Hi,
I am looking for a double bottom screener with minimum volume 1 million and minimum price 20 dollars
My search online found Leo’s double top and bottom screener, but I am wondering if it is possible to:
- Exclude double tops
- Add minimum volume
- Add minimum price
His screener code is. I’m not sure how to exclude double tops and add minimum conditions without ruining the code.
//LOCALS MINIMUMS AND MAXIMUMS USING LEO MOVING AVERAGE
//Autor: LEO
//VARIABLES TO BE OPTIMIZED
PERIOD=40 //Period for analysis
//Definition of what is a double top or double bottom
Kdouble=0.2 //Factor for defining what is double top or bottom
//-----------
//Leo Moving Average, formula: LMA= WMA+(WMA-SMA)
LMA=2*weightedaverage[period](close)-average[period](close)
//Smoothed curve of Leo Moving Average
IF BARINDEX > period THEN
smoothLMA=weightedaverage[period](LMA)
ELSE
smoothLMA=undefined
ENDIF
// Direction or trend of the LMA
// << Storage of minimums and maximums >>
once mintemp=low
once posmintemp=1
once maxtemp=high
once posmaxtemp=1
IF BARINDEX>2 THEN
// the value 0.7 is to ensure that the donchian channel is faster than the curves analysis (this value to be checked)
IF low < lowest[round(0.7*period)](low[1]) THEN
mintemp=low //minimum temporal
posmintemp=BARINDEX //postition of minimum temporal
ENDIF
IF high > highest[round(0.7*period)](high[1]) then
maxtemp=high //maximum temporal
posmaxtemp=BARINDEX //position maximum temporal
ENDIF
ENDIF
// << Detecting and locating a local minimums >>
// Where the LMA is crossing the smoothed LMA, there is a maximum or minimum nearby
// If there is a new local min/max, the preivus one is stored in de varible B... (before)
once LEVMIN=low
once POSLEVMIN=1
once LEVMAX=high
once POSLEVMAX=1
once bullcross=0
once bearcross=0
IF BARINDEX > PERIOD THEN //For avoid computer errors
bullcross=LMA crosses over smoothLMA
bearcross=LMA crosses under smoothLMA
ENDIF
IF bullcross and POSLEVMIN<>posmintemp THEN
BLEVMIN=LEVMIN //previus local minimum is saved
BPOSLEVMIN=POSLEVMIN
LEVMIN=mintemp
POSLEVMIN=posmintemp
support=LEVMIN
ENDIF
// --> Detecting and locating a local maximum
IF bearcross and POSLEVMAX<>posmaxtemp THEN
BLEVMAX=LEVMAX //previus local maximum is saved
BPOSLEVMAX=POSLEVMAX
LEVMAX=maxtemp
POSLEVMAX=posmaxtemp
resistance=LEVMAX
ENDIF
support=min(low,support)
resistance=max(high,resistance)
// << DETECTING DOUBLE TOP OR BOTTOMS >>
once WidthDoubleTop = high-low
once WidthDoubleBottom = high-low
once Wpattern=0
once Mpattern=0
// <<<<<< Double bottoms >>>>>>>>>
//looking for the top between two local minimums
IF bullcross THEN
doublebottomtop=high[BARINDEX-POSLEVMIN+1] // we start looking for the top in between two local minimums
//POSdoublebottomtop=BARINDEX-POSLEVMIN+1
FOR i = (BARINDEX-POSLEVMIN+1) to (BARINDEX-BPOSLEVMIN-1) DO
IF high[i] > doublebottomtop THEN
doublebottomtop=high[i]
//POSdoublebottomtop=BARINDEX-i
ENDIF
NEXT
WidthDoubleBottom = doublebottomtop-(BLEVMIN+LEVMIN)/2 // (top betwen local minimums) - (average of the las two local minimums)
IF abs(BLEVMIN-LEVMIN) < Kdouble*WidthDoubleBottom THEN
// we have a double bottom
Wpattern=1
else
Wpattern=0
ENDIF
ENDIF
// <<<<<<<<<< Double tops >>>>>>>
//looking for the bottom between two local maximums
IF bearcross THEN
doubletopbottom=low[BARINDEX-POSLEVMAX+1]
//POSdoubletopbottom=BARINDEX-POSLEVMAX+1
FOR i = (BARINDEX-POSLEVMAX+1) to (BARINDEX-BPOSLEVMAX-1) DO
IF low[i] < doubletopbottom THEN
doubletopbottom=low[i]
//POSdoubletopbottom=BARINDEX-i
ENDIF
NEXT
WidthDoubleTop=(BLEVMAX+LEVMAX)/2 -doubletopbottom
IF abs(BLEVMAX-LEVMAX) < Kdouble*WidthDoubleTop THEN
// we have a double top
Mpattern=1
else
Mpattern=0
ENDIF
ENDIF
// <<<<<<<<<< DOUBLE TOP AND DOUBLE BOTTOM FOR TRADING >>>>>>>>
myATR=AverageTrueRange[2*period](close)
IF Wpattern=1 THEN
IF close > (doublebottomtop+myATR) or close < (LEVMIN-0.5*myATR) THEN
Wpattern=0 // <<<< double bottom has been activated or it was cancelled >>>>>
ELSE
// <<<<<<< HERE WE HAVE A DOUBLE BOTTOM FOR TRADING >>>>>
exactness=abs(BLEVMIN-LEVMIN) / WidthDoubleBottom
ENDIF
ENDIF
IF Mpattern=1 THEN
IF close < (doubletopbottom-myATR) or close > (LEVMAX+0.5*myATR) THEN
Mpattern=0 //double top has been activated or it was cancelled
ELSE
// <<<<<<< HERE WE HAVE A DOUBLE TOP FOR TRADING >>>>>
exactness= abs(BLEVMAX-LEVMAX) / WidthDoubleTop
ENDIF
ENDIF
SCREENER[Wpattern=1 or Mpattern=1](exactness)
It is not necessary to delete the double top part, just add a condition that there is no double top. I added a minimum price and volume condition at the end of the code, you can change it there.
//LOCALS MINIMUMS AND MAXIMUMS USING LEO MOVING AVERAGE
//Autor: LEO
//VARIABLES TO BE OPTIMIZED
PERIOD=40 //Period for analysis
//Definition of what is a double top or double bottom
Kdouble=0.2 //Factor for defining what is double top or bottom
//-----------
//Leo Moving Average, formula: LMA= WMA+(WMA-SMA)
LMA=2*weightedaverage[period](close)-average[period](close)
//Smoothed curve of Leo Moving Average
IF BARINDEX > period THEN
smoothLMA=weightedaverage[period](LMA)
ELSE
smoothLMA=undefined
ENDIF
// Direction or trend of the LMA
// << Storage of minimums and maximums >>
once mintemp=low
once posmintemp=1
once maxtemp=high
once posmaxtemp=1
IF BARINDEX>2 THEN
// the value 0.7 is to ensure that the donchian channel is faster than the curves analysis (this value to be checked)
IF low < lowest[round(0.7*period)](low[1]) THEN
mintemp=low //minimum temporal
posmintemp=BARINDEX //postition of minimum temporal
ENDIF
IF high > highest[round(0.7*period)](high[1]) then
maxtemp=high //maximum temporal
posmaxtemp=BARINDEX //position maximum temporal
ENDIF
ENDIF
// << Detecting and locating a local minimums >>
// Where the LMA is crossing the smoothed LMA, there is a maximum or minimum nearby
// If there is a new local min/max, the preivus one is stored in de varible B... (before)
once LEVMIN=low
once POSLEVMIN=1
once LEVMAX=high
once POSLEVMAX=1
once bullcross=0
once bearcross=0
IF BARINDEX > PERIOD THEN //For avoid computer errors
bullcross=LMA crosses over smoothLMA
bearcross=LMA crosses under smoothLMA
ENDIF
IF bullcross and POSLEVMIN<>posmintemp THEN
BLEVMIN=LEVMIN //previus local minimum is saved
BPOSLEVMIN=POSLEVMIN
LEVMIN=mintemp
POSLEVMIN=posmintemp
support=LEVMIN
ENDIF
// --> Detecting and locating a local maximum
IF bearcross and POSLEVMAX<>posmaxtemp THEN
BLEVMAX=LEVMAX //previus local maximum is saved
BPOSLEVMAX=POSLEVMAX
LEVMAX=maxtemp
POSLEVMAX=posmaxtemp
resistance=LEVMAX
ENDIF
support=min(low,support)
resistance=max(high,resistance)
// << DETECTING DOUBLE TOP OR BOTTOMS >>
once WidthDoubleTop = high-low
once WidthDoubleBottom = high-low
once Wpattern=0
once Mpattern=0
// <<<<<< Double bottoms >>>>>>>>>
//looking for the top between two local minimums
IF bullcross THEN
doublebottomtop=high[BARINDEX-POSLEVMIN+1] // we start looking for the top in between two local minimums
//POSdoublebottomtop=BARINDEX-POSLEVMIN+1
FOR i = (BARINDEX-POSLEVMIN+1) to (BARINDEX-BPOSLEVMIN-1) DO
IF high[i] > doublebottomtop THEN
doublebottomtop=high[i]
//POSdoublebottomtop=BARINDEX-i
ENDIF
NEXT
WidthDoubleBottom = doublebottomtop-(BLEVMIN+LEVMIN)/2 // (top betwen local minimums) - (average of the las two local minimums)
IF abs(BLEVMIN-LEVMIN) < Kdouble*WidthDoubleBottom THEN
// we have a double bottom
Wpattern=1
else
Wpattern=0
ENDIF
ENDIF
// <<<<<<<<<< Double tops >>>>>>>
//looking for the bottom between two local maximums
IF bearcross THEN
doubletopbottom=low[BARINDEX-POSLEVMAX+1]
//POSdoubletopbottom=BARINDEX-POSLEVMAX+1
FOR i = (BARINDEX-POSLEVMAX+1) to (BARINDEX-BPOSLEVMAX-1) DO
IF low[i] < doubletopbottom THEN
doubletopbottom=low[i]
//POSdoubletopbottom=BARINDEX-i
ENDIF
NEXT
WidthDoubleTop=(BLEVMAX+LEVMAX)/2 -doubletopbottom
IF abs(BLEVMAX-LEVMAX) < Kdouble*WidthDoubleTop THEN
// we have a double top
Mpattern=1
else
Mpattern=0
ENDIF
ENDIF
// <<<<<<<<<< DOUBLE TOP AND DOUBLE BOTTOM FOR TRADING >>>>>>>>
myATR=AverageTrueRange[2*period](close)
IF Wpattern=1 THEN
IF close > (doublebottomtop+myATR) or close < (LEVMIN-0.5*myATR) THEN
Wpattern=0 // <<<< double bottom has been activated or it was cancelled >>>>>
ELSE
// <<<<<<< HERE WE HAVE A DOUBLE BOTTOM FOR TRADING >>>>>
exactness=abs(BLEVMIN-LEVMIN) / WidthDoubleBottom
ENDIF
ENDIF
IF Mpattern=1 THEN
IF close < (doubletopbottom-myATR) or close > (LEVMAX+0.5*myATR) THEN
Mpattern=0 //double top has been activated or it was cancelled
ELSE
// <<<<<<< HERE WE HAVE A DOUBLE TOP FOR TRADING >>>>>
exactness= abs(BLEVMAX-LEVMAX) / WidthDoubleTop
ENDIF
ENDIF
minprice = close>10
minvol = volume>100000
SCREENER[Wpattern=1 and not Mpattern and minprice and minvol](exactness)