동적 추세 추적을 위한 EMA-ADX 다단계 이익 실현 전략

EMA ADX ATR
생성 날짜: 2025-02-18 14:08:02 마지막으로 수정됨: 2025-02-18 14:08:02
복사: 0 클릭수: 405
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

동적 추세 추적을 위한 EMA-ADX 다단계 이익 실현 전략

개요

이 전략은 EMA와 ADX 지표를 결합한 트렌드 추적 거래 시스템으로, 다단계 스톱 및 모바일 스톱으로 자금 관리를 최적화한다. 이 전략은 EMA 평선을 트렌드 방향을 판단하기 위해, ADX 지표를 트렌드 강도를 필터링하기 위해 사용하고, 수익을 분할하기 위해 세 층의 스톱 메커니즘을 설계하고, ATR을 동적으로 조정하여 위험을 제어한다.

전략 원칙

전략의 핵심 논리는 다음과 같은 핵심 부분으로 구성됩니다.

  1. 50주기 EMA 평균선을 사용하여 트렌드 방향을 판단합니다. 가격이 EMA 상단으로 넘어서 상단으로 넘어서 상단으로 넘어가
  2. 14주기 ADX 지표로 필터링 약한 트렌드, ADX>20일 때 트렌드가 유효하다고 확인
  3. 14주기 ATR을 기반으로 동적 스톱로스 위치를 계산하고, 더 많은 티켓은 최저 가격에서 1ATR을 빼고, 공백 티켓은 최고 가격에서 1ATR을 더합니다.
  4. 세 층의 차단 장치가 적용됩니다.
    • 1층: ATR의 1배에 30%의 지분을 처분합니다.
    • 2층: 50%의 포지션은 ATR의 2배에서 처분됩니다.
    • 3층: 20% 포지션은 3배의 ATR의 이동식 스톱을 사용합니다.
  5. 가격이 2층 정지점에 도달하면 모든 남은 포지션을 자동으로 청산합니다.

전략적 이점

  1. 다층 막대기 설계는 수익을 적당히 확보하면서도 큰 시장을 놓치지 않습니다.
  2. 모바일 스피드 메커니즘은 시장의 변동에 적응하여 동적 위험 관리를 제공합니다.
  3. ADX 필터링은 흔들리는 시장의 가짜 신호를 효과적으로 방지합니다.
  4. EMA와 가격 교차는 명확한 진입 신호를 제공합니다.
  5. 을 분할하는 것은 감정의 변동성을 줄여주고 전략의 장기적 실행에 도움이 됩니다.

전략적 위험

  1. 불안한 시장에서 빈번한 출입으로 인해 비용이 증가할 수 있습니다.
  2. EMA는 지연된 지표로서 급격한 반전 시에는 반응하지 않을 수 있습니다.
  3. 고정된 ADX 임계값은 다른 시장 환경에 따라 조정될 수 있습니다.
  4. 다중 계층의 막대기가 일방적 추세에서 조기 하락할 수 있다 완화 조치:
  • 다른 시장 주기적 역동성에 따라 ADX 마이너스를 조정할 수 있습니다.
  • 트렌드 확인 지표를 추가하는 것을 고려하십시오.
  • 정지 비율에 대한 더 세밀한 매개 변수 최적화

전략 최적화 방향

  1. 트렌드 확인을 강화하기 위한 거래량 지표 도입
  2. 시장의 변동에 따라 ADX 하락값을 조정
  3. 제약 계층의 포지션 분배 비율을 최적화
  4. 트렌드 강도 등급을 늘리고, 다양한 차단 전략에 대응한다.
  5. 계절적 요소와 시장 주기의 판단을 포함하는 것을 고려하십시오.

요약하다

이것은 구조적이고, 논리적으로 명확한 트렌드 추적 전략으로, 여러 층의 스톱 스톱과 동적 스톱 로즈로 수익과 위험을 균형을 맞추고 있다. 전략의 전체적인 설계는 양적 거래의 기본 원칙에 부합하며, 확장성과 최적화 공간을 가지고 있다. 합리적인 매개 변수 조정과 최적화 업그레이드를 통해, 이 전략은 다양한 시장 환경에서 안정적인 성능을 유지할 것으로 보인다.

전략 소스 코드
/*backtest
start: 2024-03-06 18:40:00
end: 2025-02-17 00:00:00
period: 4h
basePeriod: 4h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("BTC Optimized Strategy v6", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=250)

// === 參數設定 ===
lengthEMA = input(50, title="EMA 週期")
adxLength = input(14, title="ADX 週期")
atrLength = input(14, title="ATR 週期")
riskReward = input(2.0, title="風險報酬比")
tp1_ratio = input(1.0, title="TP1 (ATR 倍數)")
tp2_ratio = input(2.0, title="TP2 (ATR 倍數)")
trailATR = input(3.0, title="移動止盈 ATR 倍數")

// === 計算技術指標 ===
ema = ta.ema(close, lengthEMA)
atr = ta.atr(atrLength)

// === 計算 ADX ===
upMove = math.max(high - nz(high[1], high), 0)
downMove = math.max(nz(low[1], low) - low, 0)
tr = math.max(math.max(high - low, math.abs(high - nz(close[1], close))), math.abs(low - nz(close[1], close)))
plusDM = upMove > downMove and upMove > 0 ? upMove : 0
minusDM = downMove > upMove and downMove > 0 ? downMove : 0
plusDI = 100 * ta.rma(plusDM, adxLength) / ta.rma(tr, adxLength)
minusDI = 100 * ta.rma(minusDM, adxLength) / ta.rma(tr, adxLength)
dx = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
adx = ta.rma(dx, adxLength)

// === 趨勢過濾條件 ===
isTrending = adx > 20

// === 進場條件 ===
longCondition = ta.crossover(close, ema) and isTrending
shortCondition = ta.crossunder(close, ema) and isTrending

// === 計算止損、止盈價格 ===
longStopLoss = low - atr
shortStopLoss = high + atr
longTP1 = close + tp1_ratio * atr
longTP2 = close + tp2_ratio * atr
shortTP1 = close - tp1_ratio * atr
shortTP2 = close - tp2_ratio * atr

// === 設定進場和出場 ===
if longCondition
    strategy.entry("Long", strategy.long)
    strategy.exit("Long_Exit1", from_entry="Long", qty_percent=30, limit=longTP1, stop=longStopLoss)
    strategy.exit("Long_Exit2", from_entry="Long", qty_percent=50, limit=longTP2, stop=longStopLoss)
    strategy.exit("Long_Trail", from_entry="Long", qty_percent=20, 
                 trail_points=atr * trailATR, 
                 trail_offset=atr * trailATR)

if shortCondition
    strategy.entry("Short", strategy.short)
    strategy.exit("Short_Exit1", from_entry="Short", qty_percent=30, limit=shortTP1, stop=shortStopLoss)
    strategy.exit("Short_Exit2", from_entry="Short", qty_percent=50, limit=shortTP2, stop=shortStopLoss)
    strategy.exit("Short_Trail", from_entry="Short", qty_percent=20, 
                 trail_points=atr * trailATR, 
                 trail_offset=atr * trailATR)

// === 當價格超過 TP2 後,自動平倉 ===
if close >= longTP2
    strategy.close("Long")

if close <= shortTP2
    strategy.close("Short")

// === 畫圖標示 ===
plotshape(series=longCondition, location=location.belowbar, color=color.blue, style=shape.labelup, title="買入")
plotshape(series=shortCondition, location=location.abovebar, color=color.red, style=shape.labeldown, title="賣出")
plot(ema, color=color.orange, title="EMA")