이 전략은 내 이전 간단한 트레일링 스톱 로스 전략의 멀티 타임프레임 버전입니다. 이전 전략은 포지션을 입력하기 위해 기본적인 트레일링 스톱 로스를만 사용했습니다. 그것은 꽤 잘 작동했습니다. 그래서 나는 그것을 개선하려고 노력했습니다. 내가 같은 ATR 트레일링 스톱 로스를 다른 타임프레임에 사용하여 하나의 신호로 결합하면 어떻게 될지 생각했습니다.
이 전략에서는 ATR 스톱만 사용하며 현재 시간 프레임 이외에 다른 3 개의 더 높은 시간 프레임을 선택할 수 있습니다. 이 모든 시간 프레임의 후속 스톱 손실은 차트에 그려집니다. 4 개의 시간 프레임 모두 긴 신호에 동의하는 경우 긴 포지션을 입력합니다. 적어도 2 개의 시간 프레임이 긴 신호에 동의하지 않는 경우 긴 포지션을 닫습니다. 짧은 포지션의 논리는 동일합니다.
이 전략의 핵심은 트레일링 스톱 손실과 트렌드 다음에 있다. 트레일링 스톱 손실은 ATR 값에 따라 스톱 손실 수준을 설정하는 데 사용됩니다. 이는 스톱 손실이 타격되는 것을 효과적으로 피할 수 있습니다. 트렌드 다음은 다른 시간 프레임에 걸쳐 트렌드 방향을 관찰하는 것을 기반으로 엔트리를 결정합니다.
특히, 전략은 먼저 다른 시간 프레임에서 ATR 값을 계산하고 스톱 로스 거리를 설정합니다. 그 다음 가격이 스톱 로스 수준을 넘을 때 긴 / 짧은 신호를 생성합니다. 여러 시간 프레임에서 신호가 일치하면 위치가 취해질 것입니다. 그 후 트렌드 방향별로 스톱 로스 수준을 추적합니다. 특정 시간 프레임의 신호가 반전되면 포지션을 닫습니다.
다른 기간에 걸쳐 트렌드 판단을 결합함으로써 가짜 브레이크오웃을 효과적으로 필터링 할 수 있습니다. 동시에, 수익에 대한 추적 스톱 잠금 및 위험을 제어합니다.
해결책:
이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.
이 전략은 트렌드 추적 및 리스크 통제를 멀티 타임프레임 ATR 트레일링 스톱을 통해 결합합니다. 단일 스톱에 비해 트렌드 방향을 더 명확하게 식별합니다. 단일 타임프레임에 비해 많은 잡음을 필터링합니다. 정지 매개 변수 및 타임프레임에 대한 적절한 구성은 최상의 결과를 달성하는 열쇠입니다. 특정 드라우다운을 견딜 수 있고 안정적인 수익을 제공하는 투자자에게 적합합니다. 또한 향상과 확장 가능성이 있습니다. 매우 유망한 전략 아이디어입니다.
/*backtest start: 2023-01-01 00:00:00 end: 2024-01-07 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100) //////////// // Inputs // atr_length = input(14, title = "ATR Length") atr_mult = input(2, title = "ATR Mult", type = input.float) tf2 = input('120', title = "TF2", type = input.string) tf3 = input('180', title = "TF3", type = input.string) tf4 = input('240', title = "TF4", type = input.string) // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2016, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2100, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = time >= startDate and time <= finishDate ////////////////// // CALCULATIONS // tsl() => // SL values sl_val = atr_mult * atr(atr_length) // Init Variables pos = 0 trailing_sl = 0.0 // Signals long_signal = nz(pos[1]) != 1 and high > nz(trailing_sl[1]) short_signal = nz(pos[1]) != -1 and low < nz(trailing_sl[1]) // Calculate SL trailing_sl := short_signal ? high + sl_val : long_signal ? low - sl_val : nz(pos[1]) == 1 ? max(low - sl_val, nz(trailing_sl[1])) : nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : nz(trailing_sl[1]) // Position var pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1]) trailing_sl trailing_sl1 = tsl() trailing_sl2 = security(syminfo.tickerid, tf2, tsl()) trailing_sl3 = security(syminfo.tickerid, tf3, tsl()) trailing_sl4 = security(syminfo.tickerid, tf4, tsl()) pos1 = 0 pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1]) pos2 = 0 pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1]) pos3 = 0 pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1]) pos4 = 0 pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1]) total_pos = pos1 + pos2 + pos3 + pos4 ////////////// // PLOTINGS // plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1") plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25) plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50) plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75) ////////////// // STRATEGY // //strategy.entry("long", true, stop = trailing_sl1) //strategy.entry("short", false, stop = trailing_sl1) strategy.entry("long", true, when = total_pos == 4) strategy.entry("short", false, when = total_pos == -4) strategy.close("long", when = total_pos <= 0) strategy.close("short", when = total_pos >= 0)