- Основные характеристики индикаторов
- Главное событие индикаторов: OnCalculate
- Два типа индикаторов: для главного и отдельного окна
- Настройка количества буферов и графических построений
- Назначение массива в качестве буфера: SetIndexBuffer
- Настройка графических построений: PlotIndexSetInteger
- Правила сопоставления буферов и диаграмм
- Применение директив для настройки графических построений
- Установка названий для графических построений
- Визуализация пропусков данных (пустых элементов)
- Индикаторы с собственным подокном: размер и уровни
- Общие свойства индикаторов: заголовок и точность значений
- Поэлементное раскрашивание диаграмм
- Пропуск отрисовки на начальных барах
- Ожидание данных и управление видимостью (DRAW_NONE)
- Мультивалютные и мультитаймфреймовые индикаторы
- Отслеживание формирования баров
- Тестирование индикаторов
- Ограничения и преимущества индикаторов
- Создание заготовки индикатора в Мастере MQL
Тестирование индикаторов
Встроенный тестер 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 не срабатывает. Более того, не выполняется и прочая финализация, например, не вызываются деструкторы глобальных объектов.