Считывание параметров стороннего индикатора

 

Помогите советом, не могу разобраться. Есть кастомный MACD индикатор, в нем 4 буфера

//---- buffers

double MACDLineBuffer[];

double SignalLineBuffer[];

double HistogramBufferUp[];

double HistogramBufferDown[];

И входные параметры, стандартные для MACD 12,26,9 плюс еще один параметр 3.

Пытаюсь из советника получить эти значения:

double v0 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 0), 4);

double v1 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 1), 4);

double v2 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 2), 4);

double v3 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 3), 4);

Вывожу их для теста

Alert("v0 = ", v0, " v1 = ", v1, " v2 = ", v2, " v3 = ", v3);

Смотрю в логах - ну совсем не те значения (снимок во вложении). Мне необходимо получить значения первых двух буферов (линии MACD). На графике их крайние значения видны, в отладке - полная ерунда:

USDJPY,H1: Alert: v0 = 0.0 v1 = 0.0 v2 = -0.063 v3 = 0.0

Что я делаю не так? Сам индикатор во вложении.

Файлы:
MACD_f.mq4  30 kb
k1gn1r.PNG  49 kb
 

1. Вы читаете только 4й буфер ("3" в запросе)

2. Вы читаете текущий бар, и три перед ним закрывшиеся

А хотите запрашивать значение текущего бара на всех 4х буферах 

 
firsalex:

у вас:

double v0 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 0), 4);

double v1 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 1), 4);

double v2 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 2), 4);

double v3 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 3), 4);

читаем спецификацию iCustom()

double  iCustom(
   string       symbol,           // имя символа
   int          timeframe,        // таймфрейм
   string       name,             // папка/имя_пользовательского индикатора
   ...                            // список входных параметров индикатора
   int          mode,             // источник данных
   int          shift             // сдвиг

   );

т.е. в вашем случае:

iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 0)

-- 3 -- номер буфера

-- 0 -- номер бара

параметры индикатора:

extern int FastMAPeriod = 12;
extern int SlowMAPeriod = 26;
extern int SignalMAPeriod = 9;
extern double Display_Factor = 2.0;

-- значение Display_Factor в iCustoms() вы не передаёте

т.е. чтобы считать буфер 2 на баре 1 надо записать:

iCustom(NULL,TimeFrame,"macd_f", FastMAPeriod, SlowMAPeriod, SignalMAPeriod, Display_Factor, 2, 1)

в вашем примере считывание всех четырёх буферов на баре 0 будет выглядеть так:

double v0 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 0, 0), 4);

double v1 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 1, 0), 4);

double v2 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 2, 0), 4);

double v3 = NormalizeDouble(iCustom(NULL,TimeFrame,"macd_f",12, 26, 9, 3, 3, 0), 4);


p.s. по сути, если смотреть ваш пример, то вы считываете значение буфера 3 (нумерация с 0) на баре 0,1,2,3

Причина обращения: