Классификация советников.
Все советники, запускаемые в Оптимизаторе, делятся на два типа.
- Торговые.
- Статистические: "обучение", обработка котировочных данных.
Каждый из них тоже делится на два типа.
- Индикаторные: используют бары и/или индикаторы.
- Безындикаторные: только тики.
Наконец, каждый торговый MT5-советник также бывает двух типов.
На основе этой классификации рассмотрим некоторые из вариантов.
Статистические безындикаторные советники.
Принцип этих советников один и тот же: по ходу получения исторических тиков что-то на основе их вычисляется и куда-то записывается. Иногда даже оптимизация не нужна - достаточно одиночного прогона.
Пример такого советника.
#property tester_no_cache input int inRange = 0; double gSum = 0; void OnTick() { static int Count = 0; static MqlTick Tick; // Учитываем только каждый inRange (по счету) тик. if (!(Count++ % inRange) && SymbolInfoTick(_Symbol, Tick)) gSum += Tick.ask - Tick.bid; // Вычисляем сумму спредов. } double OnTester() { return(gSum); } // Сумма спредов всех inRange (по счету) тиков.
Специально привел столь лаконичный советник для наглядности.
Оптимизация даже такого простого советника может вызвать затруднения и потребовать серьезной работы железа. Наперед скажу, что в замерах буду использовать RAMDrive (подробности ниже), чтобы не зависеть от скорости дисковой системы.
optimization finished, total passes 120 optimization done in 3 minutes 15 seconds shortest pass 0:00:07.967, longest pass 0:00:15.937, average pass 0:00:09.564
195 секунд понадобилось на оптимизацию.
EAToMath.
Подключаем EAToMath и получаем такой результат в мат. режиме.
optimization finished, total passes 120 optimization done in 0 minutes 23 seconds shortest pass 0:00:00.872, longest pass 0:00:01.419, average pass 0:00:01.109
23 секунды с тем же вычислительным результатом. Ускорение в ~8.5 раз.
Сравнение двух способов вычисления так выглядит в Benchmark-режиме.
На скрине видна конфигурация довольно слабой машины. Но даже на ней получилось достичь суммарной производительности 200 миллионов тиков в секунду. Поэтому обрабатывать миллиард тиков в секунду - посильная задача для доступных сейчас современных конфигураций железа.
Заметьте, насколько много времени уходит на практически пустые проходы в режиме реальных тиков. Плюс к этому серьезным образом забивается RAM/Disk. В мат. режиме этих недостатков нет. Причина в механизме.
Механизм.
Чтобы лучше раскрыть внутреннюю работу EAToMath, применим такой макрос.
#define EATOMATH_ADVANCED_SETTINGS // Дополнительные настройки EAToMath. #include <fxsaber\EAToMath\EAToMath.mqh> // https://www.mql5.com/ru/code/61283
Среди входных параметров появятся дополнительные.
На скрине проставлены номера для соответствующего описания.
- Путь к файлу (относительно Common-папки), в котором хранятся тики для мат. режима. Файл в формате TicksShort.
- Чтение файловых тиков из памяти (FileMap = true) или с места хранения файла (FileMap = false).
- Какими порциями читать файловые тики. Принцип похож на п.3 здесь.
- Сколько копий файловых тиков использовать. На некоторых конфигурациях с многокальной памятью этот параметр может влиять на итоговую производительность.
Эти четыре параметра управляют доступом всех Агентов к одному единому на всех архиву котировок, что позволяет экономить на памяти. Сам же архив довольно быстро распаковывается на лету, что добавляет к общей производительности.
RAMDrive.
Режим FileMap=false позволяет перейти к чтению файловых тиков через обычные файловые операции. Чтобы это делать быстро, иногда разумно использовать RAMDrive, что снимает некоторые ограничения и дает возможности для доп. ускорения.
Использую такой RamDrive: http://www.ltr-data.se/opencode.html/#ImDisk
Тогда запуск следующего батника в Common-папке
rem Создали RAM-Drive для Тестера. imdisk -a -o awe -s 3G -m Z: -p "/fs:ntfs /q /y /v:MT5Tester" mkdir z:\EAToMath.mqh mklink /j EAToMath.mqh z:\EAToMath.mqh
размещает соответствующую папку EAToMath на RAMDrive.
Торговые индикаторные советники в MT4-Style.
В MT5 много советников написано в MT4-Style. Это дает не только удобство/надежность, но и дополнительные возможности. В частности, их оптимизацию можно бесплатно ускорять.
EAToMath.
И снова EAToMath, но в другом режиме. Для примера возьмем торговый советник из описания библиотеки.
Оптимизируем этот советник без EAToMath по реальным тикам и в пипсах. И с большим депозитом (советник сливает - пример).
optimization finished, total passes 120 optimization done in 9 minutes 22 seconds shortest pass 0:00:17.264, longest pass 0:00:40.075, average pass 0:00:27.003
562 секунды.
Теперь подключаем EAToMath и просим вести торговлю в виртуальном окружении.
optimization finished, total passes 120 optimization done in 3 minutes 40 seconds shortest pass 0:00:07.308, longest pass 0:00:12.145, average pass 0:00:10.804
220 секунд с тем же результатом. Т.е. в данном случае получено бесплатное ускорение в ~2.5 раза.
Этот способ не нов (см. "Ускорение тестера" здесь), просто иная обертка.
Торговые безындикаторные советники в MT4-Style.
Наконец, рассмотрим тиковые советники. И их тоже можно запускать в мат. режиме через EAToMath. Возьмем для демонстрации все тот же советник из описания и запустим его оптимизацию согласно там же данной инструкции в мат. режиме.
optimization finished, total passes 120 optimization done in 0 minutes 39 seconds shortest pass 0:00:01.224, longest pass 0:00:02.186, average pass 0:00:01.861
Итак, было 562 секунды, стало - 39 секунд. Ускорение в ~14 раз при идентичных результатах вычислений. И почти без каких-либо требований к количеству Агентов и свободной памяти/диска.
Описанный ваше пункт "Механизм" полноценно действует и здесь. Можно настроить оптимальные параметры под свою конфигурацию. Тесты проводились на параметрах по-умолчанию.
Мат. режим.
Данная реализация использования мат. режима позволяет добиться существенных ускорений. Но что, возможно, еще более важно, так это снятие ограничений MT5-тестера для бюджетных конфигураций. Возможно использование практически любого размера архива котировок.
Однако, все это верно только для моносимвольных (большинство) безындикаторных (мало) советников, которые либо написаны в MT4-Style, либо являются статистическими.
Приложенные примеры.
Запускаемые ваше советники приложены в виде MQ5/EX5.
- Статистический безындикаторный советник - EAToMath_Example_Stat.
- Торговый безындикаторный советник в MT4-Style - EAToMath_Example_Trade.
Бонус.
Этот завершающий пункт, возможно, пригодится и для тех, кому не нужны никакие ускорения.
В режиме сохранения тиков
в журнал выводится небольшая статистика по сохраняемым тикам.
EURUSD : real ticks begin from 2025.01.01 00:00:00 EAToMath.mqh 761: 2025.01 - 4 736 862 ticks: 23 Days, 205 950 ticks/day. EAToMath.mqh 761: 2025.02 - 3 613 402 ticks: 20 Days, 180 670 ticks/day. EAToMath.mqh 761: 2025.03 - 4 550 664 ticks: 21 Days, 216 698 ticks/day. EAToMath.mqh 761: 2025.04 - 8 182 320 ticks: 22 Days, 371 923 ticks/day. EAToMath.mqh 761: 2025.05 - 4 969 817 ticks: 22 Days, 225 900 ticks/day. EAToMath.mqh 761: 2025.06 - 4 217 920 ticks: 21 Days, 200 853 ticks/day. EAToMath.mqh 761: 2025.07 - 3 681 306 ticks: 23 Days, 160 056 ticks/day. EAToMath.mqh 761: 2025.08 - 3 276 512 ticks: 21 Days, 156 024 ticks/day. final balance 10000000.00 pips OnTester result 0 EAToMath.mqh 1016: 37 228 804 ticks (213.025 MB, Compress = 10.00) are saved in \AppData\Roaming\MetaQuotes\Terminal\Common\EAToMath.mqh\RannForex-Server\EURUSD\Ticks_0.tsh EAToMath.mqh 1020: Saved interval: 2025.01.01 00:00 - 2025.08.29 23:54, 7 Months 29 Days
Это позволяет оценить количественные показатели распределения тиков по месяцам и иногда сделать соответствующие выводы по качеству предоставляемой истории котировок.
... EAToMath.mqh 761: 2019.07 - 90 322 ticks: 23 Days, 3 927 ticks/day. EAToMath.mqh 761: 2019.08 - 87 394 ticks: 22 Days, 3 972 ticks/day. EAToMath.mqh 761: 2019.09 - 83 078 ticks: 21 Days, 3 956 ticks/day. EAToMath.mqh 761: 2019.10 - 728 957 ticks: 23 Days, 31 693 ticks/day. EAToMath.mqh 761: 2019.11 - 1 359 674 ticks: 21 Days, 64 746 ticks/day. EAToMath.mqh 761: 2019.12 - 1 323 911 ticks: 21 Days, 63 043 ticks/day. EAToMath.mqh 761: 2020.01 - 1 348 103 ticks: 22 Days, 61 277 ticks/day. ... EAToMath.mqh 761: 2025.05 - 1 793 264 ticks: 22 Days, 81 512 ticks/day. EAToMath.mqh 761: 2025.06 - 1 595 663 ticks: 21 Days, 75 983 ticks/day. EAToMath.mqh 761: 2025.07 - 1 506 748 ticks: 23 Days, 65 510 ticks/day. EAToMath.mqh 761: 2025.08 - 1 413 215 ticks: 21 Days, 67 295 ticks/day. final balance 10000000.00 pips OnTester result 0 EAToMath.mqh 1016: 120 983 218 ticks (692.280 MB, Compress = 10.00) are saved in \AppData\Roaming\MetaQuotes\Terminal\Common\EAToMath.mqh\FusionMarkets-Live\EURUSD\Ticks_0.tsh EAToMath.mqh 1020: Saved interval: 2015.01.02 00:00 - 2025.08.29 23:58, 10 Years 7 Months 28 Days
Рекомендую проверять эти записи. Особенно при подготовке на большой истории. Может оказаться (см. выше), что тиковая история, мягко говоря, странная.