Does anyone have a TradeStation code for the Chandelier exit that they can post here? I think this thread - https://www.tradestation.com/Discussions/Topic.aspx?Topic_ID=24729 - has it, but as a MultiCharts user, I don't have access to it. If a TS user can check out that thread and post here, it'd be appreciated. If you have no idea what the Chandelier exit is, here's more info if you are curious - http://www.traderclub.com/discus/messages/107/477.html?FridayDecember319991048pm
This code includes the Parabolic and YoYo exits as well. I'd take it out, but don't have time right now, so you'll have to do that part...Hope that helps! I'm splitting it into 2 posts due to ET character restriction... //*************************************************************************************** // LeBeau Stops Indicator (!G_LeBeau_Stops) * // ©JRG 2004, 2005, v8.1i, 20 Jul 2005 * //*************************************************************************************** // NOTES: Implements Chuck LeBeau's family of stop loss techniques as briefed at * // TradeStation World 2004 * // Sends setings to compatible indicator for visual plotting using Global * // Variables * // Set Strategy MaxBarsBack = 150 -- set indicator same * // v8.0d -- Use GV error to set LeBeau defaults * // v8.1 -- Integrate 8.1 keywords -- update intrabar default on * // v8.1a - not applicable to indicator * // v8.1b - change GV setup to use AppID * // v8.1c - make for intrabar execution ONLY, change AvgRange to AvgRange * // change profit target tighten to 0.6 vs 0.5 (for Chan) * // v8.1d - tie parabolic initial stop to AvgEntryPrice * // v8.1e - prevent retracement (loosening) of Chandelier Stop * // v8.1f - use MIT stop for Chandelier and YoYo * // 050425 v8.1g - workaround for PT Boolean issue * // 050503 v8.1h - fix profit target multiplier error * // 050720 v8.1i - update Parabolic stop intrabar * //*************************************************************************************** //***** Set-up ***** INPUTS: Show_All_Stops ( False ), Commentary_On ( False ) ; VARIABLES: Chandelier_AvgRange ( 3 ), // inputs from strategy YoYo_AvgRange ( 2 ), Parabolic_AF ( 0 ), Acceleration_Factor ( 0.02 ), Parabolic_AF_Limit ( 0 ), AvgRange_Length ( 21 ), Average_Range ( 0 ), Market_Position ( 0 ), IntrabarPersist Trade_High ( 0 ), IntrabarPersist Trade_Low ( 0 ), IntrabarPersist YoYo_Amount ( 0 ), // YoYo stop amount YoYo_Price ( 0 ), // pin price to last bar close IntrabarPersist Chandelier_Stop ( 0 ), IntrabarPersist YoYo_Stop ( 0 ), Parabolic_Stop ( 0 ), Profit_AvgRange ( 0 ), PT_Average_Range ( 0 ), PT_Range_Length ( 21 ), Profit_Amount ( 0 ), Profit_Switch_Fac ( 1 ), EntryBar_Stop ( 0 ), IntrabarPersist Profit_Switch ( False ), GV_Name ( NumToStr( AbsValue( GetAppInfo( aiAppID ) ), 0 ) ), // 19 = aiWindowID Avg_Entry_Price ( 0 ), New_Entry ( False ) ; //***** Housekeeping ***** if CurrentBar = 2 then // get Inputs from Strategy begin Chandelier_AvgRange = GVGetNamedDouble( GV_Name + "Chandelier_AvgRange", 3 ) ; // get strategy settings from global memory YoYo_AvgRange = GVGetNamedDouble( GV_Name + "YoYo_AvgRange", 2 ) ; Parabolic_AF = GVGetNamedDouble( GV_Name + "Parabolic_AF", 0.02 ) ; AvgRange_Length = GVGetNamedDouble( GV_Name + "LeBeau_AvgRange_Length", 21 ) ; Parabolic_AF_Limit = GVGetNamedDouble( GV_Name + "Parabolic_AF_Limit", 10 ) ; // set limit 10x factor Profit_AvgRange = GVGetNamedDouble( GV_Name + "Profit_AvgRange", 4 ) ; Profit_Switch_Fac = GVGetNamedDouble( GV_Name + "Profit_Switch_Factor", 1 ) ; PT_Range_Length = GVGetNamedDouble( GV_Name + "LePT_Range_Length", AvgRange_Length ) ; end ; // housekeeping //***** Compute Stops ***** Market_Position = I_MarketPosition ; // in order to access historical bar market positions if BarStatus(1) = 2 then // calc only once per bar begin Average_Range = AvgRange( AvgRange_Length ) ; Avg_Entry_Price = I_AvgEntryPrice ; New_Entry = Avg_Entry_Price[1] <> Avg_Entry_Price ; PT_Average_Range = AvgRange( PT_Range_Length ) ; Profit_Amount = Round( Profit_AvgRange * PT_Average_Range, 2 ) ; YoYo_Amount = YoYo_AvgRange * Average_Range ; end ; // calc once if Market_Position[1] <> 0 then YoYo_Price = Close[1] else YoYo_Price = Open ; if Market_Position <> 0 then // eval market position on current bar begin //*** Long Position *** if Market_Position = 1 then begin if Market_Position[1] <> 1 or // eval market position on prior bar and reset variables if New_Entry then begin Profit_Switch = False ; // reset profit switch Trade_High = High ; // reset trade high end // reset else if High > Trade_High then // find new high Trade_High = High ; //* Chandelier Stop * if Profit_Switch or // if switch = true Trade_high >= I_AvgEntryPrice + ( Profit_Amount * Profit_Switch_Fac ) then begin Profit_Switch = True ; Chandelier_Stop = Round( Trade_High - ( Chandelier_AvgRange * Average_Range * Profit_Switch_Fac ), 2 ) ; // tighten stop end // tighten Chandelier stop when profit point exceeded else Chandelier_Stop = Round( Trade_High - ( Chandelier_AvgRange * Average_Range ), 2 ) ; // normal stop if Market_Position[1] = 1 and New_Entry = False and Chandelier_Stop < Chandelier_Stop[1] then Chandelier_Stop = Chandelier_Stop[1] ; // prevent retracement //* YoYo Stop * YoYo_Stop = Round( YoYo_Price - YoYo_Amount, 2 ) ; //* Parabolic Stop * if Market_Position[1] <> 1 or New_Entry then begin Parabolic_Stop = Chandelier_Stop ; // initial setting // Round( I_AvgEntryPrice - ( Chandelier_AvgRange * Average_Range ), 2 ) ; // tie to entry price Acceleration_Factor = Parabolic_AF ; end // eval market postion on prior bar else begin {if BarStatus(1) = 2 then begin} if Trade_High > Trade_High[1] and Acceleration_Factor < Parabolic_AF_Limit then Acceleration_Factor = Acceleration_Factor + MinList( Parabolic_AF, Parabolic_AF_Limit - Acceleration_Factor ) ; Parabolic_Stop = Parabolic_Stop + Acceleration_Factor * ( Trade_High - Parabolic_Stop ) ; if Parabolic_Stop > Low then // force stop <= low of last bar Parabolic_Stop = Low ; {end ;} // update only at end of bar end ; // long parabolic stop end // long market postion
Here's the rest! //*** Short Position *** else begin // short market position if Market_Position[1] <> -1 or // eval market position on prior bar New_Entry then begin Profit_Switch = False ; // reset profit switch Trade_Low = Low ; // reset trade low end else if Low < Trade_Low then // find new low Trade_Low = Low ; //* Chandelier Stop * if Profit_Switch or // if switch = true Trade_Low <= I_AvgEntryPrice - ( Profit_Amount * Profit_Switch_Fac ) then begin Profit_Switch = True ; Chandelier_Stop = Round( Trade_Low + ( Chandelier_AvgRange * Average_Range * Profit_Switch_Fac ), 2 ) ; // tighten stop end // tighten Chandelier stop when profit point exceeded else Chandelier_Stop = Round( Trade_Low + ( Chandelier_AvgRange * Average_Range ), 2 ) ; // normal stop if Market_Position[1] = -1 and New_Entry = False and Chandelier_Stop > Chandelier_Stop[1] then Chandelier_Stop = Chandelier_Stop[1] ; // prevent retracement //* YoYo Stop * YoYo_Stop = Round( YoYo_Price + YoYo_Amount, 2 ) ; //* Parabolic Stop * if Market_Position[1] <> -1 OR New_Entry then begin Parabolic_Stop = Chandelier_Stop ; // Round( I_AvgEntryPrice + ( Chandelier_AvgRange * Average_Range ), 2 ) ; // tie to entry price Acceleration_Factor = Parabolic_AF ; end // eval market postion on prior bar else begin {if BarStatus(1) = 2 then begin} Parabolic_Stop = Parabolic_Stop + Acceleration_Factor * ( Trade_Low - Parabolic_Stop ) ; if Trade_Low < Trade_Low[1] and Acceleration_Factor < Parabolic_AF_Limit then Acceleration_Factor = Acceleration_Factor + MinList( Parabolic_AF, Parabolic_AF_Limit - Acceleration_Factor ) ; if Parabolic_Stop < High then Parabolic_Stop = High ; {end ;} // run once per bar end ; // short parabolic stop end ; // short market position end ; // in position //***** Plots ***** if Market_Position[1] <> 0 or Market_Position <> 0 then begin if Show_All_Stops then begin Plot2( Parabolic_Stop, "Parabolic", Red ) ; Plot3( YoYo_Stop, "YoYo", Cyan ) ; Plot4( Chandelier_Stop, "Chandelier", White ) ; end // show all stops else begin // plot only closest stop if Market_Position = 1 or Market_Position[1] = 1 then begin if Chandelier_Stop > YoYo_Stop and Chandelier_Stop > Parabolic_Stop then Plot4( Chandelier_Stop, "Chandelier", White ) else if YoYo_Stop > Parabolic_Stop then Plot3( YoYo_Stop, "YoYo", Cyan ) else Plot2( Parabolic_Stop, "Parabolic", Red ) ; end ; // closest long stop if Market_Position = -1 or Market_Position[1] = -1 then begin if Chandelier_Stop < YoYo_Stop and Chandelier_Stop < Parabolic_Stop then Plot4( Chandelier_Stop, "Chandelier", White ) else if YoYo_Stop < Parabolic_Stop then Plot3( YoYo_Stop, "YoYo", Cyan ) else Plot2( Parabolic_Stop, "Parabolic", Red ) ; end ; // closest short stop end ; // only closest stop end ; // plots //***** Commentary ***** if Commentary_On and AtCommentaryBar then Commentary( ( Date - ( Year( Date ) * 10000 ) ):0:0, Time:5:0, " -- BarNumber = ", CurrentBar:5:0, NewLine, "High = ", High, NewLine, "Low = ", Low, NewLine, "Open = ", Open, NewLine, "Close = ", Close, NewLine, "AvgRange Length = ", AvgRange_Length:0:0, NewLine, "AvgRange =", Average_Range:0:2, NewLine, "Chandelier AvgRange Multiplier = ", Chandelier_AvgRange:0:2, NewLine, "YoYo AvgRange Multiplier = ", YoYo_AvgRange:0:2, NewLine, "Parabolic Acceleration Factor = ", Parabolic_AF:0:3, NewLine, "Parabolic AF Limit = ", Parabolic_AF_Limit:0:2, NewLine, "Acceleration Factor = ", Acceleration_Factor:0:3, NewLine, "Profit Point AvgRange Multiplier = ", Profit_AvgRange:0:2, NewLine, "Profit Switch = ", Profit_Switch, Newline, "Market Position = ", Market_Position:0:0, NewLine, "Trade High = ", Trade_High:0:2, NewLine, "Trade Low = ", Trade_Low:0:2, NewLine, "Profit Amount = ", Profit_Amount:0:2, NewLine, "Chandelier Stop = ", Chandelier_Stop:0:2, NewLine, "YoYo Stop = ", YoYo_Stop:0:2, NewLine, "Parabolic Stop = ", Parabolic_Stop:0:2, NewLine ) ;