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

[amibroker] Re: Ehlers Dominant Cycle



PureBytes Links

Trading Reference Links

Hi,


For sure native is always better, but in case of this code, inline is 
faster.
At the begining i code Elher Dominant Cycle from scratch (i didn't see it 
was already coded... arhhh).
But it was very slow because of Median calculation is long if you have lot 
of data (it is array processing and it will compute on all the bars). 
"Inline version Median 5" limit to only the last 5 bars and compute it from 
only those 5 values, so it is more faster even if it is not native.

I got same problem when i compute Elher Adpatative Laguerre Filter in AFL.
http://www.mesasoftware.com/technicalpapers.htm : Time Warp Without Space 
Travel
For adaptation, it need Median calcul. If you place same "Inline 
calculation", it is a lot faster for me.

If you got only 100 bar in the chart, i think native is faster than inline. 
So you have to test yourself speed depending your needs and data length.



Just to add about Elhers Cycle, i find them not very usefull. I test with 
one sinus f=30 bars, modified abruptly to f=10 bars.
The two frequency are well finded (even i i added up to 10% white noise, 
like Elher show it in his test between the 3 methods). I join two picture to 
show this. Delay to detect new frequency is pretty good: only 7 bars to 
dected new 10 bars frequency. And frequencyare well matched !
But... and this is very simple signa.
With multiple added sinus it is another story .... see the last picture 
twosin. Two sinus are added, one dominant f=30 and A=2 and one minor f=10 
and A=0.5. No noise (no need to add... héhé) .
Elher Dominant cycle should show us : f=30. But instead of this, it oscillat 
with a periode of 30... (in a less sinus behaviour than our original 
signal!). So two thing: 1- the formula is bad (mine and the one posted) but 
i think not because for one sinus it is ok. 2- it only work well for one 
sinus.

If someone can highlight this problem and from where it come ? ... can help, 
thanks.


Cheers,
Tom

--- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@xxx> wrote:
>
>It is up to you, but built-in functions are several orders of magnitude 
>faster
>because they execute native CPU code.
>
>Best regards,
>Tomasz Janeczko
>amibroker.com
>----- Original Message ----- From: "Andy Davidson" <AndyDavidson@xxx>
>To: <amibroker@xxxxxxxxxxxxxxx>
>Sent: Thursday, October 05, 2006 9:53 PM
>Subject: Re: [amibroker] Ehlers Dominant Cycle
>
>
> > Thanks Tomasz...as far as I recall I cut-and-pasted that "placed inline 
> > for speed" median calculation from the version posted in the library & > 
>haven't revisited the code until now. I take it then that there is no > 
>performance benefit to the way I have it and I should (for the benefit > of 
>efficiency) simplify the code accordingly?
> > > Tomasz Janeczko wrote:
> >> FYI: Median is built-in function >>
> >> Best regards,http://www.amibroker.com/f?median
> >> Tomasz Janeczko
> >> amibroker.com
> >>
> >>     ----- Original Message -----
> >>     *From:* Andy Davidson <mailto:AndyDavidson@...>
> >>     *To:* amibroker@xxxxxxxxxxxxxxx <mailto:amibroker@xxxxxxxxxxxxxxx>
> >>     *Sent:* Thursday, October 05, 2006 7:46 PM
> >>     *Subject:* Re: [amibroker] Ehlers Dominant Cycle
> >>
> >>     Steve,
> >>     I think you're getting confused between Ehler's two books. As far
> >>     as I recall (books not to hand right now) he makes the confusion
> >>     easy as there is a "Dominant Cycle" indicator in both 'Rocket
> >>     Science' and 'Cybernetic', which are based on different methods.
> >>     Looks to me like the top one on your plot is the former and the
> >>     bottom is the latter. I personally have used the latter...the code
> >>     is copied below, which is probably nearly identical to the posted
> >>     AFL library version as I used that as a starting point when I
> >>     worked through it myself.
> >>     Can't help you with the 'Rocket Science' version I'm afraid.
> >>     Andy
> >>
> >>
> >>     // Ehler's Dominant Cycle Period
> >>     // Cybernetic Analysis for Stocks and Futures
> >>     // Chapter 9, p. 107. Code on p. 111.
> >>
> >>     //Global Parameters
> >>     X = Param("MP[1] Close[2]",1,1,2,1);
> >>     Z1 = IIf(X==1, (H+L)/2 , C);
> >>     Z2 = Param("Alpha", .07, .01, 1, .01);
> >>
> >>     function CyclePeriod(price, alpha)
> >>     {
> >>      instperiod = deltaphase = cycle = period = 0;
> >>      Cycle = ( price[2] - 2*price[1] + price[0] )/4;   //initialise 
>arrays
> >>      smooth = ( price + 2*Ref(price,-1) + 2*Ref(price,-2) +
> >>     Ref(price,-3) )/6;
> >>      >>      for (i=6 ; i<BarCount ; i++)
> >>       { >>        Cycle[i] = (1-alpha/2)^2 * ( smooth[i] - 
>2*smooth[i-1] +
> >>     smooth[i-2] ) +
> >>                   2*(1-alpha)*Cycle[i-1] - (1-alpha)^2*Cycle[i-2];
> >>
> >>        Q1[i] = (.0962*cycle[i] + .5769*cycle[i-2] -.5769*cycle[i-4] -
> >>     .0962*cycle[i-6])*(.5 + .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]));
> >>        //limit Delta Phase High/Low (0.09rads = 69bars, 1.1rads =
> >>     6bars...per page 117)
> >>        if(DeltaPhase[i] < 0.09)
> >>         DeltaPhase[i] = 0.09;
> >>        if(DeltaPhase[i] > 1.1)
> >>         DeltaPhase[i] = 1.1;
> >>        >>        //---Begin median calculation (placed inline for 
>speed).
> >>        //Hardcoded as length=5 as higher values would be out of range
> >>     due to start-up period in main loop
> >>        for(k=4; k>=0; k--) >>         { temparray[k] = DeltaPhase[i-k]; 
>} //create new array with
> >>     last 5 values of DeltaPhase
> >>        temp = 0;
> >>        for(k=4; k>0; k--)  //this series of loops re-organises
> >>     temparray into ascending order
> >>        { for (j=4; j>0; j--) >>          { if (temparray[j-1] > 
>temparray[j]) //swap values in array
> >>     if previous value is greater
> >>            { temp = temparray[j-1];
> >>              temparray[j-1] = temparray[j];
> >>              temparray[j] = temp;
> >>        }}}
> >>        MedianDelta[i] = temparray[2]; //returns the middle (third)
> >>     element of temparray
> >>        //---End median calculation
> >>
> >>        DC[i] = Nz( 6.28318 / MedianDelta[i] + .5, 15 );
> >>
> >>        InstPeriod[i] = .33*DC[i] + .67*InstPeriod[i-1];
> >>        Period[i] = .15*InstPeriod[i] + .85*Period[i-1];
> >>        }
> >>      for (i=0; i<7; i++)
> >>       { Period[i] = 1; }
> >>      return Period;
> >>     }
> >>
> >>     Plot( CyclePeriod(Z1,Z2) , "CyberCycle", colorRed );
> >>
> >>
> >>
> >>     Steve Dugas wrote:
> >>>     Hi All,
> >>>      >>>     I wonder if anyone has ever tried to code Ehlers Dominant 
>Cycle -
> >>>     the one based on the Homodyne Discriminator, pp. 68-69 in Rocket
> >>>     Science. I have never used TradeStation and this is my first shot
> >>>     at translating EasyLanguage. As far as I can see the code looks
> >>>     OK to me but what do I know? Anyway, the graph it produces (
> >>>     middle one ) looks pretty bad. For comparison, I plotted the
> >>>     Dominant Cycle code from the AFL library on the bottom ( but I
> >>>     believe this uses a different method ).  I would like to go on
> >>>     and code the rest of the indicators in the book but many are
> >>>     built on this so I need to get this right first. Any thoughts
> >>>     or working code would be greatly appreciated. I have enclosed my
> >>>     code below.Thank you!
> >>>      >>>     Steve
> >>>      >>>
> >>>     // Dominant Cycle
> >>>
> >>>     SetBarsRequired( 10000, 10000 );
> >>>
> >>>     // USER DEFINED PARAMS
> >>>
> >>>     Price = ( *High* + *Low* ) / 2;
> >>>
> >>>     // FORMULA
> >>>
> >>>     // initialize variables
> >>>
> >>>     Smooth = Detrender = I1 = Q1 = jI = jQ = I2 = Q2 = Re = Im =
> >>>     Period = SmoothPeriod = 0;
> >>>
> >>>     // calculate dominant cycle period
> >>>
> >>>     *for* ( i = 6; i < *BarCount*; i++ )
> >>>
> >>>     {
> >>>
> >>>     // smooth price data with 4-bar WMA
> >>>
> >>>     Smooth[i] = ( 4 * Price[i] + 3 * Price[i-1] + 2 * Price[i-2] +
> >>>     Price[i-3] ) / 10;
> >>>
> >>>     // compute amplitude correction
> >>>
> >>>     AmpCorr[i] = 0.075 * Period[i-1] + 0.54;
> >>>
> >>>     // compute detrended price data and Quadrature component with
> >>>     7-bar Hilbert Transform
> >>>
> >>>     Detrender[i] = ( 0.0962 * Smooth[i] + 0.5769 * Smooth[i-2] -
> >>>     0.5769 * Smooth[i-4] - 0.0962 * Smooth[i-6] ) * AmpCorr[i];
> >>>
> >>>     Q1[i] = ( 0.0962 * Detrender[i] + 0.5769 * Detrender[i-2] -
> >>>     0.5769 * Detrender[i-4] - 0.0962 * Detrender[i-6] ) * AmpCorr[i];
> >>>
> >>>     // compute InPhase component by referencing center bar of Hilbert
> >>>     Transformer ( 3 bars ago )
> >>>
> >>>     I1[i] = Detrender[i-3];
> >>>
> >>>     // advance the phase of I1 and Q1 by 90 degrees with 7-bar
> >>>     Hilbert Transform
> >>>
> >>>     jI[i] = ( 0.0962 * I1[i] + 0.5769 * I1[i-2] - 0.5769 * I1[i-4] -
> >>>     0.0962 * I1[i-6] ) * AmpCorr[i];
> >>>
> >>>     jQ[i] = ( 0.0962 * Q1[i] + 0.5769 * Q1[i-2] - 0.5769 * Q1[i-4] -
> >>>     0.0962 * Q1[i-6] ) * AmpCorr[i];
> >>>
> >>>     // perform Phasor addition for 3-bar averaging
> >>>
> >>>     I2[i] = I1[i] - jQ[i];
> >>>
> >>>     Q2[i] = Q1[i] + jI[i];
> >>>
> >>>     // smooth the I and Q components
> >>>
> >>>     I2[i] = 0.2 * I2[i] + 0.8 * I2[i-1];
> >>>
> >>>     Q2[i] = 0.2 * Q2[i] + 0.8 * Q2[i-1];
> >>>
> >>>     // apply the Homodyne Discriminator
> >>>
> >>>     Re[i] = I2[i] * I2[i-1] + Q2[i] * Q2[i-1];
> >>>
> >>>     Im[i] = I2[i] * Q2[i-1] - Q2[i] * I2[i-1];
> >>>
> >>>     // smooth the Re and Im components
> >>>
> >>>     Re[i] = 0.2 * Re[i] + 0.8 * Re[i-1];
> >>>
> >>>     Im[i] = 0.2 * Im[i] + 0.8 * Im[i-1];
> >>>
> >>>     // compute Dominant Cycle period
> >>>
> >>>     *if* ( Im[i] != 0 *AND* Re[i] != 0 )
> >>>
> >>>     Period[i] = 360 / atan( Im[i] / Re[i] );
> >>>
> >>>     // limit ROC of the cycle period to +/- 50% of previous cycle 
>period
> >>>
> >>>     *if* ( Period[i] > 1.5 * Period[i-1] )
> >>>
> >>>     Period[i] = 1.5 * Period[i-1];
> >>>
> >>>     *if* ( Period[i] < 0.67 * Period[i-1] )
> >>>
> >>>     Period[i] = 0.67 * Period[i-1];
> >>>
> >>>     // limit the cycle period to be > 6 or < 50
> >>>
> >>>     *if* ( Period[i] < 6 )
> >>>
> >>>     Period[i] = 6;
> >>>
> >>>     *if* ( Period[i] > 50 )
> >>>
> >>>     Period[i] = 50;
> >>>
> >>>     // smooth the cycle period
> >>>
> >>>     Period[i] = 0.2 * Period[i] + 0.8 * Period[i-1];
> >>>
> >>>     SmoothPeriod[i] = 0.33 * Period[i] + 0.67 * SmoothPeriod[i-1];
> >>>
> >>>     }
> >>>
> >>>     Plot( SmoothPeriod, "Dominant Cycle", *colorWhite*,
> >>>     *styleLine*|*styleOwnScale* );
> >>>
> >>>     //Plot( Re, "Re", colorBlue, styleLine|styleOwnScale );
> >>>
> >>>     //Plot( Im, "Im", colorSkyblue, styleLine|styleOwnScale );
> >>>
> >>>     //Plot( Im/Re, "Im/Re", colorDarkGreen, styleLine|styleOwnScale );
> >>>
> >>>     //Plot( atan(Im/Re), "atan(Im/Re)", colorBrightGreen,
> >>>     styleLine|styleOwnScale );
> >>>
> >>>     //Plot( Period, "Period", colorYellow, styleLine|styleOwnScale );
> >>>
> >>>
> >>>     
>------------------------------------------------------------------------
> >>>
> >>  > > > > ___________________________________________________________ > 
>Yahoo! Messenger - with free PC-PC calling and photo sharing. 
>http://uk.messenger.yahoo.com
> > > > 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
> > > > > > > > > > > > >
>

_________________________________________________________________
Découvrez Windows Live Messenger : le futur de MSN Messenger ! 
www.windowslivemessenger.fr




Content-Description: "AVG certification"
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.409 / Virus Database: 268.14.11/542 - Release Date: 11/20/2006