• LIMITED TIME OFFER: use coupon code PRIMEDAY (case sensitive) at checkout to save $50 off VIP membership (down to $149 / year). Valid through Tuesday 6/22. Biggest discount this year!

Scan for stocks above 50 SMA for the last X days?

Nick

Active member
2019 Donor
VIP
Hi all, i tried to convert these codes into a TOS scan but received an error message, "too complex exceptions......

May i request some help to convert this into a scan.

Thanks
Code:
declare lower;

input days_above_50ma = 125;
def mystery = AbsValue(close>average(close,50)) + AbsValue(close[1]>average(close,50)[1]) + AbsValue(close[2]>average(close,50)[2]) + AbsValue(close[3]>average(close,50)[3]) +
AbsValue(close[4]>average(close,50)[4]) + AbsValue(close[5]>average(close,50)[5]) + AbsValue(close[6]>average(close,50)[6]) + AbsValue(close[7]>average(close,50)[7]) +
AbsValue(close[8]>average(close,50)[8]) + AbsValue(close[9]>average(close,50)[9]) + AbsValue(close[10]>average(close,50)[10]) + AbsValue(close[11]>average(close,50)[11]) +
AbsValue(close[12]>average(close,50)[12]) + AbsValue(close[13]>average(close,50)[13]) + AbsValue(close[14]>average(close,50)[14]) + AbsValue(close[15]>average(close,50)[15]) +
AbsValue(close[16]>average(close,50)[16]) + AbsValue(close[17]>average(close,50)[17]) + AbsValue(close[18]>average(close,50)[18]) + AbsValue(close[19]>average(close,50)[19]) +
AbsValue(close[20]>average(close,50)[20]) + AbsValue(close[21]>average(close,50)[21]) + AbsValue(close[22]>average(close,50)[22]) + AbsValue(close[23]>average(close,50)[23]) +
AbsValue(close[24]>average(close,50)[24]) + AbsValue(close[25]>average(close,50)[25]) + AbsValue(close[26]>average(close,50)[26]) + AbsValue(close[27]>average(close,50)[27]) +
AbsValue(close[28]>average(close,50)[28]) + AbsValue(close[29]>average(close,50)[29]) + AbsValue(close[30]>average(close,50)[30]) + AbsValue(close[31]>average(close,50)[31]) +
AbsValue(close[32]>average(close,50)[32]) + AbsValue(close[33]>average(close,50)[33]) + AbsValue(close[34]>average(close,50)[34]) + AbsValue(close[35]>average(close,50)[35]) +
AbsValue(close[36]>average(close,50)[36]) + AbsValue(close[37]>average(close,50)[37]) + AbsValue(close[38]>average(close,50)[38]) + AbsValue(close[39]>average(close,50)[39]) +
AbsValue(close[40]>average(close,50)[40]) + AbsValue(close[41]>average(close,50)[41]) + AbsValue(close[42]>average(close,50)[42]) + AbsValue(close[43]>average(close,50)[43]) +
AbsValue(close[44]>average(close,50)[44]) + AbsValue(close[45]>average(close,50)[45]) + AbsValue(close[46]>average(close,50)[46]) + AbsValue(close[47]>average(close,50)[47]) +
AbsValue(close[48]>average(close,50)[48]) + AbsValue(close[49]>average(close,50)[49]) + AbsValue(close[50]>average(close,50)[50]) + AbsValue(close[51]>average(close,50)[51]) +
AbsValue(close[52]>average(close,50)[52]) + AbsValue(close[53]>average(close,50)[53]) + AbsValue(close[54]>average(close,50)[54]) + AbsValue(close[55]>average(close,50)[55]) +
AbsValue(close[56]>average(close,50)[56]) + AbsValue(close[57]>average(close,50)[57]) + AbsValue(close[58]>average(close,50)[58]) + AbsValue(close[59]>average(close,50)[59]) +
AbsValue(close[60]>average(close,50)[60]) + AbsValue(close[61]>average(close,50)[61]) + AbsValue(close[62]>average(close,50)[62]) + AbsValue(close[63]>average(close,50)[63]) +
AbsValue(close[64]>average(close,50)[64]) + AbsValue(close[65]>average(close,50)[65]) + AbsValue(close[66]>average(close,50)[66]) + AbsValue(close[67]>average(close,50)[67]) +
AbsValue(close[68]>average(close,50)[68]) + AbsValue(close[69]>average(close,50)[69]) + AbsValue(close[70]>average(close,50)[70]) + AbsValue(close[71]>average(close,50)[71]) +
AbsValue(close[72]>average(close,50)[72]) + AbsValue(close[73]>average(close,50)[73]) + AbsValue(close[74]>average(close,50)[74]) + AbsValue(close[75]>average(close,50)[75]) +
AbsValue(close[76]>average(close,50)[76]) + AbsValue(close[77]>average(close,50)[77]) + AbsValue(close[78]>average(close,50)[78]) + AbsValue(close[79]>average(close,50)[79]) +
AbsValue(close[80]>average(close,50)[80]) + AbsValue(close[81]>average(close,50)[81]) + AbsValue(close[82]>average(close,50)[82]) + AbsValue(close[83]>average(close,50)[83]) +
AbsValue(close[84]>average(close,50)[84]) + AbsValue(close[85]>average(close,50)[85]) + AbsValue(close[86]>average(close,50)[86]) + AbsValue(close[87]>average(close,50)[87]) +
AbsValue(close[88]>average(close,50)[88]) + AbsValue(close[89]>average(close,50)[89]) + AbsValue(close[90]>average(close,50)[90]) + AbsValue(close[91]>average(close,50)[91]) +
AbsValue(close[92]>average(close,50)[92]) + AbsValue(close[93]>average(close,50)[93]) + AbsValue(close[94]>average(close,50)[94]) + AbsValue(close[95]>average(close,50)[95]) +
AbsValue(close[96]>average(close,50)[96]) + AbsValue(close[97]>average(close,50)[97]) + AbsValue(close[98]>average(close,50)[98]) + AbsValue(close[99]>average(close,50)[99]) +
AbsValue(close[100]>average(close,50)[100]) + AbsValue(close[101]>average(close,50)[101]) + AbsValue(close[102]>average(close,50)[102]) +
AbsValue(close[103]>average(close,50)[103]) + AbsValue(close[104]>average(close,50)[104]) + AbsValue(close[105]>average(close,50)[105]) +
AbsValue(close[106]>average(close,50)[106]) + AbsValue(close[107]>average(close,50)[107]) + AbsValue(close[108]>average(close,50)[108]) +
AbsValue(close[109]>average(close,50)[109]) + AbsValue(close[110]>average(close,50)[110]) + AbsValue(close[111]>average(close,50)[111]) +
AbsValue(close[112]>average(close,50)[112]) + AbsValue(close[113]>average(close,50)[113]) + AbsValue(close[114]>average(close,50)[114]) +
AbsValue(close[115]>average(close,50)[115]) + AbsValue(close[116]>average(close,50)[116]) + AbsValue(close[117]>average(close,50)[117]) +
AbsValue(close[118]>average(close,50)[118]) + AbsValue(close[119]>average(close,50)[119]) + AbsValue(close[120]>average(close,50)[120]) +
AbsValue(close[121]>average(close,50)[121]) + AbsValue(close[122]>average(close,50)[122]) + AbsValue(close[123]>average(close,50)[123]) +
AbsValue(close[124]>average(close,50)[124]);

