Группа функций, используемых при оформлении пользовательских индикаторов. Данные функции нельзя использовать при написании советников и скриптов.
Функция |
Действие |
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 для копирования свойств рисования из одной линии в другую.