Применение директив для настройки графических построений

До сих пор мы настраивали графические построения с помощью вызовов функции PlotIndexSetInteger. MQL5 позволяет сделать то же самое с помощью директив препроцессора #property. Основная разница между этими двумя способами заключается в том, что директивы обрабатываются на стадии компиляции и описанные с помощью них свойства считываются из исполняемого файла в процессе загрузки, еще до того как выполнится обработчик OnInit (если он есть). То есть, директивы предоставляют некоторые значения по умолчанию, которые, в принципе, можно и не менять, если в этом нет необходимости.

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

Директивы

Функция

Описание

indicator_colorN

PlotIndexSetInteger(N-1, PLOT_LINE_COLOR, сolor)

Цвет линии для графического построения

indicator_styleN

PlotIndexSetInteger(N-1, PLOT_LINE_STYLE, type)

Стиль отрисовки из перечисления ENUM_LINE_STYLE

indicator_typeN

PlotIndexSetInteger(N-1, PLOT_DRAW_TYPE, type)

Тип отрисовки из перечисления ENUM_DRAW_TYPE

indicator_widthN

PlotIndexSetInteger(N-1, PLOT_LINE_WIDTH, width)

Толщина линии в пикселях (1 - 5)

Обратите внимание, что нумерация графических построений в директивах ведется с 1, в то время как в функциях — с 0. Например, директива #property indicator_type1 DRAW_ZIGZAG эквивалентна вызову PlotIndexSetInteger(0, PLOT_DRAW_TYPE, DRAW_ZIGZAG).

Также стоит отметить, что с помощью функции можно задать гораздо больше свойств, чем через директивы: в перечислении ENUM_PLOT_PROPERTY_INTEGER — 10 элементов.

Свойства, описанные директивами, доступны (видимы и могут редактироваться пользователем) в диалоге настройки параметров индикатора даже при первом его размещении на графике. В частности, сюда относятся толщина, цвет и стиль линий (закладка Цвета), количество и размещение уровней (закладка Уровни). Те же свойства, заданные функциями (и если они не имеют значений по умолчанию в директивах), появляются в диалоге только во второй и последующие разы.

Адаптируем индикатор IndHighLowClose.mq5 под использование директив. Новая версия находится в файле IndPropHighLowClose.mq5. За счет директив обработчик OnInit упрощается, OnCalculate не меняется.

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_plots 2
   
// настройки отрисовки гистограммы High-Low (индекс 0 меняем на 1 в директиве)
#property indicator_type1   DRAW_HISTOGRAM2
#property indicator_style1  STYLE_SOLID // по умолчанию, можно опустить
#property indicator_color1  clrBlue
#property indicator_width1  5
   
// настройки отрисовки линии Close (индекс 1 меняем на 2 в директиве)
#property indicator_type2   DRAW_LINE
#property indicator_style2  STYLE_SOLID // по умолчанию, можно опустить
#property indicator_color2  clrRed
#property indicator_width2  2
   
double highs[];
double lows[];
double closes[];
   
int OnInit()
{
   // массивы для буферов под 3 типа цены
   SetIndexBuffer(0highs);
   SetIndexBuffer(1lows);
   SetIndexBuffer(2closes);
   
   return INIT_SUCCEEDED;
}

Внешне новый индикатор неотличим от старого.