// Downloaded From https://www.WiseStockTrader.com
/*
Formula Name: Turtle trading system
Collector/Uploader: www.stockbangladesh.com
E-mail: amibroker@stockbangladesh.com
Origin: Turtle trading experimemnt Chandelier exit based on Chuck Lebeau's work
Keywords: Trend trading
Level: Basic
Flags: System
*/
//=============================SETUP================ ======================

pds = 20;
MAFAST = EMA( Close, 20 );
MASLOW = EMA( Close, 40 );

DonchianUpper = HHV( Ref( H, -1 ), pds ); // Highest high value of highs in last 20 periods
DonchianLower = LLV( Ref( L, -1 ), pds ); // Lowest low value of low in last 20 periods
DonchianMiddle = ( DonchianUpper + DonchianLower ) / 2;

UpTrend = C > ( LLV( L, 20 ) + 2 * ATR( 10 ) ) AND EMA( Close, 20 ) > EMA( Close, 40 );
DnTrend = C < ( HHV( H, 20 ) - 2 * ATR( 10 ) ) AND EMA( Close, 20 ) < EMA( Close, 40 );
Color = IIf( UpTrend, colorBlue, IIf( DnTrend, colorOrange, colorCustom11 ) );

// Plots a 20 period Donchian channel
Plot( C, "Price", Color, styleBar | styleThick );
Plot( DonchianUpper, "Donchian U", ParamColor( "DU Color", colorBlue ), ParamStyle( "DU Style", styleLine ) );
Plot( DonchianMiddle, "Donchian M", ParamColor( "DM Color", colorBrightGreen ), ParamStyle( "DM Style", styleNoLine ) );
Plot( DonchianLower, "Donchian L", ParamColor( "DL Color", colorRed ), ParamStyle( "DL Style", styleLine ) );

Title = WriteVal( DonchianUpper, 1.2 ) + WriteVal( DonchianLower, 1.2 ) + WriteVal( DonchianMiddle, 1.2 );
//=============================TRIGGERS AND ENTRIES=======================
Buy = High > Ref( HHV( High, 20 ), -1 ) AND MAFAST > MASLOW; // Enters long trade

Short = Low < Ref( LLV( Low, 20 ), -1 ) AND MAFAST < MASLOW; // Enters short trade



//=============================EXITS================ ======================
_SECTION_BEGIN( "Chandelier Exit" );

SetBarsRequired( 50, 50 );

Multiple = Optimize( "Multiple", 8, 0.5, 50, 0.1 ); // How many ATR's to be allowed below the highest high since latest "buy" bar
ATRPeriods = Optimize( "ATR Periods", 1, 1,50, 1 ); // How many periods to use for the ATR

stopArray = Null;
atrArray = ATR( ATRPeriods );
HHArray = Null;
LLArray = Null;
exitArray = Null;
trendDirection = 0;

for ( i = 0; i < BarCount; i++ )
{
if ( Short[i] )
{
// we just triggered a short trade. Set up starting values
stopArray[i] = Low[i] + ( Multiple * atrArray[i] );
LLArray[i] = Low[i]; // initialize the lowest low array
trendDirection = 0 - 1; // going short. Base bar.
}

if ( Buy[i] )
{
// we just triggered a long trade. Set up starting values
stopArray[i] = High[i] - ( Multiple * atrArray[i] );
HHArray[i] = High[i]; // initialize the highest high array
trendDirection = 1; // going long. Base bar flag is now set.
}

exitArray[i] = 0;

if ( trendDirection > 0 )
{
// keep track of the highest high, highest close, highest low, etc..
if ( trendDirection > 1 )
{
// We are in the trade (2nd day or later)
if ( Low[i] < stopArray[i-1] )
{
//stop got hit. Reset the trade.
trendDirection = 0; // OK. wait until we trigger another trade.
exitArray[i] = 1;
}
else
{
// keep track of the HHV since trade was entered.
if ( High[i] > HHArray[i-1] )
HHArray[i] = High[i];
else
HHArray[i] = HHArray[i-1];

// Compute the stop based on the HHV.
stopArray[i] = HHArray[i] - ( Multiple * atrArray[i] );
}
}

trendDirection = trendDirection + 1;
}

if ( trendDirection < 0 )
{
// keep track of the lowest low, lowest close, lowest high, etc..
if ( trendDirection < 0 - 1 )
{
// We are in the trade (2nd day or later)
if ( High[i] > stopArray[i-1] )
{
// our stop got hit. Reset the trade.
trendDirection = 0;
exitArray[i] = 0 - 1;
}
else
{
// keep track of the LLV since trade was entered.
if ( Low[i] < LLArray[i-1] )
LLArray[i] = Low[i];
else
LLArray[i] = LLArray[i-1];

// Compute the stop based on the LLV.
stopArray[i] = LLArray[i] + ( Multiple * atrArray[i] );
}
}

trendDirection = trendDirection - 1;
}

if ( trendDirection == 0 )
{
stopArray[i] = 0;
LLArray[i] = 0;
HHArray[i] = 0;
}
}

Sell = Cover = exitarray;

Buy = ExRem( Buy, Sell );
Sell = ExRem( Sell, Buy );
Short = ExRem( Short, Cover );
Cover = ExRem( Cover, Short );

PlotShapes( Buy*shapeUpArrow, colorBrightGreen, 0, Low );
PlotShapes( Short*shapeDownArrow, colorRed, 0, High );
PlotShapes( abs( exitArray )*shapeHollowCircle, colorYellow, 0, ValueWhen( stopArray, stopArray, 1 ), 0 );
Plot( stopArray, "Chand", ParamColor( "Chand Color:", colorYellow ), ParamStyle( "Chand Style", styleDashed ) );

_N( Title = EncodeColor( colorYellow ) + StrFormat( "{{NAME}} - {{INTERVAL}} - {{DATE}}--Turtle_System_Rev_A \n OP= %g Hi= %g Lo= %g CL= %g (%.1f%%) \n Vol= " + WriteVal( V, 1.0 ) + "\n" + " {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ) );//=cnb

//_N(Title = "LLArray: " + LLArray + ", HHArray:" + HHArray +", stopArray"+stopArray);

//PlotShapes(shapeCircle * Sell, colorRed);
//PlotShapes(shapeCircle * Cover, colorGreen);
_SECTION_END();


// Plots a 20 period Donchian channel

pds=20;
DonchianUpper =HHV(Ref(H,-1),pds);
DonchianLower = LLV(Ref(L,-1),pds);
DonchianMiddle = (DonchianUpper+DonchianLower)/2;


Plot(DonchianUpper,"DU",colorBlue,styleDashed);
Plot(DonchianMiddle,"DM",colorBlue,styleHidden);
Plot(DonchianLower,"DL",colorBlue,styleDashed);