Константы индикаторов

Предопределены 37 стандартных технических индикаторов, которые можно использовать в программах на языке MQL5. Кроме того, есть возможность создавать свои собственные пользовательские индикаторы с помощью функции iCustom(). Все необходимые для этого константы разделены на 5 групп:

  • Ценовые константы – для выбора типа цены или объема, по которым считается индикатор;  
  • Методы скользящих – встроенные методы сглаживания, используемые в индикаторах;
  • Линии индикаторов – идентификаторы индикаторных буферов при доступе к значениям индикаторов с помощью функции CopyBuffer();
  • Стили рисования – для указания одного из 18 видов отрисовки и задания стиля рисования линии;
  • Свойства пользовательских индикаторов – используются в функциях для работы с пользовательскими индикаторами;
  • Типы индикаторов – служат для указания типа технического индикатора при создании хэндла с помощью функции IndicatorCreate();
  • Идентификаторы типов данных — используются для задания типа данных, передаваемых массивом типа MqlParam в функции IndicatorCreate().

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

Технические индикаторы требуют для своих расчетов указания значений цен и/или значений объемов, на которых они будут считаться. Существуют 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);
}

Методы скользящих

В основе многих технических индикаторов лежат те или иные методы сглаживания ценовых серий. Некоторые стандартные технические индикаторы требуют указания типа сглаживания в качестве параметра. Для указания нужного типа сглаживания служат идентификаторы, перечисленные в перечислении ENUM_MA_METHOD.

ENUM_MA_METHOD

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

Описание

MODE_SMA

Простое усреднение

MODE_EMA

Экспоненциальное усреднение

MODE_SMMA

Сглаженное усреднение

MODE_LWMA

Линейно-взвешенное усреднение

Пример:

double ExtJaws[];
double ExtTeeth[];
double ExtLips[];

//---- handles for moving averages
int ExtJawsHandle;
int ExtTeethHandle;
int ExtLipsHandle;

//--- get MA's handles
ExtJawsHandle=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN);
ExtTeethHandle=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN);
ExtLipsHandle=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN);

Линии индикаторов

Некоторые технические индикаторы имеют несколько отрисовываемых на графике буферов. Нумерация индикаторных буферов начинается с 0. При копировании значений индикатора функцией CopyBuffer() в массив типа double для некоторых индикаторов можно указывать не номер копируемого буфера, а идентификатор этого буфера.
 

Идентификаторы линий индикаторов, допустимых при копировании значений индикаторов iMACD(), iRVI() и iStochastic()

Константа

Значение

Описание

MAIN_LINE

0

Основная линия

SIGNAL_LINE

1

Сигнальная линия

Идентификаторы линий индикаторов, допустимых при копировании значений индикаторов ADX() и ADXW()

Константа

Значение

Описание

MAIN_LINE

0

Основная линия

PLUSDI_LINE

1

Линия +DI

MINUSDI_LINE

2

Линия –DI

Идентификаторы линий индикаторов допустимых при копировании значений индикатора iBands()

Константа

Значение

Описание

BASE_LINE

0

Основная линия

UPPER_BAND

1

Верхняя граница

LOWER_BAND

2

Нижняя граница

Идентификаторы линий индикаторов, допустимых при копировании значений индикаторов iEnvelopes() и iFractals()

Константа

Значение

Описание

UPPER_LINE

0

Верхняя линия

LOWER_LINE

1

Нижняя линия

Идентификаторы линий индикаторов, допустимых при копировании значений индикатора iGator()

Константа

Значение

Описание

UPPER_HISTOGRAM

0

Верхняя гистограмма

LOWER_HISTOGRAM

2

Нижняя гистограмма

Идентификаторы линий индикаторов, допустимых при копировании значений индикатора iAlligator()

Константа

Значение

Описание

GATORJAW_LINE

0

Линия челюстей

GATORTEETH_LINE

1

Линия зубов

GATORLIPS_LINE

2

Линия губ

Идентификаторы линий индикаторов, допустимых при копировании значений индикатора iIchimoku()

Константа

Значение

Описание

TENKANSEN_LINE

0

Линия Tenkan-sen

KIJUNSEN_LINE

1

Линия Kijun-sen

SENKOUSPANA_LINE

2

Линия Senkou Span A

SENKOUSPANB_LINE

3

Линия Senkou Span B

CHIKOUSPAN_LINE

4

Линия Chikou Span

Стили рисования

При создании пользовательского индикатора можно указать один из 18 типов графического построения (способа отображения на главном окне графика или в подокне графика), значения которых указаны в перечислении ENUM_DRAW_TYPE.

В одном пользовательском индикаторе допустимо использовать любые виды построения/отрисовки индикаторов. Каждый вид построения требует указания от одного до пяти глобальных массивов для хранения данных, необходимых для рисования. Эти массивы данных необходимо связать с индикаторными буферами посредством функции SetIndexBuffer(), и указать для каждого буфера тип данных из перечисления ENUM_INDEXBUFFER_TYPE.

