conversion of Swingarm ATR Trailing Stop
Forums › ProRealTime English forum › ProBuilder support › conversion of Swingarm ATR Trailing Stop
- This topic has 11 replies, 3 voices, and was last updated 4 years ago by Nicolas.
-
-
07/20/2020 at 9:35 PM #139711
Background from the author of the strategy including pictures:
The SwingArm is an idea I had using the ATRTrailingStop and modifying it to have FIB Retracements into it. “I am not a coder…” I hired someone to help me out in getting it done.
It can be used on any timeframe. The best for me (day trading) is the 10-minute chart. For Swing Trading, the 4 hours chart works well. Alerts can be set up using an ATRTrailingStop scan
Thank you in advance!
The Code:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162# blackFLAG FTS SwingArms# Edited by: Jose Azcarate# blackFLAG Futures Trading - FOR EDUCATIONAL PURPOSES ONLY# TWITTER: @blackflagfuture# Settings Vary. My preferred setting is 28 / 5 But also use 30 / 8 and 5 / 3.5 depending on strategy.input trailType = {default modified, unmodified};input ATRPeriod = 28;input ATRFactor = 5;input firstTrade = {default long, short};input averageType = AverageType.WILDERS;input fib1Level = 61.8;input fib2Level = 78.6;input fib3Level = 88.6;Assert(ATRFactor > 0, "'atr factor' must be positive: " + ATRFactor);def HiLo = Min(high - low, 1.5 * Average(high - low, ATRPeriod));def HRef = if low <= high[1] then high - close[1] else (high - close[1]) - 0.5 * (low - high[1]); def LRef = if high >= low[1]then close[1] - lowelse (close[1] - low) - 0.5 * (low[1] - high);def trueRange;switch (trailType) {case modified:trueRange = Max(HiLo, Max(HRef, LRef));case unmodified:trueRange = TrueRange(high, close, low);}def loss = ATRFactor * MovingAverage(averageType, trueRange, ATRPeriod);def state = {default init, long, short};def trail;switch (state[1]) {case init:if (!IsNaN(loss)) {switch (firstTrade) {case long:state = state.long;trail = close - loss;case short:state = state.short;trail = close + loss;}} else {state = state.init;trail = Double.NaN;}case long:if (close > trail[1]) {state = state.long;trail = Max(trail[1], close - loss);} else {state = state.short;trail = close + loss;}case short:if (close < trail[1]) {state = state.short;trail = Min(trail[1], close + loss);} else {state = state.long;trail = close - loss;}}def BuySignal = Crosses(state == state.long, 0, CrossingDirection.ABOVE);def SellSignal = Crosses(state == state.short, 0, CrossingDirection.ABOVE);def ex = if BuySignal then high else if SellSignal then low else if state == state.long then Max(ex[1], high) else if state == state.short then Min(ex[1], low) else ex[1];plot TrailingStop = trail;TrailingStop.SetPaintingStrategy(PaintingStrategy.POINTS);TrailingStop.DefineColor("Long", Color.GREEN);TrailingStop.DefineColor("Short", Color.RED);TrailingStop.AssignValueColor(if state == state.longthen TrailingStop.Color("Long")else TrailingStop.Color("Short"));plot Extremum = ex;Extremum.SetPaintingStrategy(PaintingStrategy.POINTS);Extremum.DefineColor("HH", Color.GREEN);Extremum.DefineColor("LL", Color.RED);Extremum.AssignValueColor(if state == state.longthen Extremum.Color("HH")else Extremum.Color("LL"));Extremum.Hide();def f1 = ex + (trail - ex) * fib1Level / 100;def f2 = ex + (trail - ex) * fib2Level / 100;def f3 = ex + (trail - ex) * fib3Level / 100;def l100 = trail + 0;plot Fib1 = f1;Fib1.SetPaintingStrategy(PaintingStrategy.POINTS);Fib1.SetDefaultColor(Color.BLACK);Fib1.Hide();plot Fib2 = f2;Fib2.SetPaintingStrategy(PaintingStrategy.POINTS);Fib2.SetDefaultColor(Color.BLACK);Fib2.Hide();plot Fib3 = f3;Fib3.SetPaintingStrategy(PaintingStrategy.POINTS);Fib3.SetDefaultColor(Color.BLACK);Fib3.Hide();AddCloud(f1, f2, Color.LIGHT_GREEN, Color.LIGHT_RED, no);AddCloud(f2, f3, Color.GREEN, Color.RED, no);AddCloud(f3, l100, Color.DARK_GREEN, Color.DARK_RED, no);def l1 = state[1] == state.long and close crosses below f1[1];def l2 = state[1] == state.long and close crosses below f2[1];def l3 = state[1] == state.long and close crosses below f3[1];def s1 = state[1] == state.short and close crosses above f1[1];def s2 = state[1] == state.short and close crosses above f2[1];def s3 = state[1] == state.short and close crosses above f3[1];def atr = Average(TrueRange(high, close, low), 14);plot LS1 = if l1 then low - atr else Double.NaN;plot LS2 = if l2 then low - 1.5 * atr else Double.NaN;plot LS3 = if l3 then low - 2 * atr else Double.NaN;plot SS1 = if s1 then high + atr else Double.NaN;plot SS2 = if s2 then high + 1.5 * atr else Double.NaN;plot SS3 = if s3 then high + 2 * atr else Double.NaN;LS1.SetPaintingStrategy(PaintingStrategy.ARROW_UP);LS1.SetDefaultColor(Color.GREEN);LS1.SetLineWeight(1);LS1.Hide();LS2.SetPaintingStrategy(PaintingStrategy.ARROW_UP);LS2.SetDefaultColor(Color.GREEN);LS2.SetLineWeight(1);LS2.Hide();LS3.SetPaintingStrategy(PaintingStrategy.ARROW_UP);LS3.SetDefaultColor(Color.GREEN);LS3.SetLineWeight(1);LS3.Hide();SS1.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);SS1.SetDefaultColor(Color.RED);SS1.SetLineWeight(1);SS1.Hide();SS2.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);SS2.SetDefaultColor(Color.RED);SS2.SetLineWeight(1);SS2.Hide();SS3.SetPaintingStrategy(PaintingStrategy.ARROW_DOWN);SS3.SetDefaultColor(Color.RED);SS3.SetLineWeight(1);SS3.Hide();Alert(l1, "Price crossed below Fib1 level in long trend", Alert.BAR, Sound.Bell);Alert(l2, "Price crossed below Fib2 level in long trend", Alert.BAR, Sound.Bell);Alert(l3, "Price crossed below Fib3 level in long trend", Alert.BAR, Sound.Bell);Alert(s1, "Price crossed above Fib1 level in short trend", Alert.BAR, Sound.Bell);Alert(s2, "Price crossed above Fib2 level in short trend", Alert.BAR, Sound.Bell);Alert(s3, "Price crossed above Fib3 level in short trend", Alert.BAR, Sound.Bell);`1 user thanked author for this post.
07/22/2020 at 9:13 AM #139802I added this conversion on my list, please remind me if you don’t get it before August! Thanks 😉
2 users thanked author for this post.
07/22/2020 at 1:46 PM #13984907/26/2020 at 9:00 AM #140119Hello Nicolas the indicator looks very good I hope you can integrate it in Pro Realtime. Thanks in advance .
1 user thanked author for this post.
07/26/2020 at 9:13 AM #140120Seems to be a simple ATR trailing stop with bands made with Fibonacci levels. Will look at that conversion asap.
1 user thanked author for this post.
08/01/2020 at 1:01 PM #14060508/03/2020 at 2:45 PM #14074308/03/2020 at 3:12 PM #140745Here is the translated code, please confirm it works as the original one so I can make it available in the library, thank you.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140//PRC_Swingarm ATR Trailing Stop | indicator//03.08.2020//Nicolas @ www.prorealcode.com//Sharing ProRealTime knowledge//converted from TOS//https://www.prorealcode.com/topic/conversion-of-swingarm-atr-trailing-stop/// --- settingstrailType = 1 //1=modified, 0=unmodifiedATRPeriod = 28ATRFactor = 5firstTrade = 0 //0= long, 1= shortaverageType = 3 //0 = SMA 1 = EMA 2 = WMA 3 = Wilder 4 = Triangular 5 = End point 6 = Time series 7 = Hull (PRT v11 only) 8 = ZeroLag (PRT v11 only)//--- end of settingsfib1Level = 61.8fib2Level = 78.6fib3Level = 88.6HiLo = Min(high - low, 1.5 * Average[ATRPeriod](range))if low <= high[1] thenHref = high - close[1]elseHref = (high - close[1]) - 0.5 * (low - high[1])endifif high >= low[1] thenLref = close[1] - lowelseLref = (close[1] - low) - 0.5 * (low[1] - high)endif//case modified:if trailType = 1 thentrueRange = Max(HiLo, Max(HRef, LRef))else//case unmodifiedtrueRange = tr(close) // TrueRange(high, close, low)endifiloss = ATRFactor * Average[ATRPeriod,averageType](trueRange)once init=0if init=0 thenif firsttrade=0 thenstate = 0trail = close - ilosselsestate = 1trail = close + ilossendifinit=1endif//case long:if state[1] = 0 thenif (close > trail[1]) thenstate = 0trail = Max(trail[1], close - iloss)elsestate = 1trail = close + ilossendifendif//case short:if state[1] = 1 thenif (close < trail[1]) thenstate = 1trail = Min(trail[1], close + iloss)elsestate = 0trail = close - ilossendifendifBuySignal = state<>state[1] and state = 0SellSignal = state<>state[1] and state = 1if BuySignal thenex = highelsif SellSignal thenex = lowelseif state = 0 thenex = Max(ex[1], high)elsif state = 1 thenex = Min(ex[1], low)elseex = ex[1]endifendifTrailingStop = trailif state = 0 thenr=0g=255elser=255g=0endiff1 = ex + (trail - ex) * fib1Level / 100f2 = ex + (trail - ex) * fib2Level / 100f3 = ex + (trail - ex) * fib3Level / 100l1 = state[1] = 0 and close crosses under f1[1]l2 = state[1] = 0 and close crosses under f2[1]l3 = state[1] = 0 and close crosses under f3[1]s1 = state[1] = 1 and close crosses over f1[1]s2 = state[1] = 1 and close crosses over f2[1]s3 = state[1] = 1 and close crosses over f3[1]atr = AverageTrueRange[14](close)if l1 theny =low - atrelsif l2 theny=low - 1.5 * atrelsif l3 theny=low - 2 * atrelsif s1 theny=high + atrelsif s2 theny=high + 1.5 * atrelsif s3 theny=high + 2 * atrelsey=0endifif y>0 thenif y>close thendrawarrowdown(barindex,y) coloured(r,g,0)elsedrawarrowup(barindex,y) coloured(r,g,0)endifendifreturn TrailingStop coloured(r,g,0) style(line,3) as "ATR Trailing Stop" ,state as "state", ex coloured(r,g,0) style(point,4) as "Extremum", f1 coloured(168,168,168), f2 coloured(168,168,168), f3 coloured(168,168,168)I think that the arrows are way too far from the price, but that’s how it is coded in the original code?!
2 users thanked author for this post.
08/03/2020 at 7:05 PM #14078508/03/2020 at 8:49 PM #140793Thanks Nicolas that looks great!
I agree regarding the arrows
08/04/2020 at 8:36 AM #140814Ok, I will replace the arrows closer to the price and post it in the library for everyone to benefit of this trend following indicator.
1 user thanked author for this post.
08/04/2020 at 8:55 AM #140819I published the final version in our ProRealTime code library here: SwingARM ATR Trailing Stop
1 user thanked author for this post.
-
AuthorPosts
Find exclusive trading pro-tools on