Берем советник из поставки и запускаем его в тестере, получая такие данные производительности
------ 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)); }
Но тормоза СБ-варианта не исчезли.
Где собака зарыта, что СБ так тормозит?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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 раза медленнее в режиме Одиночного прогона, чем при Оптимизации. И это на одном и том же локальном Агенте!
Одиночный прогон на локальном Агенте в 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 для одной и той же ТС.
Пока получается такая мораль: вместо одиночного тестирования нужно запускать мнимую оптимизацию на одном значении?
Да, если хочется быстро. При этом отчет торговли передавать с Агента.
Но, по-моему, такое положение вещей является багом и должно быть исправлено.
Мнимая оптимизация на одном значении только реализовывается еще через одном место - нужно, как минимум, два прохода для корректного запуска Оптимизатора. При этом второй (мнимый) проход надо будет отлавливать в OnInit c возвратом INIT_PARAMETERS_INCORRECT (или ExpertRemove()).
MT5 быстрее MT4 в 4.4 раза! Заметьте, что сравниваются не скорости языков, а скорости торговых API для одной и той же ТС.
Но все же интересно, насколько и какой тестер производительней. ТС из поставки не использует историю котировок, поэтому особенно хороша для подобного сравнения.
Будем замерять оба тестера в режиме Оптимизации, чтобы избежать различных нюансов.
MT5 (Оптимизация)
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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%.
Но все же интересно, насколько и какой тестер производительней. ТС из поставки не использует историю котировок, поэтому особенно хороша для подобного сравнения.
Т.е. сравнивается просто сферический конь в вакууме ) Какой смысл в тестере без котировок?
Тестер формирует котировки, а сама ТС этим не пользуется, чтобы не засорять результат разницей в реализации High[] и CopyHigh.
Тестер создает торговое окружение, включая историю. И именно тестер мы и меряли, а не пользовательские запросы (не путать с формированием) истории, реализованные в платформах принципиально по-разному.
Та же байда с замером производительности торговых API.
Берем советник из поставки и запускаем его в тестере, получая такие данные производительности
Теперь же запустим этот же советник, но с использованием 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
Места распределились следующим образом
- Чистый MQL5 - 100% производительность.
- MT4Orders.mqh - ~95% производительность.
- СБ Trade\Trade.mqh - ~84% производительность.
ЗЫ Интересно, сколько показывают другие торговые библиотеки...
ЗЫ2 А что это за тормоза в 1648 на первом проходе каждой пачки? В 1643 было так
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2017.08.15 17:16
В первом проходе пачки заданий Агента (например, при одиночном прогоне тестера) время между запуском советника и первым NewTick-событием может занимать несколько секунд. На следующих проходах пачки это время нулевое.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
TesterBenchmark:
Замер чистой производительности тестеров стратегий MetaTrader 4/5.
Данная библиотека позволяет добавлением в советник одной строки
#include <TesterBenchmark.mqh>
получать в логах данные чистой производительности тестера.
Более того, если в тестере переключиться с одиночного прогона на режим оптимизации (диапазоны оптимизации задавать не требуется для MetaTrader 5), то библиотека запустит заданное количество раз советник, выдав статистику производительности тестера, по которой можно составить представление об уже чистой производительности тестера.
В данном случае видно, что было два запуска на одном и том же локальном Агенте. Показаны минимальное, максимальное и среднее время расчета прохода. И видно общее время (Interval) оптимизатора. Процентная характеристика (83.89%) показывает, какую часть общего времени занимает в среднем чистая работа тестера на одном проходе от времени работы оптимизатора (там еще учитывается время на синхронизацию с Агентами и т.д.).
Автор: fxsaber