Download MetaTrader 5
To add comments, please log in or register
Find out the most discussed Forum topics. Have a look at the Wall section!
Harry
267
Harry 2014.06.06 19:42 

Hi Everyone,

I cannot understand why the following structure doesn't work.

When I attach to chart, ONLY buffer buy has value.

To my understand, it will run the 2 sequences one by one. So the first FOR() will be fully run first  --> I have buy buffer. Then the second FOR() will be processed.

(it is for illustration of the problem, so it seems silly not using if else) 

Thank you for your help. 

SCFX 

 

      int limit=rates_total-prev_calculated;
//FIRST FOR()
for(int i=1;i<=limit; i++)
{ if(Close[i]<Open[i])
    { buy[i]=Open[i];}
}       

//SECOND FOR()
for(int j=1;j<=limit;j++)
{ if(Close[j]>Open[j])
    {sell[j]=Close[j];}
}       
   

//--- return value of prev_calculated for next call

   return(rates_total);

  }
Files:
problem.mq4 4 kb
Keith Watford
Moderator
7887
Keith Watford 2014.06.07 01:49  

Change

for(int i=1;i<=limit; i++)
//
//
for(int j=1;j<=limit;j++)

to

for(int i=1;i<limit; i++)
//
//
for(int j=1;j<limit;j++)

On first run, prev_calculated==0, so limit==Bars.

You are trying to access an array element that doesn't exist and getting an array out of range error.

Because you count up in the loop, the buy buffer is being filled before the error occurs.

Harry
267
Harry 2014.06.07 02:03  

Thanks, GumRai.

It works now! 

Yes, on first run, limit==Bars.

So it will run from i=1 to N (count up in the loop). I am not clear why a given element of the array (1-N) doesn't exist.

Can you explain it please?

SCFX 

Ian Venner
2583
Ian Venner 2014.06.07 02:33  

You can figure it out youself if you can answer these questions.

Assume 100 bars, the lowest bar index is zero.

What is the highest bar index ? 

What is the value of Bars ?

Is the highest bar index the same as the value of Bars ?

Harry
267
Harry 2014.06.07 02:56  

Oh,

Great way to teach, SDC.

so it ranges from 0-99. value bar=100.

limit<=100 --> bar 100 is not there yet.

I got it. 

But you know, the i<=limit has not caused me any trouble before :(

Have a nice weekend.

SCFX 

Ian Venner
2583
Ian Venner 2014.06.07 04:17  
Yes it would have worked before the recent upgrades to mql4 and MT4. Since then badly coded indicators that were previously allowed to slide because such errors were ignored by the compiler and the terminal will no longer work. They now have to be coded more accurately.
whroeder1
13596
whroeder1 2014.06.07 16:36  
GumRai: Change
for(int i=1;i<=limit; i++)

to

for(int i=1;i<limit; i++)

Will NOT work. You do NOT loop from 0 (or 1) to rates_total-prev_calculated You loop from notDone to rates_total-1. rates_total-1 is the newest forming bar and 0 is the oldest bar.

See Question with for(i=0; i<=limit; i++) - MQL4 forum.

Ian Venner
2583
Ian Venner 2014.06.07 17:16  

WHRoeder:

Will NOT work. You do NOT loop from 0 (or 1) to rates_total-prev_calculated You loop from notDone to rates_total-1. rates_total-1 is the newest forming bar and 0 is the oldest bar.

See Question with for(i=0; i<=limit; i++) - MQL4 forum.

That is only the case if you reverse the buffers and series arrays.

These are the main considerations when creating indicator loops,

  • rates_total == total number of bars
  • prev_calculated == 0 on initial load or when chart history is added
  • prev_calculated == rates-total-1 the rest of the time
  • buffer indexing direction
/
To add comments, please log in or register