В зависимости от стиля рисования, может потребоваться от одного до четырех буферов значений (отмеченных как INDICATOR_DATA), а если стиль допускает динамическое чередование цвета (все стили со словом COLOR в наименовании), то необходим и один буфер цвета (указан тип INDICATOR_COLOR_INDEX). Цветовой буфер всегда связывается сразу после соответствующих стилю буферов значений.

ENUM_DRAW_TYPE

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

Описание

Буферов значений

Буферов цвета

DRAW_NONE

Не отрисовывается

1

0

DRAW_LINE

Линия

1

0

DRAW_SECTION

Отрезки

1

0

DRAW_HISTOGRAM

Гистограмма от нулевой линии

1

0

DRAW_HISTOGRAM2

Гистограмма на двух индикаторных буферах

2

0

DRAW_ARROW

Отрисовка стрелками

1

0

DRAW_ZIGZAG

Стиль Zigzag допускает вертикальные отрезки на баре

2

0

DRAW_FILLING

Цветовая заливка между двумя уровнями

2

0

DRAW_BARS

Отображение в виде баров

4

0

DRAW_CANDLES

Отображение в виде свечей

4

0

DRAW_COLOR_LINE

Разноцветная линия

1

1

DRAW_COLOR_SECTION

Разноцветные отрезки

1

1

DRAW_COLOR_HISTOGRAM

Разноцветная гистограмма от нулевой линии

1

1

DRAW_COLOR_HISTOGRAM2

Разноцветная гистограмма на двух индикаторных буферах

2

1

DRAW_COLOR_ARROW

Отрисовка разноцветными стрелками

1

1

DRAW_COLOR_ZIGZAG

Разноцветный ZigZag

2

1

DRAW_COLOR_BARS

Разноцветные бары

4

1

DRAW_COLOR_CANDLES

Разноцветные свечи

4

1

 

Для уточнения отображения выбранного вида отрисовки используются идентификаторы, перечисленные в перечислениях ENUM_PLOT_PROPERTY.

Для функций PlotIndexSetInteger() и PlotIndexGetInteger()

ENUM_PLOT_PROPERTY_INTEGER

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

Описание

Тип свойства

PLOT_ARROW

Код стрелки для стиля DRAW_ARROW

uchar

PLOT_ARROW_SHIFT

Смещение стрелок по вертикали для стиля DRAW_ARROW

int

PLOT_DRAW_BEGIN

Количество начальных баров без отрисовки и значений в DataWindow

int

PLOT_DRAW_TYPE

Тип графического построения

ENUM_DRAW_TYPE

PLOT_SHOW_DATA

Признак отображения значений построения в окне DataWindow

bool

PLOT_SHIFT

Сдвиг графического построения индикатора по оси времени в барах

int

PLOT_LINE_STYLE

Стиль линии отрисовки

ENUM_LINE_STYLE

PLOT_LINE_WIDTH

Толщина линии отрисовки

int

PLOT_COLOR_INDEXES

Количество цветов

int

PLOT_LINE_COLOR

Цвет отрисовки

color     модификатор=номер индекса цвета

Для функции PlotIndexSetDouble()

ENUM_PLOT_PROPERTY_DOUBLE

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

Описание

Тип свойства

PLOT_EMPTY_VALUE

Пустое значение для построения, для которого нет отрисовки

double

Для функции PlotIndexSetString()

ENUM_PLOT_PROPERTY_STRING

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

Описание

Тип свойства

PLOT_LABEL

Имя индикаторной графической серии для отображения в окне DataWindow. Для сложных графических стилей, требующих для отображения несколько индикаторных буферов, имена для каждого буфера можно задать с использованием «;» в качестве разделителя. Пример кода приведен в DRAW_CANDLES

string

Существуют 5 стилей, которыми может рисоваться линия в пользовательском индикаторе. Они применимы только при толщине линии 0 или 1.

ENUM_LINE_STYLE

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

Описание

STYLE_SOLID

Сплошная линия

STYLE_DASH

Прерывистая линия

STYLE_DOT

Пунктирная линия

STYLE_DASHDOT

Штрих-пунктирная линия

STYLE_DASHDOTDOT

Штрих — две точки

 

Для задания стиля рисования линии и вида отрисовки используется функция PlotIndexSetInteger(). Для расширений Фибоначчи указать толщину и стиль отрисовки уровней можно функцией ObjectSetInteger().

Пример:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

//--- indicator buffers
double         MABuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

void OnInit()
{
   //--- привязка массива к индикаторному буферу с индексом 0
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);

   //--- задать рисование линии
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);

   //--- задание стиля для рисования линии
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_DOT);

   //--- задание цвета линии
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrRed);

   //--- задание толщины линии
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);

   //--- задание метки для линии
   PlotIndexSetString(0,PLOT_LABEL,"Moving Average");
   //---
}

//+------------------------------------------------------------------+
//| 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[])
{
   //--- 
   for(int i=prev_calculated;i<rates_total;i++)
   {
      MABuffer[i]=close[i];
   }

   //--- return value of prev_calculated for next call
   return(rates_total);
}

 

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

Количество индикаторных буферов, которые можно использовать в пользовательском индикаторе, не ограничено. Но каждому массиву, который назначается в качестве индикаторного буфера с помощью функции SetIndexBuffer(), должен быть указан тип данных, которые он будет хранить. Это может быть одно из значений перечисления ENUM_INDEXBUFFER_TYPE.

