Подробнее о способах ускорения оптимизации советников в MT5.

2 сентября 2025, 14:28
fxsaber
5
31

Классификация советников.

Все советники, запускаемые в Оптимизаторе, делятся на два типа.

  • Торговые.
  • Статистические: "обучение", обработка котировочных данных.

Каждый из них тоже делится на два типа.

  • Индикаторные: используют бары и/или индикаторы.
  • Безындикаторные: только тики.

Наконец, каждый торговый 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


Среди входных параметров появятся дополнительные.


На скрине проставлены номера для соответствующего описания.

  1. Путь к файлу (относительно Common-папки), в котором хранятся тики для мат. режима. Файл в формате TicksShort.
  2. Чтение файловых тиков из памяти (FileMap = true) или с места хранения файла (FileMap = false).
  3. Какими порциями читать файловые тики. Принцип похож на п.3 здесь.
  4. Сколько копий файловых тиков использовать. На некоторых конфигурациях с многокальной памятью этот параметр может влиять на итоговую производительность.

Эти четыре параметра управляют доступом всех Агентов к одному единому на всех архиву котировок, что позволяет экономить на памяти. Сам же архив довольно быстро распаковывается на лету, что добавляет к общей производительности.


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


Рекомендую проверять эти записи. Особенно при подготовке на большой истории. Может оказаться (см. выше), что тиковая история, мягко говоря, странная.