Свой тиковый Тестер.

23 марта 2024, 17:37
fxsaber
3
365

В общее пользование выложен исходник тикового тестера. Разберем его особенности.


Лаконичность.

Все спрятано в обертку, поэтому весь исходник выглядит так.

#property script_show_inputs

#define REPORT_TESTER             // В тестере будут автоматически записываться отчеты
#define REPORT_BROWSER            // Создание отчета с запуском браузера - требует разрешения DLL.

#define VIRTUAL_LIMITS_TP_SLIPPAGE // Лимитники и TP исполняются по первой цене акцепта - положительные проскальзывания
#define VIRTUAL_ALTERNATIVE // Альтернативная скорость расчетов

#include <fxsaber\Virtual\VirtualTester_Script.mqh> // https://www.mql5.com/ru/code/22577

// Сюда прописываем советник.
#include "EA.mq4" // https://www.mql5.com/ru/blogs/post/756829


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

VIRTUAL::TesterMulti(this.Symbols, this.TicksArray, StrategyMulti, this.Balance, StopFlag, Netting)

Встроить Тестер для своих нужд несложно.


Мультисимвольная OnTick-функция.

В mq4-файле можно видеть, что из себя представляет функция, вызываемая на каждом тике.

// Мультисимвольный OnTick.
void OnTickMulti( const string &Symb, const int &Index )

Тестер мультисимвольный, поэтому работает и в моносимвольном режиме.


Пока работает в режиме по пипсам (TickValue = 1). Пример адаптации под TickValue/Commission/Swap можно посмотреть здесь.


Пример.

Исходник выше - это повторение ранее выложенного советника для MT5-тестера. Что дает наглядную возможность сравнить два тестера между собой.


Логи.

Логи EA_Tester.ex5 в MT5-Тестере.

final balance 9950.82 pips
OnTester result -49.17999999999999
TESTER_EURUSD,M1: 2711808 ticks, 78596 bars generated. Environment synchronized in 0:00:00.038. Test passed in 0:00:07.104 (including ticks preprocessing 0:00:01.047).
TESTER_EURUSD,M1: total time from login to stop testing 0:00:07.142 (including 0:00:00.038 for history data synchronization)
6309318 total ticks for all symbols
TESTER_EURUSD: generate 2711808 ticks in 0:00:00.453, passed to tester 2711809 ticks
TESTER_USDJPY: generate 3597511 ticks in 0:00:00.594, passed to tester 3597510 ticks


Логи EA_VirtualTester.ex5 (прикреплен) в MT5-Терминале (скрипт).

Getting Ticks (2024.01.01 00:00:00 - 2024.03.19 00:00:00)...
"TESTER_EURUSD" "TESTER_USDJPY"
1. TESTER_EURUSD: 2711808 ticks (2024.01.02 00:00:00 - 2024.03.18 23:59:55)
2. TESTER_USDJPY: 3597511 ticks (2024.01.02 00:00:00 - 2024.03.18 23:59:59)
Calculating (CLASSIC) 6309319 ticks...
final balance 9950.82 pips
OnTester result -49.18000000001757
Test passed in 00:00:02.059 (including ticks preprocessing 00:00:00.529).
total ticks for all symbols 6309319 (2024.01.02 00:00:00 - 2024.03.18 23:59:59)
TESTER_EURUSD: generate 2711808 ticks in 00:00:00.232
TESTER_USDJPY: generate 3597511 ticks in 00:00:00.296
Performance: 4 122 051.3 ticks/sec., 00:00:01.530


Итоговый результат совпадает, различие только в скорости.


Benchmark-режим.

VirtualTester поддерживает Apart-режим для мультисимвольных ТС. Это дополнительный интерес к замеру скорости.


Логи Classic-режима при Benchmark=5.

Benchmark mode.
Getting Ticks (2024.01.01 00:00:00 - 2024.03.19 00:00:00)...
"TESTER_EURUSD" "TESTER_USDJPY"
1. TESTER_EURUSD: 2711808 ticks (2024.01.02 00:00:00 - 2024.03.18 23:59:55)
2. TESTER_USDJPY: 3597511 ticks (2024.01.02 00:00:00 - 2024.03.18 23:59:59)
Calculating (CLASSIC) 6309319 ticks...
1/5: Performance = 4 119 069.6 [00:00:01.531](100.00%), Best = 4 119 069.6 ticks/sec [00:00:01.531]
Calculating (CLASSIC) 6309319 ticks...
2/5: Performance = 4 120 985.1 [00:00:01.531](100.00%), Best = 4 120 985.1 ticks/sec [00:00:01.531]
Calculating (CLASSIC) 6309319 ticks...
3/5: Performance = 4 127 131.3 [00:00:01.528](100.00%), Best = 4 127 131.3 ticks/sec [00:00:01.528]
Calculating (CLASSIC) 6309319 ticks...
4/5: Performance = 4 103 139.0 [00:00:01.537](99.42%), Best = 4 127 131.3 ticks/sec [00:00:01.528]
Calculating (CLASSIC) 6309319 ticks...
5/5: Performance = 4 093 449.0 [00:00:01.541](99.18%), Best = 4 127 131.3 ticks/sec [00:00:01.528]
-----------------
BestPerformance = 4 127 131.3 ticks/sec [00:00:01.528]


Логи Apart-режима при Benchmark=5.

Benchmark mode.
Getting Ticks (2024.01.01 00:00:00 - 2024.03.19 00:00:00)...
"TESTER_EURUSD" "TESTER_USDJPY"
1. TESTER_EURUSD: 2711808 ticks (2024.01.02 00:00:00 - 2024.03.18 23:59:55)
2. TESTER_USDJPY: 3597511 ticks (2024.01.02 00:00:00 - 2024.03.18 23:59:59)
Calculating (APART) 6309319 ticks...
1/5: Performance = 14 942 530.1 [00:00:00.422](100.00%), Best = 14 942 530.1 ticks/sec [00:00:00.422]
Calculating (APART) 6309319 ticks...
2/5: Performance = 15 290 796.4 [00:00:00.412](100.00%), Best = 15 290 796.4 ticks/sec [00:00:00.412]
Calculating (APART) 6309319 ticks...
3/5: Performance = 15 306 302.2 [00:00:00.412](100.00%), Best = 15 306 302.2 ticks/sec [00:00:00.412]
Calculating (APART) 6309319 ticks...
4/5: Performance = 15 331 072.7 [00:00:00.411](100.00%), Best = 15 331 072.7 ticks/sec [00:00:00.411]
Calculating (APART) 6309319 ticks...
5/5: Performance = 15 389 784.0 [00:00:00.409](100.00%), Best = 15 389 784.0 ticks/sec [00:00:00.409]
-----------------
BestPerformance = 15 389 784.0 ticks/sec [00:00:00.409]


В данной конфигурации Apart-режим дает четырехкратное увеличение скорости. Это примерно соответствует VirtualTester для моносимвольной ТС.


Stop-режим.

Возможно избежать принудительного закрытия позиций под конец бэктеста.


Report.


VirtualTester автоматически создает HTML-отчет (открывается автоматически, если разрешить использование DLL), где визуализированы данные торговли.


Оптимизация.

VirtualTester независим от MT5-Тестера, но при этом может участвовать в многоядерной (облачной) оптимизации MT5-тестера в математическом режиме. Эта возможность выходит за рамки данного поста.


Также VirtualTester может выступать в качестве ФФ-функции для множества алгоритмов Оптимизации, реализуя смелые сценарии использования: автооптимизация и т.д.


Бары/Индикаторы.

VirtualTester не поддерживает бары/индикаторы. Бары возможно встроить в виде соответсвующих OHLC-тиков. Кто-то работает только с тиками...


Огромное количество ордеров.

Производительность слабо зависит от количества ордеров. Можно смело использовать безумные гридеры, портфели ТС и т.д.


Вывод.

Тестер рабочий и, возможно, самый быстрый из тиковых. Чтобы попробовать, прикреплен соответствующий EX5-файл.

Ссылка на блог автора.

Файлы: