Русский

Справочник MQL4 Константы, перечисления и структуры Константы индикаторов Свойства пользовательских индикаторов

Свойства пользовательских индикаторов

Пользовательский индикатор имеет множество настроек для удобства отображения и восприятия. Эти настройки производятся через задание соответствующих свойств индикатора с помощью функций IndicatorSetDouble(), IndicatorSetInteger() и IndicatorSetString(). Идентификаторы свойств индикатора перечислены в перечислениях ENUM_CUSTOMIND_PROPERTY.

ENUM_CUSTOMIND_PROPERTY_INTEGER

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

Описание

Тип свойства

INDICATOR_DIGITS

Точность отображения значений индикатора

int

INDICATOR_HEIGHT

Фиксированная высота собственного окна индикатора (команда препроцессора #property indicator_height)

int

INDICATOR_LEVELS

Количество уровней на окне индикатора

int

INDICATOR_LEVELCOLOR

Цвет линии уровня

color                      меняет цвет всех уровней

INDICATOR_LEVELSTYLE

Стиль линии уровня

ENUM_LINE_STYLE  меняет стиль всех уровней

INDICATOR_LEVELWIDTH

Толщина линии уровня

int                         меняет толщину всех уровней

ENUM_CUSTOMIND_PROPERTY_DOUBLE

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

Описание

Тип свойства

INDICATOR_MINIMUM

Минимум окна индикатора

double

INDICATOR_MAXIMUM

Максимум окна индикатора

double

INDICATOR_LEVELVALUE

Значение уровня

double                    модификатор=номер уровня

ENUM_CUSTOMIND_PROPERTY_STRING

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

Описание

Тип свойства

INDICATOR_SHORTNAME

Короткое наименование индикатора

string

INDICATOR_LEVELTEXT

Описание уровня

string                      модификатор=номер уровня

Пример:

#property description "Relative Strength Index"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1     clrDodgerBlue
//--- входные параметры
input int InpRSIPeriod=14; // RSI Period
//--- массивы индикаторных буферов
double ExtRSIBuffer[];
double ExtPosBuffer[];
double ExtNegBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   string short_name;
//--- два дополнительных буфера используются для вычислений
   IndicatorBuffers(3);
   SetIndexBuffer(0,ExtRSIBuffer);
   SetIndexBuffer(1,ExtPosBuffer);
   SetIndexBuffer(2,ExtNegBuffer);
//--- уровни 
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,30);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,70);
//--- максимальные и минимальные значения в подоконе 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);
//--- отрисовка индикатора в виде линии 
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtRSIBuffer);
//--- имя в окне DataWindow и метка
   short_name="RSI("+string(InpRSIPeriod)+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//--- проверка входных параметров
   if(InpRSIPeriod<2)
     {
      Print("Неправильное значение переменной InpRSIPeriod = ",InpRSIPeriod);
      return(INIT_FAILED);
     }
//---
   SetIndexDrawBegin(0,InpRSIPeriod);
//--- инициализация успешно завершена
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
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[])
  {
   int    i,pos;
   double diff;
//---
   if(Bars<=InpRSIPeriod || InpRSIPeriod<2)
      return(0);
//--- расчет будет производится от 0 до rates_total
   ArraySetAsSeries(ExtRSIBuffer,false);
   ArraySetAsSeries(ExtPosBuffer,false);
   ArraySetAsSeries(ExtNegBuffer,false);
   ArraySetAsSeries(close,false);
//--- предварительные расчеты
   pos=prev_calculated-1;
   if(pos<=InpRSIPeriod)
     {
      //--- первые значения RSIPeriod не рассчитываются
      ExtRSIBuffer[0]=0.0;
      ExtPosBuffer[0]=0.0;
      ExtNegBuffer[0]=0.0;
      double sump=0.0;
      double sumn=0.0;
      for(i=1; i<=InpRSIPeriod; i++)
        {
         ExtRSIBuffer[i]=0.0;
         ExtPosBuffer[i]=0.0;
         ExtNegBuffer[i]=0.0;
         diff=close[i]-close[i-1];
         if(diff>0)
            sump+=diff;
         else
            sumn-=diff;
        }
      //--- расчет первого отображаемого значения
      ExtPosBuffer[InpRSIPeriod]=sump/InpRSIPeriod;
      ExtNegBuffer[InpRSIPeriod]=sumn/InpRSIPeriod;
      if(ExtNegBuffer[InpRSIPeriod]!=0.0)
         ExtRSIBuffer[InpRSIPeriod]=100.0-(100.0/(1.0+ExtPosBuffer[InpRSIPeriod]/ExtNegBuffer[InpRSIPeriod]));
      else
        {
         if(ExtPosBuffer[InpRSIPeriod]!=0.0)
            ExtRSIBuffer[InpRSIPeriod]=100.0;
         else
            ExtRSIBuffer[InpRSIPeriod]=50.0;
        }
      //--- подготовка начальной позиции
      pos=InpRSIPeriod+1;
     }
//--- главный цикл расчета
   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      diff=close[i]-close[i-1];
      ExtPosBuffer[i]=(ExtPosBuffer[i-1]*(InpRSIPeriod-1)+(diff>0.0?diff:0.0))/InpRSIPeriod;
      ExtNegBuffer[i]=(ExtNegBuffer[i-1]*(InpRSIPeriod-1)+(diff<0.0?-diff:0.0))/InpRSIPeriod;
      if(ExtNegBuffer[i]!=0.0)
         ExtRSIBuffer[i]=100.0-100.0/(1+ExtPosBuffer[i]/ExtNegBuffer[i]);
      else
        {
         if(ExtPosBuffer[i]!=0.0)
            ExtRSIBuffer[i]=100.0;
         else
            ExtRSIBuffer[i]=50.0;
        }
     }
//---
   return(rates_total);
  }