Explore Stocks that respect desired EMA

I want to list stocks that respect a specific EMA. For example, I want to list those stocks in my watchlist which respect their 20 days EMA.
To do this, I was thinking to consider the percentage of the daily bars that close above required EMA. For example, I assume a stock respects its 20 days EMA if 70% of its daily price is close above 20 days moving average.

I wrote the following code. However, although it counts and calculates the percentage correctly (as I debugged), it does not provide the result I am looking for.

For example, I know that Blink recently respects its 20 days EMA but does not appear in the results.
Besides, I want the list of the stocks, not the list of stocks at a different date that price was above EMA.

Appreciate if someone can advise me.
Thanks

Percenage = 70; // the percentage of price bars close above desired EMA

desiredEMA = 20;

count = 0; //Number of days that price Close above desired EMA

m = EMA(Close,desiredEMA);


for (i = 1; i < BarCount; i++) 
{
    if (close[i] > m[i]) count++; 
}

Filter = (count/BarCount)*100 > Percenage;

Here is a result I'm getting from the above code. But the ideal output for me would be just a list containing AAPL and FB.

ami

@Sepideh,

For posting questions on the forum, you are required to get "Verified".

Please search for "Verified" or "Verified Badge" and follow the steps.

Thanks for your note. I did it.

@Sepideh, Glad to see you got verified.

As to your issue, it depends on what you are really looking for. You will probably have to refine your expectation and your code...

I would suggest that you start with adding some additional columns to your exploration. Look at the "AddColumn" function.

Also, your method of determining the % (a loop), is not recommended in AB/AFL.
A more AB/AFL method is using the arrays.

// Stocks Respecting EMA
// From forum  
// Code by Snoopy.pa30

pDesiredPercentage = Param("Desired Percentage", 70, 1, 100, 1, 0);
pDesiredEMA = Param("Desired EMA", 20, 3, 99, 1, 0);
pLookBack = Param("Look Back", 63, 20, 262, 1, 0);  // Alternate time for EMA Respect

vDesiredEMA = EMA(C, pDesiredEMA);

vCaboveEMA = C>vDesiredEMA;  // Generate array with status

vSumAll = Sum(vCaboveEMA, LastValue(BarIndex()) -1 - pDesiredEMA);  // Sum must exclude the undefined EMA calc space
vSumLookback = Sum(vCaboveEMA, pLookback);  // Sum over Alternate time for EMA Respect

vPercentageAll = vSumAll/(LastValue(BarIndex()) - 1 - pDesiredEMA)  * 100;  // % for All bars, Excluding undefined EMA calc space
vPercentageLookback = vsumlookback/pLookback * 100;  // % over lookback

Filter = (vPercentageAll > pDesiredPercentage) OR (vPercentageLookback > pDesiredPercentage);

AddColumn(vPercentageLookback, "Look Back %");
AddColumn(vPercentageAll, "% All");


Hope this helps.

2 Likes

It is worth noting that cumulative sum of some condition is better written this way:

m = EMA(Close,desiredEMA);
count = Cum( Close > m ); // gives array output

if you need just one last value then:

m = EMA(Close,desiredEMA);
count = LastValue( Cum( Close > m ) ); // gives last value of cumulative sum
5 Likes

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