I am trying to run a loop on a 500 element array.
The loop should take elements 480 to 499 then store then in a 20 element array (past) then elements 479 to 498 etc. Basically it start with the last 20 elements in the returns array then shifts back 1 for the next 20 elements and so on.
For some reason i keep getting an error when i populate the past array. Any ideas??
OK, first off you need to correct a couple of things:
- You're initializing "jj" to 498. What's the reason for that? If you have 500 elements the index goes from 0 to 499. Why do you start at 498?
- Then you're not slicing in chunks of 20. What you're doing is an outer "for" that goes down 1 by 1, starting at 498 (why? see previous point), then going down (j--). Then you have the inside "for" where you try to populate the array of 20 elements. So in conclusion you're trying to populate the 20-element array some 478 times (jj > nm, or 498 > 20).
I think what you're trying to do is the following (not compiled nor tested, just typed):
for(int i = 499; i >= 0; i-=20) for(int j = 0; j <= 19; j++) past[j] = returns[i - j];
But still... you have to do something with that array before the next cycle of the outer loop, otherwise you're just overwriting the "past" array over and over. Let me know if it works.
A better version of the previous nested loop might be... (again, not tested, just typed):
int nn = 500, nm = 20; double returns[], past[25][]; int OnInit() { ArrayResize(past[25], nm); ArrayResize(returns, nn); return(INIT_SUCCEEDED); } for(int i = 499, loop = 0; i >= 0; i-=20, loop++) for(int j = 0; j <= 19; j++) past[loop][j] = returns[i - j];
OK, first off you need to correct a couple of things:
- You're initializing "jj" to 498. What's the reason for that? If you have 500 elements the index goes from 0 to 499. Why do you start at 498?
- Then you're not slicing in chunks of 20. What you're doing is an outer "for" that goes down 1 by 1, starting at 498 (why? see previous point), then going down (j--). Then you have the inside "for" where you try to populate the array of 20 elements. So in conclusion you're trying to populate the 20-element array some 478 times (jj > nm, or 498 > 20).
I added a bit more code for some context. Starting from 498 is intended. In the rest of the code, returns[480:499] which is a 20 element long array is stored as "today". I want to compare it to other slices. ie. "past" = returns[479:498], returns[478:497], etc. Maybe 'slice' is the wrong word to use. The data I'm storing in "past" is overlapping pieces of "returns", dropping and adding 1 data point as we move through jj. Not 25 slices of 20 data points. That's why its repeated 478 times.
int jj,nn = 500,nm = 20; double returns[],past[]; int OnInit() { ArrayResize(past,nm);ArrayResize(returns,nn); return(INIT_SUCCEEDED); } //populate returns double today[nm]; for(jj=(nn-1);jj>(nn-nm);jj--) { today[jj-nn+nm]= returns[jj]; } for(jj=nn-2;jj>nm;jj--) { for(kk=jj;kk>(jj-nm);kk--) { past[kk-jj+nm-1]= returns[kk]; } MathCorrelationPearson(today,past,cor); //next section }
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
I am trying to run a loop on a 500 element array.
The loop should take elements 480 to 499 then store then in a 20 element array (past) then elements 479 to 498 etc. Basically it start with the last 20 elements in the returns array then shifts back 1 for the next 20 elements and so on.
For some reason i keep getting an error when i populate the past array. Any ideas??