Download MetaTrader 5
To add comments, please log in or register
MQL5 Cloud Network speeds up calculations. Try it!
enjoysmath
64
enjoysmath 2015.07.21 22:23 

I understand that prev_calculated = 0 is passed to the first call of OnCalculate then it is incremented each time by one?

So inside OnCalculate, how would I handle all bars that are less than prev_calculated?  If prev_calculated starts at, 0, then there's nothing to do as in:

 

for (int i=0; i < prev_calculated; i++) {

}

 

So the code inside the loop won't get called, yet that's the logic I need for subsequent calls, so how is my perception wrong? 

Keith Watford
Moderator
7866
Keith Watford 2015.07.22 00:06  
enjoysmath:

I understand that prev_calculated = 0 is passed to the first call of OnCalculate then it is incremented each time by one?

So inside OnCalculate, how would I handle all bars that are less than prev_calculated?  If prev_calculated starts at, 0, then there's nothing to do as in:

 

 

So the code inside the loop won't get called, yet that's the logic I need for subsequent calls, so how is my perception wrong? 

prev_calculated returns the amount of bars (rates_total) from the previous tick

So if there are 1000 bars on the chart

1st call it =0

2nd call etc =1000

When a new bar forms, the first tick received for that new bar, it returns 1000

next tick etc it returns 1001 until another new bar opens 

enjoysmath
64
enjoysmath 2015.07.22 00:10  
GumRai:

prev_calculated returns the amount of bars (rates_total) from the previous tick

So if there are 1000 bars on the chart

1st call it =0

2nd call etc =1000

When a new bar forms, the first tick received for that new bar, it returns 1000

next tick etc it returns 1001 until another new bar opens 

Let me see if I understand you correctly:

 First call of OnCalculate:

       prev_calculated = 0

 Second call of OnCalculate:

      prev_calculated = 1000 ??????

That would mean I would need to calculate the first 1000 on the first call?  

 Could you provide some if / else conditionals that demonstrate typical handling of prev_calculated - say all I want to do is duplicate high[] for example.

Thank you for your response!!! 

enjoysmath
64
enjoysmath 2015.07.22 00:42  
enjoysmath:

Let me see if I understand you correctly:

 First call of OnCalculate:

       prev_calculated = 0

 Second call of OnCalculate:

      prev_calculated = 1000 ??????

That would mean I would need to calculate the first 1000 on the first call?  

 Could you provide some if / else conditionals that demonstrate typical handling of prev_calculated - say all I want to do is duplicate high[] for example.

Thank you for your response!!! 

 

Okay, I've got it finally!

 

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 iBound = rates_total;
   
   if (prev_calculated != 0) {
      iBound = rates_total - prev_calculated;
   }
   
   int i;
   for (i = 0; i < iBound; i++) {
      smoothnessBuffer[i] = high[i];
   }
   
   return(rates_total);
}

 


Keith Watford
Moderator
7866
Keith Watford 2015.07.22 01:12  

Not quite

int i;
   for (i = 0; i < iBound; i++) {
      smoothnessBuffer[i] = high[i];

may not get the final tick value of high[1] (thats [one] not [i], easy to misread - one of the reasons I avoid using i).

int i;
   for (i = 0; i <= iBound; i++) {
      smoothnessBuffer[i] = high[i];

will make sure that you catch the final tick value. 

Also, if you use high[], you will need to set the array as series. 

If you use High[] instead of high[], then no need

whroeder1
13593
whroeder1 2015.07.22 12:00  
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.
Ignore the parameters and just use
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) ...
the buffers and The predefined Variables - MQL4 Documentation
fridayda13_2016
6
fridayda13_2016 2016.08.05 08:43  
GumRai:

Not quite

may not get the final tick value of high[1] (thats [one] not [i], easy to misread - one of the reasons I avoid using i).

will make sure that you catch the final tick value. 

Also, if you use high[], you will need to set the array as series. 

If you use High[] instead of high[], then no need

Not quite true either.

If rates_total=1, then the loop should be only from 0 to 0, without the 1.

What you suggest, adding equality sign (=) will overflow beyond rates_total number of bars in case prev_calculated=0; 

Keith Watford
Moderator
7866
Keith Watford 2016.08.05 12:37  
fridayda13_2016:

Not quite true either.

If rates_total=1, then the loop should be only from 0 to 0, without the 1.

What you suggest, adding equality sign (=) will overflow beyond rates_total number of bars in case prev_calculated=0; 

Yes, of course, silly me :)


I should also have said that

   int iBound = rates_total;

should be

   int iBound = rates_total-1;

.

whroeder1
13593
whroeder1 2016.08.05 13:23  
  1. rates_total-1 doesn't handle your lookbacks correctly.
  2. My previous post should be (obviously)
    for(int iBar = Bars -1 - MathMax(lookback, counted); iBar >= 0; --iBar) ...
/
To add comments, please log in or register