Code presented in the article “Detecting Head & Shoulders Algorithmically, Part 2” by Giorgos E. Siligardos, PhD, in the May 2013 issue of Technical Analysis of Stocks & Commodities magazine.
Open Indicator Builder and create the following four indicators:
Indicator Name: S&C - H&Sbasicdef Code: {Head & Shoulders identification algo Giorgos Siligardos, 2011} {parameters} p1:=LastValue(LLV(C,5)); {n parameter equals 5} fac:=1; {factor parameter equals 1} {basic defs} He:=LastValue(HHV(C,LastValue(Max(1,BarsSince(C<p1))))); Heb:=LastValue(ValueWhen(1,C=He,Cum(1))); Rhalf:=LastValue(Max(1,Cum(1)-Heb)); Lhalf:=fac*Rhalf; b0:=LastValue(Min(Cum(1)-Rhalf-Lhalf,Cum(1)-BarsSince(C<p1) )); tL1:=LastValue( LLV(Ref(C,-Rhalf),LastValue(Max(1,Int(2*Lhalf/3)))) ); tL1b:=LastValue(ValueWhen(1,Ref(C,-Rhalf)=tL1,Cum(1))-Rhalf); H1:=LastValue(HHV(Ref(C,-LastValue(Cum(1)-tL1b)),LastValue(Max(1,tL1b-b0)))); H1b:=LastValue(ValueWhen(1, Ref(C, -LastValue( Cum(1)-tL1b ))=H1,Cum(1))-LastValue(Cum(1)-tL1b)); eltimi:= LastValue(LLV(Ref(C,-LastValue(Cum(1)-tL1b)), LastValue(Max(1,tL1b-H1b)))); L1b:=LastValue( ValueWhen(1,Ref(C,-LastValue(Cum(1)-tL1b))<=((tL1+2*eltimi)/3),Cum(1)-LastValue(Cum(1)-tL1b) )); L1:=LastValue(ValueWhen(1,Cum(1)=L1b,C)); L2:=LastValue( LLV(Ref(C,-LastValue(Int(Rhalf/3))),LastValue(Max(1,2*Int(Rhalf/3)))) ); L2b:=LastValue(ValueWhen(1,Ref(C,-LastValue(Int(Rhalf/3)))=L2,Cum(1))-LastValue(Int(Rhalf/3))); H2:=LastValue(HHV(C,LastValue(Max(1,Cum(1)-L2b)))); H2b:=LastValue(ValueWhen(1,C=H2, Cum(1))); L3b:=LastValue(ValueWhen(1,Cum(Cum(1)>H2b AND C<=L2)=1,Cum(1)) ); L0b:=LastValue( ValueWhen(1, Ref(C,-LastValue( Cum(1)-H1b))<=L1+0.2*(H1-L1), Cum(1))-LastValue(Cum(1)-H1b)); Indicator Name: S&C - H&S Code: {Head & Shoulders identification algo Giorgos Siligardos, 2011} Rhalf:=FmlVar("S&C - H&Sbasicdef","Rhalf"); L0b:=FmlVar("S&C - H&Sbasicdef","L0b"); L1b:=FmlVar("S&C - H&Sbasicdef","L1b"); L2b:=FmlVar("S&C - H&Sbasicdef","L2b"); L3b:=FmlVar("S&C - H&Sbasicdef","L3b"); H1b:=FmlVar("S&C - H&Sbasicdef","H1b"); H2b:=FmlVar("S&C - H&Sbasicdef","H2b"); Heb:=FmlVar("S&C - H&Sbasicdef","Heb"); L0:=LastValue(ValueWhen(1,Cum(1)=L0b,C)); L1:=LastValue(ValueWhen(1,Cum(1)=L1b,C)); L2:=LastValue(ValueWhen(1,Cum(1)=L2b,C)); L3:=LastValue(ValueWhen(1,Cum(1)=L3b,C)); H1:=LastValue(ValueWhen(1,Cum(1)=H1b,C)); He:=LastValue(ValueWhen(1,Cum(1)=Heb,C)); H2:=LastValue(ValueWhen(1,Cum(1)=H2b,C)); (L3b-L0b)* ((H1>(L1+0.20*(He-L1))) AND (H1< (He-0.15*(He-L1))) AND (H2>(L2+0.25*(He-L2))) AND (H2< (He-0.25*(He-L2))) AND (L2<(L1+0.40*(He-L1))) AND If(L2>L1+0.20*(He-L1),LastValue(HHV(Ref(C,-LastValue(Cum(1)-L2b)) ,LastValue(Int(Max((L2b-Heb)/3,1)))))<L2+0.7*(He-L2),1) AND (L2>(L1-0.15*(He-L1))) AND Abs((H1-L1)-(H2-L2))<Min(H1-L1,H2-L2) AND Abs( LastValue( HHV(Ref(C,-LastValue(Int(Rhalf+(Heb-L1b)/2))),LastValue(Max(1,Int((Heb-L1b)/2))))) - LastValue( LLV(Ref(C,-LastValue(Int(Rhalf))),LastValue(Max(1,Int((Heb-L1b)/2))))))<(He-L1)/2 AND LastValue(HHV(CLOSE,LastValue(Max(1,Cum(1)-L3b))))<L3+(H2-L3)/3 AND (LastValue(HHV(Ref(C,-LastValue(Cum(1)-H2b+Int(2*(H2b-L2b)/3))),LastValue(Max(1,Int((H2b-L2b)/3))) ))>(L2+0.8*(H2-L2)) AND LastValue(LLV(Ref(C,-LastValue(Cum(1)-H2b)), LastValue(Max(1,Int((H2b-L2b)/3)))))<(L2+0.25*(H2-L2)))=0 AND (((H1-L1)>0.25*(He-L1) AND (H2-L2)>0.25*(He-L2)) OR Min(L1b-H1b,H2b-L2b)>0.25*(L2b-L1b)) AND (LastValue(HHV(Ref(C,-LastValue(Cum(1)-H1b) ),LastValue(Max(1,H1b-L0b)))) < (He-0.15*(He-L1))) AND 2.5*Min(Heb-H1b,H2b-Heb)>Max(Heb-H1b,H2b-Heb) AND 3*Min(L1b-L0b,L3b-L2b)>Max(L1b-L0b,L3b-L2b) AND IsDefined(LastValue(L0b))) Indicator Name: S&C - H&S Outline Code: {Head & Shoulders identification algo Giorgos Siligardos, 2011} foo:=Input("color",0,1,0); L0b:=FmlVar("S&C - H&S","L0b"); L1b:=FmlVar("S&C - H&S","L1b"); L2b:=FmlVar("S&C - H&S","L2b"); L3b:=FmlVar("S&C - H&S","L3b"); H1b:=FmlVar("S&C - H&S","H1b"); H2b:=FmlVar("S&C - H&S","H2b"); Heb:=FmlVar("S&C - H&S","Heb"); a1:=LastValue(L1b-L0b)/2; a:=LastValue(L2b-L1b)/2; a2:=LastValue(L3b-L2b)/2; b1:=LastValue(LastValue((LastValue(ValueWhen(1,Cum(1)=H1b,C))+ 3*HHV(Ref(C,-LastValue(Cum(1)-H1b) ),LastValue(Max(1,H1b-L0b))))/4) - LastValue(ValueWhen(1,Cum(1)=L1b,C))) ; b:=1.1*LastValue(LastValue(ValueWhen(1,Cum(1)=Heb,C)) - LastValue(ValueWhen(1,Cum(1)=L2b,C))) ; b2:=1.1*LastValue(LastValue(ValueWhen(1,Cum(1)=H2b,C)) - LastValue(ValueWhen(1,Cum(1)=L3b,C))) ; permitiontoplot1:=(a>0)*(1+ BarsSince(Cum(1)>=L0b)>0 )*(Ref(C,LastValue(Cum(1)-L1b))>0); permitiontoplot:=(a>0)*(1+ BarsSince(Cum(1)>=L1b)>0 )*(Ref(C,LastValue(Cum(1)-L2b))>0); permitiontoplot2:=(a>0)*(1+ BarsSince(Cum(1)>=L2b)>0 )*(Ref(C,LastValue(Cum(1)-L3b))>0); center1:=LastValue((L0b+L1b)/2); center:=LastValue((L1b+L2b)/2); center2:=LastValue((L2b+L3b)/2); (BarsSince(Cum(1)=Fml( "S&C - H&S"))>0)* (a>0)*(1+ BarsSince(Cum(1)>=L0b)>0 )*(Ref(C,LastValue(Cum(1)-L3b))>0)* If(IsDefined(permitiontoplot1), LastValue(ValueWhen(1,Cum(1)=L1b,C))+b1*Sqrt(Abs(1-Power((Cum(1)-center1)/a1,2))), If(IsDefined(permitiontoplot), LastValue(ValueWhen(1,Cum(1)=L2b,C))+b*Sqrt(Abs(1-Power((Cum(1)-center)/a,2))), If(IsDefined(permitiontoplot2), LastValue(ValueWhen(1,Cum(1)=L3b,C))+b2*Sqrt(Abs(1-Power((Cum(1)-center2)/a2,2))), 1 ))) Indicator Name: S&C - H&S Target Code: {Head & Shoulders identification algo Giorgos Siligardos, 2011} r:=Input("% Target",0,1000,100); L1b:=FmlVar("S&C - H&S","L1b"); L2b:=FmlVar("S&C - H&S","L2b"); Heb:=FmlVar("S&C - H&S","Heb"); L1:=FmlVar("S&C - H&S","L1"); L2:=FmlVar("S&C - H&S","L2"); He:=FmlVar("S&C - H&S","He"); neckline:=L1+(L2-L1)/(L2b-L1b)*BarsSince(Cum(1)=L1b); M:=(L1+(Heb-L1b)*(L2-L1)/(L2b-L1b)); {r% target} Target:=M-(r/100)*(He-M); {plot neckline} (BarsSince(Cum(1)=Fml( "S&C - H&S"))>0)* (Fml( "S&C - H&S")>0)*neckline; {plot Target} (BarsSince(Cum(1)=Fml( "S&C - H&S"))>0)* (Fml( "S&C - H&S")>0)*(Target+BarsSince(Cum(1)=Heb)>0)*Target;
Open The Explorer and create a new exploration:
Name: S&C - H&S Column A: Col Name: Duration Formula: Fml( "S&C - H&S") Column B: Col Name: %Potent Formula: 100*(1-FmlVar("S&C - H&S Target","TARGET")/C); Filter: Fml( "S&C - H&S")