_SECTION_BEGIN("Ehler's Dominant Cycle1");
//derived from 
http://www.mesasoftware.com/Seminars/TAG22RocketScience.ppt#294,12,Cy
cle Period Code (cont)

SetBarsRequired(200,0);
P=(H+L)/2;

{Period=0; jI=0;jQ=0;I1=0;I2=0;Q2=0;Q1=0; X1=0;X2=0;Y1=0;Re=0;Im=0;
 }
//Smooth with less than one bar lag
Smoother=(4*P+3*Ref(P,-1) +2*Ref(P,-2) +Ref(P,-3))/10; 

//detrend with linear phase
Detrender=(.25*Smoother+.75*Ref(Smoother,-2) -(.75*Ref(Smoother,-4))-
(.25*Ref(Smoother,-6)))*(.046*Ref(period,-1)+.332);

//Compute InPhase and Quadrature components
Q1=(.25*Detrender+.75*Ref(Detrender,-2)-.75*Ref(Detrender,-4)-.25*Ref
(Detrender,-6)*(.046*Ref(Period,-1)+.332));
I1=Ref(Detrender,-3);

//advance the phase of I1 and Q1 by 90 degrees
jI=.25*I1+.75*Ref(I1,-2) -.75*Ref(I1,-4)-.25*Ref(I1,-6);
jQ=.25*Q1+.75*Ref(Q1,-2) -.75*Ref(Q1,-4)-.25*Ref(Q1,-6);

//Phasor addition to equalize amplitude due to quadrature 
calculations (and 3 bar averaging)
I2=I1-jQ;
Q2=Q1+jI;

//Smoothe the I and Q components before applying the discriminator
I2=.15*I2+.85*Ref(I2,-1);
Q2=.15*Q2+.85*Ref(Q2,-1);

//Homodyne Discriminator
        //Complex Conjugate Multiply
        X1=I2*Ref(I2,-1);
        X2=I2*Ref(Q2,-1);
        Y1=Q2*Ref(Q2,-1);
        Y2=Q2*Ref(I2,-1);
        Re=X1+Y1;
        Im=X2-Y2;
//Smooth to remove undesired cross products
        Re=.2*Re+.8*Ref(Re,-1);
        Im=.2*Im+.8*Ref(Im,-1);
        //Compute cycle period
        for(i=1;i<BarCount;i++)
        {
        if (Im[i] != 0 AND Re[i] != 0)
        Period[i]=(360/atan(Im[i]/Re[i])); 
        else Period[i]=0;
    if (Period[i]>(1.5*(Period[i-1])))
        Period[i]=(1.5*(Period[i-1])); 
        else if (Period[i]<(.67*Period[i-1])) 
        Period[i]=(.67*(Period[i-1]));
        else if (Period[i]<6)
        Period[i]=6;
        else if (Period[i]>50) 
   Period[i]=50;
   }
   Period=.2*Period+(.8*Ref(Period,-1));
   
   Plot(Period,"CyclePeriod",colorRed,styleLine);
_SECTION_END();

Reply via email to