Значения буфера iMa высчитываются неправильно

 

Всем привет!

Пишу советник на MQL5, внутри которого нужно сравнить значение iMa и текущей цены. Точнее нужно понять, что iMa проходит через текущий бар.

На вид все просто: значение iMa должно быть больше low и меньше high текущий свечи.

Мне нужно получить значение той линии, которая представляет индикатор на графике.


Создаю индикатор в onInut()

handleMa = iMA(symbol, period, 10, 0, MODE_SMA, PRICE_CLOSE);

И добавляю на график:

ChartIndicatorAdd(0,0,handleMa);


Далее в onTick() получаю значения:

double maValues[];
ArraySetAsSeries(maValues, true);
int copied = CopyBuffer(handleMa,0, 0, 3, maValues);
Print("MA VALUES: ", maValues[0]," / ",maValues[1], _Digits," / ",maValues[2]);   


Проблема:

В значениях буфера индикатора я получаю не реальные значения, которые используются для построения линии графика, а некоторые значения из самого бара. Поэтому никак не сравнить значение отрисованной линии индикатора.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
ChartIndicatorAdd - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Файлы:
sad.png  96 kb
 

1.Где полный код, который можно запустить и проверить?

2. Не нужно пытаться скрывать Окно Данных 

3. Вставляйте код правильно - на первый раз я исправил Ваше сообщение.

 
temptlon:

скорее всего - Вы получаете визуально один индикатор - а эксперт берёт расчёт с другого индикатора 

\\\\\\\\\\\\\\\\\\\\\

я имею ввиду вот эту функцию  - по умолчанию там 14 а другой у вас на 10

ChartIndicatorAdd(0,0,handleMa);
 

Пример получения данных с индикатора iMA:

//+------------------------------------------------------------------+
//|                                        iMA Values on a Chart.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property version   "1.001"
//--- input parameters
input int                  Inp_MA_ma_period     = 12;          // MA: averaging period
input int                  Inp_MA_ma_shift      = 5;           // MA: horizontal shift
input ENUM_MA_METHOD       Inp_MA_ma_method     = MODE_SMA;    // MA: smoothing type
input ENUM_APPLIED_PRICE   Inp_MA_applied_price = PRICE_CLOSE; // MA: type of price
//---
int    handle_iMA;                           // variable for storing the handle of the iMA indicator
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iMA
   handle_iMA=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double array_ma[];
   ArraySetAsSeries(array_ma,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iMA,0,start_pos,count,array_ma))
      return;

   string text="";
   for(int i=0; i<count; i++)
      text=text+IntegerToString(i)+": "+DoubleToString(array_ma[i],Digits()+1)+"\n";
//---
   Comment(text);
  }
//+------------------------------------------------------------------+
//| Get value of buffers                                             |
//+------------------------------------------------------------------+
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      //if(InpPrintLog)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      //if(InpPrintLog)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+


Результат:

iMA Values on a Chart

Pic. 1. Get value on bar #0, #1, #2

Файлы:
 
SanAlex:

скорее всего - Вы получаете визуально один индикатор - а эксперт берёт расчёт с другого индикатора 

\\\\\\\\\\\\\\\\\\\\\

я имею ввиду вот эту функцию  - по умолчанию там 14 а другой у вас на 10

Да. Здесь, видимо, тоже есть ошибка. Но даже с периодом 14 значение индикатора должно как-то отличаться от цены. Мне тоже кажется, что рисуется одно, а значения я беру другого. Но что-то не догадаюсь, почему
 
temptlon:
Да. Здесь, видимо, тоже есть ошибка. Но даже с периодом 14 значение индикатора должно как-то отличаться от цены. Мне тоже кажется, что рисуется одно, а значения я беру другого. Но что-то не догадаюсь, почему

Пост  - учить как отче наш. После этого добавить в код (из поста ) ChartIndicatorAdd и проверить полученный результат. Ещё очень Важно - следите, чтобы на графике не было лишних индикаторов.

Значения буфера iMa высчитываются неправильно
Значения буфера iMa высчитываются неправильно
  • 2021.08.12
  • www.mql5.com
