Hi Joe,
I dug it up. Hadn't worked on it for the past two years. Spent
lots of time trying to duplicate the signals given by Stefan
Sbondorovitch's dll but discovered that because of the recursive moving averages
used within the formula, that unless I knew exactly how many bars were used in
his calculation, it probably would never be an exact match anyway. I think that
I did get pretty close. I believe that the sine wave generator code is your
creation.
There has been a lot of water under the bridge since I wrote
this, so if you see anything that I did wrong from the EasyLanguage
conversion, let me know.
Also, Ehlers has other older, slightly different versions of
the Sinewave out there.
My formula has lots of extra stuff in it for debugging and it
runs slow, so don't think that your computer locked up.
I tried mm's code but all I got was two flat lines. He also
inputs degrees into AB functions that require radians.
If Yahoo doesn't take attachments, here are the gory
details:
/* Ehlers Sinewave
Indicator
by Corey Saxe ver
20032005
From Ehlers book: Cybernetic Analysis for Stocks
and Futures, p. 154
*/
SetBarsRequired(1000000,1000000);
price=(H+L)/2;
alpha=Param("alpha",0.07,0.01,1,0.01);
pi=4*atan(1); //have a piece...
RTD=180/pi;
//radians to
degrees
DTR=1/RTD;
//degrees to
radians
SWcount=0;SWGate=0;Jcount=0;SWCycle=0;I1=0;Q1=0;InstPeriod=0;DeltaPhase=0;MedianDelta=0;DC=0;Value1=0;
DCPeriod=0;RealPart=0;ImagPart=0;DCPhase=0;MedianDelta=0;Cycle=0;RealPart =
0; ImagPart = 0;
// Sine wave
generator-----------------------------------------------------------
freq =Param("Freq",15,6,50,1);
SWcycle = sin(
Cum(1)*(360*DTR)/freq
)+2;
Price = IIf(Param("Prices or
test",1,1,2,1)==1,Price,SWCycle);
//Select sinewave test pattern or real
prices
//End Sine wave
generator--------------------------------------------------------
for(i=36;i<BarCount;i++)//37
{
Smooth[i]=(price[i]+2*price[i-1]+2*price[i-2]+price[i-3])/6;
Cycle[i] = ((1-0.5*alpha[i])^2)*(Smooth[i] - 2*Smooth[i-1] +
Smooth[i-2]) + 2*(1-alpha[i])*Cycle[i-1] - ((1-alpha[i])^2)*Cycle[i-2];
//Hilbert Transform}
Q1[i] = (0.0962*Cycle[i] + 0.5769*Cycle[i-2] -
0.5769*Cycle[i-4] - 0.0962*Cycle[i-6]) *
(0.5 + 0.08*InstPeriod[i-1]);
I1[i] = Cycle[i-3];
if (Q1[i] != 0 AND Q1[i-1] != 0)
DeltaPhase[i] = (I1[i]/Q1[i] - I1[i-1]/Q1[i-1]) /
(1 + I1[i]*I1[i-1]/(Q1[i]*Q1[i-1]));
if (DeltaPhase[i] < 0.1) DeltaPhase[i] = 0.1;
if (DeltaPhase[i] > 1.1) DeltaPhase[i] = 1.1;
MedianDelta=Median(DeltaPhase , 5);
//zzz[i]=Mediandelta[i];
OK
//zzz=Mediandelta[i]; NOT
OK
if (MedianDelta[i] == 0) DC[i]=15;
else
DC[i] = 2*pi/MedianDelta[i] + 0.5;//DC[i] is
OK
InstPeriod[i] = 0.33*DC[i] + 0.67*InstPeriod[i-1];
Value1[i] = 0.15*InstPeriod[i] + 0.85*Value1[i-1];
//Compute Dominant Cycle
Phase
DCPeriod[i] = int(Value1[i]);
for (count=0; count < DCPeriod[i]-1; Count++)//DCPeriod-1
{
RealPart[i] = RealPart[i] + sin(DTR*(360*count / DCPeriod[i])) *
Cycle[i-count];
ImagPart[i] = ImagPart[i] + cos(DTR*(360*count / DCPeriod[i])) *
Cycle[i-count];
}
// Code to prevent TS arctan >
infinity
if (abs(ImagPart[i]) > 0.000001) DCPhase[i] = atan(RealPart[i]/ImagPart[i]);
if (abs(ImagPart[i]) <= 0.000001) DCPhase[i] = (pi/2) * sign(RealPart[i]);
DCPhase[i] = DCPhase[i] + (pi/2);//90
if (ImagPart[i] < 0) DCPhase[i] = DCPhase[i] + pi;// add 180
if (DCPhase[i] > (7*pi/4)) DCPhase[i] =
DCPhase[i] - (2*pi);// sub 360
}
Sine = sin(DCPhase);
LeadSine = sin(DCPhase+(pi/4));
A1=Cross(sine,Leadsine);
A2= Cross(Leadsine,sine);
GraphXSpace=5;
Plot(Sine,"Sine",colorRed,1);Plot(LeadSine,"LeadSine",colorGreen,1);
//Plot(price,"",colorYellow,24|styleNoLabel);Plot(price,"Price",colorBlue,1|styleNoLabel);
//Plot(A1 OR A2,"Grn-Trough
Red-Peak",IIf(A1,colorRed,IIf(A2,colorGreen,Null)),2|styleOwnScale|styleNoLabel);
//Plot(cycle,"cycle",3,1);
//Plot(smooth,"smooth",0,1);
//Plot(test,"dcp",2,8);Plot(test1,"dcp1",1,8);
//Plot(dcperiod,"DCPeriod",0,1);Plot(Count,"count",1,1);
//Plot(DC,"DC",2,1);
//Plot(realpart,"RP",0,1);Plot(imagpart,"IP",1,1);
//Plot(alpha,"alpha",2,1);
----- Original Message -----
Sent: Monday, September 12, 2005 5:40
PM
Subject: Re: [amibroker] Ehler's SineWave
Indicator Code check form AB GURU please.
Hello Corey Saxe - are you on line?
Moni -
Corey wrote a version of it and let's see if he's
still on the forum
and if you get his copy then you can compare your
code with his.
It may well be in the AFL area in Amibroker or the AB
Forum files area.
JOE
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 other support material please check also:
http://www.amibroker.com/support.html
YAHOO! GROUPS LINKS
|