Обсуждение статьи "Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?" - страница 4

 

Если перефразировать задачу как "какова частота вызова MQL5 кода из ядра терминала", то все надо замерять не так:

  1. Надо убрать весь лишний MQL5 код и оставив пару счетчиков в одной голой функции, чтобы минимизировать расходы на сам замер
  2. Найти подходящюю OnXXXX точку входа и метод принудительной генерации вызовов из ядра. Тут надо делать отдельную тестовую сборку под замер.

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

Это интересная задача и мы ею займемся.

 
fxsaber:


Есть!

Да, точно есть.

Извините, проглядел.

 
Renat Fatkhullin:

Если перефразировать задачу как "какова частота вызова MQL5 кода из ядра терминала", то все надо замерять не так:

  1. Надо убрать весь лишний MQL5 код и оставив пару счетчиков в одной голой функции, чтобы минимизировать расходы на сам замер
  2. Найти подходящюю OnXXXX точку входа и метод принудительной генерации вызовов из ядра. Тут надо делать отдельную тестовую сборку под замер.

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

Это интересная задача и мы ею займемся.

Спасибо, что не оставляете такие гиковские замуты без внимания!

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

 
Renat Fatkhullinfxsaber - спасибо за пояснения.
 
fxsaber:

Пожалуйста, сделайте еще один тест скорости MT5 на реальном счете

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

Тестируем 'CopyTicks'

fxsaber, 2016.09.13 11:11

если через OrderSendAsync отправить два лимитника (BuyLimit1_price < BuyLimit2_price) внутрь спреда, то будет порождено биржей два подряд идущих тика с улучшением bid-цены в одно и то же время (с точностью до 1мс)?

Поясню, что это даст.

Когда отправляется BuyLimit1 внутрь спреда, к нам придет от биржи тик со временем его рождения (он породит новый Bid). После BuyLimit2 - еще один тик со временем рождения. Разность этих двух времен - скоростная характеристика доставки MT5 торговых приказов до биржи.

Чтобы сделать минимальные денежные потери от такого эксперимента, можно послать не два BuyLimit асинхронно, а BuyLimit и SellLimit внутрь спреда и выбрать какой-нибудь слаболиквидный торговый инструмент.

 

Прежде чем сравнивать, нужно "доделать" весь комплекс торговых операций

(получение данных, оправка транзакций, получение подтверждения транзакций)

Добавлено Билд 1395, реал 

2016.09.14 17:30:03.100 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': accepted sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56 placed for execution in 3750.466 ms
2016.09.14 17:30:06.851 Trades  'xxxxx': cancel order #44309414 sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:10.014 Trades  'xxxxx': deal #29388895 sell 1.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:10.014 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:10.385 Trades  'xxxxx': deal #29388914 sell 4.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:12.374 Trades  'xxxxx': accepted exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:12.375 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market placed for execution in 2360.902 ms
2016.09.14 17:30:12.398 Trades  'xxxxx': deal #29389024 buy 1.00 BR-11.16 at 47.25 done (based on order #44309578)
2016.09.14 17:30:12.401 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.006 Trades  'xxxxx': accepted exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.007 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market placed for execution in 606.852 ms
2016.09.14 17:30:13.009 Trades  'xxxxx': deal #29389140 buy 4.00 BR-11.16 at 47.25 done (based on order #44309644)
2016.09.14 17:30:13.015 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74 placed for execution in 342.736 ms
2016.09.14 17:30:13.668 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.712 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.716 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79 placed for execution in 48.228 ms
2016.09.14 17:30:13.718 Trades  'xxxxx': deal #29389165 buy 5.00 BR-12.16 at 47.79 done (based on order #44309680)
2016.09.14 17:30:13.721 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.740 Trades  'xxxxx': accepted exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.741 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market placed for execution in 20.867 ms
2016.09.14 17:30:13.778 Trades  'xxxxx': deal #29389166 sell 5.00 BR-11.16 at 47.29 done (based on order #44309682)
 

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

ФОРТС. Вопросы по исполнению

Renat Fatkhullin, 2016.08.23 16:35

Надо просто подождать 5-10 мс и попробовать снова.

Дело в том, что подтверждение транзакции вы получаете сразу, а вот полные детали сделки прилетают асинхронно после этого. Может пройти от 0 до N мс, обычно в пределах 1-2 мс (зависит от пинга конечно же).

Из-за этого обстоятельства требуется несколько скорректировать сравнение с QLUA не в пользу MT5.
 
prostotrader:

Прежде чем сравнивать, нужно "доделать" весь комплекс торговых операций

(получение данных, оправка транзакций, получение подтверждения транзакций)

Добавлено Билд 1395, реал 


Вот только что сделал вручную аналогичную операцию: 11.7 мс

2016.09.14 18:17:26.298	Trades	'10321': order #44324961 buy limit 1.00 / 1.00 BR-12.16 at 47.00 done in 11.759 ms
2016.09.14 18:17:26.295	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00 placed for execution
2016.09.14 18:17:26.293	Trades	'10321': accepted buy limit 1.00 BR-12.16 at 47.00
2016.09.14 18:17:26.286	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00
 
Renat Fatkhullin:

Вы же не желаете смотреть реальный отчет, а пользуетесь своим собственным глючным методом замера времени сделки.

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

Вот только что сделал вручную аналогичную операцию: 11.7 мс

Вы о чём, Ренат?

Это выдержка из лога темнинала, а не мой собственный лог! 

 
fxsaber:
Из-за этого обстоятельства требуется несколько скорректировать сравнение с QLUA не в пользу MT5.

Корректировать ничего не надо. Моя фраза была для общего случая "в вашем инете и вашем пинге может быть все что угодно и в реальности в зависимости от вашей сети вы получите транзакцию через 0-N мс". Причем скорее 0 мс, чем больше.

Вот проверочный код с контролем всех транзакций в асинхронном режиме:

ulong ExtTicks=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- выведем пинг до торгового сервера в миллисекундах
   PrintFormat("AsyncTradesTest: last ping %.2f ms, build %d",TerminalInfoInteger(TERMINAL_PING_LAST)/1000.0,TerminalInfoInteger(TERMINAL_BUILD));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   Print(EnumToString(trans.type)," ",trans.symbol,": ",trans.price," ",result.order," time: ",(GetMicrosecondCount()-ExtTicks)/1000.0," ms");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static bool started=false;
//--- однократно проводим серию на первом тике
   if(!started)
     {
      started=true;
      //--- заполняем запрос
      MqlTradeRequest req={};
      MqlTradeResult  res={};

      req.volume      =1;
      req.symbol      =_Symbol;
      req.price       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      req.sl          =0;
      req.tp          =0;
      req.deviation   =100;
      req.type_filling=ORDER_FILLING_RETURN;
      req.action      =TRADE_ACTION_DEAL;
      req.type        =ORDER_TYPE_BUY;
      req.magic       =2016;
      //--- проводим цикл операций
      ExtTicks=GetMicrosecondCount();
      Print("Start...");
      OrderSendAsync(req,res);
     }
  }

Вот его вывод на реальном счете только что:

2016.09.14 18:32:53.234 Test (BR-12.16,H1)      TRADE_TRANSACTION_HISTORY_ADD BR-12.16: 0.0 0 time: 11.455 ms
2016.09.14 18:32:53.232 Test (BR-12.16,H1)      TRADE_TRANSACTION_DEAL_ADD BR-12.16: 47.13 0 time: 8.778 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_DELETE BR-12.16: 0.0 0 time: 8.457000000000001 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 8.202999999999999 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 8.151 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 5.196 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 5.171 ms
2016.09.14 18:32:53.227 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_ADD BR-12.16: 0.0 0 time: 4.184 ms
2016.09.14 18:32:53.223 Test (BR-12.16,H1)      Start...
2016.09.14 18:32:49.753 Test (BR-12.16,H1)      AsyncTradesTest: last ping 2.15 ms, build 1417

Читать надо снизу вверх.

Тут показаны все этапы транзакций с нарастающим итогом по затраченному времени от начала старта. По типам транзакций видно, что и когда добавлялось в терминал.

Итоговое время 11.45 мс.