변동성 유출 역전 거래 전략 (Volatility Breakout Reversal Trading Strategy) 은 변동성을 기반으로 계산된 채널을 벗어날 때 적응적인 이동 스톱 이윤 및 스톱 손실 포인트로 가격 채널을 추적하는 역전 거래 전략이다.
이 전략은 먼저 와일더의 평균 진정한 범위 (ATR) 지표를 사용하여 가격 변동성을 측정합니다. 그 다음 ATR 값을 기반으로 평균 범위 상수 (ARC) 를 계산합니다. ARC는 가격 채널의 절반의 폭을 나타냅니다. 다음으로 채널의 상부 및 하부 대역은 SAR 포인트로도 알려진 스톱 이익 및 스톱 손실 포인트로 계산됩니다. 가격이 상부 대역을 넘으면 짧은 지점이 열립니다. 가격이 하부 대역을 넘으면 긴 지점이 열립니다.
특히, 마지막 N 바에 대한 ATR은 먼저 계산된다. ATR은 그 다음 가격 채널의 폭을 제어하는 ARC를 얻기 위해 요인으로 곱된다. N 바에 대한 가장 높은 폐쇄 가격에 ARC를 추가하면 채널의 상단 또는 높은 SAR를 얻을 수 있다. 가장 낮은 폐쇄 가격에서 ARC를 빼면 하단 밴드 또는 낮은 SAR를 얻을 수 있다. 가격이 상단 이상으로 닫힌다면, 짧은 포지션을 취한다. 가격이 하단 밴드 아래에 닫힌다면, 긴 포지션을 취한다.
해결책:
변동성 브레이크아웃 역전 거래 전략은 가격 변화를 추적하고 변동성이 급증할 때 포지션을 역전하는 채널을 사용합니다. 반전점이 정확하게 확인되면 좋은 수익을 창출하여 반전과 범위 제한 시장에서 잘 작동합니다. 너무 넓고 과도한 매개 변수를 피하기 위해 주의가 필요합니다.
/*backtest start: 2023-02-12 00:00:00 end: 2024-02-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //@author=LucF // Volatility System [LucF] // v1.0, 2019.04.14 // The Volatility System was created by Welles Wilder. // It first appeared in his seminal masterpiece "New Concepts in Technical Trading Systems" (1978). // He describes it on pp.23-26, in the chapter discussing the first presentation ever of the "Volatility Index", // which later became known as ATR. // Performance of the strategy usually increases with the time frame. // Tuning of ATR length and, especially, the ARC factor, is key. // This code runs as a strategy, which cannot generate alerts. // If you want to use the alerts it must be converted to an indicator. // To do so: // 1. Swap the following 2 lines by commenting the first and uncommenting the second. // 2. Comment out the last 4 lines containing the strategy() calls. // 3. Save. strategy(title="Volatility System by Wilder [LucF]", shorttitle="Volatility System [Strat]", overlay=true, precision=8, pyramiding=0, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1) // study("Volatility System by Wilder [LucF]", shorttitle="Volatility System", precision=8, overlay=true) // -------------- Colors MyGreenRaw = color(#00FF00,0), MyGreenMedium = color(#00FF00,50), MyGreenDark = color(#00FF00,75), MyGreenDarkDark = color(#00FF00,92) MyRedRaw = color(#FF0000,0), MyRedMedium = color(#FF0000,30), MyRedDark = color(#FF0000,75), MyRedDarkDark = color(#FF0000,90) // -------------- Inputs LongsOnly = input(false,"Longs only") ShortsOnly = input(false,"Shorts only") AtrLength = input(9, "ATR length", minval=2) ArcFactor = input(1.8, "ARC factor", minval=0, type=float,step=0.1) ShowSAR = input(false, "Show all SARs (Stop & Reverse)") HideSAR = input(false, "Hide all SARs") ShowTriggers = input(false, "Show Entry/Exit triggers") ShowTradedBackground = input(false, "Show Traded Background") FromYear = input(defval = 2000, title = "From Year", minval = 1900) FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 1900) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) // -------------- Date range filtering FromDate = timestamp(FromYear, FromMonth, FromDay, 00, 00) ToDate = timestamp(ToYear, ToMonth, ToDay, 23, 59) TradeDateIsAllowed() => true // -------------- Calculate Stop & Reverse (SAR) points using Average Range Constant (ARC) Arc = atr(AtrLength)*ArcFactor SarLo = highest(close, AtrLength)-Arc SarHi = lowest(close, AtrLength)+Arc // -------------- Entries/Exits InLong = false InShort = false EnterLong = TradeDateIsAllowed() and not InLong[1] and crossover(close, SarHi[1]) EnterShort = TradeDateIsAllowed() and not InShort[1] and crossunder(close, SarLo[1]) InLong := (InLong[1] and not EnterShort[1]) or (EnterLong[1] and not ShortsOnly) InShort := (InShort[1] and not EnterLong[1]) or (EnterShort[1] and not LongsOnly) // -------------- Plots // SAR points plot( not HideSAR and ((InShort or EnterLong) or ShowSAR)? SarHi:na, color=MyRedMedium, style=circles, linewidth=2, title="SAR High") plot( not HideSAR and ((InLong or EnterShort) or ShowSAR)? SarLo:na, color=MyGreenMedium, style=circles, linewidth=2, title="SAR Low") // Entry/Exit markers plotshape( ShowTriggers and not ShortsOnly and EnterLong, style=shape.triangleup, location=location.belowbar, color=MyGreenRaw, size=size.small, text="") plotshape( ShowTriggers and not LongsOnly and EnterShort, style=shape.triangledown, location=location.abovebar, color=MyRedRaw, size=size.small, text="") // Exits when printing only longs or shorts plotshape( ShowTriggers and ShortsOnly and InShort[1] and EnterLong, style=shape.triangleup, location=location.belowbar, color=MyRedMedium, transp=70, size=size.small, text="") plotshape( ShowTriggers and LongsOnly and InLong[1] and EnterShort, style=shape.triangledown, location=location.abovebar, color=MyGreenMedium, transp=70, size=size.small, text="") // Background bgcolor( color=ShowTradedBackground? InLong and not ShortsOnly?MyGreenDarkDark: InShort and not LongsOnly? MyRedDarkDark:na:na) // ---------- Alerts alertcondition( EnterLong or EnterShort, title="1. Reverse", message="Reverse") alertcondition( EnterLong, title="2. Long", message="Long") alertcondition( EnterShort, title="3. Short", message="Short") // ---------- Strategy reversals strategy.entry("Long", strategy.long, when=EnterLong and not ShortsOnly) strategy.entry("Short", strategy.short, when=EnterShort and not LongsOnly) strategy.close("Short", when=EnterLong and ShortsOnly) strategy.close("Long", when=EnterShort and LongsOnly)