Разработчикам и знатокам MQL4. Работа iMA?

 
Здравствуйте!
Наткнулся на несоответствие отрисовываемых значений на графике и возращаемых функцией iMA.
Стал разбираться в этом вопросе:
- нашел в CodeBase исходный код Moving Average 'Moving Averages, MA';
- сравнил со встроенным мувингом - один к одному(визуально и по значениям на графике);
- написал простенький скрипт для проверки значений:
//+------------------------------------------------------------------+
//|                                                     TEST_iMA.mq4 |
//+------------------------------------------------------------------+
int start()
  {
   double a0= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,0); 
   double a1= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,1); 
   double a2= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,2); 
   double a3= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,3); 
   double a4= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,4); 
   double a5= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,5); 
   double a6= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,6); 
   double a7= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,7); 
   double a8= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,8); 
   double a9= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,9); 
   double a10= iMA(NULL,0,130,0,MODE_SMA,MODE_CLOSE,10);
 
   double b0= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,0); 
   double b1= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,1); 
   double b2= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,2); 
   double b3= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,3); 
   double b4= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,4); 
   double b5= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,5); 
   double b6= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,6); 
   double b7= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,7); 
   double b8= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,8); 
   double b9= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,9); 
   double b10= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,10);
   
    
Print("  a10  ",DoubleToStr(a10,8),"  a9  ",DoubleToStr(a9,8),"  a8  ",DoubleToStr(a8,8),"  a7  ",DoubleToStr(a7,8),"  a6  ",DoubleToStr(a6,8),"  a5  ",
      DoubleToStr(a5,8),"  a4  ",DoubleToStr(a4,8),"  a3  ",DoubleToStr(a3,8),"  a2  ",DoubleToStr(a2,8),"  a1  ",DoubleToStr(a1,8),"  a0  ",DoubleToStr(a0,8));      
 
Print("  b10  ",DoubleToStr(b10,8),"  b9  ",DoubleToStr(b9,8),"  b8  ",DoubleToStr(b8,8),"  b7  ",DoubleToStr(b7,8),"  b6  ",DoubleToStr(b6,8),"  b5  ",
      DoubleToStr(b5,8),"  b4  ",DoubleToStr(b4,8),"  b3  ",DoubleToStr(b3,8),"  b2  ",DoubleToStr(b2,8),"  b1  ",DoubleToStr(b1,8),"  b0  ",DoubleToStr(b0,8));      
//----
   return(0);
  }
//+------------------------------------------------------------------+/
Для наглядности поставил период 130 набросил на график и вот что имеем:
TEST_iMA GBPUSD,M5: a10 2.01683385 a9 2.01687462 a8 2.01692077 a7 2. 01697385 a6 2.01702923 a5 2. 01708308 a4 2. 01713692 a3 2.01718846 a2 2. 01724000 a1 2. 01728231 a0 2.01732615
TEST_iMA GBPUSD,M5: b10 2.01719154 b9 2.01723308 b8 2.01728154 b7 2. 01733308 b6 2.01738462 b5 2. 01743077 b4 2. 01748231 b3 2.01753231 b2 2. 01757923 b1 2. 01762077 b0 2.01766538

В среднем значения разнятся на 3 пункта!
Поясните, пожалуйста, в чем ошибка. Дальше идти не могу.
С уважением,
Владимир
 

Ненормированые значения наверно - https://docs.mql4.com/ru/convert/NormalizeDouble

 
VBAG:
Здравствуйте!
Наткнулся на несоответствие отрисовываемых значений на графике и возращаемых функцией iMA.

Пока два часа комп был выключен, несоответствие отрисовываемых значений на графике и возращаемых функцией iMA пропало!
Что к чему не понятно,( видимо какой то глюк с данными, с разных счетов)после перезагрузки работает в 0. Вопрос снимается!

А по работе iMA и iCastom( "Moving Averages") вопрос остается(интересно где собака порылась:
- то ли в формуле разница;
- то ли так погрешность так немеренно накапливается(что навряд ли);
 
Неужели никто не объяснит этот феномен:

На график подгружены два индикатора MA(130) и iCustom MA(130)(CodeBase исходный код Moving Average 'Moving Averages, MA';) которые по сути одно и тоже.
Первый красный, а второй синий. И как мы видим они идентичны!

А вот их значения разные(см. выше):
a10 2.01683385 a9 2.01687462 a8 2.01692077 a7 2.01697385 a6 2. 01702923 a5 2.01708308 a4 2. 01713692 a3 2. 01718846 a2 2.01724000 a1 2. 01728231 a0 2. 01732615
b10 2.01719154 b9 2.01723308 b8 2.01728154 b7 2.01733308 b6 2. 01738462 b5 2.01743077 b4 2. 01748231 b3 2. 01753231 b2 2.01757923 b1 2. 01762077 b0 2. 01766538

Где ошибка?
 
Подсказка: выясните где применяется константа MODE_CLOSE и всё станет ясно. Вы не первый, кто задает этот вопрос:)
 
Действительно, перепутано. Корректно сравнивать так:

//+------------------------------------------------------------------+
//|                                                     TEST_iMA.mq4 |
//+------------------------------------------------------------------+
int start()
  {
   double a0= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,0); 
   double a1= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,1); 
   double a2= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,2); 
   double a3= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,3); 
   double a4= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,4); 
   double a5= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,5); 
   double a6= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,6); 
   double a7= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,7); 
   double a8= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,8); 
   double a9= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,9); 
   double a10= iMA(NULL,0,130,0,MODE_SMA,PRICE_CLOSE,10);
 
   double b0= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,0); 
   double b1= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,1); 
   double b2= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,2); 
   double b3= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,3); 
   double b4= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,4); 
   double b5= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,5); 
   double b6= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,6); 
   double b7= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,7); 
   double b8= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,8); 
   double b9= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,9); 
   double b10= iCustom(NULL,0,"Moving Averages",130,0,MODE_SMA,0,10);
   
    
Print("  a10  ",DoubleToStr(a10,8),"  a9  ",DoubleToStr(a9,8),"  a8  ",DoubleToStr(a8,8),"  a7  ",DoubleToStr(a7,8),"  a6  ",DoubleToStr(a6,8),"  a5  ",
      DoubleToStr(a5,8),"  a4  ",DoubleToStr(a4,8),"  a3  ",DoubleToStr(a3,8),"  a2  ",DoubleToStr(a2,8),"  a1  ",DoubleToStr(a1,8),"  a0  ",DoubleToStr(a0,8));      
 
Print("  b10  ",DoubleToStr(b10,8),"  b9  ",DoubleToStr(b9,8),"  b8  ",DoubleToStr(b8,8),"  b7  ",DoubleToStr(b7,8),"  b6  ",DoubleToStr(b6,8),"  b5  ",
      DoubleToStr(b5,8),"  b4  ",DoubleToStr(b4,8),"  b3  ",DoubleToStr(b3,8),"  b2  ",DoubleToStr(b2,8),"  b1  ",DoubleToStr(b1,8),"  b0  ",DoubleToStr(b0,8));      
//----
   return(0);
  }
//+------------------------------------------------------------------+/


Тогда никакой разницы нет:
11:05:18 TestMA GBPJPY,H1: loaded successfully
11:05:18 Moving Averages GBPJPY,H1: loaded successfully
11:05:18 Moving Averages GBPJPY,H1: initialized
11:05:18 TestMA GBPJPY,H1: a10 231.53992308 a9 231. 57546154 a8 231. 60530769 a7 231.63815385 a6 231.66815385 a5 231.69638462 a4 231. 72130769 a3 231. 74515385 a2 231.77269231 a1 231.80223077 a0 231.82592308
11:05:18 TestMA GBPJPY,H1: b10 231.53992308 b9 231. 57546154 b8 231. 60530769 b7 231.63815385 b6 231.66815385 b5 231.69638462 b4 231. 72130769 b3 231. 74515385 b2 231.77269231 b1 231.80223077 b0 231.82592308
11:05:18 Moving Averages GBPJPY,H1: removed
11:05:18 TestMA GBPJPY,H1: removed
 
Itso,Xupypr,Rosh, благодарю вас участие и разъяснения.
Создавал массивы для хранения данных и для проверки сверял значения с графиком. Заметил расхождения и написал скрипт для проверки. Создалось впечатление что кирдык.
После перезагрузки расхождения пропали, а в скрипте подлая ошибка оказалась.
Напрягся не по-детски - бывает же такое-подряд две непонятки, причем вторая подтверждала первую!

С уважением,
Владимир
Причина обращения: