Ожидание ответа сервера после посылки OrderSend()

 

Открываю сделку в цикле следующим кодом:

if(OrderCheck(Request, Check))
         {
          if(Check retcode != 0) break;
          do
            {
             if(OrderSend(Request, Results)) Print(Symbols[i], " - trade result retcode = ", Results.retcode);
            }
          while(Results.retcode != 10009 && !IsStopped());
         }

 Цикл задуман как средство повышения надежности открытия сделки, то есть, если не открывается с первого раза, пробовать снова.

Проблема в том, что, пока терминал получает ответ сервера, цикл успевает послать команду OrderSend() несколько раз.

Как можно заставить его ждать ответа? 

 
Oleg Shenker:

Открываю сделку в цикле следующим кодом:

 Цикл задуман как средство повышения надежности открытия сделки, то есть, если не открывается с первого раза, пробовать снова.

Проблема в том, что, пока терминал получает ответ сервера, цикл успевает послать команду OrderSend() несколько раз.

Как можно заставить его ждать ответа? 

Попробуйте между посылкой запросов сделать паузу. Используйте функцию PauseBeforeTrade

 
Иногда сервер не отвечает вообще... это надо предусмотреть в коде - как то раз чуть не слил депо из-за этого безобразия.
 
Alexandr Saprykin:

Попробуйте между посылкой запросов сделать паузу. Используйте функцию PauseBeforeTrade

Почему Before, а не After? Надо после OrderSend() спать секунду, чтобы история обновилась.
 
-Aleks-:
Иногда сервер не отвечает вообще... это надо предусмотреть в коде - как то раз чуть не слил депо из-за этого безобразия.
Что было? Расскажите поподробней. 
 
А почему-бы не следить за транзакциями? Событие OnTradeTransaction() прошло, анализируйте что случилось.
 
Alexey Viktorov:
А почему-бы не следить за транзакциями? Событие OnTradeTransaction() прошло, анализируйте что случилось.
Не просто OnTradeTransaction(), а именно тип транзакции TRADE_TRANSACTION_DEAL_ADD - событие добавления сделки в историю.
 
Karputov Vladimir:
Не просто OnTradeTransaction(), а именно тип транзакции TRADE_TRANSACTION_DEAL_ADD - событие добавления сделки в историю.
Владимир, это уже детали.
 
Разве событие OnTradeTransaction() произойдет, при неудачном OrderSend()?
 
Dmitry Fedoseev:
Разве событие OnTradeTransaction() произойдет, при неудачном OrderSend()?

Нет, OnTradeTransaction будет только при успешном выполнении:

OnTradeTransaction

В результате выполнения определенных действий с торговым счетом, его состояние изменяется. К таким действиям относятся:

·Отсылка торгового запроса любым MQL5-приложением в клиентском терминале при помощи функций OrderSend и OrderSendAsync и его последующее исполнение; 

А вот после OrderSend() (успешного) видимо нужно взводить флаги для ожидания - прождали более 2-3 секунд и не получили - OnTradeTransaction() , значит нужно делать задний ход.
 
Для начала бы выскакивать из цикла по OrderSend()==true