Как в советнике при неудачной модификации продолжить попытки пока не модифицирует?

 
Товарищи подскажите. Есть советник. Каждый час делает выборку ордера и его модификацию по tick=trade.PositionModify(tick,stop,pos_tp);. При переходе через 0:00 делает попытку, получает marlet close и в итоге получается модифицировать только на следующем часе в 1:00. Есть ли простое решение без повторной выборки и выявления имеющегося стопа после попытки модифицировать?
 
milya977:
Товарищи подскажите. Есть советник. Каждый час делает выборку ордера и его модификацию по tick=trade.PositionModify(tick,stop,pos_tp);. При переходе через 0:00 делает попытку, получает marlet close и в итоге получается модифицировать только на следующем часе в 1:00. Есть ли простое решение без повторной выборки и выявления имеющегося стопа после попытки модифицировать?

тикет позиции запоминать.

 

или просто трижды написать одно и тоже:

tick=trade.PositionModify(tick,stop,pos_tp);

tick=trade.PositionModify(tick,stop,pos_tp);

tick=trade.PositionModify(tick,stop,pos_tp);

первая модификация застрянет на market close, 

вторая сработает при открытии торгов,

а третья будет будет отброшена т.к. нечего менять?

 
milya977:

или просто трижды написать одно и тоже:

tick=trade.PositionModify(tick,stop,pos_tp);

tick=trade.PositionModify(tick,stop,pos_tp);

tick=trade.PositionModify(tick,stop,pos_tp);

первая модификация застрянет на market close, 

вторая сработает при открытии торгов,

а третья будет будет отброшена т.к. нечего менять?

Нет. void OnTick() закончит работу и будет ждать следующий тик. Если конечно void OnTick(). Если таймер, то по времени. Закрытие рынка не остановит работу советника, если он начал работу на предыдущем тике, то сверху вниз он закончит работу программы. 

 
Valeriy Yastremskiy:

Нет. void OnTick() закончит работу и будет ждать следующий тик. Если конечно void OnTick(). Если таймер, то по времени. Закрытие рынка не остановит работу советника, если он начал работу на предыдущем тике, то сверху вниз он закончит работу программы. 

Спасибо. Да, void OnTick(). Но модификация происходит в отдельной функции которая вызывается при нескольких условиях и в частности по времени в 00 минут. Т.е. при выполнении условий вызов функции в которой выполняется модификация и получается выход из функции при невыполнении модификации при закрытом маркете.

 
Написать свою OrderSend и подставить ее под штатную через макрос. Тогда в OnTick будет полная инфа, что творилось в потрохах советника. И можно будет совершать доп. действия.
 
milya977:

Спасибо. Да, void OnTick(). Но модификация происходит в отдельной функции которая вызывается при нескольких условиях и в частности по времени в 00 минут. Т.е. при выполнении условий вызов функции в которой выполняется модификация и получается выход из функции при невыполнении модификации при закрытом маркете.

Например можно так:

      for (uint i=1;i<=try;i++)
      {
         if (OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0,clrNONE)) 
         {           
            break;
         }else
         {
            Print(Error Modify order #",OrderTicket()," code " ,GetLastError());
            Sleep(100);
           
         }         
      } 

В цикле попытка модификации ордера. Если попытка удачная цикл прерывается. Переменная try количество попыток. Можно еще добавить анализ самой ошибки мешающей модифицировать ордер. GetLastError() - код ошибки расшифровку, которой можно в справочнике найти.

 
Vitalii Ananev:

Например можно так:

В цикле попытка модификации ордера. Если попытка удачная цикл прерывается. Переменная try количество попыток. Можно еще добавить анализ самой ошибки мешающей модифицировать ордер. GetLastError() - код ошибки расшифровку, которой можно в справочнике найти.

Спасибо большое. Отличная идея.