고급 트렌드 추종 및 적응형 트레일링 스톱 전략

ATR SL TS
생성 날짜: 2024-12-20 14:12:05 마지막으로 수정됨: 2024-12-20 14:12:05
복사: 1 클릭수: 418
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

고급 트렌드 추종 및 적응형 트레일링 스톱 전략

개요

이것은 Supertrend 지표에 기반한 트렌드 추적 전략으로, 적응된 추적 스톱 메커니즘을 결합한다. 이 전략은 주로 Supertrend 지표를 통해 시장의 경향 방향을 식별하고, 위험 관리 및 출구 시간을 최적화하기 위해 동적으로 조정된 추적 스톱을 사용합니다. 이 전략은 퍼센티지 스톱, ATR 스톱 및 고정 점 스톱을 포함한 여러 가지 스톱 방식을 지원하며, 다양한 시장 환경에 따라 유연하게 조정할 수 있습니다.

전략 원칙

전략의 핵심 논리는 다음과 같은 핵심 요소에 기초합니다.

  1. Supertrend 지표가 트렌드 판단의 주요 근거로 사용되며, 이 지표는 ATR (Average True Rate) 을 사용하여 시장의 변동성을 측정합니다.
  2. Supertrend의 방향 변화로 유발된 입시 신호는, 더 많은, 더 적은 또는 양방향 거래를 지원합니다.
  3. 스톱 메커니즘은 시장의 변동에 따라 자동으로 스톱 위치를 조정할 수 있는 적응적 추적 스톱을 사용합니다.
  4. 거래 관리 시스템에는 포지션 관리 (기본 계정의 15% 포지션) 및 시간 필터링 메커니즘이 포함되어 있습니다.

전략적 이점

  1. 트렌드 포착 능력: 슈퍼 트렌드 지표로 주요 트렌드를 효과적으로 식별하여 잘못된 판단을 줄일 수 있습니다.
  2. 리스크 관리가 완성된: 다양한 마켓 환경에 적응할 수 있는 다중 손해제도
  3. 높은 유연성: 여러 거래 방향과 손해 중지 방식을 지원하는 구성
  4. 자기 적응력: 트래킹 스톱은 시장의 변동에 따라 자동으로 조정되어 전략의 적응력을 향상시킵니다.
  5. 완전한 회귀 시스템: 내장된 시간 필터 기능으로 역사 성과 분석이 가능합니다.

전략적 위험

  1. 트렌드 리버스 위험: 시장의 급격한 변동으로 인해 잘못된 신호가 발생할 수 있습니다.
  2. 슬라이드 리스크: 시장 유동성에 따라 손실을 추적하는 실행이 영향을 받을 수 있습니다.
  3. 매개 변수 민감성: 슈퍼 트렌드의 요소와 ATR 주기 설정이 전략 성능에 큰 영향을 미칩니다.
  4. 시장 환경 의존성: 불안정한 시장에서 거래 빈도가 증가하여 비용이 증가할 수 있습니다.

전략 최적화 방향

  1. 신호 필터링 최적화: 가짜 신호를 필터링하기 위해 추가 기술 지표를 추가할 수 있다.
  2. 포지션 관리 최적화: 시장의 변동성에 따라 포지션 비율을 조정할 수 있습니다.
  3. 손해 방지 장치 강화: 비용 평균 설계에 더 복잡한 손해 방지 논리를 통합할 수 있다
  4. 진입 시점 최적화: 진입 정확성을 높이기 위해 가격 구조 분석을 추가할 수 있습니다.
  5. 응답 시스템 개선: 전략의 성과를 평가하는 더 많은 통계 수치를 추가할 수 있습니다.

요약하다

이것은 합리적이고 위험 통제 가능한 트렌드 추적 전략이다. 슈퍼트렌드 지표와 유연한 중지 메커니즘을 결합하여 전략은 높은 수익성을 유지하면서 위험을 효과적으로 제어 할 수 있습니다. 전략은 구성성이 강하며 다양한 시장 환경에서 사용되지만 충분한 변수 최적화 및 재검토가 필요합니다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Supertrend Strategy with Adjustable Trailing Stop [Bips]", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=15)

// Inputs
atrPeriod = input(10, "ATR Länge", "Average True Range „wahre durchschnittliche Schwankungsbreite“ und stammt aus der technischen Analyse. Die ATR misst die Volatilität eines Instruments oder eines Marktes. Mit ihr kann die Wahrscheinlichkeit für einen Trendwechsel bestimmt werden.", group="Supertrend Settings")
factor = input.float(3.0, "Faktor", step=0.1, group="Supertrend Settings")
tradeDirection = input.string("Long", "Trade Direction", options=["Both", "Long", "Short"], group="Supertrend Settings")
sl_type    = input.string("%", "SL Type", options=["%", "ATR", "Absolute"])
// Parameter für ST nur für einstieg -> Beim Ausstieg fragen ob der bool WWert true ist -> Für weniger und längere Trädes 

sl_perc    = input.float(4.0, "% SL", group="Stop Loss Einstellung")
atr_length = input.int(10, "ATR Length", group="Stop Loss Einstellung")
atr_mult   = input.float(2.0, "ATR Mult", group="Stop Loss Einstellung")
sl_absol   = input.float(10.0, "Absolute SL", group="Stop Loss Einstellung")

//-------------------------//
// BACKTESTING RANGE
fromDay   = input.int(defval=1, title="From Day", minval=1, maxval=31, group="Backtesting Einstellung")
fromMonth = input.int(defval=1, title="From Month", minval=1, maxval=12, group="Backtesting Einstellung")
fromYear  = input.int(defval=2016, title="From Year", minval=1970, group="Backtesting Einstellung")
toDay     = input.int(defval=1, title="To Day", minval=1, maxval=31, group="Backtesting Einstellung")
toMonth   = input.int(defval=1, title="To Month", minval=1, maxval=12, group="Backtesting Einstellung")
toYear    = input.int(defval=2100, title="To Year", minval=1970, group="Backtesting Einstellung")

startDate  = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond  = time >= startDate and time <= finishDate

//-------------------------//
// Supertrend calculation
[_, direction] = ta.supertrend(factor, atrPeriod)

// SL values
sl_val = sl_type == "ATR"      ? atr_mult * ta.atr(atr_length) : 
         sl_type == "Absolute" ? sl_absol : 
         close * sl_perc / 100
         
// Init Variables
var pos         = 0
var float 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 ? math.max(low  - sl_val, nz(trailing_sl[1])) :  
               nz(pos[1]) == -1 ? math.min(high + sl_val, nz(trailing_sl[1])) : 
               nz(trailing_sl[1])
               
// Position var               
pos := long_signal  ? 1 : short_signal ? -1 : nz(pos[1]) 

// Entry logic
if ta.change(direction) < 0 and time_cond
    if tradeDirection == "Both" or tradeDirection == "Long"
        strategy.entry("Long", strategy.long, stop=trailing_sl)
    else
        strategy.close_all("Stop Short")

if ta.change(direction) > 0 and time_cond
    if tradeDirection == "Both" or tradeDirection == "Short"
        strategy.entry("Short", strategy.short, stop=trailing_sl)
    else
        strategy.close_all("Stop Long")

// Exit logic: Trailing Stop and Supertrend
//if strategy.position_size > 0 and not na(trailing_sl)
    //strategy.exit("SL-Exit Long", from_entry="Long", stop=trailing_sl)

//if strategy.position_size < 0 and not na(trailing_sl)
    //strategy.exit("SL-Exit Short", from_entry="Short", stop=trailing_sl)

// Trailing Stop visualization
plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red)
//plot(not na(trailing_sl) ? trailing_sl : na, color=pos == 1 ? color.green : color.red, linewidth=2, title="Trailing Stop")