Good Day Guys
I am in the process of developing a screener and am trying to find an effective way to filter out low liquidity stocks.
I am thinking about using a volume filter (Average[x](volume) > 1000) and maybe a gap screener (maximum x amount of gaps in last x days).
But I would appreciate any ideas or if someone maybe already developed a nice liquidity filter I would appreciate if you can share it.
Thanks
@Nicolas, your input, and experience will be appreciated.
You can check the Market Capitalization with this code:
marketcap = close*volume>=300000000//market cap
Of course, you can adapt the ‘300000000’ to filter more or less the stocks you want to find.
Thank You Nicolas.
Only problem with that is that as you know not all tradable instruments have volume available.
I do make use of the Market Cap column in the screener window though when sorting the results.
However was hoping of a more versatile technique to measure liquidity using price action for example.
Rough early morning ideas:
_ check how many times a short term ATR has crossed a long term averaged one within the last X periods.
_ check Rate Of Change behavior compared to long term one.
Without Volumes, it’s all about price VS time.
Great ideas! So how would we incorporate that?
Do a few tests using known liquid and illiquid stocks and measure behavior or expected ranges using something like the below?
ATR Crosses:
NearATR = AverageTrueRange[3]
LongATR = AverageTrueRange[21]
ATRCross = 0
For i = 1 to 50 Do
If (NearATR crosses over LongATR) or (NearATR crosses under LongATR) Then
ATRCross = ATRCross + 1
EndIf
Next
//Return ATRCross As "ATRCross"
Rate of change:
EMAperiod = 13
ROCperiod = 21
EMA = exponentialaverage[EMAperiod](close)
SRoC = ( EMA - EMA[ROCperiod] ) / ( EMA[ROCperiod] ) * 100
AverageSROC = Average[21](SROC)
I would recommend something like this instead for the ATR crosses:
NearATR = AverageTrueRange[7]
LongATR = average[100](nearATR)//AverageTrueRange[21]
ATRCross = 0
For i = 1 to 50 Do
If (NearATR[i] crosses over LongATR[i]) Then
ATRCross = ATRCross + 1
EndIf
Next
Return ATRCross As "ATRCross"
Yes, I like that, noticed that I forgot to specify the [i] in my code (typed it out without PRT open).
Now I just need to look up a few stocks to get an idea of an acceptable Average ATRCross value.