OrderSend возвращает неправильный тикет

 

После прочтения свежей темы задумался о теоретической возможности там сказанного, когда OrderSend на разных терминалах одного счета получили один и тот же тикет (Result.order).

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

struct MqlTradeResult
  {
   uint     retcode;          // Код результата операции
   ulong    deal;             // Тикет сделки, если она совершена
   ulong    order;            // Тикет ордера, если он выставлен
   double   volume;           // Объем сделки, подтверждённый брокером
   double   price;            // Цена в сделке, подтверждённая брокером
   double   bid;              // Текущая рыночная цена предложения (цены реквота)
   double   ask;              // Текущая рыночная цена спроса (цены реквота)
   string   comment;          // Комментарий брокера к операции (по умолчанию заполняется расшифровкой кода возврата торгового сервера)
   uint     request_id;       // Идентификатор запроса, устанавливается терминалом при отправке 
   uint     retcode_external; // Код ответа внешней торговой системы
  };

Соответственно, решил проверить гипотезу через такой советник.

// Воспроизведение возврата OrderSend ошибочного тикета.

input int inMagic = 1; // Первый терминал - 1, второй - 2.
input int inSyncTime = 3; // Параметр для синхронизации двух терминалов

void OnTick()
{
  static MqlTradeResult Result = {};  
  static datetime PrevTime = 0;
  
  MqlTradeRequest Request = {};
  MqlTick Tick;

  if (OrderSelect(Result.order)) // Если ордер присутствует - удаляем.
  {
    if (OrderGetInteger(ORDER_MAGIC) != inMagic) // Если выставленный советником ордер имеет другой Magic - останавливаемся.
      ExpertRemove();
    
    Request.action = TRADE_ACTION_REMOVE;
    Request.order = Result.order;
  }
  else if (SymbolInfoTick(_Symbol, Tick) && (Tick.time != PrevTime) && !(Tick.time % inSyncTime)) // Если время символа кратно значению, выставляем ордер.
  {
    Request.action = TRADE_ACTION_PENDING;            
    Request.magic = inMagic; // Советник работает (выставляет/удаляет) только с заданным Magic.
    Request.symbol = _Symbol;
    Request.volume = 0.1;
    Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) + 1000 * _Point;
    Request.type = ORDER_TYPE_BUY_STOP;
    
    PrevTime = Tick.time;
  }
  
  if (OrderSend(Request, Result))
    Print(Result.order); // Распечатываем все удачные Result.order.
}


Ну и теперь подготовка. Берем два терминала и подключаем к одному торговому счету. Перезагружаем оба и не делаем никаких торговых операций - синхронизация Result.id.

Взял MetaQuotes-Demo, оставил в Обзоре рынка только USDCNH (большой тиковый объем) и накинул на его чарт советник на каждом терминале.

На первом чарте входной Magic=1, второй Magic = 2. После чего нажал на обоих терминалах кнопку OK (без задержек).


И вот, что получил.

Оба Терминала получили один и тот же Result.order после OrderSend! При этом один терминал завершил работу, т.к. мэджик, который был указан в OrderSend, оказался не соответствующим ордеру, что вернул этот OrderSend.


Журнал обоих терминалов.

// Левый терминал.
2023.01.17 14:14:25.075 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79614
2023.01.17 14:14:25.075 Trades  '5009503753': order #50327280159 buy stop 0.1 / 0.1 USDCNH at 6.79614 done in 34.175 ms

// Правый терминал.
2023.01.17 14:14:25.075 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79614
2023.01.17 14:14:25.075 Trades  '5009503753': order #50327280159 buy stop 0.1 / 0.1 USDCNH at 6.79614 done in 35.014 ms

Отличие записей только в длительности выполнения OrderSend.


Автор исходной ветки из-за этого бага получил заметный убыток, т.к. произошла потеря своего ордера в логике. Баг, очевидно, носит критический характер.

Более широко (разные символы, разные Result.id) не проверял. Для воспроизведения и разбирательства все есть.

Строка для поискаOshibka 060.

Two orders with the same ticket number
Two orders with the same ticket number
  • 2023.01.16
  • www.mql5.com
I am running two instances of the same EA on two VPSes in two different data-centers, each with a different magic number...
 

Удаленные ордера правого терминала.


Живой ордер от левого Терминала.


Смотрим его тикет и пробуем его (50327280160) найти в логах обоих Терминалов.


Левый.

2023.01.17 14:14:17.388 Experts expert Test5-3 (USDCNH,H1) loaded successfully
2023.01.17 14:14:23.545 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:23.649 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:23.805 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:23.869 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.085 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.231 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.343 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.586 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.637 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.739 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.843 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.937 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:25.042 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79614
2023.01.17 14:14:25.075 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79614
2023.01.17 14:14:25.075 Trades  '5009503753': order #50327280159 buy stop 0.1 / 0.1 USDCNH at 6.79614 done in 34.175 ms
2023.01.17 14:14:25.139 Trades  '5009503753': cancel order #50327280159 buy stop 0.1 USDCNH at 6.79614
2023.01.17 14:14:25.180 Trades  '5009503753': accepted cancel order #50327280159 buy 0  at market
2023.01.17 14:14:25.180 Trades  '5009503753': failed cancel order #50327280159 buy 0  at market [Modification failed due to order or position being close to market]
2023.01.17 14:14:25.196 Experts expert Test5-3 (USDCNH,H1) removed


Правый.

2023.01.17 14:14:10.683 Experts expert Test5-3 (USDCNH,H1) loaded successfully
2023.01.17 14:14:23.545 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:23.649 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:23.805 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:23.869 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.084 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.232 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.342 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.586 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.637 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.739 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.842 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:24.936 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:25.041 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79614
2023.01.17 14:14:25.075 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79614
2023.01.17 14:14:25.075 Trades  '5009503753': order #50327280159 buy stop 0.1 / 0.1 USDCNH at 6.79614 done in 35.014 ms
2023.01.17 14:14:25.139 Trades  '5009503753': cancel order #50327280159 buy stop 0.1 USDCNH at 6.79614
2023.01.17 14:14:25.178 Trades  '5009503753': accepted cancel order #50327280159 buy 0  at market
2023.01.17 14:14:25.178 Trades  '5009503753': failed cancel order #50327280159 buy 0  at market [Modification failed due to order or position being close to market]
2023.01.17 14:14:25.240 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:25.337 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:25.442 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:25.643 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:25.744 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:27.158 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:27.265 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:27.361 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:28.185 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79618
2023.01.17 14:14:28.819 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79618
2023.01.17 14:14:28.819 Trades  '5009503753': order #50327280275 buy stop 0.1 / 0.1 USDCNH at 6.79618 done in 634.602 ms
2023.01.17 14:14:29.055 Trades  '5009503753': cancel order #50327280275 buy stop 0.1 USDCNH at 6.79618
2023.01.17 14:14:29.091 Trades  '5009503753': accepted cancel order #50327280275 buy 0  at market
2023.01.17 14:14:29.091 Trades  '5009503753': cancel #50327280275 buy stop 0.1 USDCNH at market done in 36.085 ms
2023.01.17 14:14:29.181 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:29.274 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:29.353 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:29.459 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:29.547 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:29.760 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:30.664 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:30.771 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:30.883 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:31.020 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:31.080 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79603
2023.01.17 14:14:31.491 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79603
2023.01.17 14:14:31.491 Trades  '5009503753': order #50327280378 buy stop 0.1 / 0.1 USDCNH at 6.79603 done in 411.811 ms
2023.01.17 14:14:31.560 Trades  '5009503753': cancel order #50327280378 buy stop 0.1 USDCNH at 6.79603
2023.01.17 14:14:31.595 Trades  '5009503753': accepted cancel order #50327280378 buy 0  at market
2023.01.17 14:14:31.706 Trades  '5009503753': cancel #50327280378 buy stop 0.1 USDCNH at market done in 146.247 ms
2023.01.17 14:14:33.083 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:33.166 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:33.271 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:33.364 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:33.467 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:33.580 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:33.727 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:33.761 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:33.869 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:34.067 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79544
2023.01.17 14:14:34.101 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79544
2023.01.17 14:14:34.102 Trades  '5009503753': order #50327280457 buy stop 0.1 / 0.1 USDCNH at 6.79544 done in 34.349 ms
2023.01.17 14:14:34.172 Trades  '5009503753': cancel order #50327280457 buy stop 0.1 USDCNH at 6.79544
2023.01.17 14:14:34.207 Trades  '5009503753': accepted cancel order #50327280457 buy 0  at market
2023.01.17 14:14:34.207 Trades  '5009503753': cancel #50327280457 buy stop 0.1 USDCNH at market done in 35.371 ms
2023.01.17 14:14:34.565 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:34.679 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:35.675 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:36.372 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:36.476 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:37.558 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79544
2023.01.17 14:14:37.661 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79544
2023.01.17 14:14:37.661 Trades  '5009503753': order #50327280564 buy stop 0.1 / 0.1 USDCNH at 6.79544 done in 103.160 ms
2023.01.17 14:14:37.697 Trades  '5009503753': cancel order #50327280564 buy stop 0.1 USDCNH at 6.79544
2023.01.17 14:14:37.745 Trades  '5009503753': accepted cancel order #50327280564 buy 0  at market
2023.01.17 14:14:37.745 Trades  '5009503753': cancel #50327280564 buy stop 0.1 USDCNH at market done in 47.968 ms
2023.01.17 14:14:37.819 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:37.897 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:38.181 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:38.278 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:38.391 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:40.696 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79540
2023.01.17 14:14:40.741 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79540
2023.01.17 14:14:40.741 Trades  '5009503753': order #50327280675 buy stop 0.1 / 0.1 USDCNH at 6.79540 done in 45.934 ms
2023.01.17 14:14:40.789 Trades  '5009503753': cancel order #50327280675 buy stop 0.1 USDCNH at 6.79540
2023.01.17 14:14:41.132 Trades  '5009503753': accepted cancel order #50327280675 buy 0  at market
2023.01.17 14:14:41.132 Trades  '5009503753': cancel #50327280675 buy stop 0.1 USDCNH at market done in 342.863 ms
2023.01.17 14:14:41.401 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:41.616 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:41.719 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:41.796 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:41.902 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:41.996 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:42.100 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:42.596 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:42.698 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:43.205 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79533
2023.01.17 14:14:45.627 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79533
2023.01.17 14:14:45.627 Trades  '5009503753': order #50327280865 buy stop 0.1 / 0.1 USDCNH at 6.79533 done in 2422.251 ms
2023.01.17 14:14:45.705 Trades  '5009503753': cancel order #50327280865 buy stop 0.1 USDCNH at 6.79533
2023.01.17 14:14:45.739 Trades  '5009503753': accepted cancel order #50327280865 buy 0  at market
2023.01.17 14:14:45.739 Trades  '5009503753': cancel #50327280865 buy stop 0.1 USDCNH at market done in 34.188 ms
2023.01.17 14:14:47.211 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:48.217 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:48.313 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:49.619 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79534
2023.01.17 14:14:49.926 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79534
2023.01.17 14:14:49.926 Trades  '5009503753': order #50327281000 buy stop 0.1 / 0.1 USDCNH at 6.79534 done in 307.097 ms
2023.01.17 14:14:50.324 Trades  '5009503753': cancel order #50327281000 buy stop 0.1 USDCNH at 6.79534
2023.01.17 14:14:50.362 Trades  '5009503753': accepted cancel order #50327281000 buy 0  at market
2023.01.17 14:14:50.362 Trades  '5009503753': cancel #50327281000 buy stop 0.1 USDCNH at market done in 38.432 ms
2023.01.17 14:14:50.437 Trades  '5009503753': failed prices for  0 [Invalid request]
2023.01.17 14:14:55.441 Experts expert Test5-3 (USDCNH,H1) removed


Тикета нет, он не приходил в OnTradeTransaction! Это по теме, что OnTradeTransaction ничего не пропускает...

 
Прошу еще обратить внимание на подобные задержки.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

OrderSend возвращает неправильный тикет

fxsaber, 2023.01.17 14:05

2023.01.17 14:14:43.205 Trades  '5009503753': buy stop 0.1 USDCNH at 6.79533
2023.01.17 14:14:45.627 Trades  '5009503753': accepted buy stop 0.1 USDCNH at 6.79533
2023.01.17 14:14:45.627 Trades  '5009503753': order #50327280865 buy stop 0.1 / 0.1 USDCNH at 6.79533 done in 2422.251 ms

Пинг 32 мс.

 

@fxsaber Thank you for confirming and reproducing the bug I found!

I have reported the bug at MetaQuotes linking to both my post and your post. Hopefully the bug can be fixed.

 

Исправили, будет в очередной бете

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

Причина обращения: