[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [amibroker] Ehler's SineWave Indicator Code check form AB GURUplease.



PureBytes Links

Trading Reference Links

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 -----
From: Joe Landry
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




Attachment: Description: Binary data