3 things about the code
if (Im[i] != 0 AND Re[i] != 0)
Period[i]=(360/atan(Im[i]/Re[i]));
else 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[i]+(.8*Period[i-1]);
You are using else if for the first Period check and period is not
calculated if the first condition if (Im[i] != 0 AND Re[i] != 0) is
not true, so it is only ever using the initiated value of period from before
the loop
Also your last Period calculation is missing the array identifier so period
is not always passed to outside the loop except for the last value of the
array
Try this
if (Im[i] != 0 AND Re[i] != 0)
Period[i]=(360/atan(Im[i]/Re[i]));
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[i] =.2*Period[i]+(.8*Period[i-1]);
The 3rd is that you calculation for Re and Im should be inside the loop as
you are trying to reference a periovus value of the variables in their own
calcualtions, this also occurs for a few other variables. You have to
remember that tradestation is based on looping for its basic coding method.
This is different to AB whihch calculates each variable for each bar, TS
calculates each bar for each variable
--
Cheers
Graham
AB-Write >< Professional AFL Writing Service
Yes, I write AFL code to your requirements
http://www.aflwriting.com
On 23/12/06, jeffro861 <[EMAIL PROTECTED]> wrote:
I got this from tradestation code as seen in the algorithm, but
apparently it thinks Period[i]<6. Does anybody have any clues?
TIA
_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 lag
Smoother=(4*P+3*Ref(P,-1) +2*Ref(P,-2) +4*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
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 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[i]+(.8*Period[i-1]);
}
Plot(Period,"CyclePeriod",colorRed,styleLine);
_SECTION_END();
Please note that this group is for discussion between users only.
To get support from AmiBroker please send an e-mail directly to
SUPPORT {at} amibroker.com
For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG:
http://www.amibroker.com/devlog/
For other support material please check also:
http://www.amibroker.com/support.html
Yahoo! Groups Links