Странное поведение iMAOnArray с MODE_EMA

 

Почему то EMA уходит за экран. Баг внутри iMAOnArray или неверное использование?

#property copyright ""
#property link      ""
#property version   "1.00"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_minimum 0
#property indicator_maximum 100

#property indicator_color1 clrDodgerBlue
#property indicator_color2 clrYellow
#property indicator_width1 1
#property indicator_width2 1
#property indicator_style1 STYLE_SOLID
#property indicator_style2 STYLE_DOT


input string _tmp1_ = " --- RSI ---";
input int RSI_Period = 20;
input ENUM_APPLIED_PRICE RSI_AppliedPrice = PRICE_CLOSE;
input int RSI_MaxBars = 500;

input string _tmp2_ = " --- MAs ---";
input int FastMA_period = 20;
input ENUM_MA_METHOD FastMA_method = MODE_EMA;

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

double RSIBuff[];
double MA1Buff[];

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

void OnInit()
{
  SetIndexBuffer(0, RSIBuff);
  SetIndexStyle(0, DRAW_LINE);
  SetIndexEmptyValue(0, EMPTY_VALUE);

  SetIndexBuffer(1, MA1Buff);
  SetIndexStyle(1, DRAW_LINE);
  SetIndexEmptyValue(1, EMPTY_VALUE);
}

void OnDeinit(const int reason)
{
}

int OnCalculate (const int rates_total,      // size of input time series
                 const int prev_calculated,  // bars handled in previous call
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[])        // Spread
{
  for (int i=RSI_MaxBars-1; i >= 0; i--)
  {
    RSIBuff[i] = iRSI(NULL, 0, RSI_Period, RSI_AppliedPrice, i);
  }

  for (i=RSI_MaxBars-FastMA_period-1; i >= 0; i--)
  {
    MA1Buff[i] = iMAOnArray(RSIBuff, 0, FastMA_period, 0, FastMA_method, i);
  }
  
  return (rates_total);
}

RSI_EMA

Файлы:
 

1. EMA считается от начала данных. В отличие от прочих SMA, которые считаются , начиная со смещения period_ma

2. Обеспечьте весь обсчитываемый массив реальными данными. Если не получается, то хотя бы обнулите начало массива

3. Убедитесь, что расчёт идёт слева направо

 
stringo:

1. EMA считается от начала данных. В отличие от прочих SMA, которые считаются , начиная со смещения period_ma

2. Обеспечьте весь обсчитываемый массив реальными данными. Если не получается, то хотя бы обнулите начало массива

3. Убедитесь, что расчёт идёт слева направо


Но обнулять массив ланных в осцилляторе по логике как то некорректно, если используется EMPTY_VALUE как пустое значение.

 
У меня такой хакерский способ получился. Перед вызовом  iMAOnArray я зануляю начало массива данных. А после вызова iMAOnArray я опять заполняю начало массива значением EMPTY_VALUE.  Так работает.
 
RickD:

Но обнулять массив ланных в осцилляторе по логике как то некорректно, если используется EMPTY_VALUE как пустое значение.


Именно EMPTY_VALUE, прописанные в начале массива, дают такой эффект. Значение EMPTY_VALUE влияет только на отрисовку, но никак не на расчёт

Установите SetIndexEmptyValue в 0. Тогда поводов для смущения не будет