Магия CopyBuffer для индикаторов со сдвигом

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
RickD
1226
RickD  

Этот простой тестовый индикатор повторяет отрисовку MA. В параметрах задаем сдвиг вправо на 5 баров: MA_shift = 5

Главный вопрос: почему правильно работает только, когда в CopyBuffer 3-м параметром передается сдвиг с коэффициентом -2 ?

shift = -2 * MA_shift


#property copyright "Copyright 2019"
#property link      ""
#property version   "1.00"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed

//---

input int                  MA_period = 10;
input int                  MA_shift = 5;
input ENUM_MA_METHOD       MA_method = MODE_SMA;
input ENUM_APPLIED_PRICE   MA_applied_price = PRICE_CLOSE;

//---

double MA_Buf[];
double MA_Calc_Buf[];

int hMA = INVALID_HANDLE;


int OnInit()
{
  SetIndexBuffer(0, MA_Buf, INDICATOR_DATA);
  PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
  
  SetIndexBuffer(1, MA_Calc_Buf, INDICATOR_CALCULATIONS);
  
  ArraySetAsSeries(MA_Buf, false);
  ArraySetAsSeries(MA_Calc_Buf, false);
  
  hMA = iMA(NULL, 0, MA_period, MA_shift, MA_method, MA_applied_price);    
  if (hMA == INVALID_HANDLE)
  { 
    int LErr = GetLastError();
    PrintFormat("iMA create failed (%d)", LErr);
    return (INIT_FAILED);
  }
  
  return (INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
  if (hMA != INVALID_HANDLE)
  {
    IndicatorRelease(hMA);
    hMA = INVALID_HANDLE;
  }
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
  int limit = rates_total-prev_calculated;
  if (prev_calculated > 0) limit++;

  int shift = -2 * MA_shift;
  
  int copied;
  copied = CopyBuffer(hMA, 0, shift, rates_total, MA_Calc_Buf);
  if (copied == -1)
  {
    int LErr = GetLastError();
    PrintFormat("CopyBuffer(hMA) failed (%d)", LErr);
    return (prev_calculated);
  }
  
  if (copied == 0)
  {
    PrintFormat("CopyBuffer(hMA) copied 0 bars");
    return (prev_calculated);
  }  
  
  for (int i=0; i < limit; i++)
  {
    MA_Buf[i] = MA_Calc_Buf[i];
  }

  return (rates_total);
}
Алексей Тарабанов
9726
Алексей Тарабанов  
Что общего с реальностью? Возможно, планы? 
RickD
1226
RickD  

В MT4 было просто. Когда нужно взять значение сдвинутого на 5 баров MA(20) напротив нулевого бара:
MA = iMA(NULL, 0, 20, 5, MODE_SMA, PRICE_CLOSE, 0);

В MT5 же работает правильно только при
CopyBuffer(hMA, 0, -10, ....

Хотя логично было бы
CopyBuffer(hMA, 0, -5, ....

Откуда берется двойной сдвиг?
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий