Ошибка при вызове OrderSelect(ticket), или не хорошее исполнение функции

 

Если вызвать OrderSelect(ticket), а после удалить из открытых этот ордер. Вы все рано получите свойства ордера. Но уже другого. 

ulong ticket=0;

      o.SellAtPrice(0,1,65500,SellName);
      o.BuyAtPrice(0,1,63500,BuyName);
      Print("OrdersTotal() = "+OrdersTotal());
      for(int i=0; i<OrdersTotal(); i++)
        {
         if(OrderGetTicket(i))
           {
            if(StringCompare(OrderGetString(ORDER_COMMENT),"OL_"+BuyName)==0)
              {
               ticket=OrderGetInteger(ORDER_TICKET);
              }
           }


        }
      if(ticket!=0 && OrderSelect(ticket))
        {
         Print("1 name = "+OrderGetString(ORDER_COMMENT));
         o.OrderDelete(ticket);
         Print("2 name = "+OrderGetString(ORDER_COMMENT));
        }

Вместо o.SellAtPrice подставьте свои функции, которые запишут комментарий в ордер. Принты:

2022.08.19 12:41:24.248	TestFun (Si-9.22,M1)	1 name = OL_Buy
2022.08.19 12:41:24.282	TestFun (Si-9.22,M1)	2 name = OL_Sell

Я вызывал тикет OL_Buy, а получил данные OL_Sell. Не важно по какой причине удалится ордер из открытых. В данном случае я его сам удалил.

Очень плохая ситуация в условиях. Что все работает очень быстро. Уже сталкивался с тем. Что до прихода транзаций приходил второй OnTick. Из за чего у меня дублировалась сделка в редких случаях.

В конкретном случая я ошибся. Но напрашивается проверка данных, которые запрашиваешь. 

 

Дополню. Если отправить запрос на удаление ордера, по которому прошла TRADE_TRANSACTION_DEAL_ADD, но еще не прошла TRADE_TRANSACTION_ORDER_DELETE.

Разумеется приходит ответ - что удалить невозможно. Но я вижу. Что в этот момент исчезают все отложенные ордера из списка открытых (OrdersTotal()<1)

В этот момент я дублирую второй запрос по этим отложенным ордерам и получаю дубликат сделок. Возникает вопрос.  OrdersTotal() может выдать ошибку? 

Потому что что то происходит буквально несколько миллисекунд. Потом ордера появляются. Или же идет синхронизация, или же ломается сам список только?

Не знаю что делать . Может спасет меня SeriesInfoInteger(_Symbol,PERIOD_CURRENT,SERIES_SYNCHRONIZED)

 

Все верно. После удаления ордера, обязательно нужна операция  OrderSelect(ticket). Из документации:

Функция OrderSelect() копирует данные об ордере в программное окружение, и последующие вызовы OrderGetDouble(), OrderGetInteger(), OrderGetString() возвращают ранее скопированные данные

Документация по MQL5: Торговые функции / OrderGetInteger
Документация по MQL5: Торговые функции / OrderGetInteger
  • www.mql5.com
OrderGetInteger - Торговые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
vbymrf:

Если вызвать OrderSelect(ticket), а после удалить из открытых этот ордер. Вы все рано получите свойства ордера. Но уже другого.

Такое поведение ошибочно. Попробуйте создать лаконичный код для воспроизведения.

ЗЫ. Сервер Just2Trade-MT5 работает по выходным, демо-счет открывается из Терминала.

 
vbymrf #:

в этот момент исчезают все отложенные ордера из списка открытых (OrdersTotal()<1)

В этот момент я дублирую второй запрос по этим отложенным ордерам и получаю дубликат сделок. Возникает вопрос.  OrdersTotal() может выдать ошибку?

Ошибки нет. К сожалению, данная тема почти не поднимается на форуме.

Описывал свое ByPass-решение синхронизации торгового окружения. Работает с любыми торговыми библиотеками.

Проверка на наличие дублей ордеров/позиций в MT5
Проверка на наличие дублей ордеров/позиций в MT5
  • 2021.09.12
  • www.mql5.com
Появление дублей ордеров/позиций в MT5 - архитектурная особенность платформы, с которой многие сталкиваются. Данная неприятность вызывает серьезные перекосы в торговых рисках, ломает логику, усложняет
 
fxsaber #:

Ошибки нет. К сожалению, данная тема почти не поднимается на форуме.

Описывал свое 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 возможно и пропадают списки ордеров. Достоверно точно не могу сказать, пока занимаюсь проблемой. 

Главная проблема - раз на раз не приходится. Запаздывания наблюдаю если несколько роботов в тужу секунду отправляют запросы. 

 
vbymrf #:

Не понял, что вы делаете? Что бы не было дублей?

Определяю, что ситуация не синхронизирована. Разрешаю торговать только после синхронизации.

 
fxsaber #:

Определяю, что ситуация не синхронизирована. Разрешаю торговать только после синхронизации.

Чем вы определяете сам процесс синхронизации?

 
vbymrf #:

Чем вы определяете сам процесс синхронизации?

Смотрю соответствие того, что было, с тем, что сейчас.