Индикаторы

Группа функций, используемых при оформлении пользовательских индикаторов. Данные функции нельзя использовать при написании советников и скриптов.

Функция

Действие

SetIndexBuffer

Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double

IndicatorSetDouble

Задает значение свойства индикатора, имеющего тип double

IndicatorSetInteger

Задает значение свойства индикатора,имеющего тип int

IndicatorSetString

Задает значение свойства индикатора, имеющего тип string

PlotIndexSetDouble

Задает значение  свойства  линии индикатора, имеющего тип double

PlotIndexSetInteger

Задает значение  свойства  линии индикатора, имеющего тип int

PlotIndexSetString

Задает значение  свойства  линии индикатора, имеющего тип string

PlotIndexGetInteger

Возвращает значение свойства линии индикатора, имеющего целый тип

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

Все необходимые расчеты пользовательских индикаторов необходимо размещать в предопределенной функции OnCalculate(). Если используется короткая форма вызова функции OnCalculate() вида

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])

то переменная rates_total содержит значение общего количества элементов массива price[], переданного в качестве входного параметра для расчета значений индикатора.

Параметр prev_calculated – результат выполнения функции OnCalculate() на предыдущем вызове и позволяет организовать экономный алгоритм расчета значений индикатора. Например, если текущее значение rates_total=1000, а prev_calculated=999, то, возможно, нам достаточно сделать расчеты только для одного значения каждого индикаторного буфера.

Если бы информация о размере входного массива price была бы недоступна, то это привело к необходимости производить расчеты для 1000 значений каждого индикаторного буфера. При первом вызове функции OnCalculate() значение prev_calculated=0. Если массив price[] каким-либо образом изменился, то в этом случае prev_calculated также равно 0.

Параметр begin сообщает количество начальных значений массива price, которые не содержат данных для расчета. Например, если в качестве входного массива были использованы значения индикатора Accelerator Oscillator (для которого первые 37 значений не рассчитываются), то begin=37.

 

SetIndexBuffer

Связывает указанный индикаторный буфер с одномерным динамическим массивом типа double.

bool SetIndexBuffer(
 int index, // индекс буфера
 double buffer[], // массив
 ENUM_INDEXBUFFER_TYPE data_type // что будем хранить
 );

Параметры

index — [in] Номер индикаторного буфера. Нумерация начинается с 0. Номер должен быть меньше значения, объявленного в #property indicator_buffers.

buffer[] — [in] Массив, объявленный в программе пользовательского индикатора.

data_type — [in] Тип данных, хранящихся в индикаторном массиве. По умолчанию INDICATOR_DATA (значения рассчитанного индикатора). Может также принимать значение INDICATOR_COLOR_INDEX, тогда данный буфер предназначен для хранения индексов цветов для предыдущего индикаторного буфера. Можно задать до 64 цветов в строке #property indicator_colorN. Значение INDICATOR_CALCULATIONS означает, что данный буфер участвует в промежуточных расчетах индикатора и не предназначен для отрисовки.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

Примечание

После связывания динамический массив buffer[] будет иметь индексацию как в обычных массивах, даже если для связываемого массива будет предварительно установлена индексация как в таймсериях. Если необходимо изменить порядок доступа к элементам индикаторного массива, необходимо применить функцию ArraySetAsSeries() после связывания массива функцией SetIndexBuffer(). При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит исполняющая подсистема терминала.

Пример:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot MA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input bool               AsSeries=true;
input int                period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//--- indicator buffers
double                   MABuffer[];
int                      ma_handle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   if(AsSeries) ArraySetAsSeries(MABuffer,true);
   Print("Индикаторный буфер является таймсерией = ",ArrayGetAsSeries(MABuffer));
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   Print("Индикаторный буфер после SetIndexBuffer() является таймсерией = ",
         ArrayGetAsSeries(MABuffer));
   
//--- изменим порядок доступа к элементам индикаторного буфера
   ArraySetAsSeries(MABuffer,AsSeries);
   
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries);
//---
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- скопируем значения скользящей средней в буфер MABuffer
   int copied=CopyBuffer(ma_handle,0,0,rates_total,MABuffer);
 
   Print("MABuffer[0] = ",MABuffer[0]);// в зависимости от значения AsSeries 
                                       // будем получать либо самое старое значение
                                       // либо на текущем незавершенном баре
 
//--- return value of prev_calculated for next call
   return(rates_total);
  }

 

IndicatorSetDouble

Задаёт значение соответствующего свойства индикатора. Свойство индикатора должно быть типа double. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

bool IndicatorSetDouble(
int prop_id, // идентификатор
double prop_value // устанавливаемое значение
);

Вызов с указанием идентификатора и модификатора свойства.

bool IndicatorSetDouble(
int prop_id, // идентификатор
int prop_modifier, // модификатор 
double prop_value // устанавливаемое значение
);

Параметры

