Inefficient Loop → AFL

Hello All...

Sorry, the subject is not very descriptive but that's the only one I think of right now ¯_(ツ)_/¯

I am trying to write a code to return at each bar the shortest MA period (between two predefined periods) where the following condition is true: Sum(C>MA(C,Period))==Limit... Period is the number I am looking for for each bar and Limit is a predefined constant.

What I have currently come up (below) with is a highly inefficient use of resources and I am sure there is a better way... can anyone please guide me a little to improve this and ideally have it all in AFL? I am shooting blanks here :man_facepalming:.

Much appreciated!

// look for the SHORTEST MA period between _start and _End
period_start = 10; 
period_end = 50;

period_limit = 20; 
// the number of days the C must be above the MA to stop the search.


for( i = 0; i < BarCount; i++ ) // loop through all bars, probably not necessary... can change to visible bars only
{

    period_result[i] = 0; // stores the result at each bar

    for( p = period_start; p <= period_end; p++ ) // loop between _start and _end periods
    {

        average = MA( C, p );
        count = Sum( C > average, period_limit ); // count number of days the c>ma in _limit periods

        if( count[i] == period_limit ) // if all above for _limit periods then 
        {
            period_result[i] = p;  // ... store the result
            break;				   // ... break the loop 
        }

    }

}

Plot( period_result, _DEFAULT_NAME(), colorBlack );

Try something like this:

period_start = 10; 
period_end = 50;
period_limit = 20; 

period_result = 0;
for( p = period_start; p <= period_end; p++ )
{
	currMA = MA(C,p);
	allAboveMA = LLV(C > currMA, period_limit);
	period_result = IIf(period_result, period_result, allAboveMA * p);
}

Filter = True;
AddColumn(period_result, "Result", 1.0);
1 Like

Beautiful! Thank you!

This topic was automatically closed 100 days after the last reply. New replies are no longer allowed.