Особенности написания пользовательских индикаторов

FXWizard

Гуру форума
Особенности написания пользовательских индикаторов

Написание пользовательских индикаторов в торговой системе MetaTrader также имеет ряд особенностей.

Для того, чтобы программа считалась пользовательским индикатором, необходимо наличие описания:

#property indicator_chart_window // индикатор
рисуется в главном окне графика

или

#property indicator_separate_window // индикатор
рисуется в отдельном окне

Для фиксации масштаба отдельного окна индикатора используются определения:

#property indicator_minimum Min_Value
#property indicator_maximum Max_Value


где "Min_Value" и "Max_Value" - соответствующие числовые значения. Например, для пользовательского индикатора RSI эти значения должны быть 0 и 100 соответственно.

Количество индикаторных массивов, необходимых для отрисовки индикатора, должно быть задано при помощи определения:

#property indicator_buffer N

где N может принимать значение от 1 до 8.

Цвет линий индикатора задается определениями:

#property indicator_color1 Blue
#property indicator_color2 Red


...
#property indicator_colorN <SomeColor>

где N - количество индикаторных массивов, определенное при помощи "#property indicator_buffer".

Существует ряд функций, которые позволяют управлять расчетом и визуализацией индикатора. Для иллюстрации используем пользовательский индикатор Ichimoku Kinko Hyo:

//+------------------------------------------------------------------+
//| Ichimoku.mq4 |
//| Copyright © 2004, MetaQuotes Software Corp. |

//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."


#property indicator_chart_window
#property indicator_buffers 7
#property indicator_color1 Red
#property indicator_color2 Blue

#property indicator_color3 SandyBrown
#property indicator_color4 Thistle
#property indicator_color5 Lime
#property indicator_color6 SandyBrown
#property indicator_color7 Thistle

//---- input parameters
extern int Tenkan=9;
extern int Kijun=26;

extern int Senkou=52;
//---- indicator buffers
double Tenkan_Buffer[];
double Kijun_Buffer[];

double SpanA_Buffer[];
double SpanB_Buffer[];
double Chinkou_Buffer[];
double SpanA2_Buffer[];

double SpanB2_Buffer[];
//---- span_a drawing begin
int a_begin;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+

int init()
{
//----
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,Tenkan_Buffer);
SetIndexDrawBegin(0,Tenkan-1);
SetIndexLabel(0,"Tenkan Sen");

//----
SetIndexStyle(1,DRAW_LINE);
SetIndexBuffer(1,Kijun_Buffer);
SetIndexDrawBegin(1,Kijun-1);
SetIndexLabel(1,"Kijun Sen");

//----
a_begin=Kijun; if(a_begin<Tenkan) a_begin=Tenkan;
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(2,SpanA_Buffer);
SetIndexDrawBegin(2,Kijun+a_begin-1);
SetIndexShift(2,Kijun);
SetIndexLabel(2,NULL);
SetIndexStyle(5,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(5,SpanA2_Buffer);
SetIndexDrawBegin(5,Kijun+a_begin-1);
SetIndexShift(5,Kijun);
SetIndexLabel(5,"Senkou Span A");

//----
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_DOT);
SetIndexBuffer(3,SpanB_Buffer);
SetIndexDrawBegin(3,Kijun+Senkou-1);
SetIndexShift(3,Kijun);
SetIndexLabel(3,NULL);
SetIndexStyle(6,DRAW_LINE,STYLE_DOT);
SetIndexBuffer(6,SpanB2_Buffer);
SetIndexDrawBegin(6,Kijun+Senkou-1)<="" p="">


Если входные параметры не установлены, то вызов соответствующего пользовательского индикатора производится в самом простом формате.

double current_AC = iCustom( NULL, 0, "Accelerator", 0, 0 );

Здесь передача первых двух значений "NULL" и "0" означает, что будет использован текущий график. В качестве имени пользовательского индикатора используется имя соответствующего файла без расширения mq4. Предпоследний параметр 0 означает, что нас интересуют данные из самого первого индикаторного массива. Последний параметр 0 означает, что нас интересует значение самого последнего элемента (то есть самое свежее, текущее значение) запрашиваемого индикаторного массива.

Параметры передаются в функцию расчета пользовательского индикатора в том порядке, в котором они описаны. Например, вызов пользовательского индикатора "Ichimoku" с параметрами (9,26,52) будет выглядеть следующим образом:

iCustom( NULL, 0, "Ichimoku", 9, 26, 52, 0, shift );

Строго говоря, параметры пользовательского индикатора можно не передавать в функцию. Если в программе не определено ни одной переменной extern, то параметры передавать бесполезно. Также можно воспользоваться начальными значениями, используемыми при описании параметров. Например, вызов того же пользовательского индикатора без параметров будет выглядеть следующим образом:

iCustom( NULL, 0, "Ichimoku", 0, shift );

Это означает, что будут использованы те значения, которыми инициализируются переменные "Tenkan", "Kijun", "Senkou", то есть 9, 26 и 52. Однако, если в одном эксперте вызывается один пользовательский индикатор с разными наборами параметров, то крайне не рекомендуется пользоваться умолчаниями.

Необходимо отметить, что излишнее количество пользовательских индикаторов, а также неправильно написанные пользовательские индикаторы могут существенно замедлить работу клиентского терминала!
 
Последнее редактирование:

PiratRoger

Интересующийся
А как извлечь из двух/более линейного индикатора значение одной его линии?
 
Верх