prop_id — [in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_CUSTOMIND_PROPERTY_DOUBLE.

prop_modifier — [in] Модификатор указанного свойства. Только свойства уровней требуют модификатора. Нумерация уровней идет с 0, то есть для задания свойства второму уровню нужно указать единицу (на 1 меньше, чем при использовании директивы компилятора).

prop_value — [in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

Примечание

Нумерация свойств (модификаторов) при использовании директивы #property начинается с 1 (единицы), в то время как функция использует нумерацию с 0 (нуля). При неправильном задании номера уровня отображение индикатора может отличаться от того, которое предполагается.

Например, задать значение первого уровня для индикатора в отдельном подокне можно двумя способами:

property indicator_level1 50 //- используется 1 для указания номера уровня,
IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 50); //- используется 0 для указания первого уровня.

 

IndicatorSetInteger

Задает значение соответствующего свойства индикатора. Свойство индикатора должно быть типа int или color. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

bool IndicatorSetInteger(
int prop_id, // идентификатор
int prop_value // устанавливаемое значение
);

Вызов с указанием идентификатора и модификатора свойства.

bool IndicatorSetInteger(
int prop_id, // идентификатор
int prop_modifier, // модификатор 
int prop_value // устанавливаемое значение
);

Параметры

prop_id — [in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_CUSTOMIND_PROPERTY_INTEGER.

prop_modifier — [in] Модификатор указанного свойства. Только свойства уровней требуют модификатора.

prop_value — [in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

Примечание

Нумерация свойств (модификаторов) при использовании директивы #property начинается с 1 (единицы), в то время как функция использует нумерацию с 0 (нуля). При неправильном задании номера уровня отображение индикатора может отличаться от того, которое предполагается.

Например, чтобы задать толщину линии первого горизонтального уровня используйте нулевой индекс:

IndicatorSetInteger(INDICATOR_LEVELWIDTH, 0, 5); //- используется индекс 0 для задания толщины линии первого уровня.

 

IndicatorSetString

Задает значение соответствующего свойства индикатора. Свойство индикатора должно быть типа string. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

bool IndicatorSetString(
int prop_id, // идентификатор
string prop_value // устанавливаемое значение
);

Вызов с указанием идентификатора и модификатора свойства.

bool IndicatorSetString(
int prop_id, // идентификатор
int prop_modifier, // модификатор 
string prop_value // устанавливаемое значение
);

Параметры

prop_id — [in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_CUSTOMIND_PROPERTY_STRING.

prop_modifier — [in] Модификатор указанного свойства. Только свойства уровней требуют модификатора.

prop_value — [in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

Примечание

Нумерация свойств (модификаторов) при использовании директивы #property начинается с 1 (единицы), в то время как функция использует нумерацию с 0 (нуля). При неправильном задании номера уровня отображение индикатора может отличаться от того, которое предполагается.

Например, чтобы задать описание первого горизонтального уровня, используйте нулевой индекс:

IndicatorSetString(INDICATOR_LEVELTEXT, 0, "First Level"); //- используется индекс 0 для задания текстового описания первого уровня.

 

PlotIndexSetDouble

Задает значение соответствующего свойства соответствующей линии индикатора. Свойство индикатора должно быть типа double.

bool PlotIndexSetDouble(
int plot_index, // индекс графического стиля
int prop_id, // идентификатор свойства
double prop_value // устанавливаемое значение
);

Параметры

plot_index — [in] Индекс графического построения

prop_id — [in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_PLOT_PROPERTY_DOUBLE.

prop_value — [in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

 

PlotIndexSetInteger

Задает значение соответствующего свойства соответствующей линии индикатора. Свойство индикатора должно быть типа int, char, bool или color. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

bool PlotIndexSetInteger(
int plot_index, // индекс графического стиля
int prop_id, // идентификатор свойства
int prop_value // устанавливаемое значение
);

Вызов с указанием идентификатора и модификатора свойства.

bool PlotIndexSetInteger(
int plot_index, // индекс графического стиля
int prop_id, // идентификатор свойства
int prop_modifier, // модификатор свойства
int prop_value // устанавливаемое значение
);

Параметры

plot_index — [in] Индекс графического построения

prop_id — [in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_PLOT_PROPERTY_INTEGER.

prop_modifier — [in] Модификатор указанного свойства. Только свойства индексов цветов требуют модификатора.

prop_value — [in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

 

PlotIndexSetString

Задает значение соответствующего свойства соответствующей линии индикатора. Свойство индикатора должно быть типа string.

bool PlotIndexSetString(
int plot_index, // индекс графического стиля
int prop_id, // идентификатор свойства
string prop_value // устанавливаемое значение
);

Параметры

plot_index — [in] Индекс графического построения

prop_id — [in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_PLOT_PROPERTY_STRING.

prop_value — [in] Значение свойства.

Возвращаемое значение

В случае успешного выполнения возвращает true, в противном случае false.

 

PlotIndexGetInteger

Возвращает значение соответствующего свойства соответствующей линии индикатора. Свойство должно быть типов int, color, bool или char. Существует 2 варианта функции.

Вызов с указанием идентификатора свойства.

int PlotIndexGetInteger(
int plot_index, // индекс графического стиля
int prop_id, // идентификатор свойства
);

Вызов с указанием идентификатора и модификатора свойства.

int PlotIndexGetInteger(
int plot_index, // индекс графического стиля
int prop_id, // идентификатор свойства
int prop_modifier // модификатор свойства
);

Параметры

plot_index — [in] Индекс графического построения

prop_id — [in] Идентификатор свойства индикатора. Значение может быть одним из значений перечисления ENUM_PLOT_PROPERTY_INTEGER.

prop_modifier — [in] Модификатор указанного свойства. Только свойства индексов цветов требуют модификатора.

Примечание

Функция предназначена для извлечения настроек рисования соответствующей линии индикатора. Функция работает в паре с функцией PlotIndexSetInteger для копирования свойств рисования из одной линии в другую.