Проблема с отрисовкой графика при попытке сгладить линию (iMAOnArray)

 

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

после вертикальной линии показана не стыковка,  на втором

показана как должно быть (вручную обновлен график). Часть кода индикатора:

#property copyright "Copyright 2017, AVGi."
#property version   "1.00"
#property strict
#property indicator_separate_window
//#property indicator_minimum 0
//#property indicator_maximum 100
#property indicator_buffers 3
#property indicator_plots   3

//Buy
#property indicator_level1 20
#property indicator_level2 30
//#property indicator_level3 40

//BuySell
#property indicator_level4 50

//Sell
//#property indicator_level5 60
#property indicator_level6 70
#property indicator_level7 80



//--- plot Label1
#property indicator_label1  "XLine"
#property indicator_type1 DRAW_LINE
#property indicator_color1  clrWhite
#property indicator_style1  DRAW_LINE
#property indicator_width1  1 
//--- plot Label2
#property indicator_label2  "XByu"
#property indicator_type2  DRAW_ARROW
#property indicator_color2  clrBlue
#property indicator_style2  DRAW_ARROW
#property indicator_width2  3
//--- plot Label3
#property indicator_label3  "XSell"
#property indicator_type3  DRAW_ARROW
#property indicator_color3  clrRed
#property indicator_style3  DRAW_ARROW
#property indicator_width3  3 


//--- input parameters
//extern int БарыИстории=2160;
extern int Усреднение=5;
//--- indicator buffers
double XLine[];
double XBuy[];
double XSell[];
int    x,z;
//+------------------------------------------------------------------+
//| Custom indicator initialization function      |
//+------------------------------------------------------------------+
int OnInit()
  {
   IndicatorBuffers(3);
//--- indicator buffers mapping
   SetIndexBuffer(0,XLine);
   SetIndexEmptyValue(0,EMPTY_VALUE);

   SetIndexBuffer(1,XBuy);
   SetIndexArrow(1,159);
   SetIndexEmptyValue(1,EMPTY_VALUE);

   SetIndexBuffer(2,XSell);
   SetIndexArrow(2,159);
   SetIndexEmptyValue(2,EMPTY_VALUE);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function      |
//+------------------------------------------------------------------+
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(limit==rates_total){limit=limit-1;}
   if(limit==0){limit=limit+1;}
//Print("limit = ",limit,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
   int i;
   for(i=0;   i<limit && i<rates_total && !IsStopped(); i++)
     {
      XLine[i]=signal(i);
      XBuy[i]=EMPTY_VALUE;
      XSell[i]=EMPTY_VALUE;
     }
   double ZX[];
   ArraySetAsSeries(ZX,true);
   ArrayCopy(ZX,XLine,0,0,rates_total);
   for(i=0;(i<limit && i<rates_total && !IsStopped()); i++)
     {
      XLine[i]=iMAOnArray(ZX,0,Усреднение,0,MODE_SMA,i);
     }
   for(z=0;z<limit && !IsStopped(); z++)
     {
      if(XLine[z]<XLine[z+1])
        {
         XSell[z]=XLine[z];
        }
      else
        {
         XBuy[z]=XLine[z];
        }
     }
   return(rates_total);
  }
 
надо обновлять (перерисовывать) предыдущие бары (усреднение 5 штук)
 
Taras Slobodyanik:
надо обновлять (перерисовывать) предыдущие бары (усреднение 5 штук)
Если при каждом закрытии свечи перерисовывать предыдущие 5 свечей, то искажается информация с каждой итерацией. Т.е. с каждым сдвигом функция усреднения для каждой свечи (последние 4 бара за исключением 0 бара), будет запускаться 4 раза (из-за смещения), итого при усреднении 5, свеча под индексом 4 будет усреднена в итоге на 20, при смещении функции усреднения.
 

усреднять одни и те же значения, то есть сделать темповый массив, и в нём хранить "чистые" значения, и их усреднять/перезаписывать 

 
Taras Slobodyanik:

усреднять одни и те же значения, то есть сделать темповый массив, и в нём хранить "чистые" значения, и их усреднять/перезаписывать 

Спасибо за помощь! Успел протестировать всего минут 10, различия между стандартным MA и iMAOnArray, составляет теперь от 0,5 до 1,5 %, с чем связано различие пока не смог найти, но раньше доходило до 40%, разности в значениях.