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