Why array out of series when I want to put array in smaller multitimeframe

 
Code here, mql5 newbie, can anyone tell me why it print array out of range(number71,55)?Thx a lot(Want to calculate the average high-low 20 days)
#property indicator_chart_window

#property indicator_buffers 4
#property indicator_plots 4

double DayHigh[];
double DayLow[];
double DayAmplitudeBuffer[];
double AverageDayAmplitudeBuffer[];

int DayAmplitudeHandle;
double DayAmplitudeCurrentBuffer[];
double AverageDayAmplitudeCurrentBuffer[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,DayHigh,INDICATOR_DATA);
   SetIndexBuffer(1,DayLow,INDICATOR_DATA);
   SetIndexBuffer(2,DayAmplitudeBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,AverageDayAmplitudeBuffer,INDICATOR_DATA);

   DayAmplitudeHandle=iCustom(_Symbol,PERIOD_D1,"自訂\\12");

   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[])
  {
   CopyHigh(Symbol(),PERIOD_D1,TimeCurrent(),rates_total,DayHigh);
   CopyLow(Symbol(),PERIOD_D1,TimeCurrent(),rates_total,DayLow);
   
   for(int i=0; i<rates_total; i++)
     {
      DayAmplitudeBuffer[i]=StringToDouble(IntegerToString(StringToInteger(DoubleToString((DayHigh[i]-DayLow[i])/Point()))));
      AverageDayAmplitudeBuffer[i]=CalculateAverageDayAmplitude(i);
     }
   CopyBuffer(DayAmplitudeHandle,2,0,rates_total,DayAmplitudeCurrentBuffer);
   CopyBuffer(DayAmplitudeHandle,3,0,rates_total,AverageDayAmplitudeCurrentBuffer);

   datetime Time[];
   CopyTime(_Symbol,PERIOD_D1,0,rates_total,Time);

   int pos=0;
   for(int i=0; i<rates_total; i++)
     {
      if(time[i]>Time[pos]) //i for smaller timeframe, pos for PERIOD_D1, when time i bigger than time pos, pos will plus1 to make effect like iBarshift
        {
         pos++;
        }
      DayAmplitudeBuffer[i]=DayAmplitudeCurrentBuffer[pos];
      AverageDayAmplitudeBuffer[i]=AverageDayAmplitudeCurrentBuffer[pos];
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
double CalculateAverageDayAmplitude(int StartBar)
  {
   double DayAmplitudeSum=0;
   for(int pos=StartBar-20; pos<StartBar; pos++)
     {
      if(StartBar-20<0)
        {
         return(0);
        }
      DayAmplitudeSum=DayAmplitudeSum+DayAmplitudeBuffer[pos];
     }
   return(DayAmplitudeSum/20);
  }
//+------------------------------------------------------------------+
The checks a trading robot must pass before publication in the Market
The checks a trading robot must pass before publication in the Market
  • www.mql5.com
Before any product is published in the Market, it must undergo compulsory preliminary checks in order to ensure a uniform quality standard. This article considers the most frequent errors made by developers in their technical indicators and trading robots. An also shows how to self-test a product before sending it to the Market.
Reason: