Предопределены 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
Методы скользящих
В основе многих технических индикаторов лежат те или иные методы сглаживания ценовых серий. Некоторые стандартные технические индикаторы требуют указания типа сглаживания в качестве параметра. Для указания нужного типа сглаживания служат идентификаторы, перечисленные в перечислении 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
Свойства пользовательских индикаторов
Количество индикаторных буферов, которые можно использовать в пользовательском индикаторе, не ограничено. Но каждому массиву, который назначается в качестве индикаторного буфера с помощью функции 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
Каждый элемент этого массива описывает соответствующий входной параметр создаваемого технического индикатора, поэтому тип и порядок следования элементов массива должен быть строго выдержан в соответствии с описанием.
—