Stock Portfolio Organizer
The ultimate porfolio management solution.
WiseTrader Toolbox
#1 Selling Amibroker Plugin featuring:
Least Squares Channel Indicator for Amibroker (AFL)
Least Squares Channel Indicator (Amibroker AFL code by E.M.Pottasch, Aug 2015).
Indicator updates at end of each bar or when parameters are adjusted. It takes awhile before indicator appears because a lot of calculations are involved. This is the reason it only calculates the channels once a new bar appears OR when you press “Force Calculation” in parameter window. Also see other parameters you may change. For now this is purely meant to be an indicator. You need Version 6 of Amibroker (or higher).
Screenshots
Indicator / Formula
// Least Squares Channel Indicator
// Amibroker AFL code by E.M.Pottasch, Aug 2015
// Indicator updates at end of each bar or when parameters are adjusted
// Else press "Force Calculation" in parameter window
Version( 6 ); // need Amibroker version 6
SetBarsRequired( 1000, 0 );
order = Param( "n-th Order", 1, 1, 10, 1 );
clevel = Param( "Confidence Level", 2, 1, 3, 0.1 );
extend = Param( "Extend Fit (Bars)", 10, 0, 20, 1 );
trig = ParamTrigger( "Force Calculation", "Press Here" );
minbars = Param( "Minimum", 20, 1, 500, 1 ); // minimum number of bars before new channel starts
showTrack = ParamToggle( "Show Track", "No|Yes", 0 );
showSignals = ParamToggle( "Show Signals", "No|Yes", 0 );
s1 = GetChartID() + StrToNum( Name() );
regext = regextx1a = regextz1a = Null;
prc = ( H + L ) / 2;
sd = 0;
bi = BarIndex();
lvb = LastVisibleValue( bi );
fvb = 1;
function NewBarJustArrived()
{
vname = "lbe" + s1;
prev = Nz( StaticVarGet( vname ) );
curr = Status( "lastbarend" );
StaticVarSet( vname, curr );
return curr != prev;
}
StaticVarSet( "DoEntirecalculation" + s1, 0 );
if( Nz( StaticVarGet( "svOrder" + s1 ) ) != order OR
Nz( StaticVarGet( "svClevel" + s1 ) ) != clevel OR
StaticVarGet( "svInterval" + s1 ) != Interval() OR
StaticVarGet( "svMinbars" + s1 ) != minbars OR
StaticVarGet( "svExtend" + s1 ) != extend OR
StaticVarGetText( "svSymbol" + s1 ) != Name() OR
NewBarJustArrived() OR
trig )
{
StaticVarSet( "DoEntirecalculation" + s1, 1 );
//Say( " Do Calculation " );
}
StaticVarSet( "svOrder" + s1, order );
StaticVarSet( "svClevel" + s1, clevel );
StaticVarSet( "svInterval" + s1, Interval() );
StaticVarSet( "svMinbars" + s1, minbars );
StaticVarSet( "svExtend" + s1, extend );
StaticVarSetText( "svSymbol" + s1, Name() );
function CalculateCoefficients( aa, bb )
{
n = MxGetSize( aa, 0 );
ll = uu = Matrix( n, n, 0 );
xx = yy = 0;
for( j = 0; j < n; j++ )
{
for( i = 0; i < n; i++ )
{
if( i <= j )
{
uu[i][j] = aa[i][j];
for( k = 0; k <= i - 1; k++ )
uu[i][j] -= ll[i][k] * uu[k][j];
if( i == j )
ll[i][j] = 1;
else
ll[i][j] = 0;
}
else
{
ll[i][j] = aa[i][j];
for( k = 0; k <= j - 1; k++ )
ll[i][j] -= ll[i][k] * uu[k][j];
ll[i][j] /= uu[j][j];
uu[i][j] = 0;
}
}
}
for( i = 0; i < n; i++ )
{
yy[i] = bb[i];
for( j = 0; j < i; j++ )
{
yy[i] -= ll[i][j] * yy[j];
}
}
for( i = n - 1; i >= 0; i-- )
{
xx[i] = yy[i];
for( j = i + 1; j < n; j++ )
{
xx[i] -= uu[i][j] * xx[j];
}
xx[i] /= uu[i][i];
}
return xx;
}
function CalculateFit( eb, bars )
{
global reg;
global x1a;
global z1a;
global regext;
global regextx1a;
global regextz1a;
reg = x1a = z1a = Null;
regext = regextx1a = regextz1a = Null;
lb = eb;
fb = eb - bars;
nb = lb - fb;
if( eb > bars )
{
aa = Matrix( order + 1, order + 1, 0 );
bb = 0;
// fill matrix A
for( i = 0; i <= order; i++ )
{
for( j = 0; j <= order; j++ )
{
for( k = fb; k <= lb; k++ )
{
vv = ( k - ( lb + fb ) / 2 );
aa[i][j] = aa[i][j] + ( vv ^ ( i + j ) );
}
}
}
// fill matrix B
for( i = 0; i <= order; i++ )
{
for( j = fb; j <= lb; j++ )
{
vv = ( j - ( lb + fb ) / 2 );
bb[i] = bb[i] + prc[j] * ( vv ^ i );
}
}
// calculate coefficients
xx = CalculateCoefficients( aa, bb );
// store the fit in reg
for( i = fb; i <= lb; i++ )
{
reg[i] = xx[0];
for( j = 1; j <= order; j++ )
{
vv = ( i - ( lb + fb ) / 2 );
reg[i] = reg[i] + xx[j] * vv ^ j;
}
}
// extended fit (only when channel is active at last bar)
if( lb == BarCount - 1 )
{
for( i = lb + 1; i <= lb + extend; i++ )
{
regext[i - extend] = xx[0];
for( j = 1; j <= order; j++ )
{
vv = ( i - ( lb + fb ) / 2 );
regext[i - extend] = regext[i - extend] + xx[j] * vv ^ j;
}
}
}
// calculate standard deviation
sdp = 0;
for( i = fb; i <= lb; i++ )
{
sdp = sdp + ( prc[i] - reg[i] ) ^ 2;
}
sd = sqrt( sdp / ( bars - 2 ) ); // devide by ( bars - 2 ) corresponding to StdErr function
x1a = reg + sd * clevel;
z1a = reg - sd * clevel;
regextx1a = regext + sd * clevel;
regextz1a = regext - sd * clevel;
}
}
if( StaticVarGet( "DoEntirecalculation" + s1 ) == 1 )
{
regFinal = x1aFinal = z1aFinal = 0;
regPerm = x1aPerm = z1aPerm = 0;
buyPerm = sellPerm = 0;
sb = fvb;
for( i = fvb; i <= lvb; i++ )
{
eb = i;
bars = eb - sb;
if( bars > minbars )
{
calculateFit( eb, bars );
regFinal = IIf( !IsEmpty( reg ), reg, regFinal );
x1aFinal = IIf( !IsEmpty( x1a ), x1a, x1aFinal );
z1aFinal = IIf( !IsEmpty( z1a ), z1a, z1aFinal );
if( C[ i ] < z1aFinal [ i ] AND z1aFinal [ i ] > z1aFinal [ i - 1 ] )
{
sellPerm[ eb ] = 1;
i = i + 2;
sb = i;
}
else
if( C[ i ] > x1aFinal [ i ] AND x1aFinal [ i ] < x1aFinal [ i - 1 ] )
{
buyPerm[ eb ] = 1;
i = i + 2;
sb = i;
}
regPerm[ eb ] = reg[ eb ];
x1aPerm[ eb ] = x1a[ eb ];
z1aPerm[ eb ] = z1a[ eb ];
}
}
regFinal = IIf( regFinal, regFinal, Null );
x1aFinal = IIf( x1aFinal, x1aFinal, Null );
z1aFinal = IIf( z1aFinal, z1aFinal, Null );
regPerm = IIf( regPerm, regPerm, Null );
x1aPerm = IIf( x1aPerm, x1aPerm, Null );
z1aPerm = IIf( z1aPerm, z1aPerm, Null );
buyPerm = IIf( buyPerm, buyPerm, Null );
sellPerm = IIf( sellPerm, sellPerm, Null );
StaticVarSet( "regFinal" + s1, regFinal );
StaticVarSet( "x1aFinal" + s1, x1aFinal );
StaticVarSet( "z1aFinal" + s1, z1aFinal );
StaticVarSet( "regext" + s1, regext );
StaticVarSet( "regextx1a" + s1, regextx1a );
StaticVarSet( "regextz1a" + s1, regextz1a );
StaticVarSet( "regPerm" + s1, regPerm );
StaticVarSet( "x1aPerm" + s1, x1aPerm );
StaticVarSet( "z1aPerm" + s1, z1aPerm );
StaticVarSet( "buyPerm" + s1, buyPerm );
StaticVarSet( "sellPerm" + s1, sellPerm );
}
SetChartOptions( 0, chartShowDates );
SetChartBkColor( colorBlack );
SetBarFillColor( IIf( C > O, ColorRGB( 0, 75, 0 ), IIf( C <= O, ColorRGB( 75, 0, 0 ), colorLightGrey ) ) );
Plot( C, "", IIf( C > O, ColorRGB( 0, 255, 0 ), IIf( C <= O, ColorRGB( 255, 0, 0 ), colorLightGrey ) ), 64, Null, Null, 0, 1, 1 );
Plot( iif( !IsEmpty( StaticVarGet( "regPerm" + s1 ) ) , StaticVarGet( "regFinal" + s1 ), Null ), "", colorBlue, styleLine | styleNoLabel, Null, Null, 0, 1, 2 );
Plot( StaticVarGet( "regFinal" + s1 ), "", colorBlue, styleDashed, Null, Null, 0, 1, 1 );
Plot( iif( !IsEmpty( StaticVarGet( "regPerm" + s1 ) ) , StaticVarGet( "x1aFinal" + s1 ), Null ), "", colorred, styleLine | styleNoLabel, Null, Null, 0, 1, 2 );
Plot( StaticVarGet( "x1aFinal" + s1 ), "", colorred, styleDashed, Null, Null, 0, 1, 1 );
Plot( iif( !IsEmpty( StaticVarGet( "regPerm" + s1 ) ) , StaticVarGet( "z1aFinal" + s1 ), Null ), "", colorred, styleLine | styleNoLabel, Null, Null, 0, 1, 2 );
Plot( StaticVarGet( "z1aFinal" + s1 ), "", colorred, styleDashed, Null, Null, 0, 1, 1 );
Plot( StaticVarGet( "regext" + s1 ), "", colorlightgrey, styleDashed | styleNoLabel | styleNoRescale, Null, Null, extend, 0, 1 );
Plot( StaticVarGet( "regextx1a" + s1 ), "", colorlightgrey, styleDashed | styleNoLabel | styleNoRescale, Null, Null, extend, 0, 1 );
Plot( StaticVarGet( "regextz1a" + s1 ), "", colorlightgrey, styleDashed | styleNoLabel | styleNoRescale | styleClipMinMax, Null, Null, extend, 0, 1 );
hh = StaticVarGet( "x1aFinal" + s1 );
ll = StaticVarGet( "z1aFinal" + s1 );
PlotOHLC( ll, ll, hh, hh, "", ColorRGB( 10, 10, 10 ), styleCloud | styleNoLabel | styleNoRescale, Null, Null, 0, -1, 1 );
if( showTrack )
{
Plot( StaticVarGet( "regPerm" + s1 ), "", colorLightBlue, styleDashed | styleNoLabel | styleNoRescale, Null, Null, 0, 1, 1 );
Plot( StaticVarGet( "x1aPerm" + s1 ), "", colorOrange, styleDashed | styleNoLabel | styleNoRescale, Null, Null, 0, 1, 1 );
Plot( StaticVarGet( "z1aPerm" + s1 ), "", colorOrange, styleDashed | styleNoLabel | styleNoRescale, Null, Null, 0, 1, 1 );
}
if( showSignals )
{
PlotShapes( IIf( StaticVarGet( "buyPerm" + s1 ), shapeUpArrow, shapeNone ), colorDarkGreen, 0, L, -15 );
PlotShapes( IIf( StaticVarGet( "buyPerm" + s1 ), shapeSmallCircle, shapeNone ), colorWhite, 0, C, 0 );
PlotShapes( IIf( StaticVarGet( "sellPerm" + s1 ), shapeDownArrow, shapeNone ), colorRed, 0, H, -15 );
PlotShapes( IIf( StaticVarGet( "sellPerm" + s1 ), shapeSmallCircle, shapeNone ), colorWhite, 0, C, 0 );
}
SecsToGo = Status( "lastbartimeleft" );
nm = StrMid( Name(), 0, StrLen( Name() ) );
Title = nm +
" | " + Now( 2 ) +
" | " + EncodeColor( ColorYellow ) + NumToStr( SecsToGo, 1.0, False ) + EncodeColor( colorWhite ) +
" | " + NumToStr( order, 1.0, False ) + " | ";1 comments
Leave Comment
Please login here to leave a comment.
Back
Excellent work sir
Thank you for sharing