Дополню. Если отправить запрос на удаление ордера, по которому прошла TRADE_TRANSACTION_DEAL_ADD, но еще не прошла TRADE_TRANSACTION_ORDER_DELETE.
Разумеется приходит ответ - что удалить невозможно. Но я вижу. Что в этот момент исчезают все отложенные ордера из списка открытых (OrdersTotal()<1)
В этот момент я дублирую второй запрос по этим отложенным ордерам и получаю дубликат сделок. Возникает вопрос. OrdersTotal() может выдать ошибку?
Потому что что то происходит буквально несколько миллисекунд. Потом ордера появляются. Или же идет синхронизация, или же ломается сам список только?
Не знаю что делать . Может спасет меня SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_SYNCHRONIZED)
Все верно. После удаления ордера, обязательно нужна операция OrderSelect(ticket). Из документации:
Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderGetDouble(), OrderGetInteger(), OrderGetString() возвращают ранее скопированные данные
- www.mql5.com
Если вызвать OrderSelect(ticket), а после удалить из открытых этот ордер. Вы все рано получите свойства ордера. Но уже другого.
Такое поведение ошибочно. Попробуйте создать лаконичный код для воспроизведения.
ЗЫ. Сервер Just2Trade-MT5 работает по выходным, демо-счет открывается из Терминала.
в этот момент исчезают все отложенные ордера из списка открытых (OrdersTotal()<1)
В этот момент я дублирую второй запрос по этим отложенным ордерам и получаю дубликат сделок. Возникает вопрос. OrdersTotal() может выдать ошибку?
Ошибки нет. К сожалению, данная тема почти не поднимается на форуме.
Описывал свое ByPass-решение синхронизации торгового окружения. Работает с любыми торговыми библиотеками.
- 2021.09.12
- www.mql5.com
Ошибки нет. К сожалению, данная тема почти не поднимается на форуме.
Описывал свое ByPass-решение синхронизации торгового окружения. Работает с любыми торговыми библиотеками.
Не понял, что вы делаете? Что бы не было дублей?
Если использовать не асинхронный вызов OrderSend() То все равно изменение позиции произойдет в конце.
Вот вам порядок вызова транзакций при рыночной заявке:
TRADE_TRANSACTION_ORDER_ADD trans TRADE_TRANSACTION_REQUEST request,result //Если идут UPDATE TRADE_TRANSACTION_ORDER_UPDATE trans //Если идут UPDATE TRADE_TRANSACTION_DEAL_ADD trans TRADE_TRANSACTION_ORDER_DELETE trans //Идет после выполнения OrderSend() TRADE_TRANSACTION_HISTORY_ADD trans //Идет после выполнения OrderSend() TRADE_TRANSACTION_REQUEST request,result //Идет после выполнения OrderSend() TRADE_TRANSACTION_POSITION trans(нет сделки, ордера) //Исполняется, если изменяется позиция (не удаляется)
На момент завершения OrderSend я вижу
TRADE_TRANSACTION_DEAL_ADD
Т.е. еще не удалился ордер открытия, не добавился в историю. А тем более не появилась позиция.
Разобрался причин вызова UPDATE. Если между транзакциями идут запросы на изменения с ордерами. То идет процесс синхронизации. С REQUEST об их исполнении.
В момент вызова UPDATE возможно и пропадают списки ордеров. Достоверно точно не могу сказать, пока занимаюсь проблемой.
Главная проблема - раз на раз не приходится. Запаздывания наблюдаю если несколько роботов в тужу секунду отправляют запросы.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Если вызвать OrderSelect(ticket), а после удалить из открытых этот ордер. Вы все рано получите свойства ордера. Но уже другого.
Вместо o.SellAtPrice подставьте свои функции, которые запишут комментарий в ордер. Принты:
Я вызывал тикет OL_Buy, а получил данные OL_Sell. Не важно по какой причине удалится ордер из открытых. В данном случае я его сам удалил.
Очень плохая ситуация в условиях. Что все работает очень быстро. Уже сталкивался с тем. Что до прихода транзаций приходил второй OnTick. Из за чего у меня дублировалась сделка в редких случаях.
В конкретном случая я ошибся. Но напрашивается проверка данных, которые запрашиваешь.