Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

TesterBenchmark - библиотека для MetaTrader 5

Просмотров:
2429
Рейтинг:
(23)
Опубликован:
2017.07.24 07:46
Обновлен:
2017.09.05 20:48
\MQL5\Include\ \MQL5\Experts\
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

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

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

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

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)

слабо говорят о чистой производительности советника/тестера и могут довольно сильно "плавать" от запуска к запуску.

Чистым же временем работы непосредственно Тестера Стратегий является время, прошедшее от первого Tick-события (первый запуск OnTick) до последнего тика интервала тестирования. Сразу после окончания интервала тестирования тестер вызывает OnTester (OnDeinit идет после).


Чистое время выполнения прогона тестером

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

#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%) показывает, какую часть общего времени занимает в среднем чистая работа тестера на одном проходе от времени работы оптимизатора (там еще учитывается время на синхронизацию с Агентами и т.д.).



Профайлинг OnTick

Добавление еще одной строки

#define PROFILER_OnTick // Замеряет чистое время выполнения всех OnTick - немного замедляет общую работу
#include <TesterBenchmark.mqh>

позволяет увидеть время, потраченное исключительно на выполнение OnTick - не учитывается время на симуляцию торгового окружения, исполнение и т.д.

------
OnTesterInit
i = 0 Pass = 0 OnTester = 9.540 s.: OnTick Profiler: Count = 3387955, Interval = 8.079 s., 419359.4 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000
i = 1 Pass = 1 OnTester = 9.471 s.: OnTick Profiler: Count = 3387955, Interval = 8.029 s., 421956.9 unit/sec , Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000
iMin = 1 Results[iMin] = 9.471s.
iMax = 0 Results[iMax] = 9.540s.
Amount = 2 Mean = 9.505 s. - 98.86%
OnTesterDeinit
------
Interval = 19.231 s., Count = 0, 0.0 unit/sec



Пример

К библиотеке идет советник-пример (MQL4/5) с шапкой, по которой можно понять одно из практических применений библиотеки.

#include <TesterBenchmark.mqh>

// Если обе include-строки ниже закомментированы, то торговая логика написана на чистом MQL5 - торговом API
// Иначе - что раскомментировали, та торговая API-обертка и используется.
// TesterBench покажет, какая производительность у каждого (из трех) API.
// #include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
// #include <Trade\Trade.mqh>
OzFx OzFx

Система OzFx. Использует индикаторы Accelerator Oscillator и Stochastic Oscillator.

Trade in Channel Trade in Channel

Торговая система "Ценовой канал" (Price Channel).

Symbol Symbol

Библиотека для работы с обычными и кастомными символами

Nevalyashka Nevalyashka

Открываем новую позицию, противоположную предыдущей. Из настроек только Stop loss, Take Profit и количество минимальных лотов.