PureBytes Links
Trading Reference Links
|
Thanks TJ,
Just wondering if I am correct that one has to be careful in
extending this in backtests, since detrending (LR) is based on the
last value of the regression?
PS
--- In amibroker@xxxxxxxxxxxxxxx, "Tomasz Janeczko" <groups@xxx>
wrote:
>
> Hello,
>
> Here are few words about new FFT function.
> It requires AmiBroker 4.86 BETA to run.
> http://www.amibroker.com/devlog/2006/10/11/amibroker-4860-beta-
released/
> ===============
>
> FFT( array, len = 0 )
>
> performs FFT (Fast Fourier Transform) on last 'len' bars of the
array, if len is set to zero, then FFT is performed
> on entire array. len parameter must be even.
>
> Result:
>
> function returns array which holds FFT bins for first 'len' bars.
There are len/2 FFT complex bins returned,
> where bin is a pair of numbers (complex number): first is real part
of the complex number and second number
> is the imaginary part of the complex number.
>
> result = FFT( array, 256 );
>
> where:
> 0th bin (result[0] and result[1]) represents DC component,
> 1st bin (result[1 ] and result[2]) represents real and imaginary
parts of lowest frequency range
> and so on upto result[ len - 2 ] and result[ len - 1 ]
>
> remaining elements of the array are set to zero.
>
> FFT bins are complex numbers and do not represent real amplitude
and phase. To obtain amplitude and
> phase from bins you need to convert inside the formula. The
following code snipplet does that:
>
> ffc = FFT(data,Len);
> for( i = 0; i < Len - 1; i = i + 2 )
> {
> amp[ i ] = amp[ i + 1 ] = sqrt(ffc[ i ]^ 2 + ffc[ i + 1 ]
^2);
> phase[ i ] = phase[ i + 1 ] = atan2( ffc[ i + 1], ffc[ i ] );
> }
>
> IMPORTANT note: input array for FFT must NOT contain any Null
values. Use Nz() function to convert Nulls to zeros
> if you are not sure that input array is free from nulls.
>
>
> Below is example code showing how to use new FFT function in AFL.
>
> SetBarsRequired(100000,100000);
>
> Len = Param("FFT Length", 1024, 64, 10000, 10 );
>
> Len = Min( Len, BarCount );
>
> x = BarIndex();
> x1 = x - BarCount + Len;
>
>
> input = C;
> a = LastValue( LinRegIntercept( input, Len - 1 ) );
> b = LastValue( LinRegSlope( input, Len - 1 ) );
>
>
> Lr = a + b * x1;
>
> data = input - Lr;// de-trending
>
> ffc = FFT(data,Len);
>
> for( i = 0; i < Len - 1; i = i + 2 )
> {
> amp[ i ] = amp[ i + 1 ] = sqrt(ffc[ i ]^ 2 + ffc[ i + 1 ]^2);
> phase[ i ] = phase[ i + 1 ] = atan2( ffc[ i + 1], ffc[ i ] );
> }
>
> auto = ParamToggle("Auto dominant cycle", "No|Yes", 1 );
> sbar = Param( "Which FFT bin", 1, 0, 50 );
>
> skipbin1 = ParamToggle("Skip 1st FFT bin", "No|Yes", 1 );
>
> if( auto )
> {
> sbar = int( LastValue(ValueWhen( amp == LastValue(Highest( IIf(
skipbin1 AND x < 4, 0 , amp ) )), x / 2 )) );
> }
>
> fv = Status("firstvisiblebar");
>
> thisbar = Ref( int(x/2) == sbar, -fv);
> Plot( Ref(amp,-fv),"amplitude (bin " + Ref( int(x/2), -fv ) +")",
IIf( thisbar, colorRed, colorBlack ),styleArea);
>
> Plot( IIf( BarCount - BarIndex() < Len, data, Null ) , "de-trended
input ("+Len+" bars)", colorOrange, styleLeftAxisScale );
> Plot( cos( phase[ sbar * 2 ] + (sbar) * x1 * 2 * 3.1415926 /
Len ), "dominant cycle "+ Len/(sbar) + "(" + sbar + " bin) bars",
colorBlue, styleOwnScale );
>
> GraphZOrder=1;
> GraphXSpace = 10;
>
> Best regards,
> Tomasz Janeczko
> amibroker.com
>
|