Всем привет! Пишу советник на MQL5, внутри которого нужно сравнить значение iMa и текущей цены...
 
Vladimir Karputov:

Пост  - учить как отче наш. После этого добавить в код (из поста ) ChartIndicatorAdd и проверить полученный результат. Ещё очень Важно - следите, чтобы на графике не было лишних индикаторов.

Спасибо!!! Код из поста #3 сработал! Буду сравнивать!
 
Vladimir Karputov:

Пост  - учить как отче наш. После этого добавить в код (из поста ) ChartIndicatorAdd и проверить полученный результат. Ещё очень Важно - следите, чтобы на графике не было лишних индикаторов.

Ведь действительно, по факту у меня индикатор на график не добавляется. хз, почему. И что бы было на что ориентироваться я отредактировал шаблон tester.tpl и добавил на него нужный мне индикатор. И дальше предполагаю, что рассчитываемый индикатор совпадает. Однако на этом же шаблоне ваш пример кода показывает валидные значения средней. Где-то у меня там ошибка. Но имея рабочий пример, дальше уже разберусь. Спасибо!
 
temptlon:
Ведь действительно, по факту у меня индикатор на график не добавляется. хз, почему. И что бы было на что ориентироваться я отредактировал шаблон tester.tpl и добавил на него нужный мне индикатор. И дальше предполагаю, что рассчитываемый индикатор совпадает. Однако на этом же шаблоне ваш пример кода показывает валидные значения средней. Где-то у меня там ошибка. Но имея рабочий пример, дальше уже разберусь. Спасибо!

Прочтите внимательнее справку по ChartIndicatorAdd - особенно обратите внимание на это:

Возвращаемое значение

Возвращает true в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Ошибка 4114 означает, что график и добавляемый индикатор отличаются по символу или таймфрейму.

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
ChartIndicatorAdd - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Прочтите внимательнее справку по ChartIndicatorAdd - особенно обратите внимание на это:

Возвращаемое значение

Возвращает true в случае успеха, иначе false. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Ошибка 4114 означает, что график и добавляемый индикатор отличаются по символу или таймфрейму.

В моем случае ChartIndicatorAdd говорит, что все норм:

   handleMa = iMA(Symbol(), Period(), 10, 0, MODE_SMA, PRICE_CLOSE);
   bool error = ChartIndicatorAdd(0,0,handleMa);
   Print("ERROR=", error, " / ", GetLastError());

Возвращает true, кода ошибки, соответственно, нет. Но проблема была именно в этой команде. Если ее не использовать, то iMa возвращает корректные значения.

Но если добавляю эту команду в ваш пример:

int OnInit()
  {
//--- create handle of the indicator iMA
   handle_iMA=iMA(Symbol(),Period(),Inp_MA_ma_period,Inp_MA_ma_shift,
                  Inp_MA_ma_method,Inp_MA_applied_price);
//--- if the handle is not created
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early
      return(INIT_FAILED);
     }
     
     ChartIndicatorAdd(0,0,handle_iMA);// <---- ВОТ ТУТ ДОБАВЛЯЮ
     
//---
   return(INIT_SUCCEEDED);
  }

то все хорошо.


А правильно ли я задаю внешние параметры таймфрейма и валютной пары? 


Вот так объявляю:

input string symbol = "EURUSD";
input ENUM_TIMEFRAMES period = PERIOD_M15;

И потом в onInit()

ChartSetSymbolPeriod(0, symbol, period);

Может быть так делать не надо? Все равно же эти параметры задаются на уровне тестера:


 
temptlon:

В моем случае ChartIndicatorAdd говорит, что все норм:

Возвращает true, кода ошибки, соответственно, нет. Но проблема была именно в этой команде. Если ее не использовать, то iMa возвращает корректные значения.

Но если добавляю эту команду в ваш пример:

то все хорошо.


А правильно ли я задаю внешние параметры таймфрейма и валютной пары? 


Вот так объявляю:

И потом в onInit()

Может быть так делать не надо? Все равно же эти параметры задаются на уровне тестера:


Чтобы ответить, сначала точно опишите что, куда Вы нажимаете. По шагам, по пунктам...

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