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

 
Karputov Vladimir:

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

OnTradeTransaction

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

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

А вот после OrderSend() (успешного) видимо нужно взводить флаги для ожидания - прождали более 2-3 секунд и не получили - OnTradeTransaction() , значит нужно делать задний ход.
Проблема автора темы в том, что у неuо не получается правильно определить успешность/неуспешность OrderSend()
 
Karputov Vladimir:

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

OnTradeTransaction

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

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

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

Задний ход делать нечем, если запрос на открытие уже ушел и висит в очереди.

Вообще приведенный код плох с многих позиций. Например, нельзя все ошибки грести одной гребенкой (есть критические, при которых продолжать не имеет смысла, а при некоторых таких как 10010 нужно бы подредактировать запрос). Бесконечный цикл - это в данном случае антипаттерн. И ждать результата нужно не в нем, а в OnTradeTransaction как уже сказали.

 
Oleg Shenker:

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

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

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

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

На каком сервере и на каком инструменте чаще всего OrderSend() возвращает false? Хочу кое что проверить.

 

Добавлено: хочу проверить догадку, что пока OrderSend() == false, в Results.retcode храниться мусор, а значит проверять его нет смысла.

 
Karputov Vladimir:

На каком сервере и на каком инструменте чаще всего OrderSend() возвращает false? Хочу кое что проверить.

 

Добавлено: хочу проверить догадку, что пока OrderSend() == false, в Results.retcode храниться мусор, а значит проверять его нет смысла.

Да какие-нибудь параметры установите неправильные. Стоплосс близкий, или лот 0.
 
Dmitry Fedoseev:
Что было? Расскажите поподробней. 

В кратце - не получив ответа от сервера через паузу происходил повторный запрос на сервер - выставлялась отложка.

Подробней тут https://www.mql5.com/ru/forum/83456

Официальный ответ от разработчиков сводится к тому, что:

- Нужно увеличивать пинг

- Нельзя работать с большим количеством ордеров одновременно, не смотря на то, что терминал может работать со 100 ордерами

О возможностях ДЦ при спорных ситуациях.
О возможностях ДЦ при спорных ситуациях.
  • отзывов: 3
  • www.mql5.com
Хочу открыть тему, в которой будут обсуждаться возможности ДЦ с точки зрения наличия технической базы для разрешения спорных ситуаций...
 
Alexey Viktorov:
А почему-бы не следить за транзакциями? Событие OnTradeTransaction() прошло, анализируйте что случилось.

Событие OnTradeTransaction() можно отследить изнутри цикла? Мне же нужно внутри цикла ждать прерывания от функции OnTradeTransaction(). А если я могу заставит его ждать ответа этой функции, то мне проще прямо внутри цикла дождаться получения реткода, и дальше действовать в зависимости от его значения.

Вот если бы была функция PauseAfterTrade.... :) 

 
Alexandr Saprykin:

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

Возможно это хорошее решение. Спасибо!
 
Karputov Vladimir:
Не просто OnTradeTransaction(), а именно тип транзакции TRADE_TRANSACTION_DEAL_ADD - событие добавления сделки в историю.
Я пока не понимаю, как мне внутри цикла дожидаться ответа функции OnTradeTransaction.
 
Karputov Vladimir:

На каком сервере и на каком инструменте чаще всего OrderSend() возвращает false? Хочу кое что проверить.

 

Добавлено: хочу проверить догадку, что пока OrderSend() == false, в Results.retcode храниться мусор, а значит проверять его нет смысла.

Так оно и есть. Я заметил, что проверка Rsults.retcode и OrderSend() == true - это одно и тоже.

У Альфабанка и ВТБ не открывались сделки. Поэтому я поставил цикл. Мне нужно надежное открытие.

Попробовал, стало открываться по несколько сделок. Хотя не уверен, что это связано с циклом. Возможно, в другом месте косяк. 

 
Oleg Shenker:
Я пока не понимаю, как мне внутри цикла дожидаться ответа функции OnTradeTransaction.
А не нужно внутри цикла. @Сделал дело - гуляй смело!@ Внутри цикла пульнули и если OrderSend==true, то взвести флаг ожидания и ловить результат в OnTradeTransaction(). И никаких циклов и зацикливаний.
Причина обращения: