MT5 и скорость в боевом исполнении - страница 94

 
fxsaber #:

Не удаленной машине (не VPS) с хорошими характеристиками и пингом до торгового сервера <4 мс увидел много случаев регулярных тормозов при просмотре логов Терминалов (b2958).


Взял первый попавшийся для демонстрации здесь.


Модификация лимитника длилась восемь секунд. Большинство же модификаций происходит за такое примерно время.


Даже для пинга 4 мс это многовато, но все же ни в какое сравнение не идет с восемью секундами.


На машине работают только MT5-терминалы и средняя нагрузка на CPU ~1%. Анализ показал, что во время тормозов нагрузка вплесками доходит до 100% при сильной активности рынка и торговых приказов. Как итог, ответ от торгового сервера до терминала длится ОЧЕНЬ долго. По случаям тормозов запрашивал у брокера информацию. На стороне торгового сервера все мгновенно и приказ доходит от терминала до сервера по первой строке modify. Т.е. отправка приказа не тормозит, лаги случаются при получении ответа в терминал.


Сомневаюсь, что разработчики смогут здесь что-то улучшить. Кто ОЧЕНЬ активно торгует, поделитесь наблюдениями этой темы по своим логам.

Есть подозрение на серверный тормоз в конце дня 23:00:09 (это локальное время терминала).

Возможно: бакап, генерация отчетов или еще что-то.

 
Renat Fatkhullin #:

Есть подозрение на серверный тормоз в конце дня 23:00:09 (это локальное время терминала).

Локальное совпадает с серверным. Это час до ролловера. Проблема наблюдаются и в другие часы.


Запрашивал логи сервера у брокера. Все идеально у них. Проблема на стороне Терминала.

Можно воспроизвести таким образом.

 
Обнаружилась медленная работа с уже сформированной историей торговли.
// Демонстрация длительности получения всех ордеров/сделок в истории.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279
#define _C(A) _B(A, 1)
#define PRINT(A) Print(#A + " = " + (string)(A) + "\n");

// Получение всех ордеров в истории.
ulong Orders()
{
  ulong Sum = 0;
  
  for (int i = ::HistoryOrdersTotal() - 1; i >= 0; i--)
    Sum += ::HistoryOrderGetTicket(i);
  
  return(Sum);
}

// Получение всех сделок в истории.
ulong Deals()
{
  ulong Sum = 0;
  
  for (int i = ::HistoryDealsTotal() - 1; i >= 0; i--)
    Sum += ::HistoryDealGetTicket(i);
  
  return(Sum);
}

// Получение всех элементов в массиве.
ulong TestArray( const ulong &Array[] )
{
  ulong Sum = 0;
  
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    Sum += Array[i];
  
  return(Sum);  
}

void OnStart()
{
  if (HistorySelect(0, INT_MAX))
  {
    // Замеряем время на получение всех ордеров в истории.
    _C(Orders());
    PRINT(HistoryOrdersTotal());    
    
    // Замеряем время на получение всех сделок в истории.
    _C(Deals());
    PRINT(HistoryDealsTotal());
        
    ulong Array[];
    ArrayResize(Array, HistoryDealsTotal() + HistoryOrdersTotal());
    
    // Замеряем время на получение всех элементов в массиве.
    Print(_C(TestArray(Array))); // https://www.mql5.com/ru/forum/436140/page4#comment_43240762
    PRINT(ArraySize(Array));
  }
}


Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 45 in OnStart: Orders()] = 6378 mcs.
HistoryOrdersTotal() = 319872

Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 49 in OnStart: Deals()] = 3411 mcs.
HistoryDealsTotal() = 203639

Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 56 in OnStart: TestArray(Array)] = 1483 mcs.
0
ArraySize(Array) = 523511

Простой перебор тикетов в уже сформированной истории занимает почти 10 мс! Это в 6+ раз медленнее перебора элементов массива. Просьба ускорить.

 
Почему нет асинхронности на торговом сервере?
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

input int inAmount = 20; // Amount of new orders

void OnStart()
{
  // Выставили лимитные ордера в синхронном режиме.
  for (int i = 0; i < inAmount; i++)
    OrderSend(_Symbol, OP_BUYLIMIT, 0.1, Ask - 1000 * _Point, 0, 0, 0);
    
  // Модифицируем ордера в асинхронном режиме.
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
      OrderModifyAsync(OrderTicket(), OrderOpenPrice() - _Point, 0, 0, 0);
}


Результат запуска на MQ-Demo.

