Home > Enterprise >  Nested For Loop MQL4
Nested For Loop MQL4

Time:03-02

I have an array which has the same size as the number of bars in my chart. I want to create a cumulative array that sums them up 200 at a time. I am trying to wrap my head around loops, and I'm not sure what I'm doing wrong. Array[] denotes the array that has the same number of bars as the chart. CumulativeSumArray[] is the array in which each value is the sum of 200 of the values of Array[]. I am attempting to accomplish this task via nested for loops.

Here is a hypothetical situation:

double Array[];
double CumulativeSumArray[];
Length=200;
int i;
int j;
double _CumulativeSumArray;
for(i=Bars-Length-1;i>=0;i--)
    {
        for(j=i,j>=i Length;j  )
           {
               _CumulativeSumArray  = Array[j];
    
           }
    CumulativeSumArray[i]=_CumulativeSumArray;
    }

What I end up getting with this loop, or at least what it looks like, is a cumulative sum of the whole array.

CodePudding user response:

Q :
" not sure what I'm doing wrong. "

A :
( Overhead-costs Efficiency )
MQL4/5 code-execution eco-system works differently for Script, EA and even way more strange for CustomIndicator :

Setup-costs ( hopefully not spent more than once )
Update-costs ( best kept as low as possible, just smart-update per tick )
Maintenance-costs ( best kept as low as possible, just smart-update per aNewBar )

So, best forget the full-depth tandem-loops straight now :

Be it in start(){...} or OnInit(){...}, setup the values in Array[] and start filling the CumulativeSumArray[] ... progressively and state-fully :

ArrayCopy( CumulativeSumArray,    // destination
                        Array,    // source
                            0,    // start
                            0,    // start   
                  WHOLE_ARRAY );  // scope

for( int fwdBarNUMBER  = Bars -   1;
         fwdBarNUMBER >  Bars - 201;
         fwdBarNUMBER--
     )
     CumulativeSumArray[fwdBarNUMBER]  = CumulativeSumArray[fwdBarNUMBER - 1];

for( int fwdBarNUMBER  = Bars - 201;
         fwdBarNUMBER >= 0;
         fwdBarNUMBER--
     )
     CumulativeSumArray[fwdBarNUMBER]  = CumulativeSumArray[fwdBarNUMBER -   1]
                                       - CumulativeSumArray[fwdBarNUMBER - 201];

Given this pre-fill, an onNewBar() maintenance is as easy as:

             Array[1] = ... update your value on now last known Close[1] & other var. parts
CumulativeSumArray[1] = CumulativeSumArray[  2]   Array[1]
                      - CumulativeSumArray[202];            // CumSum update

and
similarly you keep updating the "hot"-end of the running bar inside an OnTick(){...}-handler for EA-s or inside an if ( RefreshRates() ){...}-POSACK-ed code-block as:

             Array[0] = ... update your value on a so far known Close[0]
CumulativeSumArray[0] = CumulativeSumArray[  1]   Array[0]
                      - CumulativeSumArray[201];

CodePudding user response:

It should just be a case of getting your logic right for the loops you require. Try the following code

   double Array[];
   double CumulativeSumArray[];
   int Length=200;
   int idx=0;
   
   for(int i=Bars-1; i>=0; i-=Length)
   {
      for(int j=i; j>i-Length; j--) CumulativeSumArray[idx] =Array[j];
      idx  ;
   }
  • Related