
이 전략은 EMA와 ADX 지표를 결합한 트렌드 추적 거래 시스템으로, 다단계 스톱 및 모바일 스톱으로 자금 관리를 최적화한다. 이 전략은 EMA 평선을 트렌드 방향을 판단하기 위해, ADX 지표를 트렌드 강도를 필터링하기 위해 사용하고, 수익을 분할하기 위해 세 층의 스톱 메커니즘을 설계하고, ATR을 동적으로 조정하여 위험을 제어한다.
전략의 핵심 논리는 다음과 같은 핵심 부분으로 구성됩니다.
이것은 구조적이고, 논리적으로 명확한 트렌드 추적 전략으로, 여러 층의 스톱 스톱과 동적 스톱 로즈로 수익과 위험을 균형을 맞추고 있다. 전략의 전체적인 설계는 양적 거래의 기본 원칙에 부합하며, 확장성과 최적화 공간을 가지고 있다. 합리적인 매개 변수 조정과 최적화 업그레이드를 통해, 이 전략은 다양한 시장 환경에서 안정적인 성능을 유지할 것으로 보인다.
/*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")