2023.02.22 09:23:27.302 Trades  '4999464569': modify #50362768384 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 34.320 ms
2023.02.22 09:23:27.302 Trades  '4999464569': modify #50362768383 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 34.285 ms
2023.02.22 09:23:27.302 Trades  '4999464569': modify #50362768381 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 34.437 ms
2023.02.22 09:23:27.302 Trades  '4999464569': modify #50362768380 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 35.045 ms
2023.02.22 09:23:27.303 Trades  '4999464569': modify #50362768379 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 35.756 ms
2023.02.22 09:23:27.304 Trades  '4999464569': modify #50362768378 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 36.187 ms
2023.02.22 09:23:27.304 Trades  '4999464569': modify #50362768377 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 36.773 ms
2023.02.22 09:23:27.304 Trades  '4999464569': modify #50362768376 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 36.843 ms
2023.02.22 09:23:27.305 Trades  '4999464569': modify #50362768374 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 37.149 ms
2023.02.22 09:23:27.305 Trades  '4999464569': modify #50362768373 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 37.541 ms
2023.02.22 09:23:27.306 Trades  '4999464569': modify #50362768371 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 38.152 ms
2023.02.22 09:23:27.306 Trades  '4999464569': modify #50362768370 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 38.642 ms
2023.02.22 09:23:27.307 Trades  '4999464569': modify #50362768369 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 39.110 ms
2023.02.22 09:23:27.308 Trades  '4999464569': modify #50362768367 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 39.672 ms
2023.02.22 09:23:27.308 Trades  '4999464569': modify #50362768366 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 40.118 ms
2023.02.22 09:23:27.309 Trades  '4999464569': modify #50362768365 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 40.995 ms
2023.02.22 09:23:27.309 Trades  '4999464569': modify #50362768364 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 41.391 ms
2023.02.22 09:23:27.310 Trades  '4999464569': modify #50362768362 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 41.708 ms
2023.02.22 09:23:27.310 Trades  '4999464569': modify #50362768361 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 42.394 ms
2023.02.22 09:23:27.322 Trades  '4999464569': modify #50362768359 buy limit 0.1 AUDCAD -> price: 0.91423, sl: 0.00000, tp: 0.00000 done in 54.233 ms
2023.02.22 09:23:27.322 Trades  '4999464569': modify #50362767168 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.267 ms
2023.02.22 09:23:27.322 Trades  '4999464569': modify #50362767167 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.284 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767166 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.243 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767165 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.242 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767164 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.393 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767163 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.415 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767162 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.452 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767161 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.456 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767160 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.474 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767158 buy limit 0.1 AUDCAD -> price: 0.91416, sl: 0.00000, tp: 0.00000 done in 54.445 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767157 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 54.472 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767155 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 54.471 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767154 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 54.537 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767152 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 54.508 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767151 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 54.526 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767149 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 54.566 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767148 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 54.564 ms
2023.02.22 09:23:27.323 Trades  '4999464569': modify #50362767145 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 54.568 ms
2023.02.22 09:23:27.324 Trades  '4999464569': modify #50362767141 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 55.319 ms
2023.02.22 09:23:27.324 Trades  '4999464569': modify #50362767140 buy limit 0.1 AUDCAD -> price: 0.91417, sl: 0.00000, tp: 0.00000 done in 55.397 ms

Смотрите на рост времени в миллисекундах в правом столбце. Выделил лаг в продвижении очереди на 12 мс.

На сервере формируется очередь на модификацию ордеров, где каждое продвижение занимает почти миллисекунду. Это нормально?


ЗЫ. На боевом терминале пинг 11 мс. При этом на асинхронную модификацию пачки ордеров уходит от 12 до 88 мс. Когда делаешь асинхронные приказы одновременно на нескольких торговых счетах одного торгового сервера, то это влияет на скорость модификации: модификация с одного торгового счета влияет на скорость модификации с другого торгового счета. Т.е. на торговом сервере единая на все счета очередь приказов. Так архитектурно задумано? Мнимая асинхронность - только терминал?


ЗЗЫ. На тему очереди.


ЗЗЗЫ. До нескольких десятков тысяч ордеров в минуту на один торговый сервер.

Формирование очередей исполнения торговых ордеров в MT5.
Формирование очередей исполнения торговых ордеров в MT5.
  • 2022.04.30
  • www.mql5.com
При анализе истории торгов обратил вниманием на интересную деталь влияния TP открытых позиций на исполнение лимитных ордеров. Переворот. Для подтверждения сделанной гипотезы был написан такой скрипт