Пишет: Модифицируется ордер 1
Модифицируется ордер 5
Модифицируется ордер 20
Модифицируется ордер 36
Модифицируется ордер 161
1,5,20,36,161 - это тикеты, которые присваиваются ордерам при тесте.
А вы не пытались проверить результат возвращаемый OrderSelect() ? или проверить ордер на закрытость ?
OrderSelect() возвращает True. Я ж говорю, я могу вытянуть любую информацию из ордера, который "невидим" для OrderModify - как то его номер, цену открытия, лот и т.д. Т.е этот ордер существует, он открыт, но в цикле OrderModify видит только последний из открытых ордеров (повторюсь, что в цикле OrderSelect() работает исправно, перебирает все открытые ордера)
Я менял
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Green);
на
OrderModify(5,OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Green);
Сейчас нет возможности проверить. Но я тут подумал - у меня при тесте ордера закрываются/открываются по свопу (swap close/open). При этом у "переоткрытого" ордера тикет будет отличаться от первоначального?
да. бегите с этого ДЦ, Вы не сможете спокойно отрабатывать эксперты.
Сейчас нет возможности проверить. Но я тут подумал - у меня при тесте ордера закрываются/открываются по свопу (swap close/open). При этом у "переоткрытого" ордера тикет будет отличаться от первоначального?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Собственно, сначала кусок кода:
//Сформируем приказ на вход в рынок***************************************************************************************************
if(Close[1]>Max20 && LongOpen==0 && ShortOpen==0)
{
StopLoss=MarketInfo(Symbol(),MODE_BID)-StopLoss;
ticket[t]=OrderSend(Symbol(),OP_BUY,Lot,Ask,20,0,0,"Старт",t,0,Green); LongOpen=true; OrderPrice=MarketInfo(Symbol(),MODE_BID);
if(ticket[t]<0)
{
Print("Buy OrderSend failed with error #",GetLastError());
return(0);
}
t++;
}
if(Close[1]<Min20 && ShortOpen==0 && LongOpen==0)
{
StopLoss=MarketInfo(Symbol(),MODE_BID)+StopLoss;
ticket[t]=OrderSend(Symbol(),OP_SELL,Lot,Bid,20,0,0,"Старт",t,0,Green); ShortOpen=true; OrderPrice=MarketInfo(Symbol(),MODE_BID);
if(ticket[t]<0)
{
Print("Sell OrderSend failed with error #",GetLastError());
return(0);
}
t++;
}
//Сформировали приказ на вход в рынок*************************************************************************************************
//Зададим алгоритм построения "пирамиды" для увеличения прибыльной позиции************************************************************************************************************
while(t<2)
{
if(MarketInfo(Symbol(),MODE_BID)>OrderPrice+2*N_vtor && LongOpen==1)
{
StopLoss=MarketInfo(Symbol(),MODE_BID)-StopLoss;
ticket[t]=OrderSend(Symbol(),OP_BUY,Lot,Ask,20,0,0,"Пирамида",t,0,Green); OrderPrice=MarketInfo(Symbol(),MODE_BID);//открытие доп. ордера в пирамиде
if(ticket[t]<0)
{
Print("Buy OrderSend failed with error #",GetLastError());
return(0);
}
t++;
}
if(MarketInfo(Symbol(),MODE_BID)<OrderPrice-2*N_vtor && ShortOpen==1)
{
StopLoss=MarketInfo(Symbol(),MODE_BID)+StopLoss;
ticket[t]=OrderSend(Symbol(),OP_SELL,Lot,Bid,20,0,0,"Пирамида",t,0,Green); OrderPrice=MarketInfo(Symbol(),MODE_BID);//открытие доп. ордера в пирамиде
if(ticket[t]<0)
{
Print("Sell OrderSend failed with error #",GetLastError());
return(0);
}
t++;
}
break;
}
//Задали алгоритм построения "пирамиды" для увеличения прибыльной позиции************************************************************************************************************
//Приведение StopLoss'а для всех ордеров к уровню только что открытого (последнего)**************************************************************************************************
while(tt<t)//ордер модифицируется ТОЛЬКО когда открылся следующий ордер (tt<t, после модификации tt=t, после открытия нового ордера tt<t и т.д)
{
tt=0;
for(tt=0;tt<t;tt++)//Перебор всех ордеров начиная с 0го, заканчивая (t-1)'м
{
OrderSelect(ticket[tt], SELECT_BY_TICKET);
Print("Модифицируется ордер ",OrderTicket());
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Green);
}
}
Первая часть (вход на рынок) выполняется как нужно.
Вторая часть (пирамида) выполняется как нужно.
В третьей части проблема. Происходит следующее - советник открывает 0й ордер с тикетом ticket[0]=1 (это в первой части, номер тикета - в массиве), затем OrderSelect - выбрали этот ордер, OrderModify - модифицировали.
Далее, после срабатывания необходимых условий, советник открывает 1й ордер с тикетом ticket[1]=5 (все аналогично, ордер открывается как нужно, без проблем). Затем:
Должно быть так: 0: OrderSelect - выбирает предыдущий ордер с тикетом ticket[0], OrderModify- модифицирует его (подтягивает стоплосс)
1: OrderSelect - выбирает ордер с тикетом ticket[1], OrderModify- модифицирует его (задает стоплосс - такой же, какой теперь у предыдущего ордера)
Имеем следующее: 0: OrderSelect - выбирает предыдущий ордер с тикетом ticket[0], OrderModify- должен бы модифицировать его, но возвращает ошибку 4108 (Неверный номер тикета) - Unknown ticket 1 for OrderModify function (где ticket 1 - и есть ticket[0]).
1: OrderSelect - выбирает ордер с тикетом ticket[1], OrderModify- модифицирует его (задает стоплосс - такой же, какой теперь у предыдущего ордера) - все тип-топ.
Далее, при открытии 2го ордера с тикетом ticket[2]=16 повторяется та же история. Советник НЕ модифицирует 2 предыдущих ордера (дважды выдает ошибку 4108), модифицирует последний. При открытии последующих ордеров - модифицируется только последний из них, все предыдущие - "Unknown ticket". Хотя они открыты, я могу вытянуть любую информацию из них.
OrderSelect(ticket[tt], SELECT_BY_TICKET);
Print("Модифицируется ордер ",OrderTicket());
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Green);
Функция OrderSelect - исправно перебирает все ордеры, от 0-го до текущего, возвращая каждый раз TRUE. Функция OrderModify поочередно получает значение OrderTicket() выбранных ордеров. Но видит только последний. В чем может быть проблема? Собственно говоря, все работает исправно до строчки
OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Green);
Всем спасибо за внимание.