Ценовые константы

Технические индикаторы требуют для своих расчетов указания значений цен и/или значений объемов, на которых они будут считаться. Существуют 7 предопределенных идентификаторов перечисления ENUM_APPLIED_PRICE, для указания нужной ценовой базы расчетов.

ENUM_APPLIED_PRICE

Идентификатор

Описание

PRICE_CLOSE

Цена закрытия

PRICE_OPEN

Цена открытия

PRICE_HIGH

Максимальная за период цена

PRICE_LOW

Минимальная за период цена

PRICE_MEDIAN

Медианная цена, (high+low)/2

PRICE_TYPICAL

Типичная цена, (high+low+close)/3

PRICE_WEIGHTED

Средневзвешенная цена, (high+low+close+close)/4

Если в расчетах используется объем, то нужно указать одно из двух значений перечисления ENUM_APPLIED_VOLUME.

ENUM_APPLIED_VOLUME

Идентификатор

Описание

VOLUME_TICK

Тиковый объем

VOLUME_REAL

Торговый объем

Технический индикатор iStochastic() имеет два варианта расчета, которые могут использовать:

  • либо только цены Close;
  • либо цены High и Low.

Для выбора нужного варианта расчета нужно указать одно из значений перечисления ENUM_STO_PRICE.

ENUM_STO_PRICE

Идентификатор

Описание

STO_LOWHIGH

Построение по ценам Low/High

STO_CLOSECLOSE

Построение по ценам Close/Close

Если технический индикатор для своих расчетов использует ценовые данные, тип которых задается перечислением ENUM_APPLIED_PRICE, то в качестве входного ценового ряда можно указывать хэндл любого индикатора (встроенного в терминал или написанного пользователем). В этом случае для расчетов будут использованы значения нулевого буфера индикатора. Это позволяет легко строить значения одного индикатора по значениям другого индикатора. Хэндл пользовательского индикатора создается вызовом функции iCustom().

Пример:

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- input parameters
input int      RSIperiod=14;         // период для вычисления RSI
input int      Smooth=8;             // период сглаживания RSI
input ENUM_MA_METHOD meth=MODE_SMMA// метод сглаживания
//---- plot RSI
#property indicator_label1  "RSI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//---- plot RSI_Smoothed
#property indicator_label2  "RSI_Smoothed"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrNavy
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         RSIBuffer[];          // здесь мы будем хранить значения RSI
double         RSI_SmoothedBuffer[]; // здесь будут сглаженные значения RSI 
int            RSIhandle;            // дескриптор на индикатор RSI
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,RSIBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,RSI_SmoothedBuffer,INDICATOR_DATA);
   IndicatorSetString(INDICATOR_SHORTNAME,"iRSI");
   IndicatorSetInteger(INDICATOR_DIGITS,2);
//--- 
   RSIhandle=iRSI(NULL,0,RSIperiod,PRICE_CLOSE);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[]
                 )
 
  {
//--- сбросим в ноль значение последней ошибки 
   ResetLastError();
//--- получим данные индикатора RSI в массив RSIBuffer[]
   int copied=CopyBuffer(RSIhandle,0,0,rates_total,RSIBuffer);
   if(copied<=0)
     {
      Print("Не удалось скопировать значения индикатора RSI. Error = ",
            GetLastError(),",  copied = ",copied);
      return(0);
     }
//--- создадим индикатор средней по значениям индикатора RSI 
   int RSI_MA_handle=iMA(NULL,0,Smooth,0,meth,RSIhandle);
   copied=CopyBuffer(RSI_MA_handle,0,0,rates_total,RSI_SmoothedBuffer);
   if(copied<=0)
     {
      Print("Не удалось скопировать сглаженный индикатор RSI. Error = ",
            GetLastError(),",  copied =",copied);
      return(0);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }