My point was ... there should be NO speed problems ... Personally I
find response time for FFT calculations over thousands of bars to
still be subsecond.
Speed problems resulting from piggy code with
indicators can be
observed by holding down the left or right arrow keys
traveling bar
to bar and seeing how much lag time there is.
There
is no reason an FFT should have this sort of response time ergo
the first
F in FFT ...
If you have code for an FFT ( which I have yet to see
anyone post
here or in the files section ) and it has a lot of lag
associated
with it, I suggest you hunt down code on the net for a more
efficient
implementation.
For example ... here's a page of FFT
routines in a variety of
languages that fill the bill ... For those that
are C challenged
there are easily translatable other flavors ...
http://faculty.prairiestate.edu/skifowit/fft/
--- In [EMAIL PROTECTED]ps.com,
"Ton Sieverding"
<ton.sieverding@...> wrote:
>
>
"Writing efficient AFL for either is fairly straight forward with
no
> need for extra hardware ( FFT Chips ?! ) or DLL's ..."
> Sure
as long as you accept delays of several minutes when using
this code. This
has nothing to do with AFL or AB but is just what you
get when running
Fourier Analysis for financial timeseries. That's
why I am asking if other
members have some experience and how they
did solve the speed problem, But
thanks for you advise anyway ...
>
> Ton.
>
>
> ----- Original Message -----
> From: Fred
> To: [EMAIL PROTECTED]ps.com
> Sent: Tuesday, September 12, 2006 4:29 PM
> Subject:
[amibroker] Re: Cycles and Mesa
>
>
> 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 .
> >
> > <<...>>
> >
> >
> >
> >
------------------------------------------------