Formulas and/or algorithms for FFT's are available a zillion places
on the net although I wouldn't bother with the one at numerical
recipes. Formulas for MESA are also available on net although they
are a little harder to find as I think someone who is probably the
best known for this technique although not the originator of the
algorithm or even its use with price data has done his best to
squelch a lot of what otherwise would be available.
Writing
efficient AFL for either is fairly straight forward with no
need for
extra hardware ( FFT Chips ?! ) or DLL's ...
--- In [EMAIL PROTECTED]ps.com,
"Ton Sieverding"
<ton.sieverding@...> wrote:
>
>
Thanks Tomasz. First I do not understand why it involves 3.000 * (
Bars#
) * ( Bars# ). Why not just 3.000 * ( Bars# ) ? I did the same
test in
Excel with 3.000 * ( Bars# ) and got no delay. After your
email I did it
again with 3.000 * ( Bars# ) * ( Bars# ) and got a
delay of several
minutes. But why two times 1.000 ?
> Secondly I just copied the code I
got from Fred and tried to speed
it up by removing the second and third
harmonic calculation. Of
course it was faster but still to slow for me.
Frankly I do not
understand how you can remove Cum() and LastValue() as
the results
are being used for the calculation of the harmonic.
>
Finally I agree that Log calculations will speed up the process and
will
look for FFT code that does use Log's. I only have used full
Fourier
Analysis in electronics and have no experience with the Fast
Fourier
Transform. Although I agree with Ara that a FFT card is
probably needed
for the real good performance. Do you have any
experience with these
goodies ?
>
> Ton.
>
> ----- Original Message
-----
> From: Tomasz Janeczko
> To: [EMAIL PROTECTED]ps.com
> Sent: Thursday, September 07, 2006 1:32 PM
> Subject: Re:
[amibroker] Re: Cycles and Mesa
>
>
>
>
Hello,
>
> You are doing 24 * 16 * 8 * (NUMBER OF BARS)
iterations per bar
(in the most inner loop you are using Cum() function
which is
cummulative
> sum over all bars). So entire execution
involves 24 * 16 * 8 *
(Number of bars) * (Number of bars). If you say
have 1000 bars you
end up with
> 3 billion operations.
> To
speed it up you would need to REMOVE Cum() and LastValue()
from inner
loop (they are not needed in fact).
>
> The code below is a
sample of very inefficient coding. Properly
coded FFT requires only
N*logN operations
>
> Best regards,
> Tomasz
Janeczko
> amibroker.com
> ----- Original Message -----
>
From: Ton Sieverding
> To: [EMAIL PROTECTED]ps.com
> Sent: Wednesday, September 06, 2006 12:16 PM
> Subject: Re:
[amibroker] Re: Cycles and Mesa
>
>
> 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: [EMAIL PROTECTED]ps.com
> 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: [EMAIL PROTECTED]ps.com
> 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@...> 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: [EMAIL PROTECTED]ps.com
> 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@...> 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: [EMAIL PROTECTED]ps.com
> Sent: Tuesday, September 05, 2006 6:18 AM
> Subject:
[amibroker] Re: Cycles and Mesa
>
>
>
> For
example
>
> <<...>>
>
>
>
>
------------------------------------------------