Mql5 Array out of Range after conversion from Mql4- Please Help

 
  1. #property strict
    #property copyright "Copyright 2018"
    #property link      "https://www.mql5.com/"
    #property version "1.0"
    #property indicator_separate_window
    #property indicator_minimum 0
    #property indicator_buffers 2
    #property indicator_plots   2
    //--- plot upVolume
    #property indicator_label1  "upPips"
    #property indicator_type1   DRAW_HISTOGRAM
    #property indicator_color1  clrGreen
    #property indicator_style1  STYLE_SOLID
    #property indicator_width1  2
    //--- plot dnVolume
    #property indicator_label2  "dnPips"
    #property indicator_type2   DRAW_HISTOGRAM
    #property indicator_color2  clrFireBrick
    #property indicator_style2  STYLE_SOLID
    #property indicator_width2  2
    //--- input parameters
    input int      Difference = 120;
    // Alert Parameters
    input string Alert_On_Volume = "Alert on Volume>VolSize on TriggerCandle";
    input int    TriggerCandle  = 1;
    input double PipWaveSize=100;
    input bool   EnableNativeAlerts = false;
    input bool   EnableSoundAlerts  = false;
    input bool   EnableEmailAlerts  = false;
    input string SoundFileName = "alert.wav";
    datetime LastAlertTimeP = D'01.01.1970';
    int LastAlertDirectionP = 0;
    //--- indicator buffers
    double         barDirection[];
    double         trendDirection[];
    double         waveDirection[];
    double         upPipBuffer[];
    double         dnPipBuffer[];
    double         pipTracker=0;
    double         highestHigh = EMPTY_VALUE;
    double         lowestLow   = EMPTY_VALUE;
    int            hhBar = EMPTY_VALUE;
    int            llBar = EMPTY_VALUE;
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function                         |
    //+------------------------------------------------------------------+
    int OnInit()
      {
    //--- indicator buffers mapping
       //IndicatorBuffers(5);
       SetIndexBuffer(0, upPipBuffer);
       SetIndexBuffer(1, dnPipBuffer);
       SetIndexBuffer(2, trendDirection);
      
       SetIndexBuffer(3, waveDirection);
       SetIndexBuffer(4, barDirection);
      
      
    //  SetLevelValue(1,PipWaveSize);
    //  SetLevelStyle(STYLE_DASH,1);
    //---
       return(INIT_SUCCEEDED);
      }
    //+------------------------------------------------------------------+
    //| Custom indicator deinitialization function                       |
    //+------------------------------------------------------------------+
    //+------------------------------------------------------------------+
    //| 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[])
      {
    //---
       // Only compute bars on new bar
       if (rates_total == prev_calculated) return(rates_total);
       //RefreshRates();
       int limit = rates_total-1 ;
       int  waveChangeBar = limit-1;
    // ArrayResize(trendDirection,limit);
    // ArrayResize(waveDirection,limit);
    //ArrayResize(barDirection,limit);
       // Initialise values
       if (highestHigh == EMPTY_VALUE) highestHigh = NormalizeDouble(close[waveChangeBar],5);
       if (lowestLow == EMPTY_VALUE) lowestLow = NormalizeDouble(close[waveChangeBar],5);
       if (hhBar == EMPTY_VALUE) hhBar = waveChangeBar;
       if (llBar == EMPTY_VALUE) llBar = waveChangeBar;
      
       for(int i=limit-1; i>=0; i--) {
      Print(i, " limit ", limit);
          // Determine this bar's direction
          if (NormalizeDouble(close[i],5) - NormalizeDouble(close[i+1],5) >  0) barDirection[i] =  +1;    // Error Array out of Range current close higher
          if (NormalizeDouble(close[i],5) - NormalizeDouble(close[i+1],5) == 0) barDirection[i] =  0;    // current close equal
          if (NormalizeDouble(close[i],5) - NormalizeDouble(close[i+1],5) <  0) barDirection[i] = -1;    // current close lower
          if (barDirection[limit]   == EMPTY_VALUE) barDirection[limit]   = barDirection[i];
          if (trendDirection[limit] == EMPTY_VALUE) trendDirection[limit] = barDirection[i];
          if (waveDirection[limit]  == EMPTY_VALUE) waveDirection[limit]  = barDirection[i];
          // Determine highset high and lowest low
          if (NormalizeDouble(close[i],5) > highestHigh) {
             highestHigh = NormalizeDouble(close[i],5);
             hhBar = i;
          }
          else if (NormalizeDouble(close[i],5) < lowestLow) {
             lowestLow = NormalizeDouble(close[i],5);
             llBar = i;
          }
          // Determine if this bar has started a new trend
          if ((barDirection[i] != 0) && (barDirection[i] != barDirection[i+1]))
                trendDirection[i] = barDirection[i];
          else  trendDirection[i] = trendDirection[i+1];
          // Determine if this bar has started a new wave
         double waveTest =0.0;
          if (waveDirection[i+1] == 1  ) {
             waveTest = highestHigh ;
          }
          if (waveDirection[i+1] == -1  ) {
             waveTest = lowestLow;
          }
          double waveDifference = (MathAbs(waveTest - NormalizeDouble(close[i],5))) * MathPow(10, _Digits);
          if (trendDirection[i] != waveDirection[i+1]) {
             if (waveDifference >= Difference ) waveDirection[i] = trendDirection[i];
             else waveDirection[i] = waveDirection[i+1];
          }
          else waveDirection[i] = waveDirection[i+1];
          // Determine if we have started a new wave
          if (waveDirection[i] != waveDirection[i+1] ) {    //&& close[i] !=close[i+1]
            if (waveDirection[i] == 1) {
                highestHigh = NormalizeDouble(close[i],5);
                hhBar = i;
               waveChangeBar = llBar;
             }
            else {
                lowestLow = NormalizeDouble(close[i],5);
               llBar = i;
               waveChangeBar = hhBar;
             }
            
        
             pipTracker=0;
             for (int k=waveChangeBar-1; k>=i; k--)     {                                                                                                                        
              
                pipTracker +=(NormalizeDouble(open[k],5)-NormalizeDouble(close[k],5))*MathPow(10, _Digits)/10;
                if (waveDirection[i] ==  1) {
          
                   upPipBuffer[k]=MathAbs(pipTracker);
                   dnPipBuffer[k]=0;
                }
                if (waveDirection[i] == -1) {
              
                   upPipBuffer[k]=0;
                   dnPipBuffer[k]=MathAbs(pipTracker);
                }
             }
            
          }
          else {
           pipTracker+=(NormalizeDouble(open[i],5)-NormalizeDouble(close[i],5))*MathPow(10, _Digits)/10;
          }
          // Set the indicators
          if (waveDirection[i] ==  1) {
        
             upPipBuffer[i]=MathAbs(pipTracker);
             dnPipBuffer[i]=0;
            
        
          }
          if (waveDirection[i] == -1) {
        
             upPipBuffer[i]=0;
             dnPipBuffer[i]=MathAbs(pipTracker);
          
          
          }
        
       }
    //if (((TriggerCandle > 0) && (Time[0] > LastAlertTimeP)) || (TriggerCandle == 0))
    //{
    //string Text;
    //if ((upPipBuffer[TriggerCandle] > PipWaveSize) && (upPipBuffer[TriggerCandle+1] < PipWaveSize) && ((TriggerCandle > 0) || ((TriggerCandle == 0) && (LastAlertDirectionP != 1))))
    //{
    // Text = _Symbol+" "+ IntegerToString(Period())+" HIGH UP PIP WAVE " + " - "+TimeToString(Time[0]);
    // if (EnableNativeAlerts) Alert(Text);
    // if (EnableEmailAlerts) SendMail(_Symbol+ " HIGH UP PIP WAVE ", Text);
    // if (EnableSoundAlerts) PlaySound(SoundFileName);
    // LastAlertTimeP = Time[0];
    // LastAlertDirectionP = 1;
    //}
    // Down Arrow Alert
    //if ((dnPipBuffer[TriggerCandle] > PipWaveSize)&& (dnPipBuffer[TriggerCandle+1] < PipWaveSize) && ((TriggerCandle > 0) || ((TriggerCandle == 0) && (LastAlertDirectionP != -1))))
    //{
    // Text =_Symbol+ " "+ IntegerToString(Period())+" HIGH DN PIP WAVE  " + " - "+TimeToString(Time[0]);
    // if (EnableNativeAlerts) Alert(Text);
    // if (EnableEmailAlerts) SendMail(_Symbol+ " HIGH DN PIP WAVE ", Text);
    // if (EnableSoundAlerts) PlaySound(SoundFileName);
    // LastAlertTimeP = Time[0];
    // LastAlertDirectionP = -1;
    //}
    //}
    //--- return value of prev_calculated for next call
       return(rates_total);
      }
    //+------------------------------------------------------------------+
    //********************************************  Emulation *******************************************
    double Ask;
    double Bid;
    double Bars;
    double Open[];
    double Close[];
    double High[];
    double Low[];
    datetime Time[];
    long Volume[];
    void Set_Values_to_variables()
    {
       MqlTick last_tick;
       SymbolInfoTick(_Symbol,last_tick);
       Ask=last_tick.ask;
       Bid=last_tick.bid;
      
       ArraySetAsSeries(Close,true);
       CopyClose(_Symbol,_Period,0,Bars(_Symbol,_Period),Close);
       ArraySetAsSeries(Open,true);
       CopyOpen(_Symbol,_Period,0,Bars(_Symbol,_Period),Open);
       ArraySetAsSeries(Low,true);
       CopyLow(_Symbol,_Period,0,Bars(_Symbol,_Period),Low);
       ArraySetAsSeries(High,true);
       CopyHigh(_Symbol,_Period,0,Bars(_Symbol,_Period),High);
       ArraySetAsSeries(Time,true);
       CopyTime(_Symbol,_Period,0,Bars(_Symbol,_Period),Time);
       ArraySetAsSeries(Volume,true);
       CopyTickVolume(_Symbol,_Period,0,Bars(_Symbol,_Period),Volume);
    }
    ENUM_TIMEFRAMES TFMigrate(int tf)
    {
       switch(tf)
       {
          case 0: return(PERIOD_CURRENT);
          case 1: return(PERIOD_M1);
          case 5: return(PERIOD_M5);
          case 15: return(PERIOD_M15);
          case 30: return(PERIOD_M30);
          case 60: return(PERIOD_H1);
          case 240: return(PERIOD_H4);
          case 1440: return(PERIOD_D1);
          case 10080: return(PERIOD_W1);
          case 43200: return(PERIOD_MN1);
          
          case 2: return(PERIOD_M2);
          case 3: return(PERIOD_M3);
          case 4: return(PERIOD_M4);      
          case 6: return(PERIOD_M6);
          case 10: return(PERIOD_M10);
          case 12: return(PERIOD_M12);
          case 16385: return(PERIOD_H1);
          case 16386: return(PERIOD_H2);
          case 16387: return(PERIOD_H3);
          case 16388: return(PERIOD_H4);
          case 16390: return(PERIOD_H6);
          case 16392: return(PERIOD_H8);
          case 16396: return(PERIOD_H12);
          case 16408: return(PERIOD_D1);
          case 32769: return(PERIOD_W1);
          case 49153: return(PERIOD_MN1);      
          default: return(PERIOD_CURRENT);
       }
    }

