Turtle System AFL Code
//------------------------------------------------------------------------------ // // zerodha // //------------------------------------------------------------------------------ // // Trend trading system. // Strengths: volatility-based. // Weaknesses: lag and since volatility increases at the end of a trend, traders exits early. // Description: Indicator is used to keep track of a trade. Indicator shows a orange circle // where the exit would have taken place. Once a stop is hit, it waits for the // next entry signal (short or long). Use on DAILY values only. // Algorithm: Lebeau recommends that an exits hangs from the HHV (long) or LLV (short) // since the trade was triggered. Some traders use the highest close as the base // for hanging the exit. //------------------------------------------------------------------------------ //=============================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, colorGrey50 )); // Plots a 20 period Donchian channel Plot( C, "Price", Color, styleBar | styleThick ); Plot(DonchianUpper,"DU", ParamColor( "DU Color", colorBlue ), ParamStyle("DU Style", styleLine)); Plot(DonchianMiddle,"DM",ParamColor( "DM Color", colorGreen ), ParamStyle("DM Style", styleNoLine)); Plot(DonchianLower,"DL",ParamColor( "DL Color", colorRed ), ParamStyle("DL Style", styleLine)); //=============================TRIGGERS AND ENTRIES====================================== Buy = High > Ref(HHV(High, 20), -1) AND MAFAST > MASLOW ; // Enters long trade //Sell = Low < Ref(LLV(Low, 10), -1) ; // Exits long trade Short = Low < Ref(LLV(Low, 20), -1) AND MAFAST < MASLOW ; // Enters short trade //Cover = High > Ref(HHV(High, 10), -1) ; // Exits short trade //=============================EXITS====================================== _SECTION_BEGIN("Chandelier Exit"); SetBarsRequired(50,50); Multiple = Param("Multiple", 3, 0.5, 10, 0.1); //How many ATR’s to be allowed below the highest high since latest "buy" bar ATRPeriods = Param("ATR Periods", 20, 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; } } PlotShapes( Buy*shapeUpArrow, colorGreen, 0, Low ); PlotShapes( Short*shapeDownArrow, colorRed, 0, High ); PlotShapes( abs(exitArray)*shapeHollowCircle, colorOrange, 0, ValueWhen(stopArray, stopArray,1), 0 ); Plot( stopArray, "Chand", ParamColor( "Chand Color:", colorYellow ), ParamStyle("Chand Style", styleDashed) ); //_N(Title = "LLArray: " + LLArray + ", HHArray:" + HHArray +", stopArray"+stopArray); //PlotShapes( shapeCircle * Sell, colorRed ); //PlotShapes( shapeCircle * Cover, colorGreen ); _SECTION_END();