Неправильная работа iMAOnArray

 
Есть несложный индикатор:

#property indicator_separate_window

#property indicator_buffers 1
#property indicator_color1 Red

extern int MAPeriod = 5;
extern int RSIPeriod = 5;
extern int TimeFrame = 5;

double MA[];
double RSI[];

int Multiplier;

int init()
{
   Multiplier = MathMax(1, TimeFrame/Period());
   
   IndicatorBuffers(2);

   SetIndexBuffer(0, MA);
   SetIndexBuffer(1, RSI);
   
   return(0);
}

int start()
{
   int toCount = MathMin(Bars, (Bars - IndicatorCounted())*Multiplier);
   
   for (int i = toCount - 1; i >= 0; i--)
   {
      RSI[i] = iRSI(Symbol(), TimeFrame, RSIPeriod, PRICE_CLOSE, iBarShift(Symbol(), TimeFrame, Time[i]));
   }
   
   for (i = toCount - 1; i >= 0; i--)
   {
      MA[i] = iMAOnArray(RSI, 0, MAPeriod, 0, MODE_EMA, i);
   }

   return(0);
}
Собственно, фишка:
1. Ставим индюк
2. Ждем несколько баров, скажем 5-10
3. Ставим второй индюк с такими же параметрами и сравниваем.
 
TheXpert >>:
Есть несложный индикатор:

Собственно, фишка:
1. Ставим индюк
2. Ждем несколько баров, скажем 5-10
3. Ставим второй индюк с такими же параметрами и сравниваем.

При расчёте с конца на начало вполне может быть, разность начальных условий и всё, вместо бая селл :о)

Поставь считать все бары на каждом тике думаю результы выравняються, пока же вижу что результат зависит от времени сброса индюка на чарт.

 
TheXpert писал(а) >>
Есть несложный индикатор:

Собственно, фишка:
1. Ставим индюк
2. Ждем несколько баров, скажем 5-10
3. Ставим второй индюк с такими же параметрами и сравниваем.


Все правильно. Нулевой бар на старшем таймфрейме перерисовывает.
 
Urain >>:
Поставь считать все бары на каждом тике думаю результы выравняються, пока же вижу что результат зависит от времени сброса индюка на чарт.

Понятное дело, что выравняются, вот только считать все бары на каждом тике -- это изврат. Да и пересчет вроде корректный.

Т.е. варианта два
1. я не замечаю какую-то (не)очевидную мелочь.
2. неправильно работает iMAOnArray
Vinin >>:
Все правильно. Нулевой бар на старшем таймфрейме перерисовывает.

Виктор, посмотри код, я обсчитываю перерисовку.

 
TheXpert писал(а) >>

Понятное дело, что выравняются, вот только считать все бары на каждом тике -- это изврат. Да и пересчет вроде корректный.

Т.е. варианта два
1. я не замечаю какую-то (не)очевидную мелочь.
2. неправильно работает iMAOnArray


1. Может быть
2. Оно всегда некорректно работает, но не всегда это можно заметить

 
Vinin >>:

2. Оно всегда некорректно работает, но не всегда это можно заметить

Предлагаешь заменить самописным?

 
TheXpert писал(а) >>

Понятное дело, что выравняются, вот только считать все бары на каждом тике -- это изврат. Да и пересчет вроде корректный.

Виктор, посмотри код, я обсчитываю перерисовку.



Я и так смотрю. Поставил два индикатора (предварительно сменив порядок расчета). Установил примерно через две минуты. Показания начинаю рассходиться потихоньку.

 
Vinin писал(а) >>


Я и так смотрю. Поставил два индикатора (предварительно сменив порядок расчета). Установил примерно через две минуты. Показания начинаю рассходиться потихоньку.


Все равно со временем разные значения дают

 
Вобщем окончательный отчет:
Код ниже все считает правильно и перерисовывает тоже правильно.
#property indicator_separate_window

#property indicator_buffers 1
#property indicator_color1 Red

extern int MAPeriod = 5;
extern int RSIPeriod = 5;
extern int TimeFrame = 5;

double MA[];
double RSI[];

int Multiplier;
double Koef;

int init()
{
   Multiplier = MathMax(1, TimeFrame/Period());
   Koef = 2.0/(MAPeriod + 1);
   
   IndicatorBuffers(2);

   SetIndexBuffer(0, MA);
   SetIndexBuffer(1, RSI);
   
   return(0);
}

int start()
{
   int toCount = MathMin(Bars, (Bars - IndicatorCounted())*Multiplier);
   
   for (int i = toCount - 1; i >= 0; i--)
   {
      RSI[i] = iRSI(Symbol(), TimeFrame, RSIPeriod, PRICE_CLOSE, iBarShift(Symbol(), TimeFrame, Time[i]));
   }
   
   for (i = toCount - 1; i >= 0; i--)
   {
      if (i < Bars - 1 && MA[i] == EMPTY_VALUE) MA[i] = RSI[i];
      
      MA[i] = RSI[i]*Koef + MA[i + 1]*(1 - Koef);
   }

   return(0);
}
Вывод: iMAOnArray работает неправильно! Различия между кодами начинаются только в процессе, а не сразу. Будьте бдительны.
 
TheXpert писал(а) >>
Вобщем окончательный отчет:
Код ниже все считает правильно и перерисовывает тоже правильно.
Вывод: iMAOnArray работает неправильно! Различия между кодами начинаются только в процессе, а не сразу. Будьте бдительны.


Так он всегда так работал. Сталкивался и раньше.

 

Два дня ковырял свой индикатор. Мой вывод такой: «неправильно» работают все встроенные индикаторы типа iXXXOnArray если буфер для расчёта заполняется со старшего ТФ. Обнаружил, что все они пересчитывают только нулевой и первый бары даже когда в цикле явно указано большее количество. Если старший ТФ не используется и значения в буфере для расчёта не изменяются на барах старше первого, то встроенные индикаторы можно использовать.

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