Could someone help out Array our of Range at the beginning of the "for" loop at line 130. 

 
#property indicator_buffers 2
#property indicator_plots   2

   //IndicatorBuffers(5);
   SetIndexBuffer(0, upPipBuffer);
   SetIndexBuffer(1, dnPipBuffer);
   SetIndexBuffer(2, trendDirection);
   
   SetIndexBuffer(3, waveDirection);
   SetIndexBuffer(4, barDirection);
How can you have five buffers when you set the property to two?
 
whroeder1:
How can you have five buffers when you set the property to two?

You are absolutely right, I missed that. Now when I set indicators buffer to 5 I get an array error on the following lines

  for (int k=waveChangeBar-1; k>=i; k--)     {                                                                                                                       
         
            pipTracker +=(NormalizeDouble(open[k],5)-NormalizeDouble(close[k],5))*MathPow(10, _Digits)/10;

 
Panagiotis Diamantopoulos:

You are absolutely right, I missed that. Now when I set indicators buffer to 5 I get an array error on the following lines

  for (int k=waveChangeBar-1; k>=i; k--)     {                                                                                                                       
         
            pipTracker +=(NormalizeDouble(open[k],5)-NormalizeDouble(close[k],5))*MathPow(10, _Digits)/10;

Thank you for your help, I appreciated 

I fixed that error too .

 
Set ArraySetAsSeries all your buffer.
Reason: