Strange behaviour by indicator

 

Could anybody tell me what it is about the code that means the overlaid lines do not exactly follow the WPR line? It isn't a major problem, but it all helps me learn mql4!

#property indicator_separate_window

#property indicator_maximum 0
#property indicator_minimum -100

#property indicator_buffers 3

#property indicator_color1 Red
#property indicator_color2 Aqua
#property indicator_color3 Gray

//---- input parameters
extern string  WPRPeriod_Desc    =  "Period";
extern int     WPRPeriod         =  8;
extern string  HighLevel_Desc    =  "Upper Limit";
extern int     HighLevel         =  -20;
extern string  LowLevel_Desc     =  "Lower Limit";
extern int     LowLevel          =  -80;
extern string  MarkFalse_Desc    =  "Show Limits";
extern bool    MarkFalse         =  true;
extern string  Transparent_Desc  =  "Transparency";
extern bool    Transparent       =  true;
extern string  Width_Desc        =  "Width";
extern int     Width             =  3;
      
//---- buffers
double WPR[];
double Inner[];
double Higher[];
double Lower[];


/// \brief Equal to ternar operator 
/// needed = Condition ? IfTrue : IfFalse;
/// \param IfTrue
/// \param IfFalse
/// \return matching value from parameters
double DoubleIf(bool Condition, double IfTrue, double IfFalse)
{
   if (Condition) return (IfTrue);
   else           return (IfFalse);
}

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   IndicatorBuffers(4);

   SetIndexBuffer(0, Higher);
   SetIndexBuffer(1, Lower);
   SetIndexBuffer(2, Inner);

   SetIndexBuffer(3, WPR);
   
   SetLevelValue(0, HighLevel);
   SetLevelValue(1, LowLevel);
   
  
   SetIndexStyle(0, DRAW_LINE, EMPTY, Width);
   SetIndexStyle(1, DRAW_LINE, EMPTY, Width);

   SetIndexDrawBegin(0, WPRPeriod + 1);
   SetIndexDrawBegin(1, WPRPeriod + 1);
   SetIndexDrawBegin(2, WPRPeriod + 1);   
   
   IndicatorShortName("WPR");
   
   IndicatorDigits(2);

   return(0);
}

int start()
{
   int ToCount = Bars - IndicatorCounted();

   for (int cnt = ToCount - 1; cnt >= 0; cnt--)
   {
      WPR[cnt] = iWPR(NULL, 0, WPRPeriod, cnt);

      int depth = 2;
      if (MarkFalse)
      {
         depth = 1;
      }
      
      for (int i = cnt + depth - 1; i >= cnt; i--)
      {
         Higher[i] = EMPTY_VALUE;
         Lower[i] = EMPTY_VALUE;
      
         Inner[i] = WPR[i];
   
         if (!Transparent)
         {
            if (WPR[i] <= LowLevel)
            {
               Inner[i] = DoubleIf(WPR[i + 1] > LowLevel, LowLevel, EMPTY_VALUE);
            }
            else
            {
               Inner[i] = DoubleIf(WPR[i + 1] <= LowLevel, LowLevel, WPR[i]);
            }
   
   
            if (WPR[i] >= HighLevel)
            {
               Inner[i] = DoubleIf(WPR[i + 1] < HighLevel, HighLevel, EMPTY_VALUE);
            }
            else 
            {
               Inner[i] = DoubleIf(WPR[i + 1] >= HighLevel, HighLevel, Inner[i]);
            }
         }
         
         if(WPR[i] >= HighLevel)
         {
            Higher[i] = WPR[i];
            Higher[i + 1] = DoubleIf(WPR[i + 1] >= HighLevel, WPR[i + 1], HighLevel);
         }
         else if(WPR[i + 1] >= HighLevel)
         {
            Higher[i] = HighLevel;
            Higher[i + 1] = WPR[i + 1];
         }   


         if(WPR[i] <= LowLevel)
         {
            Lower[i] = WPR[i];
            Lower[i + 1] = DoubleIf(WPR[i + 1] <= LowLevel, WPR[i + 1], LowLevel);
         }
         else if(WPR[i + 1] <= LowLevel)
         {
            Lower[i] = LowLevel;
            Lower[i + 1] = WPR[i + 1];
         }   
      }
   }
   
   return(0);
}
Reason: