Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Подключи MQL5 Cloud Network. Начни зарабатывать!
Oleg Shenker
7327
Oleg Shenker 2016.09.11 01:42 

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

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() несколько раз.

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

Alexandr Saprykin
5755
Alexandr Saprykin 2016.09.11 14:55  
Oleg Shenker:

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

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

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

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

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

-Aleks-
6313
-Aleks- 2016.09.11 17:07  
Иногда сервер не отвечает вообще... это надо предусмотреть в коде - как то раз чуть не слил депо из-за этого безобразия.
Dmitry Fedoseev
41706
Dmitry Fedoseev 2016.09.11 18:16  
Alexandr Saprykin:

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

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

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

OnTradeTransaction

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

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

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