Skip to main content

Automatic Linear Trend Channel (edited) for Amibroker (AFL)

crkumar over 9 years ago Amibroker (AFL)

  • Rating:
    3 / 5 (Votes 5)
  • Tags:
    amibroker, trend

This appears to be an edited version of Edward Pottasch’ AFL.
Saw it in a forum
http://www.traderji.com/amibroker/103501-alf.html#post1191706

Screenshots

Indicator / Formula

Copy & Paste Friendly
// Automatic Linear Trend Channel (edited)
// original author Edward Pottasch
// Trend is defined using code found on the net
// see also: http://www.youtube.com/watch?v=HWPSqwEkN64
// Amibroker AFL code by Edward Pottasch, November 2011
// edited by Anderson Wilson, July 2012
// some symbols makes yybull and yybear infinite, 
// added IsFinite(yybull) AND IsFinite(yybear)
// before plotting Channel
_SECTION_BEGIN("Parameters");
kk = Optimize( "mult", Param( "mult", 1.25, 0.25, 8, 0.25 ), 1, 8, 0.25 );
Per = Optimize( "period", Param( "period", 10, 1, 300, 1 ), 5, 300, 1 );
sdfact = Param( "Standard Deviation Factor", 2, 0.5, 5, 0.1 );
offset = Param( "Offset", 2, 1, 50, 1 );
tc = ParamList( "Channel Display", List = "No Channel|Channel|ChannelRT|Both
Channels", 1 );
ms = ParamToggle( "Trend", "Regular|Smoothed", 1 );

x = Cum( 1 );
HaClose = ( O + H + L + C ) / 4;
HaOpen = AMA( Ref( HaClose, -1 ), 0.5 );
HaHigh = Max( H, Max( HaClose, HaOpen ) );
HaLow = Min( L, Min( HaClose, HaOpen ) );

if ( ms == 0 )
{
nm = ( H - L );
j = ( O + H + L + C ) / 4;
}
else
{
nm = ( HaHigh - HaLow );
j = ( HaOpen + HaHigh + HaLow + HaClose ) / 4;
}

rfsctor = WMA( nm, Per );

revers = kk * rfsctor;
Trend = 1;
NW[0] = 0;

for ( i = 1;i < BarCount;i++ )
{
if ( Trend[i-1] == 1 )
{
if ( j[i] < NW[i-1] )
{
Trend[i] = -1;
NW[i] = j[i] + Revers[i];
}
else
{
Trend[i] = 1;

if ( ( j[i] - Revers[i] ) > NW[i-1] )
{
NW[i] = j[i] - Revers[i];
}
else
{
NW[i] = NW[i-1];
}
}
}

if ( Trend[i-1] == -1 )
{
if ( j[i] > NW[i-1] )
{
Trend[i] = 1;
NW[i] = j[i] - Revers[i];
}
else
{
Trend[i] = -1;

if ( ( j[i] + Revers[i] ) < NW[i-1] )
{
NW[i] = j[i] + Revers[i];
}
else
{
NW[i] = NW[i-1];
}
}
}
}

cp = ( H + L ) / 2;

TrendUp = IIf( Trend == 1, Trend, 0 );
TrendDown = IIf( Trend == -1, Trend, 0 );
totalTrend = IIf( TrendUp, TrendUp, TrendDown );
dtotalTrend = totalTrend - Ref( totalTrend, -1 );
vtotalTrend = ValueWhen( dtotalTrend, dtotalTrend );
cbull = vtotalTrend > 0 AND Ref( vtotalTrend, -1 ) < 0;
cbull = Ref( cbull, 1 );
cbear = vtotalTrend < 0 AND Ref( vtotalTrend, -1 ) > 0;
cbear = Ref( cbear, 1 );
cbull = vtotalTrend > 0 AND Ref( vtotalTrend, -1 ) < 0;
cbull = Ref( cbull, 1 );
cbull[BarCount-1] = 1;
cbear = vtotalTrend < 0 AND Ref( vtotalTrend, -1 ) > 0;
cbear = Ref( cbear, 1 );
cbear[BarCount-1] = 1;
nwbull = Ref( Flip( cbull, cbear ), -1 );
nwbear = Ref( Flip( cbear, cbull ), -1 );

xxbull = BarsSince( cbull );
xxbull[BarCount-1] = xxbull[BarCount-2] + 1;
aaabull = LinRegIntercept( cp, xxbull );
bbbbull = LinRegSlope( cp, xxbull );
daabull = Ref( ValueWhen( cbear, aaabull, 0 ), -1 );
dbbbull = Ref( ValueWhen( cbear, bbbbull, 0 ), -1 );
yybull = daabull + dbbbull * ( xxbull - 1 );
yybull = IIf( xxbull > Max( offset, 1 ), yybull, Null );
wdbull = sdfact * StdErr( cp, xxbull );
wdbull = Ref( ValueWhen( cbear, wdbull, 0 ), -1 );

xxbear = BarsSince( cbear );
xxbear[BarCount-1] = xxbear[BarCount-2] + 1;
aaabear = LinRegIntercept( cp, xxbear );
bbbbear = LinRegSlope( cp, xxbear );
daabear = Ref( ValueWhen( cbull, aaabear, 0 ), -1 );
dbbbear = Ref( ValueWhen( cbull, bbbbear, 0 ), -1 );
yybear = daabear + dbbbear * ( xxbear - 1 );
yybear = IIf( xxbear > Max( offset, 1 ), yybear, Null );
wdbear = sdfact * StdErr( cp, xxbear );
wdbear = Ref( ValueWhen( cbull, wdbear, 0 ), -1 );

llbull = LinearReg( cp, xxbull );
llbull = IIf( xxbull > Max( Offset, 1 ), llbull, Null );
llbullp = LinearReg( cp, xxbull ) + sdfact * StdErr( cp, xxbull );
llbullp = IIf( xxbull > Max( Offset, 2 ), llbullp, Null );
llbullm = LinearReg( cp, xxbull ) - sdfact * StdErr( cp, xxbull );
llbullm = IIf( xxbull > Max( Offset, 2 ), llbullm, Null );
llbear = LinearReg( cp, xxbear );
llbear = IIf( xxbear > Max( Offset, 1 ), llbear, Null );
llbearp = LinearReg( cp, xxbear ) + sdfact * StdErr( cp, xxbear );
llbearp = IIf( xxbear > Max( Offset, 2 ), llbearp, Null );
llbearm = LinearReg( cp, xxbear ) - sdfact * StdErr( cp, xxbear );
llbearm = IIf( xxbear > Max( Offset, 2 ), llbearm, Null );

SetChartBkColor( ParamColor( "Background Color", colorBlack ) );
SetChartOptions( 0, chartShowDates );
SetBarFillColor( IIf( C > O, ParamColor( "Candle UP Color", colorGreen ), IIf(
C <= O, ParamColor( "Candle Down Color", colorRed ), colorLightGrey ) ) );
Plot( C, "Price", IIf( C > O, ParamColor( "Wick UP Color", colorDarkGreen ),
IIf( C <= O, ParamColor( "Wick Down Color", colorDarkRed ), colorLightGrey ) ),
64, 0, 0, 0, 0 );
PlotShapes( IIf( x == BarCount, shapeSmallSquare, shapeNone ), colorWhite, 0,
j, 0 );
Plot( IIf( NW < j, NW, Null ), "\ntrailLong", ParamColor( "ColorTrailLong",
colorGreen ), styleStaircase | styleDots );
Plot( IIf( NW > j, NW, Null ), "\ntrailShort", ParamColor( "ColorTrailShort",
colorRed ), styleStaircase | styleDots );


Buy = trend==1;	Sell = trend==-1;
Buy = ExRem(Buy,Sell);	Sell = ExRem(Sell,Buy);
PlotShapes(Buy+2*Sell, colorBrightGreen, 0,IIf(Buy,L,H),-30);


switch ( tc )
{
case( "No Channel" ):
break;
case( "Channel" ):
Plot( IIf( nwbull AND IsFinite(yybull), yybull, Null ), "", bbb = ColorRGB(
0, 255, 0 ), styleDashed );
Plot( IIf( nwbull AND IsFinite(yybull), yybull + wdbull, Null ), "", bbb,
styleThick );
Plot( IIf( nwbull AND IsFinite(yybull), yybull - wdbull, Null ), "", bbb,
styleThick );
Plot( IIf( nwbear AND IsFinite(yybear), yybear, Null ), "", sss =
ColorRGB( 255, 0, 0 ), styleDashed );
Plot( IIf( nwbear AND IsFinite(yybear), yybear + wdbear, Null ), "", sss,
styleThick );
Plot( IIf( nwbear AND IsFinite(yybear), yybear - wdbear, Null ), "", sss,
styleThick );
PlotOHLC( IIf( nwbull AND IsFinite(yybull), yybull + wdbull, Null ), 
IIf( nwbull AND IsFinite(yybull), yybull + wdbull, Null ), 
IIf( nwbull AND IsFinite(yybull), yybull - wdbull, Null ),
IIf( nwbull AND IsFinite(yybull), yybull - wdbull, Null ), 
"", ColorRGB( 10, 15, 10 ), styleCloud | styleNoLabel, 0, 0, 0, -1 );
PlotOHLC( IIf( nwbear AND IsFinite(yybear), yybear + wdbear, Null ), 
IIf( nwbear AND IsFinite(yybear), yybear + wdbear, Null ), 
IIf( nwbear AND IsFinite(yybear), yybear - wdbear, Null ),
IIf( nwbear AND IsFinite(yybear), yybear - wdbear, Null ), 
"", ColorRGB( 15, 10, 10 ), styleCloud | styleNoLabel, 0, 0, 0, -1 );

_N(Title = VarGetText("Title") + 
StrFormat(
", nwbull %g, yybull %g, nwbear %g, yybear %g wdbull %g", 
nwbull, yybull, nwbear, yybear, wdbull

)
);
break;
case( "ChannelRT" ):
Plot( IIf( nwbull, llbull, Null ), "", colorGreen, styleDashed,
0, 1, 0, 1 );
Plot( IIf( nwbull, llbullp, Null ), "", colorGreen, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbull, llbullm, Null ), "", colorGreen, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbear, llbear, Null ), "", colorRed, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbear, llbearp, Null ), "", colorRed, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbear, llbearm, Null ), "", colorRed, styleDashed, 0, 1, 0, 1
);
PlotOHLC( IIf( nwbull, llbullp, Null ), IIf( nwbull, llbullp, Null ), IIf(
nwbull, llbullm, Null ),
IIf( nwbull, llbullm, Null ), "", ColorRGB( 10, 15, 10 ),
styleCloud | styleNoLabel, 0, 0, 0, -1 );
PlotOHLC( IIf( nwbear, llbearp, Null ), IIf( nwbear, llbearp, Null ), IIf(
nwbear, llbearm, Null ),
IIf( nwbear, llbearm, Null ), "", ColorRGB( 15, 10, 10 ),
styleCloud | styleNoLabel, 0, 0, 0, -1 );
break;
case( "Both Channels" ):
Plot( IIf( nwbull, yybull, Null ), "", bbb = ColorRGB( 0, 255,
0 ), styleLine );
Plot( IIf( nwbull, yybull + wdbull, Null ), "", bbb, styleThick );
Plot( IIf( nwbull, yybull - wdbull, Null ), "", bbb, styleThick );
Plot( IIf( nwbear, yybear, Null ), "", sss = ColorRGB( 255, 0, 0 ),
styleLine );
Plot( IIf( nwbear, yybear + wdbear, Null ), "", sss, styleThick );
Plot( IIf( nwbear, yybear - wdbear, Null ), "", sss, styleThick );
Plot( IIf( nwbull, llbull, Null ), "", colorGreen, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbull, llbullp, Null ), "", colorGreen, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbull, llbullm, Null ), "", colorGreen, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbear, llbear, Null ), "", colorRed, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbear, llbearp, Null ), "", colorRed, styleDashed, 0, 1, 0, 1
);
Plot( IIf( nwbear, llbearm, Null ), "", colorRed, styleDashed, 0, 1, 0, 1
);
break;

}

_SECTION_END();

1 comments

1. Kevin
over 9 years ago

Hi, Any chance you could edit this great code, so that it shows just the last up or down down channel, with the current live channel?

Leave Comment

Please login here to leave a comment.