PureBytes Links
Trading Reference Links
|
Rudolph
Here is the code for the Hilbert function written in Easy Language for
Tradestation. Maybe someone can translate it into Metastock code.
John
Inputs: Price(numeric);
Vars: Smoother(0),Detrender(0),I1(0),Q1(0),jI(0),
jQ(0),I2(0),Q2(0),X1(0),X2(0),Y1(0),Y2(0),Re(0),Im(0),Period(0);
If CurrentBar>5 then begin
Smoother=(4*Price+3*Price[1]+2*Price[2]+Price[3])/10;
Detrender=(.25*Smoother+.75*Smoother[2]-.75*Smoother[4]-.25*Smoother[6])*(.0
46*Period[1]+.332);
{Compute InPhase and Quadrature components}
Q1=(.25*Detrender+.75*Detrender[2]-.75*Detrender[4]-.25*Detrender[6])*(.046*
Period[1]+.332);
I1=Detrender[3];
{advance the phase of I1 and Q1 by 90 degrees}
jI=.25*I1+.75*I1[2]-.75*I1[4]-.25*I1[6];
jQ=.25*Q1+.75*Q1[2]-.75*Q1[4]-.25*Q1[6];
{Phasor addition to equalize amplitude due to quadrature calculations (and 3
bar average)}
I2=I1-jQ;
Q2=Q1+jI;
{Smooth the I and Q components before applying the discriminator}
I2=.15*I2+.85*I2[1];
Q2=.15*Q2+.85*Q2[1];
{Homodyne Discriminator}
{Complex Conjugate Multiply}
X1=I2*I2[1];
X2=I2*Q2[1];
Y1=Q2*Q2[1];
Y2=Q2*I2[1];
Re=X1+Y1;
Im=X2-Y2;
{Smooth to remove undesired cross products}
Re=.2*Re+.8*Re[1];
Im=.2*Im+.8*Im[1];
{Compute Cycle Period}
If Im<>0 and Re<>0 then Period = 360/ArcTangent(Im/Re);
If Period>1.5*Period[1] then Period = 1.5*Period[1];
If Period<.67*Period[1] then Period=.67*Period[1];
If Period<.6 then Period = 6;
If Period>50 then Period=50;
Period=.2*Period+.8*Period[1];
{End Core Code}
HilbertPeriod=Period;
end;
|