Hi all,
This is a screener that detect double top and double bottom.
A double top or a double bottom, are chartists figures that announce a reversal of trend. In general, a double top is created in the context of a downward trend and therefore marks its end and a return of the bullish movement while a double bottom, is created in the context of a downward trend and therefore marks its end and a return of the bullish movement.
Base on my Leo Moving Average indicator, the following screener detects double bottom and double top.
I am looking forward to read your comments and improvements in the systems.
If you earn money with this methodology please share your luck with the people in the world who do not.
//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)