Нет, OnTradeTransaction будет только при успешном выполнении:
OnTradeTransaction
В результате выполнения определенных действий с торговым счетом, его состояние изменяется. К таким действиям относятся:
·Отсылка торгового запроса любым MQL5-приложением в клиентском терминале при помощи функций OrderSend и OrderSendAsync и его последующее исполнение;
А вот после OrderSend() (успешного) видимо нужно взводить флаги для ожидания - прождали более 2-3 секунд и не получили - OnTradeTransaction() , значит нужно делать задний ход.
Проблема автора темы в том, что у неuо не получается правильно определить успешность/неуспешность OrderSend()
Нет, OnTradeTransaction будет только при успешном выполнении:
OnTradeTransaction
В результате выполнения определенных действий с торговым счетом, его состояние изменяется. К таким действиям относятся:
·Отсылка торгового запроса любым MQL5-приложением в клиентском терминале при помощи функций OrderSend и OrderSendAsync и его последующее исполнение;
А вот после OrderSend() (успешного) видимо нужно взводить флаги для ожидания - прождали более 2-3 секунд и не получили - OnTradeTransaction() , значит нужно делать задний ход.
Задний ход делать нечем, если запрос на открытие уже ушел и висит в очереди.
Вообще приведенный код плох с многих позиций. Например, нельзя все ошибки грести одной гребенкой (есть критические, при которых продолжать не имеет смысла, а при некоторых таких как 10010 нужно бы подредактировать запрос). Бесконечный цикл - это в данном случае антипаттерн. И ждать результата нужно не в нем, а в OnTradeTransaction как уже сказали.
Alexey Viktorov: А почему-бы не следить за транзакциями? Событие OnTradeTransaction() прошло, анализируйте что случилось.
Событие OnTradeTransaction() можно отследить изнутри цикла? Мне же нужно внутри цикла ждать прерывания от функции OnTradeTransaction(). А если я могу заставит его ждать ответа этой функции, то мне проще прямо внутри цикла дождаться получения реткода, и дальше действовать в зависимости от его значения.
Oleg Shenker: Я пока не понимаю, как мне внутри цикла дожидаться ответа функции OnTradeTransaction.
А не нужно внутри цикла. @Сделал дело - гуляй смело!@ Внутри цикла пульнули и если OrderSend==true, то взвести флаг ожидания и ловить результат в OnTradeTransaction(). И никаких циклов и зацикливаний.
Karputov Vladimir: А не нужно внутри цикла. @Сделал дело - гуляй смело!@ Внутри цикла пульнули и если OrderSend==true, то взвести флаг ожидания и ловить результат в OnTradeTransaction(). И никаких циклов и зацикливаний.
Возможно вы правы. Но, мне этот путь не очень нравится. Так как я открываю три сделки, мне нужно будет отлавливать в OnTrade три результата. А потом снова пытаться открыть не открывшиеся. Гораздо элегантнее дождаться ответа сервера прямо на месте, когда все параметры запроса еще свежие.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Нет, OnTradeTransaction будет только при успешном выполнении:
OnTradeTransaction
В результате выполнения определенных действий с торговым счетом, его состояние изменяется. К таким действиям относятся:
·Отсылка торгового запроса любым MQL5-приложением в клиентском терминале при помощи функций OrderSend и OrderSendAsync и его последующее исполнение;
Нет, OnTradeTransaction будет только при успешном выполнении:
OnTradeTransaction
В результате выполнения определенных действий с торговым счетом, его состояние изменяется. К таким действиям относятся:
·Отсылка торгового запроса любым MQL5-приложением в клиентском терминале при помощи функций OrderSend и OrderSendAsync и его последующее исполнение;
Задний ход делать нечем, если запрос на открытие уже ушел и висит в очереди.
Вообще приведенный код плох с многих позиций. Например, нельзя все ошибки грести одной гребенкой (есть критические, при которых продолжать не имеет смысла, а при некоторых таких как 10010 нужно бы подредактировать запрос). Бесконечный цикл - это в данном случае антипаттерн. И ждать результата нужно не в нем, а в OnTradeTransaction как уже сказали.
Открываю сделку в цикле следующим кодом:
Цикл задуман как средство повышения надежности открытия сделки, то есть, если не открывается с первого раза, пробовать снова.
Проблема в том, что, пока терминал получает ответ сервера, цикл успевает послать команду OrderSend() несколько раз.
Как можно заставить его ждать ответа?
На каком сервере и на каком инструменте чаще всего OrderSend() возвращает false? Хочу кое что проверить.
Добавлено: хочу проверить догадку, что пока OrderSend() == false, в Results.retcode храниться мусор, а значит проверять его нет смысла.
На каком сервере и на каком инструменте чаще всего OrderSend() возвращает false? Хочу кое что проверить.
Добавлено: хочу проверить догадку, что пока OrderSend() == false, в Results.retcode храниться мусор, а значит проверять его нет смысла.
Что было? Расскажите поподробней.
В кратце - не получив ответа от сервера через паузу происходил повторный запрос на сервер - выставлялась отложка.
Подробней тут https://www.mql5.com/ru/forum/83456
Официальный ответ от разработчиков сводится к тому, что:
- Нужно увеличивать пинг
- Нельзя работать с большим количеством ордеров одновременно, не смотря на то, что терминал может работать со 100 ордерами
А почему-бы не следить за транзакциями? Событие OnTradeTransaction() прошло, анализируйте что случилось.
Событие OnTradeTransaction() можно отследить изнутри цикла? Мне же нужно внутри цикла ждать прерывания от функции OnTradeTransaction(). А если я могу заставит его ждать ответа этой функции, то мне проще прямо внутри цикла дождаться получения реткода, и дальше действовать в зависимости от его значения.
Вот если бы была функция PauseAfterTrade.... :)
Попробуйте между посылкой запросов сделать паузу. Используйте функцию PauseBeforeTrade
Не просто OnTradeTransaction(), а именно тип транзакции TRADE_TRANSACTION_DEAL_ADD - событие добавления сделки в историю.
Я пока не понимаю, как мне внутри цикла дожидаться ответа функции OnTradeTransaction.
А не нужно внутри цикла. @Сделал дело - гуляй смело!@ Внутри цикла пульнули и если OrderSend==true, то взвести флаг ожидания и ловить результат в OnTradeTransaction(). И никаких циклов и зацикливаний.