- Дескрипторы и счетчики владельцев индикаторов
- Простой способ создания экземпляров индикаторов: iCustom
- Проверка количества просчитанных баров: BarsCalculated
- Получение данных таймсерии из индикатора: CopyBuffer
- Поддержка множества символов и таймфреймов
- Обзор встроенных индикаторов
- Использование встроенных индикаторов
- Расширенный способ создания индикаторов: IndicatorCreate
- Гибкое создание индикаторов с помощью IndicatorCreate
- Обзор функций управления индикаторами на графике
- Комбинирование вывода в главное окно и вспомогательное
- Чтение данных из диаграмм, имеющих сдвиг
- Удаление экземпляров индикаторов: IndicatorRelease
- Получение настроек индикатора по его дескриптору
- Определение источника данных для индикатора
Использование готовых индикаторов из MQL-программ
В предыдущей главе мы научились разрабатывать собственные индикаторы. Пользователи могут размещать их на графиках и проводить с их помощью технический анализ вручную. Но это не единственный вариант применения индикаторов. MQL5 позволяет создавать экземпляры индикаторов и запрашивать их расчетные данные программным способом. Это можно сделать как из других индикаторов, комбинируя несколько простых в более сложные, так и из экспертов, реализующих автоматическую или полуавтоматическую торговлю на сигналах индикаторов.
Достаточно знать параметры индикатора, а также расположение и смысл расчетных данных в его публичных буферах, чтобы организовать построение этих новых прикладных таймсерий и получить доступ к ним.
В этой главе мы изучим функции для создания и удаления индикаторов, а также чтения их буферов. Причем это относится не только к пользовательским индикаторам, написанным на MQL5, но и к большому набору встроенных индикаторов.
Общие принципы программного взаимодействия с индикаторами включают несколько шагов:
- Создание дескриптора (описателя) индикатора — уникального идентификационного номера, выдаваемого системой в ответ на вызов особых функций (iCustom или IndicatorCreate), посредством которых MQL-код сообщает имя и параметры требуемого индикатора;
- Чтение данных из буферов индикатора, заданного дескриптором, с помощью функции CopyBuffer;
- Освобождение дескриптора (IndicatorRelease), если индикатор стал не нужен.
Создание и освобождение дескриптора выполняются обычно на стадиях инициализации и деинициализации программы, соответственно, а чтение буферов и их анализ производится многократно, по необходимости, например, по приходу тиков.
Во всех случаях кроме экзотических, когда требуется динамически менять настройки индикаторов по ходу выполнения программы, рекомендуется получать дескрипторы индикаторов однократно в OnInit или в конструкторе класса глобального объекта.
Все функции создания индикаторов имеют как минимум 2 параметра — символ и таймфрейм. Вместо символа можно передать NULL, что означает текущий инструмент, а значение 0 соответствует текущему таймфрейму, но можно пользоваться и встроенными переменными _Symbol и _Period. При необходимости можно задать произвольные символ и таймфрейм, не связанные с графиком. Таким образом, в частности, можно реализовать мультисимвольные и мультитаймфреймовые индикаторы.
Нельзя обратиться к данным индикатора сразу после создания его экземпляра, так как расчет буферов требует некоторого времени. Прежде чем читать данные, следует проверить их готовность с помощью функции BarsCalculated (она также принимает аргумент-дескриптор и возвращает количество просчитанных баров). В противном случае вместо данных будет получена ошибка. Хотя она не является критической в том смысле, что не приводит к остановке и выгрузке программы, но отсутствие данных сделает программу бесполезной.
Далее в данной главе будем для краткости называть создание экземпляров индикаторов и получение их дескрипторов просто "созданием индикаторов". Следует отличать его от похожего термина "создание пользовательских индикаторов", под которым мы понимали в предыдущей главе написание исходного кода индикаторов.