Получение значений из буфера iCustom

 

Есть пользовательский индикатор который судя по его отображению на графике работает верно, но проблема возникает при попытке получить значения. Возвращаются не те значения которые ожидаются в соответствии с view самого графика. Учитывая что индикатор на выходе умеет показывать только 3 значения: +1 -1 и 0, то можно точно сказать что проблема не в погрешности отрисовки самого графика, а в импорте или способе обращения к буферу.

Инициализация в OnInit проходит так:

SetIndexBuffer(0, ExtOpenBuffer, INDICATOR_CALCULATIONS);
ExtOpenHandle = iCustom(NULL, timeframe, "::Indicators\\Examples\\OpenGroup.13.ex5", params);
if(ExtOpenHandle == INVALID_HANDLE) return(INIT_FAILED);

 И перед тем вытаскивать значения по индексу из буфера:

if (CopyBuffer(ExtOpenHandle, 0, 0, 1, ExtOpenBuffer) < 1) ... error handing

Если не какие ошибки не вылетели, то я ожидаю что в ExtOpenBuffer[0] будет лежать данные по текущему бару, но то что нарисовано на графике и значение которое я получаю не совпадают.


В моем импорте\вызове есть какие-то  ошибки?

Переход на новые рельсы: пользовательские индикаторы в MQL5
Переход на новые рельсы: пользовательские индикаторы в MQL5
  • www.mql5.com
Наконец мы получили возможность попробовать в работе новый торговый терминал - MetaTrader 5 . Вне сомнения, продукт заслуживает внимания и имеет множество новых возможностей по сравнению со своим предшественником. Важными преимуществами этой платформы среди прочих являются: Существенно доработанный язык, позволяющий теперь программировать...
 
Павел Раввич:

Есть пользовательский индикатор который судя по его отображению на графике работает верно, но проблема возникает при попытке получить значения. Возвращаются не те значения которые ожидаются в соответствии с view самого графика. Учитывая что индикатор на выходе умеет показывать только 3 значения: +1 -1 и 0, то можно точно сказать что проблема не в погрешности отрисовки самого графика, а в импорте или способе обращения к буферу.

Инициализация в OnInit проходит так:

 И перед тем вытаскивать значения по индексу из буфера:

Если не какие ошибки не вылетели, то я ожидаю что в ExtOpenBuffer[0] будет лежать данные по текущему бару, но то что нарисовано на графике и значение которое я получаю не совпадают.


В моем импорте\вызове есть какие-то  ошибки?

А разве  MqlParam  IndicatorCreate применяется к обычному созданию индикатора? Ведь MqlParam применяется только для создания индикатора через IndicatorCreate.

Уберите из вызова  MqlParam  и создайте индикатор без параметров. 
 
Ничего такого неправильного не видно. А может у индикатора не один буфер? Или с params что-то не то.
 
Dmitry Fedoseev:
Ничего такого неправильного не видно. А может у индикатора не один буфер? Или с params что-то не то.

Не params это условно там просто параметры из примитивов, их много я так и написал params что бы не городить огород. А у индикатора да не один буфер:


//--- indicator buffers mapping
   SetIndexBuffer(0,ExtMainBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtColorBuffer,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,ExtMA_1_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,ExtMA_2_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,ExtMA_3_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,ExtMA_4_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,ExtMA_5_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(7,ExtST_1_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(8,ExtST_2_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(9,ExtST_3_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(10,ExtST_4_Buffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(11,ExtST_5_Buffer,INDICATOR_CALCULATIONS);
//--- set accuracy
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,33);
//--- sets width of data line view
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
//--- name for DataWindow
   IndicatorSetString(INDICATOR_SHORTNAME,"OpenGroup");
//--- get handles
   ExtMA_1_Handle=iMA(NULL,timeframe,ma_1_period,0,MODE_SMA,PRICE_OPEN);
   ExtMA_2_Handle=iMA(NULL,timeframe,ma_2_period,0,MODE_SMA,PRICE_OPEN);
   ExtMA_3_Handle=iMA(NULL,timeframe,ma_3_period,0,MODE_SMA,PRICE_OPEN);
   ExtMA_4_Handle=iMA(NULL,timeframe,ma_4_period,0,MODE_SMA,PRICE_OPEN);
   ExtMA_5_Handle=iMA(NULL,timeframe,ma_5_period,0,MODE_SMA,PRICE_OPEN);
   ExtST_1_Handle=iStochastic(NULL,st_1_timeframe,st_1_k_period,3,st_1_slowing,MODE_SMA,STO_CLOSECLOSE);
   ExtST_2_Handle=iStochastic(NULL,st_2_timeframe,st_2_k_period,3,st_2_slowing,MODE_SMA,STO_CLOSECLOSE);
   ExtST_3_Handle=iStochastic(NULL,st_3_timeframe,st_3_k_period,3,st_3_slowing,MODE_SMA,STO_CLOSECLOSE);
   ExtST_4_Handle=iStochastic(NULL,st_4_timeframe,st_4_k_period,3,st_4_slowing,MODE_SMA,STO_CLOSECLOSE);
   ExtST_5_Handle=iStochastic(NULL,st_5_timeframe,st_5_k_period,3,st_5_slowing,MODE_SMA,STO_CLOSECLOSE);

Но результирующий с INDICATOR_DATA только 1.

 
Vladimir Karputov:

А разве  MqlParam  IndicatorCreate применяется к обычному созданию индикатора? Ведь MqlParam применяется только для создания индикатора через IndicatorCreate.

Уберите из вызова  MqlParam  и создайте индикатор без параметров. 

Не удачно назвал param здесь это не структура, просто много разных параметров примитивов. 

 
Павел Раввич:

Не удачно назвал param здесь это не структура, просто много разных параметров примитивов. 

Нужно полный код индикатора и советника. Всегда есть место для ошибки.