Библиотеки: TesterBenchmark

 

TesterBenchmark:

Замер чистой производительности тестеров стратегий MetaTrader 4/5.

Данная библиотека позволяет добавлением в советник одной строки

#include <TesterBenchmark.mqh>

получать в логах данные чистой производительности тестера.

Core 1  2017.07.21 23:59:59   Interval = 8.842 s., Count = 3387955, 383166.1 unit/sec
Core 1  EURUSD,M1: 3387955 ticks, 52608 bars generated. Environment synchronized in 0:00:01.389. Test passed in 0:00:09.422 (including ticks preprocessing 0:00:00.187).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.811 (including 0:00:01.389 for history data synchronization)

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

------
OnTesterInit
i = 0 Pass = 0 OnTester = 8.687 s.: Count = 3387955, 390002.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000
i = 1 Pass = 1 OnTester = 8.702 s.: Count = 3387955, 389330.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000
iMin = 0 Results[iMin] = 8.687s.
iMax = 1 Results[iMax] = 8.702s.
Amount = 2 Mean = 8.694 s. - 83.89%
OnTesterDeinit
------
Interval = 20.729 s., Count = 0, 0.0 unit/sec

В данном случае видно, что было два запуска на одном и том же локальном Агенте. Показаны минимальное, максимальное и среднее время расчета прохода. И видно общее время (Interval) оптимизатора. Процентная характеристика (83.89%) показывает, какую часть общего времени занимает в среднем чистая работа тестера на одном проходе от времени работы оптимизатора (там еще учитывается время на синхронизацию с Агентами и т.д.).

Автор: fxsaber

 

Берем советник из поставки и запускаем его в тестере, получая такие данные производительности

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214s.
iMax = 0 Results[iMax] = 2.231s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

Теперь же запустим этот же советник, но с использованием Trade.mqh

------
OnTesterInit
i = 0 Pass = 0 OnTester = 3.330 s.: Count = 3387955, 1017403.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 3.475 s.: Count = 3387955, 974951.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 0 Results[iMin] = 3.330s.
iMax = 1 Results[iMax] = 3.475s.
Amount = 2 Mean = 3.402 s. - 89.73%
OnTesterDeinit
------
Interval = 7.584 s., Count = 0, 0.0 unit/sec

Получилось, что торговая СБ в 1.5 раза медленнее чистого MQL5!

Предположил, что причина в этом, и внес маленькую правку в Trade.mqh

//+------------------------------------------------------------------+
//| Access functions PositionSelect(...)                             |
//+------------------------------------------------------------------+
bool CPositionInfo::Select(const string &symbol)
  {
   return(PositionSelect(symbol));
  }

Но тормоза СБ-варианта не исчезли.

Где собака зарыта, что СБ так тормозит?

 

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

Библиотеки: TesterBenchmark

fxsaber, 2017.07.24 14:13

Берем советник из поставки и запускаем его в тестере, получая такие данные производительности

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214s.
iMax = 0 Results[iMax] = 2.231s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

Это был режим Оптимизации. А теперь ЭТОТ же советник, но в режиме одиночного прогона

Core 1  2017.07.21 23:59:59   Interval = 5.140 s., Count = 3387955, 659135.2 unit/sec
Core 1  EURUSD,M1: 3387955 ticks, 52608 bars generated. Test passed in 0:00:05.164.

Одиночный прогон на локальном Агенте в 2.3 раза медленнее, чем на ЭТОМ же Агенте, но во время Оптимизации!


Возможно, дело в тормозах тестера, поэтому посмотрим, что покажет профилирование только OnTick (вопросы исполнения и другого торгового окружения на результат не будут влиять) в режимах Оптимизации и одиночного прохода.


Оптимизация

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.910 s.: OnTick Profiler: Count = 3387955, Interval = 0.969 s., 3496753.0 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.862 s.: OnTick Profiler: Count = 3387955, Interval = 0.952 s., 3559797.1 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.862s.
iMax = 0 Results[iMax] = 2.910s.
Amount = 2 Mean = 2.886 s. - 78.06%
OnTesterDeinit
------
Interval = 7.394 s., Count = 0, 0.0 unit/sec


Одиночный

Core 1  2017.07.21 23:59:59   Interval = 6.149 s. (Profiler: Count = 3387955, Interval = 4.018 s., 843148.2 unit/sec)
Core 1  EURUSD,M1: 3387955 ticks, 52608 bars generated. Test passed in 0:00:06.162.


Чистое выполнение самого OnTick аж в 4.2 раза медленнее в режиме Одиночного прогона, чем при Оптимизации. И это на одном и том же локальном Агенте!

 
fxsaber:

Одиночный прогон на локальном Агенте в 2.3 раза медленнее, чем на ЭТОМ же Агенте, но во время Оптимизации!

Такая же ситуация и в MT4. Возможно, в четверке тормоза из-за формирования логов во время Одиночного прохода.

 
Пока получается такая мораль: вместо одиночного тестирования нужно запускать мнимую оптимизацию на одном значении?
 

Всегда было интересно, какой торговый API быстрее - чистый MQL4 или чистый MQL5.

Поэтому проведем профилирование OnTick одного и того же советника в MT4/5, чтобы исключить влияние производительности самих тестеров.


MT5x64 (Оптимизация)

i = 1 Pass = 1 OnTester = 2.862 s.: OnTick Profiler: Count = 3387955, Interval = 0.952 s., 3559797.1 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641


MT4x86(Одиночный прогон)

2017.07.24 15:38:10.770 EURUSD,M1: 1044487 tick events (39659 bars, 1045534 bar states) processed in 0:00:01.903 (total time 0:00:01.997)
2017.07.24 15:38:10.770 2017.07.08 22:10:23  TesterBenchmark_Example EURUSD,M1: Interval = 1.878 s. (Profiler: Count = 1044487, Interval = 1.284 s., 813504.6 unit/sec)


Можно сделать вывод, что одна и та же торговая логика, написанная в MT4 на своем чистом торговым API, и, написанная на MT5 на своем чистом торговом API, отличаются по скорости следующим образом.

MT5 быстрее MT4  в 4.4 раза! Заметьте, что сравниваются не скорости языков, а скорости торговых API для одной и той же ТС.

 
Stanislav Korotky:
Пока получается такая мораль: вместо одиночного тестирования нужно запускать мнимую оптимизацию на одном значении?

Да, если хочется быстро. При этом отчет торговли передавать с Агента.

Но, по-моему, такое положение вещей является багом и должно быть исправлено.


Мнимая оптимизация на одном значении только реализовывается еще через одном место - нужно, как минимум, два прохода для корректного запуска Оптимизатора. При этом второй (мнимый) проход надо будет отлавливать в OnInit c возвратом INIT_PARAMETERS_INCORRECT (или ExpertRemove()).

 
fxsaber:

MT5 быстрее MT4  в 4.4 раза! Заметьте, что сравниваются не скорости языков, а скорости торговых API для одной и той же ТС.

Но все же интересно, насколько и какой тестер производительней. ТС из поставки не использует историю котировок, поэтому особенно хороша для подобного сравнения.

Будем замерять оба тестера в режиме Оптимизации, чтобы избежать различных нюансов.


MT5 (Оптимизация)

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

Библиотеки: TesterBenchmark

fxsaber, 2017.07.24 14:13

------
OnTesterInit
i = 0 Pass = 0 OnTester = 2.231 s.: Count = 3387955, 1518581.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
i = 1 Pass = 1 OnTester = 2.214 s.: Count = 3387955, 1530241.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1641
iMin = 1 Results[iMin] = 2.214s.
iMax = 0 Results[iMax] = 2.231s.
Amount = 2 Mean = 2.223 s. - 79.08%
OnTesterDeinit
------
Interval = 5.621 s., Count = 0, 0.0 unit/sec

MT4 (Одиночный)

2017.07.24 15:58:50.775 EURUSD,M1: 1044487 tick events (39659 bars, 1045534 bar states) processed in 0:00:01.513 (total time 0:00:01.607)
2017.07.24 15:58:50.775 2017.07.08 22:11:32  TesterBenchmark_Example EURUSD,M1: Interval = 1.486 s., Count = 1044487, 702884.9 unit/sec


Поскольку Одиночный тормозит и в MT4, делаем Оптимизацию и смотрим чистое время в OnTester

Получаем, что скорость MT4-тестера 702884.9 * 1.486 / 0.607 = 1720736.3 тиков/секунду.


Вывод: MT4-тестер быстрее MT5-тестера на ~12%.

 
fxsaber:

Но все же интересно, насколько и какой тестер производительней. ТС из поставки не использует историю котировок, поэтому особенно хороша для подобного сравнения.

Т.е. сравнивается просто сферический конь в вакууме )  Какой смысл в тестере без котировок?
 
Alexey Navoykov:
Т.е. сравнивается просто сферический конь в вакууме )  Какой смысл в тестере без котировок?

Тестер формирует котировки, а сама ТС этим не пользуется, чтобы не засорять результат разницей в реализации High[] и CopyHigh.

Тестер создает торговое окружение, включая историю. И именно тестер мы и меряли, а не пользовательские запросы (не путать с формированием) истории, реализованные в платформах принципиально по-разному.

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

 
fxsaber:

Берем советник из поставки и запускаем его в тестере, получая такие данные производительности

Теперь же запустим этот же советник, но с использованием Trade.mqh

Получилось, что торговая СБ в 1.5 раза медленнее чистого MQL5!

Предположил, что причина в этом, и внес маленькую правку в Trade.mqh

Но тормоза СБ-варианта не исчезли.

Где собака зарыта, что СБ так тормозит?

Разработчики что-то подкрутили в 1648 и исправили некоторые ошибки, что удалось оценить производительность еще одной торговой библиотеки.

Текущий расклад такой.


Чистый MQL5

------
OnTesterInit
i = 0 Pass = 0 OnTester = 13.451 s.: Count = 19469844, 1447464.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 10.904 s.: Count = 19469844, 1785569.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 10.895 s.: Count = 19469844, 1787044.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 10.898 s.: Count = 19469844, 1786552.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 10.889 s.: Count = 19469844, 1788028.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 4 Results[iMin] = 10.889s.
iMax = 0 Results[iMax] = 13.451s.
Amount = 5 Mean = 11.407 s. - 89.58%
OnTesterDeinit
------
Interval = 63.675 s., Count = 0, 0.0 unit/sec


#include <Trade\Trade.mqh>

------
OnTesterInit
i = 0 Pass = 0 OnTester = 14.390 s.: Count = 19469844, 1353012.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 13.044 s.: Count = 19469844, 1492628.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 13.016 s.: Count = 19469844, 1495839.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 13.014 s.: Count = 19469844, 1496069.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 13.039 s.: Count = 19469844, 1493200.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 3 Results[iMin] = 13.014s.
iMax = 0 Results[iMax] = 14.390s.
Amount = 5 Mean = 13.301 s. - 94.05%
OnTesterDeinit
------
Interval = 70.713 s., Count = 0, 0.0 unit/sec


#include <MT4Orders.mqh>

------
OnTesterInit
i = 0 Pass = 0 OnTester = 14.385 s.: Count = 19469844, 1353482.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 1 Pass = 1 OnTester = 11.434 s.: Count = 19469844, 1702802.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 2 Pass = 2 OnTester = 11.459 s.: Count = 19469844, 1699087.5 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 3 Pass = 3 OnTester = 11.440 s.: Count = 19469844, 1701909.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
i = 4 Pass = 4 OnTester = 11.426 s.: Count = 19469844, 1703994.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1648
iMin = 4 Results[iMin] = 11.426s.
iMax = 0 Results[iMax] = 14.385s.
Amount = 5 Mean = 12.029 s. - 91.20%
OnTesterDeinit
------
Interval = 65.946 s., Count = 0, 0.0 unit/sec


Места распределились следующим образом

  1. Чистый MQL5 - 100% производительность.
  2. MT4Orders.mqh  - ~95% производительность.
  3. СБ Trade\Trade.mqh - ~84% производительность.
СБ стала меньше отставать.


ЗЫ Интересно, сколько показывают другие торговые библиотеки...

ЗЫ2 А что это за тормоза в 1648 на первом проходе каждой пачки? В 1643 было так

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.08.15 17:16

В первом проходе пачки заданий Агента (например, при одиночном прогоне тестера) время между запуском советника и первым NewTick-событием может занимать несколько секунд. На следующих проходах пачки это время нулевое.

Как будто в 1648 тестер тут же делает NewTick-событие. Что, конечно, неправильно.