Индикаторы

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

Данные функции нельзя использовать при написании советников и скриптов.

 

IndicatorBuffers

void IndicatorBuffers( int count)

Распределяет память для буферов, используемых для вычислений пользовательского индикатора. Количество буферов не может превышать 8 и быть менее значения, указанного в свойстве indicator_buffers. Если пользовательский индикатор требует дополнительных буферов для счета, следует использовать эту функцию для указания общего числа буферов.

Параметры:

count — Количество расчетных буферов. от indicator_buffers до 8 буферов.

Пример:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Silver
//---- параметры индикатора
extern int FastEMA=12;
extern int SlowEMA=26;
extern int SignalSMA=9;
//---- буферы индикатора
double ind_buffer1[];
double ind_buffer2[];
double ind_buffer3[];
//+------------------------------------------------------------------+
//| специальная функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
 {
//---- 2 дополнительных буфера, используемых для расчета.
 IndicatorBuffers(3);
//---- параметры рисования
 SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
 SetIndexDrawBegin(0,SignalSMA);
 IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//---- 3 распределенных буфера индикатора
 SetIndexBuffer(0,ind_buffer1);
 SetIndexBuffer(1,ind_buffer2);
 SetIndexBuffer(2,ind_buffer3);
//---- маркировка именами для DataWindow и подокна (subwindow) индикатора
 IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
//---- инициализация завершена
 return(0);
 }

 

IndicatorCounted

int IndicatorCounted( )

Функция возвращает количество баров, не измененных после последнего вызова индикатора. Большинство подсчитанных баров не нуждается в пересчете. Функция используется для оптимизации вычислений.

Замечание: самый последний бар не считается посчитанным, и в большинстве случаев необходимо пересчитывать только его. Однако бывают пограничные случаи, когда вызов пользовательского индикатора производится из эксперта на первом тике нового бара. Возможна ситуация, что последний тик предыдущего бара не обработан (по той причине, что в момент прихода этого последнего тика обрабатывался предпоследний тик), и пользовательский индикатор не был вызван и поэтому не был рассчитан. Чтобы избежать в такой ситуации ошибок расчета индикатора, функция IndicatorCounted() возвращает реально посчитанное количество баров минус один.

Пример:

void OnTick()
{
  int limit;
  int counted_bars=IndicatorCounted();

  //---- последний посчитанный бар будет пересчитан
  if(counted_bars > 0)
    counted_bars--;

  limit = Bars-counted_bars;

  //---- основной цикл
  for(int i=0; i<limit; i++)
  {
     //---- ma_shift присваивается 0, потому что SetIndexShift, вызываемый выше
     ExtBlueBuffer[i] = iMA(NULL,0,JawsPeriod,0, MODE_SMMA,PRICE_MEDIAN,i);
     ExtRedBuffer[i]  = iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i);
     ExtLimeBuffer[i] = iMA(NULL,0,LipsPeriod,0, MODE_SMMA,PRICE_MEDIAN,i);
  }
  //----

  return(0);
}

 

IndicatorDigits

void IndicatorDigits(int digits)

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

Параметры:

digits — Формат точности, число цифр после десятичной точки.

Пример:

int OnInit()
{
   //---- 2 дополнительных буфера используются для подсчета.
   IndicatorBuffers(3);

   //---- настройка параметров отрисовки
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexDrawBegin(0,SignalSMA);
   IndicatorDigits(Digits+2);

   //---- 3 распределенных буферов индикатора
   SetIndexBuffer(0,ind_buffer1);
   SetIndexBuffer(1,ind_buffer2);
   SetIndexBuffer(2,ind_buffer3);

   //---- "короткое имя" для DataWindow и подокна индикатора
   IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
   //---- инициализация сделана

   return(0);
}

 

IndicatorShortName

void IndicatorShortName(string name)

Установка «короткого» имени пользовательского индикатора для отображения в подокне индикатора и в окне DataWindow.

Параметры:

name — Новое короткое имя.

Пример:

int OnInit()
{
   //---- 2 дополнительных буфера используются для подсчета.
   IndicatorBuffers(3);

   //---- настройка параметров отрисовки
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexDrawBegin(0,SignalSMA);
   IndicatorDigits(Digits+2);

   //---- 3 распределенных буферов индикатора
   SetIndexBuffer(0,ind_buffer1);
   SetIndexBuffer(1,ind_buffer2);
   SetIndexBuffer(2,ind_buffer3);

   //---- "короткое имя" для DataWindow и подокна индикатора
   IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
   //---- инициализация сделана

   return(0);
}

 

SetIndexArrow

void SetIndexArrow(int index, int code)

Назначение значка для линии индикаторов, имеющей стиль DRAW_ARROW.
Нельзя использовать коды стрелок вне диапазона 33-255.

Параметры:

index — Порядковый номер линии. Должен быть от 0 до 7.
code — Код символа из шрифта Wingdings или одним из предопределенных стрелок.

Пример:

int OnInit()
{
   //---- 2 распределенных буфера индикатора
   SetIndexBuffer(0,ExtUppperBuffer);
   SetIndexBuffer(1,ExtLowerBuffer);

   //---- настройка параметров отрисовки
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,218);

   //---- отображение в DataWindow
   SetIndexLabel(0,"Fractal Up");
   SetIndexLabel(1,"Fractal Down");
   //---- инициализация сделана

   return(0);
}

 

SetIndexBuffer

bool SetIndexBuffer(int index, double array[])

Связывает переменную-массив, объявленный на глобальном уровне, с предопределенным буфером пользовательского индикатора. Количество буферов, необходимых для расчета индикатора, задается с помощью функции IndicatorBuffers() и не может быть больше 8. В случае успешного связывания возвращается TRUE, иначе FALSE. Чтобы получить расширенные сведения об ошибке, следует вызвать функцию GetLastError().

Параметры:

index — Порядковый номер линии. Должен быть от 0 до 7.
array[] — Ссылка на массив, который будет связан с расчетным буфером.

Пример:

double ExtBufferSilver[];
int init()
{
   SetIndexBuffer(0, ExtBufferSilver); // буфер для первой линии
   // ...
}

 

SetIndexDrawBegin

void SetIndexDrawBegin(int index, int begin)

Установка порядкового номера бара от начала данных, с которого должна начинаться отрисовка указанной линии индикатора. Отрисовка индикатора производится слева направо. Значения индикаторного массива, находящиеся левее указанного бара, не будут рисоваться на графике и отображаться в окне DataWindow. По умолчанию устанавливается значение 0.

Параметры:

index — Порядковый номер линии. Должен быть от 0 до 7.
begin — Номер позиции начала отрисовки линии индикатора.

Пример:

int OnInit()
{
   //---- 2 дополнительных буфера используются для подсчета.
   IndicatorBuffers(3);

   //---- настройка параметров рисунка
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3);
   SetIndexDrawBegin(0,SignalSMA);
   IndicatorDigits(Digits+2);

   //---- 3 распределенных буферов индикатора
   SetIndexBuffer(0,ind_buffer1);
   SetIndexBuffer(1,ind_buffer2);
   SetIndexBuffer(2,ind_buffer3);

   //---- "короткое имя" для DataWindow и подокна индикатора
   IndicatorShortName("OsMA("+FastEMA+","+SlowEMA+","+SignalSMA+")");
   //---- инициализация сделана

   return(0);
}

 

SetIndexEmptyValue

void SetIndexEmptyValue(int index, double value)

Устанавливает значение пустой величины для линии индикатора. Пустые значения не рисуются и не показываются в DataWindow. По умолчанию значение пустой величины — EMPTY_VALUE.

Параметры:

index — Порядковый номер линии. Должен быть от 0 до 7.
value — Новое «пустое» значение.

Пример:

int OnInit()
{
   //---- 2 распределенных буфера индикатора
   SetIndexBuffer(0,ExtUppperBuffer);
   SetIndexBuffer(1,ExtLowerBuffer);

   //---- настройка параметров отрисовки
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,218);

   //---- значение 0 отображаться не будет
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);

   //---- отображение в DataWindow
   SetIndexLabel(0,"Fractal Up");
   SetIndexLabel(1,"Fractal Down");
   //---- инициализация сделана

   return(0);
}

 

SetIndexLabel

void SetIndexLabel(int index, string text)

Установка имени линии индикатора для отображения информации в окне DataWindow и всплывающей подсказке.

Параметры:

index — Порядковый номер линии индикатора. Должен быть от 0 до 7.
text — Текст описания линии индикатора. NULL означает, что значение этой линии не показывается в DataWindow.

Пример:

//+------------------------------------------------------------------+
//| Функция инициализации Ichimoku Kinko Hyo |
//+------------------------------------------------------------------+
int OnInit()
{
//---- линия Tenkan Sen
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Tenkan_Buffer);
SetIndexDrawBegin(0,Tenkan-1);
SetIndexLabel(0,"Tenkan Sen");
//---- линия Kijun Sen
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,Kijun_Buffer);
SetIndexDrawBegin(1,Kijun-1);
SetIndexLabel(1,"Kijun Sen");
//---- гистограмма облака Kumo Up
a_begin=Kijun; if(a_begin<Tenkan) a_begin=Tenkan;
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(2,SpanA_Buffer);
SetIndexDrawBegin(2,Kijun+a_begin-1);
SetIndexShift(2,Kijun);
//---- в DataWindow не показываем, так как есть ограничивающая линия Senkou Span A
SetIndexLabel(2,NULL);
//---- линия Senkou Span A
SetIndexStyle(5,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(5,SpanA2_Buffer);
SetIndexDrawBegin(5,Kijun+a_begin-1);
SetIndexShift(5,Kijun);
SetIndexLabel(5,"Senkou Span A");
//---- гистограмма облака Kumo Down
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(3,SpanB_Buffer);
SetIndexDrawBegin(3,Kijun+Senkou-1);
SetIndexShift(3,Kijun);
//---- в DataWindow не показываем, так как есть ограничивающая линия Senkou Span B
SetIndexLabel(3,NULL);
//---- линия Senkou Span B
SetIndexStyle(6,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(6,SpanB2_Buffer);
SetIndexDrawBegin(6,Kijun+Senkou-1);
SetIndexShift(6,Kijun);
SetIndexLabel(6,"Senkou Span B");
//---- линия Chinkou Span
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,Chinkou_Buffer);
SetIndexShift(4,-Kijun);
SetIndexLabel(4,"Chinkou Span");
//----
return(0);
}

 

SetIndexShift

void SetIndexLabel(int index, string text)

Установка имени линии индикатора для отображения информации в окне DataWindow и всплывающей подсказке.

Параметры:

index — Порядковый номер линии индикатора. Должен быть от 0 до 7.
text — Текст описания линии индикатора. NULL означает, что значение этой линии не показывается в DataWindow.

Пример:

//+------------------------------------------------------------------+
//| Функция инициализации Ichimoku Kinko Hyo |
//+------------------------------------------------------------------+
int OnInit()
{
//---- линия Tenkan Sen
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Tenkan_Buffer);
SetIndexDrawBegin(0,Tenkan-1);
SetIndexLabel(0,"Tenkan Sen");
//---- линия Kijun Sen
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,Kijun_Buffer);
SetIndexDrawBegin(1,Kijun-1);
SetIndexLabel(1,"Kijun Sen");
//---- гистограмма облака Kumo Up
a_begin=Kijun; if(a_begin<Tenkan) a_begin=Tenkan;
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(2,SpanA_Buffer);
SetIndexDrawBegin(2,Kijun+a_begin-1);
SetIndexShift(2,Kijun);
//---- в DataWindow не показываем, так как есть ограничивающая линия Senkou Span A
SetIndexLabel(2,NULL);
//---- линия Senkou Span A
SetIndexStyle(5,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(5,SpanA2_Buffer);
SetIndexDrawBegin(5,Kijun+a_begin-1);
SetIndexShift(5,Kijun);
SetIndexLabel(5,"Senkou Span A");
//---- гистограмма облака Kumo Down
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(3,SpanB_Buffer);
SetIndexDrawBegin(3,Kijun+Senkou-1);
SetIndexShift(3,Kijun);
//---- в DataWindow не показываем, так как есть ограничивающая линия Senkou Span B
SetIndexLabel(3,NULL);
//---- линия Senkou Span B
SetIndexStyle(6,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(6,SpanB2_Buffer);
SetIndexDrawBegin(6,Kijun+Senkou-1);
SetIndexShift(6,Kijun);
SetIndexLabel(6,"Senkou Span B");
//---- линия Chinkou Span
SetIndexStyle(4,DRAW_LINE);
SetIndexBuffer(4,Chinkou_Buffer);
SetIndexShift(4,-Kijun);
SetIndexLabel(4,"Chinkou Span");
//----
return(0);
}

 

SetIndexStyle

void SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE)

Устанавливает новый тип, стиль, ширину и цвет для указанной линии индикатора.

Параметры:

index — Порядковый номер линии. Должен быть от 0 до 7.
type — Стиль отрисовки линии индикатора. Может быть одним из перечисленных стилей отрисовки линии.
style — Стиль линии. Используется для линий толщиной в 1 пиксель. Может быть одним из перечисленных стилей линии. Пустое значение (EMPTY) указывает, что стиль не будет изменен.
width — Ширина линии. Допустимые значения — 1,2,3,4,5. Пустое значение (EMPTY) указывает, что ширина не будет изменена.
clr — Цвет линии. Отсутствие параметра означает, что цвет не будет изменен.

Пример:

SetIndexStyle(3, DRAW_LINE, EMPTY, 2, Red);

 

SetLevelStyle

void SetLevelStyle(int draw_style, int line_width, color clr=CLR_NONE)

Устанавливает новый стиль, ширину и цвет для горизонтальных уровней индикатора, выводимого в отдельное окно.

Параметры:

draw_style — Стиль линии. Может быть одним из перечисленных стилей линии. Пустое значение (EMPTY) указывает, что стиль не будет изменен.
line_width — Ширина линии. Допустимые значения — 1,2,3,4,5. Пустое значение (EMPTY) указывает, что ширина не будет изменена.
clr — Цвет линии. Пустое значение CLR_NONE указывает, что цвет не будет изменен.

Пример:

//---- уровни в виде толстой красной линии
SetLevelStyle(STYLE_SOLID,2,Red)

 

SetLevelValue

void SetLevelValue( int level, double value)

Устанавливает значение для указанного горизонтального уровня индикатора, выводимого в отдельное окно.

Параметры:

level — Номер уровня (0-31).
value — Значение для указанного уровня.

Пример:

SetLevelValue(1,3.14);