Анализ результатов тестов и оптимизации в тестере стратегий MetaTrader 5 - страница 2

 
Anatoli Kazharski:

Проверяется long-параметр (lparam). Идентификатор события тика содержится в нём.

Идентификатор пользовательского события (int id) равен нулю.

Можно вот так, чтобы было понятнее:

Понял, что все надо переписать, чтобы заработало корректно. Сейчас накидаю.

 
fxsaber:

Понял, что все надо переписать, чтобы заработало корректно. Сейчас накидаю.

А не могу, потому что это дерьмо происходит

2018.01.28 12:37:23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01.28 12:37:24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0:00.998 (0.09 Kb/sec)
2018.01.28 12:37:24.692 Tester  EURUSD: ticks data begins from 2017.09.01 00:00
2018.01.28 12:37:24.692 Core 1  agent process started
2018.01.28 12:37:33.425 Core 1  connecting to 127.0.0.1:3000
2018.01.28 12:37:50.450 Core 1  tester agent authorization error
2018.01.28 12:37:50.456 Core 1  connection closed
и не запустить Тестер.
 

Индикатор

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Советник

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    Sum2 += GetBid(Symbols[(int)lparam]);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, без задержки, только Core1-агент, реальные тики 01.09.2017 - 28.01.2018.


Один символ

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677, 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s.: Count = 9986677, 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Два символа

i = 0 Pass = 0 OnTester = 25.747 s.: Count = 9986677, 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677, 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Три символа

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677, 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s.: Count = 9986677, 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


  1. В режиме одного символа "шпион" работает в 2.5 раза медленнее, чем чистый OnTick. Т.е. индикатор пустышка (строится на PERIOD_W1, чтобы история баров была минимальна) имеет огромный оверхед в Тестере!
  2. Два символа медленее в 3.5 раза, чем один.
  3. А вот три символа только в 1.8 медленнее, чем два символа. Т.е. переход от двух к трем объясняется масштабируемостью., в отличие от п.2.
 

Анатолий, предалагаю перенести тему в раздел Эксперты Форекс, торговые роботы и советники и закрепить её там наверху.

Так она будет всегда на виду. Здесь же и так много уже закрепленных тем

 
Rashid Umarov:

Анатолий, предалагаю перенести тему в раздел Эксперты Форекс, торговые роботы и советники и закрепить её там наверху.

Так она будет всегда на виду. Здесь же и так много уже закрепленных тем

Не против конечно, если тема может быть полезной.
 
fxsaber:

...

  1. В режиме одного символа "шпион" работает в 2.5 раза медленнее, чем чистый OnTick. Т.е. индикатор пустышка (строится на PERIOD_W1, чтобы история баров была минимальна) имеет огромный оверхед в Тестере!
  2. Два символа медленее в 3.5 раза, чем один.
  3. А вот три символа только в 1.8 медленнее, чем два символа. Т.е. переход от двух к трем объясняется масштабируемостью., в отличие от п.2.

У Вас результат 6, 25, 46. Почему не 6, 12 и 18 ?

Замедление нужно смотреть относительно одного символа. Тогда три символа медленнее одного почти в 8 раз, а не в 3, как ожидается.

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

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

Анализ результатов тестов и оптимизации в тестере стратегий MetaTrader 5

Anatoli Kazharski, 2018.01.27 20:15

Вопрос:

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

//---

Если это невозможно, то один из вариантов для разработчиков терминала добавить ещё один режим, когда можно проводить тест последовательно символ за символом, а не все символы одновременно. Это бы выдавало в итоге ожидаемое время тестов. Дело в том, что мультисимвольность экспертов очень часто используется просто для тех случаев, когда: 

  1. Необходимо больше данных для тестов.
  2. Проверить торговый алгоритм на большем разнообразии поведения цены, условиях (спред, стоп/лимит уровни) и т.д., с одними и теми же параметрами.

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


 
Anatoli Kazharski:

У Вас результат 6, 25, 46. Почему не 6, 12 и 18 ?

Замедление нужно смотреть относительно одного символа.

Два символа со шпионами - сильно отличающийся режим работы тестера, чем один символ. Поэтому масштабируемость логично смотреть относительно двух.

Более того, индикаторный оверхед настолько дикий, что работать через шпионов - костылище. Ждем Сервисы, где масштабируемость должна быть почти идеальной, относительно как раз одного символа. Как это происходит с таймером. Только там пропусков тиков не будет.

 
Значительно ускорил
#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnTick( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}


Один символ

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677, 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s.: Count = 9986677, 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Два символа

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677, 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s.: Count = 9986677, 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Три символа

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677, 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s.: Count = 9986677, 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Четыре символа

i = 0 Pass = 0 OnTester = 68.459 s.: Count = 9986677, 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677, 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
 
fxsaber:

Два символа со шпионами - сильно отличающийся режим работы тестера, чем один символ. Поэтому масштабируемость логично смотреть относительно двух.

Более того, индикаторный оверхед настолько дикий, что работать через шпионов - костылище. Ждем Сервисы, где масштабируемость должна быть почти идеальной, относительно как раз одного символа. Как это происходит с таймером. Только там пропусков тиков не будет.

fxsaber:
Значительно ускорил

Один символ

Два символа

Три символа

Четыре символа

Если смотреть результаты относительно двух символов, то тогда результат двух символов делим на два: 17 / 2 = 8.5

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

  • три символа: 8.5 * 3 = 25, а по факту 35.462 s.
  • четыре символа: 8.5 * 4 = 34, а по факту 68.459 s.

Но это в любом случае наилучший на текущий момент результат. Интересный вариант получился, использовать текущий символ в OnTick, а остальные по кастомным событиям.

Пока нет сервисов можно им воспользоваться. 

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

Последовательность выполнение Init() и DeInit()

Slava, 2017.04.14 10:18

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

Поставщик рыночных данных - это только одна из возможностей.

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

Последовательность выполнение Init() и DeInit()

Slava, 2017.04.14 10:21

У сервисов будет OnTick(string symbol). Но на тики от конкретного символа надо будет подписаться

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

Последовательность выполнение Init() и DeInit()

fxsaber, 2017.04.14 10:46

Получается, что Сервисы будут иметь почти все On-функции: OnInit, OnDeinit, OnTick(string), OnTimer, OnTrade, OnTradeTransaction, OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit, OnBookEvent, OnChartEvent(long ChartID, ...), OnCalculate, ...

И если не нужны индикаторные буферы и не хочешь сталкиваться с костылями индикаторов/советников, то пиши в не страдающем (тянущимися из предыдущих версий MT) ограничениями новом виде программ - Сервисы.

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