PureBytes Links
Trading Reference Links
|
Rakesh when talking about the Fourier code ( Fred -> Ehler ? ) you sent me and looking for what you want to get, why not just taking the first harmonic and forgetting the rest of the code. In this way you have your current cycle length - at least this is what I think you want to get - and this will also solve an important part of the speed problem. So take Y01 and take out the linear Y and you should get the first harmonic. But as I already told you, this is not what I have in mind for the first harmonic ...
Also I do not understand why this code is still so slow. When looking to the For Loops I am getting 24 * 16 * 8 being 3.072 iterations per Bar. So why is the code so slow ? Thomasz am I to optimistic ? Dimitri do you have any idea ? You can speedup the calculation by setting n = 6, g01=1.0 ( starting g=1 ) and stp0 = 200 ( starting stp0 = 400 ). I do not see any difference in the graph and the speed should be of course 12 * 8 * 4 = 384 or 8x the old speed ...
Ton.
_SECTION_BEGIN("Fourier Analysis Elementary");
// =============================================================
// Elementary Fourier analysis, by D. Tsokakis, May 2004
// =============================================================
t=Cum(1)-1;
A=Param("Rsi",50,1,100,1);
B=Param("smooth",100,1,120,1);
C1=MA(RSI(A),B);
start=Cum(IsTrue(C1))==1;
t1=ValueWhen(start,t);
// PlotShapes(shapeDownTriangle*start,colorYellow);
// C10=ValueWhen(start,C1);Plot(C1,"C1",colorBlack,8);
GraphXSpace=2;
x = Cum(1);
lastx = LastValue( x );
Daysback = LastValue(Cum(IsTrue(C1)));
aa = LastValue( LinRegIntercept( C1, Daysback) );
bb = LastValue( LinRegSlope( C1, Daysback ) );
yy = Aa + bb * ( x - (Lastx - DaysBack) );
yy=IIf( x >= (lastx - Daysback), yy, -1e10 );
// Plot( yy, "yy", colorRed );
detrend=C1-yy;
new1=detrend;
Hor=LastValue(Cum(new1)/Cum(IsTrue(C1)));
pi=4*atan(1);
n=12;
// ===============================================
// Fundamental period, crude approximation
// ===============================================
error00=10000;
per01=0;
g01=0;
phi01=0;
stg0=0.5;
stp0=100;
for(phi=0;phi<2*pi;phi=phi+pi/n)
{
for(g=0.5;g<=8;g=g+stg0)
{
for(per=300;per<=1000;per=per+stp0)
{
f=1/per;
y=Hor+g*sin(2*pi*f*(t-t1)+phi);
error=LastValue(Cum(abs(y-new1)));
if(error<error00)
{error00=error;per01=per;g01=g;phi01=phi;}
}
}
}
f01=1/per01;
y01=Hor+g01*sin(2*pi*f01*(t-t1)+phi01);
Plot(y01,"y01",colorRed,4);
_SECTION_END();
----- Original Message -----
From: Ara Kaloustian
To: amibroker@xxxxxxxxxxxxxxx
Sent: Wednesday, September 06, 2006 6:12 AM
Subject: Re: [amibroker] Re: Cycles and Mesa
Rakesh,
John Ehler's code is quite usable with AB... it produces the dominant cycle value. It is a bit CPU intensive but I tried using it at the start of a new bar (instead of using it with every trade) and that made the CPU load quite acceptable.
My issue with both Ehler's code anf FFT is that I was not satisfied with either.
Since you were getting good results with FFT, you might try Ehler's code.
Theoretically ehler's code should be better since it looks at the most recent data, while FFT would need much longer data to produce usefuk cycle lengths.
Good luck
Ara
----- Original Message -----
From: Rakesh Sahgal
To: amibroker@xxxxxxxxxxxxxxx
Sent: Tuesday, September 05, 2006 5:33 PM
Subject: Re: [amibroker] Re: Cycles and Mesa
Ton
Back in the old MetaStock days I had fiddled around with using the packaged FFT in MS. I had used it to extract the current dominant cycle length in a market and then used it to compute studies. The results were quite satisfactory. Then I changed platforms to AB and the whole idea got shelved. Subsequently I have tried to find a way of extracting current dominant cycle length in an issue/market in AB but have not seen any way of using it which my non-engineering/mathmetician brain could comprehend. It was in this context I tried DT's code. Unfortunately (a) it was computing power intensive and (b) the results were beyond my comprehension so I gave up on it. I still would like to find a way of ascertaining what the current cycle length is in an issue but have not been able to make much progress. Perhaps someone on the list could throw up some ideas which are implementable on the AB platform.
R
On 9/6/06, Ton Sieverding <ton.sieverding@xxxxxxxxxx> wrote:
Thanks Rakesh. I've tried underneath mentioned AFL code for Fourier analysis. It does something but I have some questions :
1. I have the feeling that the code uses a lot of computer power. When modifying the parameters it takes several seconds ( about 5 sec ) before I have a result on the graph. I am using a Ghz 2.6 CPU with 1GB internal and have never seen my computer so slow. Do you have the same experience ?
2. What I would like to see is a couple of sine waves being the harmonics of the original time series. So more or less the same picture as Fred's Cycles. But that's not what I get. Also the calculations for the Fourier analysis does not look familiar to me. Where can I find the logical background behind these formulas ?
Ton.
----- Original Message -----
From: Rakesh Sahgal
To: amibroker@xxxxxxxxxxxxxxx
Sent: Tuesday, September 05, 2006 2:12 PM
Subject: Re: [amibroker] Re: Cycles and Mesa
If you are interested in Fourier Analysis in AB environment you should refer to the work of Dmitris Tsokasis who shared his work on Fourier Analysis with the group. Am pasting below his code. I have never used it and would not know how to apply it in a meaningful manner. Hope you find it useful.
R
===============================
// Elementary Fourier analysis, by D. Tsokakis, May 2004
t=Cum(1)-1;
A=Param("Rsi",50,1,100,1);
B=Param("smooth",100,1,120,1);
C1=MA(RSI(A),B);
start=Cum(IsTrue(C1))==1;
t1=ValueWhen(start,t);
PlotShapes(shapeDownTriangle*start,colorYellow);
C10=ValueWhen(start,C1);Plot(C1,"C1",colorBlack,8);
GraphXSpace=2;
x = Cum(1);
lastx = LastValue( x );
Daysback = LastValue(Cum(IsTrue(C1)));
aa = LastValue( LinRegIntercept( C1, Daysback) );
bb = LastValue( LinRegSlope( C1, Daysback ) );
yy = Aa + bb * ( x - (Lastx - DaysBack) );
yy=IIf( x >= (lastx - Daysback), yy, -1e10 );
Plot( yy, "yy", colorRed );
detrend=C1-yy;
new1=detrend;Hor=LastValue(Cum(new1)/Cum(IsTrue(C1)));
pi=4*atan(1);n=12;
// Fundamental period, crude approximation
error00=10000;per01=0;g01=0;phi01=0;stg0=0.5;stp0=100;
for(phi=0;phi<2*pi;phi=phi+pi/n)
{
for(g=0.5;g<=8;g=g+stg0)
{
for(per=300;per<=1000;per=per+stp0)
{f=1/per;
y=Hor+g*sin(2*pi*f*(t-t1)+phi);
error=LastValue(Cum(abs(y-new1)));
if(error<error00)
{error00=error;per01=per;g01=g;phi01=phi;}
}}}
f01=1/per01;y01=Hor+g01*sin(2*pi*f01*(t-t1)+phi01);
Plot(y01+yy,"y01",colorSkyblue,4);
Title=Name()+" [ Sample="+WriteVal(Daysback,1.0)+" bars ]"+"\nyS0="+WriteVal(Hor,1.2)+
"\nyS01="+
WriteVal(g01,1.1)+"*sin(2*pi*(1/"+
WriteVal(per01,1.0)+")*(t-t1)+"+
WriteVal(12*phi01/pi,1.0)+"*pi/"+WriteVal(n, 1.0)+"), Error1 ="+
WriteVal(LastValue(Cum(abs(y01-new1))),1.0)+", Error1/bar ="+
WriteVal(2*LastValue(Cum(abs(y01-new1)))/Daysback,1.2)+" %";;
// Fundamental period, detailed approximation
error0=10000;per1=0;g1=0;phi1=0;stg=0.5;stp=10;
for(phi=0;phi<2*pi;phi=phi+pi/n)
{
for(g=0.5;g<=8;g=g+stg)
{
for(per=per01-stp0;per<=per01+stp0;per=per+stp)
{f=1/per;
y=Hor+g*sin(2*pi*f*(t-t1)+phi);
error=LastValue(Cum(abs(y-new1)));
if(error<error0)
{error0=error;per1=per;g1=g;phi1=phi;}
}}}
f1=1/per1;y1=Hor+g1*sin(2*pi*f1*(t-t1)+phi1);
Plot(y1+yy,"y1",colorBlue,4);
Title=Title+
"\nyS1="+
WriteVal(g1,1.1)+"*sin(2*pi*(1/"+
WriteVal(per1,1.0)+")*(t-t1)+"+
WriteVal(12*phi1/pi, 1.0)+"*pi/"+WriteVal(n,1.0)+"), Error1 ="+
WriteVal(LastValue(Cum(abs(y1-new1))),1.0)+", Error1/bar ="+
WriteVal(2*LastValue(Cum(abs(y1-new1)))/Daysback,1.2)+" %";;
// 2nd Harmonic
error0=10000;
for(phi=0;phi<2*pi;phi=phi+pi/n)
{
for(g=0;g<=8;g=g+0.1)
{
per2=per1/2;f=1/per2;
y2=y1+g*sin(2*pi*f*(t-t1)+phi);
error2=LastValue(Cum(abs(y2-new1)));
if(error2<error0)
{error0=error2;g2=g;phi2=phi;}
}}
f2=1/per2;y2=y1+g2*sin(2*pi*f2*(t-t1)+phi2);
Plot(y2+yy,"y1",colorYellow,8);
Title=Title+
"\nyS2="+
WriteVal(g2,1.1)+"*sin(2*pi*(1/"+
WriteVal(per2,1.0)+")*(t-t1)+"+
WriteVal(12*phi2/pi,1.0)+"*pi/"+WriteVal(n,1.0)+"), Error2 ="+
WriteVal(LastValue(Cum(abs(y2-new1))),1.0)+", Error2/bar ="+
WriteVal(2*LastValue(Cum(abs(y2-new1)))/Daysback,1.2)+" %";;
// 3rd Harmonic
error0=10000;
for(phi=0;phi<2*pi;phi=phi+pi/n)
{
for(g=0;g<=8;g=g+0.1)
{
per3=per2/2;f=1/per3;
y3=y2+g*sin(2*pi*f*(t-t1)+phi);
error3=LastValue(Cum(abs(y3-new1)));
if(error3<error0)
{error0=error3;g3=g;phi3=phi;}
}}
f3=1/per3;y3=y2+g3*sin(2*pi*f3*(t-t1)+phi3);
Plot(y3+yy,"y1",colorWhite,8);
Title=Title+
"\nyS3="+
WriteVal(g3,1.1)+"*sin(2*pi*(1/"+
WriteVal(per3,1.0)+")*(t-t1)+"+
WriteVal(12*phi3/pi,1.0)+"*pi/"+WriteVal(n,1.0)+"), Error3 ="+
WriteVal(LastValue(Cum(abs(y3-new1))),1.0)+", Error3/bar ="+
WriteVal(2*LastValue(Cum(abs(y3-new1)))/Daysback,1.2)+" %";
/*
===============================
On 9/5/06, Ton Sieverding <ton.sieverding@xxxxxxxxxx> wrote:
I certainly like what I see Fred. But do you have the AFL code for this picture also ?
Is this based on Fourier stuff ? I have tried to find the FTT instructions in AFL but cannot find them. Do they exist in AFL or did you use some special DLL ?
Kind regards,
Ton Sieverding.
----- Original Message -----
From: Fred Tonetti
To: amibroker@xxxxxxxxxxxxxxx
Sent: Tuesday, September 05, 2006 6:18 AM
Subject: [amibroker] Re: Cycles and Mesa
For example ?
<<...>>
------------------------------------------------------------------------
I am using the free version of SPAMfighter for private users.
It has removed 8436 spam emails to date.
Paying users do not have this message in their emails.
Try SPAMfighter for free now!
|