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