OrderModify ошибка 4108 (неверный тикет).

 

Собственно, сначала кусок кода:

//Сформируем приказ на вход в рынок***************************************************************************************************
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);

Всем спасибо за внимание.

 

и что вам пишет Print("Модифицируется ордер ",OrderTicket()); ?

 
А вы не пытались проверить результат возвращаемый OrderSelect() ? или проверить ордер на закрытость ?
 
и что вам пишет Print("Модифицируется ордер ",OrderTicket()); ?

Пишет: Модифицируется ордер 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);

т.е. делал, чтобы цикл "на пофиг" модифицировал только ордер с тикетом 5 (второй по счету). В первой итерации - ошибка, т.к. такой ордер еще не открыт. ВО второй итерации - этот ордер отркрыт и является последним - модификация ордера проходит. В третьей итерации открывается ордер с тикетом 20. И OrderModify(5,OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Green); вовращает ту же ошибку, мол 5 - неизвестный тикет. Хотя вот он, только что в предыдущей итерации обрабатывался.
 
или проверить ордер на закрытость ?
Сейчас нет возможности проверить. Но я тут подумал - у меня при тесте ордера закрываются/открываются по свопу (swap close/open). При этом у "переоткрытого" ордера тикет будет отличаться от первоначального?
 
Pesso711:
Сейчас нет возможности проверить. Но я тут подумал - у меня при тесте ордера закрываются/открываются по свопу (swap close/open). При этом у "переоткрытого" ордера тикет будет отличаться от первоначального?

да. бегите с этого ДЦ, Вы не сможете спокойно отрабатывать эксперты.
 
Pesso711:
Сейчас нет возможности проверить. Но я тут подумал - у меня при тесте ордера закрываются/открываются по свопу (swap close/open). При этом у "переоткрытого" ордера тикет будет отличаться от первоначального?
И это кстати тоже, в этом случае вам придется маркировать каждый ордер сложным магиком, которые будут играть роль внутренних тикетов (при переотрытии магик сохраняется). просто с тех пор как нарвался на ситуацию когда между занесением ордеров в список, дальнейшей сортировкой и последующей модификацией (закрытием), некоторые ордера закрывались по абсолютно обьективным причинам, то приучил себя кроме проверки ордера на наличие ОрдерСелектом, проверять еще и время закрытия ордера, и уж если тут все совпадает, тогда ордер точно есть и не закрыт.
 
Да, все дело было в переоткрытии ордеров. Спасибо за помощь =)
Причина обращения: