- Основные характеристики индикаторов
- Главное событие индикаторов: OnCalculate
- Два типа индикаторов: для главного и отдельного окна
- Настройка количества буферов и графических построений
- Назначение массива в качестве буфера: SetIndexBuffer
- Настройка графических построений: PlotIndexSetInteger
- Правила сопоставления буферов и диаграмм
- Применение директив для настройки графических построений
- Установка названий для графических построений
- Визуализация пропусков данных (пустых элементов)
- Индикаторы с собственным подокном: размер и уровни
- Общие свойства индикаторов: заголовок и точность значений
- Поэлементное раскрашивание диаграмм
- Пропуск отрисовки на начальных барах
- Ожидание данных и управление видимостью (DRAW_NONE)
- Мультивалютные и мультитаймфреймовые индикаторы
- Отслеживание формирования баров
- Тестирование индикаторов
- Ограничения и преимущества индикаторов
- Создание заготовки индикатора в Мастере MQL
Настройка количества буферов и графических построений
Чтобы индикатор мог вывести на график результаты своих расчетов, он должен определить один или несколько массивов и объявить их индикаторными буферами. Количество буферов устанавливается с помощью директивы:
#property indicator_buffers N |
Здесь N — целое число от 1 до 512. Эта директива задает количество буферов, которые будут доступны в коде для расчета индикатора.
В качестве N должна быть указана целочисленная константа (литерал) или эквивалентное ей макроопределение. Поскольку это директива препроцессора, никакие переменные (пусть и с модификатором const) на стадии предобработки исходного кода еще не существуют.
Однако буферов недостаточно для визуализации расчетных данных. В MQL5 система визуализации является двухуровневой. Первый уровень как раз формируют индикаторные буфера — динамические массивы, хранящие данные для отображения. Второй уровень предназначен для управления тем, как эти данные будут отображаться. Строится он на основе новых сущностей — так называемых графических построений (или диаграмм), в англоязычной терминологии — "plot". Дело в том, что различные способы отображения данных могут потребовать разного количества индикаторных буферов. Например, скользящая средняя имеет ровно одно значение на бар, и потому для такой линейной диаграммы достаточно одного индикаторного буфера. Однако для показа диаграммы в виде японских свечей требуется 4 значения на бар (цены OHLC). Таким образом, одному такому графическому построению требуется 4 индикаторных буфера.
Количество диаграмм (P) также должно быть определено в исходном коде с помощью специальной директивы.
#property indicator_plots P |
В простейшем случае количество буферов и диаграмм совпадает. Но мы скоро разберем примеры, когда буферов потребуется больше, чем графических построений. Кроме ситуаций, в которых графическое построение конкретного вида требует предопределенного количества буферов, нам иногда придется столкнуться с необходимостью выделять один или несколько массивов под промежуточные вычисления. Такие массивы не участвуют напрямую в визуализации, но содержат данные для построения визуализируемых буферов. Конечно, можно использовать для таких целей простые динамические массивы, не объявляя их буферами. Но тогда нам пришлось бы самостоятельно контролировать и изменять их размеры. Гораздо удобнее сделать их буферами и тем самым поручить терминалу выделение памяти.
Количество буферов и графических построений можно задавать только с помощью директив препроцессора, динамическое изменение этих свойств с помощью функций MQL5 невозможно.
После того как количество буферов и диаграмм будет определено, следует описать в исходном коде сами массивы, которые станут индикаторными буферами.
Начнем разрабатывать новый пример индикатора IndReplica1.mq5, чтобы продемонстрировать необходимые конструкции в исходном коде. Суть индикатора будет проста: в его единственном буфере отобразим значения полученного массива-параметра data. Как мы уже говорили ранее, выбор конкретной таймсерии для передачи в массив data осуществляет пользователь в момент наложения индикатора на график, а по умолчанию там будет предложена таймсерия с ценами закрытия баров.
Добавим директивы с описанием одного буфера и одной диаграммы.
#property indicator_chart_window
|
Директивы не выделяют сам буфер, а лишь устанавливают свойства индикатора и подготавливают систему исполнения к тому, что программа далее определит и настроит указанное количество массивов. Поэтому теперь самое время разобраться с регистрацией массива в качестве буфера.