plot x = mystery >= days_above_50ma;

AddCloud(if x then 1 else Double.NaN,   if x then 0 else Double.NaN,   Color.red,   Color.CURRENT);
 
Last edited by a moderator:

tomsk

Well-known member
VIP
@Nick Gosh, what a huge complicated mess, for sure the scanner will undoubtedly complain. Checking your code, looks like all you really want to do is to scan for stocks that are ABOVE the 50 day SMA for the past 125 days.

Your entire code can be collapsed into one single statement. Place the following into the scanner. I just ran this scan successfully on the S&P 500 with no problems

Code:
sum (close > Average(close,50), 125) >= 125
 

HighBredCloud

Well-known member
VIP
@tomsk so to scan on a 5 min chart for any stocks above 50 SMA on that current day...the code would be this?

sum (close > Average(close,50), 1) >= 1

and below 50 SMA would be this?

sum (close < Average(close,50), 1) <= 1
 

tomsk

Well-known member
VIP
First of all when you refer to scanning 50 SMA on a 5 min chart, I assume you mean 50 period SMA rather than the 50 day SMA. This is because the scanner does not permit secondary aggregations

That said if you want to scan for stocks that had just crossed above the 50 period SMA on that day for a 5 min aggregation, here is the scan

Code:
close crosses above Average(close,50)

The scan code for the close crosses below the 50 period SMA would thus be

Code:
close crosses below Average(close,50)

Remember to select the aggregation period of 5 mins
 
Last edited:

WOLVES

New member
Hi,
@tomsk I tried the code:
sum (close > Average(close,50), 125) >= 125
but i changed it to hourly and the Average to (close,13), but I get no results.
here is the code I put:
Sum("data" = close > Average(close, 13), "length" = 21) >= 21
I want the stock to be above the 13 sma for at least 21 days.
I'm looking for stocks that's been trending and is about to crossover.

how I set my scanner is:
ask 30 and above
stock volume 1,000,000 and above
and then the code:
Sum("data" = close > Average(close, 13), "length" = 21) >= 21


Thanks
 
Last edited:

WOLVES

New member
@BenTen I use 13/30 sma. should I use the code like this: Sum("data" = close > Average(close, 13), "length" = 21) >= 21. I use an hourly chart. I am looking for stock that have been trending for at least 21 days and is ready to crossover.
this is the code I would use to look for trending stock about to crossover:

Sum("data" = close > Average(close, 13), "length" = 21) >= 21

and
MovingAvgCrossover("length1" = 13, "crossing type" = "below")

or

Sum("data" = close < Average(close, 13), "length" = 21) >= 21

and

MovingAvgCrossover("length1" = 13, "crossing type" = "above")

but I still get no result.
 
Last edited:

WOLVES

New member
@BenTen I mean the stock been trading above the 13 sma for 21 days. The reason for 21 day is because I use an hourly chart and 125 days from the original code didn't work on the scanner when I change it to hourly aggregation. And the "ready to crossover" after the stock been trading above the 13 sma it crosses the 30. I have found stock that do this but only after I take out the code and just use the crossover study. it would take me at least an hour to weed out stocks that crossover but hasn't been clearly trading above or below the 13 sma.
 
Last edited:

BenTen

Administrative
Staff
VIP
@Rambo Yes

vtWduN0.png
 
  • Like
Reactions: RBO

mikewest

New member
VIP
1: I am trying to scan for price is above 21 Day EMA for at least 10 days instead of within 10 days.
2: Scan for 21 day EMA is above 50 SimpleMovingAverage for at least 5 days
I can only find within in the study options. If anyone would help me it would be greatly appreciated thanks
VB2A9fF.jpg
 
Last edited:

XeoNoX

Well-known member
VIP
@mikewest
i made a tutorial thread on this
https://usethinkscript.com/threads/...udies-on-entire-chart-or-specified-time.5496/


its simple, i have it in the tutorial, all you had to do was change the var to what you want to scan for, in this case you could of used to wizard to get that part which is
Code:
low is greater than MovAvgExponential("length" = 21)."AvgExp";

then you just plug it into the var

Code:
declare lower;
# COUNT OF THE TOTAL NUMBER OF CONSECUTIVE BARS THAT THE LOW is GREATER THAN SPECIFIED MOVING AVERAGE
# By XeoNoX via Usethinkscript.com
def var = low is greater than MovAvgExponential("length" = 21)."AvgExp";
def barUpCount = CompoundValue(1, if var then barUpCount[1] + 1 else 0, 0);
plot scan  = barUpCount;

then to scan for greater than 10 days, you set the agreegation to DAY and use the following scan code and replace the
"plot scan = barUpCount;"
with the code below
Code:
plot scan  = barUpCount > 10;

Ill let your try the 21 day EMA is above 50 SimpleMovingAverage for at least 5 days, let us see what you came up with.
remember to thumbs up if you found this post useful
 
Last edited:
Top