Использование готовых индикаторов из MQL-программ

В предыдущей главе мы научились разрабатывать собственные индикаторы. Пользователи могут размещать их на графиках и проводить с их помощью технический анализ вручную. Но это не единственный вариант применения индикаторов. MQL5 позволяет создавать экземпляры индикаторов и запрашивать их расчетные данные программным способом. Это можно сделать как из других индикаторов, комбинируя несколько простых в более сложные, так и из экспертов, реализующих автоматическую или полуавтоматическую торговлю на сигналах индикаторов.

Достаточно знать параметры индикатора, а также расположение и смысл расчетных данных в его публичных буферах, чтобы организовать построение этих новых прикладных таймсерий и получить доступ к ним.

В этой главе мы изучим функции для создания и удаления индикаторов, а также чтения их буферов. Причем это относится не только к пользовательским индикаторам, написанным на MQL5, но и к большому набору встроенных индикаторов.

Общие принципы программного взаимодействия с индикаторами включают несколько шагов:

  • Создание дескриптора (описателя) индикатора — уникального идентификационного номера, выдаваемого системой в ответ на вызов особых функций (iCustom или IndicatorCreate), посредством которых MQL-код сообщает имя и параметры требуемого индикатора;
  • Чтение данных из буферов индикатора, заданного дескриптором, с помощью функции CopyBuffer;
  • Освобождение дескриптора (IndicatorRelease), если индикатор стал не нужен.

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

Во всех случаях кроме экзотических, когда требуется динамически менять настройки индикаторов по ходу выполнения программы, рекомендуется получать дескрипторы индикаторов однократно в OnInit или в конструкторе класса глобального объекта.

Все функции создания индикаторов имеют как минимум 2 параметра — символ и таймфрейм. Вместо символа можно передать NULL, что означает текущий инструмент, а значение 0 соответствует текущему таймфрейму, но можно пользоваться и встроенными переменными _Symbol и _Period. При необходимости можно задать произвольные символ и таймфрейм, не связанные с графиком. Таким образом, в частности, можно реализовать мультисимвольные и мультитаймфреймовые индикаторы.

Нельзя обратиться к данным индикатора сразу после создания его экземпляра, так как расчет буферов требует некоторого времени. Прежде чем читать данные, следует проверить их готовность с помощью функции BarsCalculated (она также принимает аргумент-дескриптор и возвращает количество просчитанных баров). В противном случае вместо данных будет получена ошибка. Хотя она не является критической в том смысле, что не приводит к остановке и выгрузке программы, но отсутствие данных сделает программу бесполезной.

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