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" <[EMAIL PROTECTED]> To: <[email protected]> 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:[EMAIL PROTECTED]> >> *To:* [email protected] <mailto:[email protected]> >> *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 > > > > > > > > > > > > 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 <*> To visit your group on the web, go to: http://groups.yahoo.com/group/amibroker/ <*> Your email settings: Individual Email | Traditional <*> To change settings online go to: http://groups.yahoo.com/group/amibroker/join (Yahoo! ID required) <*> To change settings via email: mailto:[EMAIL PROTECTED] mailto:[EMAIL PROTECTED] <*> To unsubscribe from this group, send an email to: [EMAIL PROTECTED] <*> Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/