ENUM_INDEXBUFFER_TYPE

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

Описание

INDICATOR_DATA

Данные для отрисовки

INDICATOR_COLOR_INDEX

Цвета отрисовки

INDICATOR_CALCULATIONS

Вспомогательные буферы для промежуточных вычислений

Пользовательский индикатор имеет множество настроек для удобства отображения и восприятия. Эти настройки производятся через задание соответствующих свойств индикатора с помощью функций 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                      модификатор=номер уровня

Примеры:

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   2
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
#property indicator_color1  clrLightSeaGreen
#property indicator_color2  clrRed

//--- input parameters
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;

//--- indicator buffers
double MainBuffer[];
double SignalBuffer[];
double HighesBuffer[];
double LowesBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
{
   //--- indicator buffers mapping
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(2,HighesBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,LowesBuffer,INDICATOR_CALCULATIONS);

   //--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,2);

   //--- set levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,80);

   //--- set maximum and minimum for subwindow 
   IndicatorSetDouble(INDICATOR_MINIMUM,0);
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);

   //--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,KPeriod+Slowing-2);
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,KPeriod+Slowing+DPeriod);

   //--- set style STYLE_DOT for second line
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_DOT);

   //--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Stoch("+KPeriod+","+DPeriod+","+Slowing+")");
   PlotIndexSetString(0,PLOT_LABEL,"Main");
   PlotIndexSetString(1,PLOT_LABEL,"Signal");

   //--- sets drawing line to empty value
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0);
   //--- initialization done
}

 

Типы технических индикаторов

Существует два способа программно создавать хэндл индикатора для последующего доступа к его значениям. Первый способ состоит в непосредственном указании имени функции из списка технических индикаторов. Второй способ позволяет с помощью функции IndicatorCreate() единообразно создавать хэндл любого индикатора заданием идентификатора из перечисления ENUM_INDICATOR. Оба варианта создания хэндла индикатора равноправны, можно использовать тот, который наиболее удобен в каждом конкретном случае при написании программы на MQL5.

При создании индикатора типа IND_CUSTOM, поле type первого элемента массива входных параметров MqlParam обязательно должен иметь значение TYPE_STRING из перечисления ENUM_DATATYPE, а поле string_value первого элемента должно содержать имя пользовательского индикатора.

ENUM_INDICATOR

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

Индикатор

IND_AC

Accelerator Oscillator

IND_AD

Accumulation/Distribution

IND_ADX

Average Directional Index

IND_ADXW

ADX by Welles Wilder

IND_ALLIGATOR

Alligator

IND_AMA

Adaptive Moving Average

IND_AO

Awesome Oscillator

IND_ATR

Average True Range

IND_BANDS

Bollinger Bands®

IND_BEARS

Bears Power

IND_BULLS

Bulls Power

IND_BWMFI

Market Facilitation Index

IND_CCI

Commodity Channel Index

IND_CHAIKIN

Chaikin Oscillator

IND_CUSTOM

Custom indicator

IND_DEMA

Double Exponential Moving Average

IND_DEMARKER

DeMarker

IND_ENVELOPES

Envelopes

IND_FORCE

Force Index

IND_FRACTALS

Fractals

IND_FRAMA

Fractal Adaptive Moving Average

IND_GATOR

Gator Oscillator

IND_ICHIMOKU

Ichimoku Kinko Hyo

IND_MA

Moving Average

IND_MACD

MACD

IND_MFI

Money Flow Index

IND_MOMENTUM

Momentum

IND_OBV

On Balance Volume

IND_OSMA

OsMA

IND_RSI

Relative Strength Index

IND_RVI

Relative Vigor Index

IND_SAR

Parabolic SAR

IND_STDDEV

Standard Deviation

IND_STOCHASTIC

Stochastic Oscillator

IND_TEMA

Triple Exponential Moving Average

IND_TRIX

Triple Exponential Moving Averages Oscillator

IND_VIDYA

Variable Index Dynamic Average

IND_VOLUMES

Volumes

IND_WPR

Williams’ Percent Range

 

Идентификаторы типов данных

При создании хэндла индикатора функцией IndicatorCreate() необходимо указывать последним параметром массив типа MqlParam. Соответственно, структура MqlParam, описывающая параметры индикатора, содержит специальное поле type. Это поле содержит информацию о типе данных (вещественный, целочисленный или строковый тип), которые передаются конкретным элементом этого массива. Значение этого поля структуры MqlParam может быть одним из значений перечисления ENUM_DATATYPE.

ENUM_DATATYPE

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

Тип данных

TYPE_BOOL

bool

TYPE_CHAR

char

TYPE_UCHAR

uchar

TYPE_SHORT

short

TYPE_USHORT

ushort

TYPE_COLOR

color

TYPE_INT

int

TYPE_UINT

uint

TYPE_DATETIME

datetime

TYPE_LONG

long

TYPE_ULONG

ulong

TYPE_FLOAT

float

TYPE_DOUBLE

double

TYPE_STRING

string

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