Что неправильно?

 

Хочу написать простой индикатор, показывающий на H1 зачение ATR(D1). Казалось бы, по логике, на всех часовых барах, принадлежащих какому-то дню, должно быть показано одно и то же значение, то есть должны быть прямые горизонтальные линии длиной 24 бара. Только этого не происходит. В чём ошибка?

#property  indicator_separate_window
#property  indicator_buffers 1
#property  indicator_color1  MediumBlue
double     Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings and buffers mapping
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1);
   SetIndexBuffer(0,Buffer);
   
   IndicatorDigits(Digits+1);
   
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("ATR_D1 V1.0");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- counted in the 1-st buffer
   for(int i=0; i<limit; i++)
     {
       Buffer[i]=iATR(NULL,PERIOD_D1,1,i); 
     }
   return(0);
  }
         
//+------------------------------------------------------------------+

Вот эта строка ---> Buffer[i]=iATR(NULL,PERIOD_D1,1,i); ---> усреднение по одному бару для периода D1. Или я что-то не так понимаю?

 
Parabellum:

Вот эта строка ---> Buffer[i]=iATR(NULL,PERIOD_D1,1,i); ---> усреднение по одному бару для периода D1. Или я что-то не так понимаю?



Попробуйте вот так:

Buffer[i] = iATR(NULL,PERIOD_D1,1,iBarShift(NULL,PERIOD_D1,iTime(NULL,0,i),false));

А еще лучше так:

Buffer[i] = iATR(NULL,PERIOD_D1,1,iBarShift(NULL,PERIOD_D1,Time[i],false));

 
Talex:
Parabellum:

Вот эта строка ---> Buffer[i]=iATR(NULL,PERIOD_D1,1,i); ---> усреднение по одному бару для периода D1. Или я что-то не так понимаю?



Попробуйте вот так:

Buffer[i] = iATR(NULL,PERIOD_D1,1,iBarShift(NULL,PERIOD_D1,iTime(NULL,0,i),false));

А еще лучше так:

Buffer[i] = iATR(NULL,PERIOD_D1,1,iBarShift(NULL,PERIOD_D1,Time[i],false));


Спасибо!
Причина обращения: