Download MetaTrader 5
To add comments, please log in or register
Read the Forum and improve your rating!
enjoysmath
64
enjoysmath 2015.07.21 20:09 

Hello, I'm in the process of porting some old code (start(), init(), etc) to the updated MQL4.  I've gotten rid of all the compiler warnings and replaced start() with OnCalculate() and so on.  Now without this one line, the chart window stays open (desired operation), but with the line, it crashes as if it thinks something in the line is legacy code.  Please point out how this line should be updated (See bottom of code).

 

//+------------------------------------------------------------------+
//| 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[])
{
        int limit;
        int counted_bars=IndicatorCounted();

   Comment("DEBUG: " + IntegerToString(counted_bars));
   
   if(counted_bars < 0)
      return(-1);

        if(counted_bars > 0)
                counted_bars -= 10;

        limit = Bars - counted_bars;

        int i;
        for(i=0; i<CURRENCYCOUNT; i++) {
                SetIndexStyle(i,DRAW_LINE,STYLE_SOLID,2,currencyColors[i]);
        }

        RefreshRates();

        int lowLimit = 0;
        limit = WindowFirstVisibleBar();
        lowLimit = limit - WindowBarsPerChart();

        for(i=limit; i >= lowLimit; i--) {
                double diff = 0.0;

                static int priorBar = -1;
                int bar = iBarShift(NULL, userTimeFrame, time[i]);  /************ THE LINE THAT BREAKS IT. within it I've replaced old "Time[i]" with updated time[i] ***********/
//              if(bar!=priorBar) {
//                      // Calc Slope into currencyValues[]
//                      ArrayInitialize(currencyValues,0.0);
//                      calcCSS(userTimeFrame,bar);
//              }
// .........

whroeder1
13597
whroeder1 2015.07.22 12:24  
  1.         int counted_bars=IndicatorCounted();
    
            if(counted_bars > 0)
                    counted_bars -= 10;
    
            limit = Bars - counted_bars;
    Do your lookback properly
    int counted = IndicatorCounted();
    int lookback = ... // iMA(period) has look back of period.
                       // buffer[i+2] has look back of 2
                       // use maximum of all.
    for(int iBar = Bars - MathMax(lookback, counted); iBar >= 0; --iBar) ...

  2. int bar = iBarShift(NULL, userTimeFrame, time[i]);  /************ THE LINE THAT BREAKS IT. within it I've replaced old "Time[i]" with updated time[i] ***********/
    There is the parameters high[] and the The predefined Variables - MQL4 Documentation High[]. Don't get them confused. high[] can be ordered either direction; High[0] is the current bar always. Your limit/lowLimit implies series arrays but you didn't set time[] as series.
  3. limit = WindowFirstVisibleBar();
    lowLimit = limit - WindowBarsPerChart();
    You don't take chart shift into account so lowLimit will go negative
    iLeft   = WindowFirstVisibleBar(); 
    iRight  = MathMax(0,iLeft-WindowBarsPerChart() ); 

enjoysmath
64
enjoysmath 2015.07.22 13:19  
Thanks WHRoeder,  that's a lot of points.  I will look at each one in detail now.
/
To add comments, please log in or register