Тестирование индикаторов

Встроенный тестер MetaTrader 5 поддерживает два типа MQL-программ: эксперты и индикаторы. В случае индикаторов тестирование всегда проводится в визуальном окне. Но это касается только тестирования отдельно взятого индикатора. Если же индикатор создается и вызывается из эксперта программным способом, то тестирование этого эксперта вместе с индикатором (индикаторами) может проводиться и без визуализации, на усмотрение пользователя. Технологию использования индикаторов из MQL-кода мы изучим в следующей главе. Она же будет применяться и для интеграции с экспертами.

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

Если на текущем тике индикатор еще не был рассчитан, он рассчитывается однократно при первом обращении к его данным. При последующих возможных запросах в течение того же тика рассчитанные данных отдаются в готовом виде. Если на текущем тике не происходит чтение буферов индикатора, он не рассчитывается. Расчет индикаторов только по запросу даёт существенное ускорение при тестировании и оптимизации.

Если ваш индикатор имеет такую специфику, что он не должен пропускать тики, MQL5 позволяет потребовать у тестера включить пересчет индикатора на каждом тике. Это делается с помощью директивы:

#property tester_everytick_calculate

Словосочетание "каждый тик" (everytick) в директиве относится именно к расчету индикатора и не влияет на режим генерации тиков. Иными словами, под тиками подразумеваются генерируемые тестером изменения цен — по всем тикам, по ценам OHLC M1 или по открытию баров — эта настройка тестера остается в силе.

Для индикаторов, которые мы рассмотрели в данной главе, данное свойство некритично. Также следует отметить, что оно касается только работы в тестере стратегий: в терминале индикаторы всегда получают события OnCalculate на каждом поступившем тике (с поправкой на возможный пропуск тиков, если ваши вычисления в OnCalculate займут слишком много времени и не уложатся до появления нового тика).

Что же касается тестера, то индикаторы считаются в нем на каждом тике при любом из условий:

  • в визуальном режиме;
  • при наличии директивы tester_everytick_calculate;
  • при наличии в них вызова EventChartCustom, или функций OnChartEvent или OnTimer.

Попробуем протестировать индикатор IndMultiSymbolMonitor.mq5 из предыдущего раздела.

Выберем основным символом и таймфреймом графика EURUSD,H1. Способ генерации тиков поставим "на основе реальных тиков".

После запуска тестирования мы должны увидеть в журнале окна визуального режима примерно следующие записи:

2021.10.20 00:00:00   New bar(s) on: EURUSD USDCHF USDJPY , in-sync:false

2021.10.20 00:00:00   New bar(s) on: AUDUSD , in-sync:false

2021.10.20 00:00:00   New bar(s) on: GBPUSD , in-sync:false

2021.10.20 00:00:02   New bar(s) on: USDCAD , in-sync:false

2021.10.20 00:00:11   New bar(s) on: NZDUSD , in-sync:true

2021.10.20 01:00:04   New bar(s) on: EURUSD GBPUSD USDCHF USDJPY AUDUSD USDCAD NZDUSD , in-sync:true

2021.10.20 02:00:00   New bar(s) on: EURUSD USDJPY NZDUSD , in-sync:false

2021.10.20 02:00:00   New bar(s) on: USDCHF , in-sync:false

2021.10.20 02:00:01   New bar(s) on: AUDUSD , in-sync:false

2021.10.20 02:00:15   New bar(s) on: GBPUSD USDCAD , in-sync:true

2021.10.20 03:00:00   New bar(s) on: EURUSD AUDUSD NZDUSD , in-sync:false

2021.10.20 03:00:00   New bar(s) on: GBPUSD USDJPY USDCAD , in-sync:false

2021.10.20 03:00:12   New bar(s) on: USDCHF , in-sync:true

Как нетрудно заметить, новые бары появляются на разных символах постепенно, и до появления флага "in-sync", равного true, проходит обычно несколько событий.

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

Тестирование "по ценам открытия" можно использовать только для индикаторов и экспертов, которые разработаны с поддержкой данного режима, например, делают расчет только по ценам Open или анализируют завершенные бары, начиная с 1-го.

Внимание! При тестировании индикаторов в тестере событие OnDeinit не срабатывает. Более того, не выполняется и прочая финализация, например, не вызываются деструкторы глобальных объектов.