HELP, this MACROSS indicator can't refresh intime too,who can help me to solve it ,thanks

 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Coral

double CrossUp[];
double CrossDown[];
double prevtime;
double Range, AvgRange;
double fasterMAnow, fasterMAprevious, fasterMAafter;
double mediumMAnow, mediumMAprevious, mediumMAafter;
double slowerMAnow, slowerMAprevious, slowerMAafter;

extern int FasterMA    =    12;
extern int FasterShift =    0;
extern int FasterMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma

extern int MediumMA    =    144;
extern int MediumShift =    0;
extern int MediumMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma

extern int SlowerMA    =   169;
extern int SlowerShift =    0;
extern int SlowerMode  =    1; // 0 = sma, 1 = ema, 2 = smma, 3 = lwma

extern int SoundAlert =    0; // 0 = disabled

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW, EMPTY);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, EMPTY);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
 {
   
   int limit, i, counter;
   
   int counted_bars=IndicatorCounted();
   //---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   
   limit=Bars-counted_bars;
   
   for(i = 0; i <= limit; i++)
    {
      
      counter=i;
      Range=0;
      AvgRange=0;
      for (counter=i ;counter<=i+9;counter++)
       {
         AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
       }
      Range=AvgRange/10;
       
      fasterMAnow      = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i+1);
      fasterMAprevious = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i+5);
      fasterMAafter    = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i-1);
      
      mediumMAnow      = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i+1);
      mediumMAprevious = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i+2);
      mediumMAafter    = iMA(NULL, 0, MediumMA, MediumShift, MediumMode, PRICE_CLOSE, i-1);
      
      slowerMAnow      = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i+1);
      slowerMAprevious = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i+2);
      slowerMAafter    = iMA(NULL, 0, SlowerMA, SlowerShift, SlowerMode, PRICE_CLOSE, i-1);
      
      if ((fasterMAnow     > mediumMAnow       &&
          fasterMAprevious <= slowerMAprevious  &&
          fasterMAafter    > mediumMAafter     &&
          mediumMAnow      > slowerMAnow     )
          ||
          (fasterMAnow     > slowerMAnow       &&
          fasterMAprevious <= mediumMAprevious  &&
          fasterMAafter    > slowerMAafter     &&
          slowerMAnow      > mediumMAnow      ))
       {
         CrossUp[i] = Low[i] - Range*0.5;
       }
 
       
      if ((fasterMAnow     < slowerMAnow       &&
          fasterMAprevious >= mediumMAprevious  &&
          fasterMAafter    < slowerMAafter     &&
          mediumMAnow      > slowerMAnow     )
          ||
          (fasterMAnow     < mediumMAnow       &&
          fasterMAprevious > slowerMAprevious       &&
          fasterMAafter    < mediumMAafter  &&
          mediumMAafter    < slowerMAafter   ))
       {
         CrossDown[i] = High[i] + Range*0.5;
       }
      
    }
   
      if ((CrossUp[0] > 2000) && (CrossDown[0] > 2000)) { prevtime = 0; }
      
      
      if ((CrossUp[0] == Low[0] - Range*0.5) && (prevtime != Time[0]) && (SoundAlert != 0))
       {
         prevtime = Time[0];
         Alert(Symbol()," 3 MA Cross Up @  Hour ",Hour(),"  Minute ",Minute());
       }
      
      if ((CrossDown[0] == High[0] + Range*0.5) && (prevtime != Time[0]) && (SoundAlert != 0))
       {
         prevtime = Time[0];
         Alert(Symbol()," 3 MA Cross Down @  Hour ",Hour(),"  Minute ",Minute());
       } 
       
   
   //Comment("  CrossUp[0]  ",CrossUp[0]," ,  CrossDown[0]  ",CrossDown[0]," ,  prevtime  ",prevtime);
   //Comment("");
   
   return(0);
 }
 
  1. Don't double post! You already had this thread open.
              General rules and best pratices of the Forum. - General - MQL5 programming forum

  2.    for(i = 0; i <= limit; i++)
          ⋮
          fasterMAnow      = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i+1);
          fasterMAprevious = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i+5);
          fasterMAafter    = iMA(NULL, 0, FasterMA, FasterShift, FasterMode, PRICE_CLOSE, i-1);
    When i is zero, you try to read the future. If i+1 is now, then after must be i+0.

  3. When counted_bars is less than six you try to read past the end of the chart.
              How to do your lookbacks correctly.
  4.       for (counter=i ;counter<=i+9;counter++)
           {
             AvgRange=AvgRange+MathAbs(High[counter]-Low[counter]);
    When counted_bars is less than ten you try to read past the end of the chart.
              How to do your lookbacks correctly.

  5. if ((CrossDown[0] == High[0] + Range*0.5)
    Doubles are rarely equal. Understand the links in:
              The == operand. - MQL4 programming forum