CODE FOR METASTOCK

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.

Indicators

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;

Exploration

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")

Instructions