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

 
fxsaber:

на выходных невозможно менять историю, поэтому не проверить.

Возможно. Поэтому нашлась проблема на выходных.

// Демонстрация лагов HistorySelect при удалении нескольких ордеров.
#property script_show_inputs

input int inAmount = 5; // Количество ордеров

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/332/Benchmark.mqh
#define _B2(A) _B(A, 10)

// true - ордер есть в истории, false - иначе.
bool HistorySelectOrder( const ulong Ticket )
{
  return((HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket) ||
         (_B2(HistorySelect(0, INT_MAX)) && (HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket)));
}

void OnStart()
{
  HistorySelect(0, INT_MAX); // Создали исторический кеш.
        
  MqlTradeRequest Request = {0};
  MqlTradeResult Result;
                        
  // Выставляем ордера
  Request.action = TRADE_ACTION_PENDING;
  Request.symbol = _Symbol;
  Request.volume = 0.01;
  Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - 1000 * _Point;
  Request.type = ORDER_TYPE_BUY_LIMIT;
        
  for (int i = 0; i < inAmount; i++)
    if (!OrderSend(Request, Result) || (Result.retcode != TRADE_RETCODE_DONE))
      Print("Good!");
            
  // Удаляем ордера
  Request.action = TRADE_ACTION_REMOVE;

  for (int i = OrdersTotal() - 1; i >= 0; i--)
  {
    Request.order = OrderGetTicket(i);

    if (OrderSend(Request, Result) && (Result.retcode == TRADE_RETCODE_DONE) &&
        !HistorySelectOrder(Request.order)) // Проверяем наличие удаленного ордера в истории.
      Print("OrderSend BUG!");
  }
}


Результат.

2020.09.27 15:46:11.940 Alert: Time[Test6.mq5 523: HistorySelect(0,INT_MAX)] = 39 mсs.
2020.09.27 15:46:11.988 Alert: Time[Test6.mq5 523: HistorySelect(0,INT_MAX)] = 253 mсs.
2020.09.27 15:46:12.034 Alert: Time[Test6.mq5 523: HistorySelect(0,INT_MAX)] = 190 mсs.
2020.09.27 15:46:12.083 Alert: Time[Test6.mq5 523: HistorySelect(0,INT_MAX)] = 218 mсs.
2020.09.27 15:46:12.130 Alert: Time[Test6.mq5 523: HistorySelect(0,INT_MAX)] = 250 mсs.

Лаги (могут доходить до нескольких миллисекунд) после удаления второго ордера.

 
Renat Fatkhullin:

Переходите на учет микросекунд. Миллисекунды уже не подходят.

Почему сервер МТ5 исполняет отложенные ордера за 100-200 миллисекунд? (у всем известного брокера на А)

 
fxsaber:

Возможно. Поэтому нашлась проблема на выходных.


Результат.

Лаги (могут доходить до нескольких миллисекунд) после удаления второго ордера.

Удаление ордеров приводит к полной инвалидации кеша выбранной истории.

В обычном режиме скорость выборки истории довели до десятков микросекунд.

 
secret:

Почему сервер МТ5 исполняет отложенные ордера за 100-200 миллисекунд? (у всем известного брокера на А)

Исполняет или принимает?

Без деталей на N сделках(чтобы можно было видеть картину в целом, а не вырванный одиночный ордер. включая пинги) обсуждать нельзя.

 
Renat Fatkhullin:

Удаление ордеров приводит к полной инвалидации кеша выбранной истории.

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

 
fxsaber:

Надо на форуме поискать. Помню, что показывал, как Generic-доступ к истории превосходит штатный механизм именно в Тестере.

Здесь дело было.

Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
Библиотека Generic классов - ошибки, описание, вопросы, особенности использования и предложения
  • 2017.12.08
  • www.mql5.com
С 6 декабря 2017 года в стандартную поставку MetaTrader 5 стали входить так называемые Generic-классы, реализующие эффективные алгоритмы для хранен...
 
Renat Fatkhullin:

Исполняет или принимает?

Без деталей на N сделках(чтобы можно было видеть картину в целом, а не вырванный одиночный ордер. включая пинги) обсуждать нельзя.

Исполняет.

Если цена одним тиком касается отложенного Limit-ордера и отскакивает обратно, и этот тик длится меньше 100-200 мс. То приблизительно в 30-50% случаев исполнение происходит с проскальзыванием. Т.е. по цене тика ордер не успевает исполниться.

Длительность тика смотрю по тиковому архиву брокера, поэтому пинги ни при чем.

В повышенную загрузку сервера тоже не верю, т.к. судя по номерам ордеров в эти моменты мало кто торгует.

Проскальзывание из-за недостатка ликвидности тоже ни при чем. Т.к. проявляется только на коротких тиках. Да и лот маленький.

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

Статистику по нескольким сделкам собрать трудоемко. Но можно, если это поможет ответить на вопрос.

 
secret:

Исполняет.

Если цена одним тиком касается отложенного Limit-ордера и отскакивает обратно, и этот тик длится меньше 100-200 мс. То приблизительно в 30-50% случаев исполнение происходит с проскальзыванием. Т.е. по цене тика ордер не успевает исполниться.

Длительность тика смотрю по тиковому архиву брокера, поэтому пинги ни при чем.

В повышенную загрузку сервера тоже не верю, т.к. судя по номерам ордеров в эти моменты мало кто торгует.

Проскальзывание из-за недостатка ликвидности тоже ни при чем. Т.к. проявляется только на коротких тиках. Да и лот маленький.

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

Статистику по нескольким сделкам собрать трудоемко. Но можно, если это поможет ответить на вопрос.

Надо детально разбираться, но если форекс, то скорее всего сделка на следующем тике.

Нужны логи и таблица тикового графика.
 
secret:

Если цена одним тиком касается отложенного Limit-ордера и отскакивает обратно, и этот тик длится меньше 100-200 мс. То приблизительно в 30-50% случаев исполнение происходит с проскальзыванием. Т.е. по цене тика ордер не успевает исполниться.

MT5 не при делах здесь. На демо-счетах будет идеальное исполнение.
 

ЗадолУтомился снепшоты отлаживать. В итоге сделал идеально. Один советник - тишь и гладь. Два - замечательно. 20 - катастрофа: CPU под 100%. HistorySelect по много миллисекунд лагает.

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