Настройка количества буферов и графических построений

Чтобы индикатор мог вывести на график результаты своих расчетов, он должен определить один или несколько массивов и объявить их индикаторными буферами. Количество буферов устанавливается с помощью директивы:

#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
#property indicator_buffers 1
#property indicator_plots 1

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