
이 전략은 방향성 이동 지수(DMI)와 평균 진정 범위(ATR)를 결합한 추세 추종 시스템입니다. 전략의 핵심은 DI+와 DI- 지표를 통해 시장 추세의 방향과 강도를 파악하고 ATR을 사용하여 이익실현 및 손절매 포지션을 동적으로 조정하는 것입니다. 보조 확인 수단으로 추세 필터링 이동 평균을 도입함으로써 거래 신호의 신뢰성이 더욱 향상되었습니다. 전략 설계는 시장 변동성을 충분히 고려했으며 적응성이 뛰어납니다.
이 전략은 다음과 같은 핵심 메커니즘을 기반으로 운영됩니다.
변동성이 큰 시장의 위험 - 범위가 제한된 시장에서는 지속적인 정지가 발생할 수 있습니다. 제안: 발진기 필터를 추가하거나 매개변수 임계값을 조정하세요.
미끄러짐 위험 - 변동성이 높은 기간 동안 큰 미끄러짐이 발생할 수 있습니다. 제안: 손절매 포지션을 적절히 완화하고 미끄러짐에 대한 여지를 남겨두세요.
거짓 돌파 위험 - 추세 전환점에 대한 잘못된 판단 가능성. 권장 사항: 거래량 등의 지표를 결합하여 신호를 확인하세요.
매개변수 민감도 - 매개변수 조합에 따라 성능이 매우 달라질 수 있습니다. 권장 사항: 백테스팅을 통해 안정성이 높은 매개변수 범위를 찾으세요.
신호 최적화 - 추세 강도를 평가하기 위해 ADX 지표를 도입하거나, 거래량 확인 메커니즘을 추가할 수 있습니다.
포지션 관리 - 보다 정교한 위험 관리를 달성하기 위해 추세 강도에 따라 포지션 크기를 동적으로 조정합니다.
시간 범위 - 신호 신뢰성을 높이기 위해 여러 시간 기간 분석을 고려할 수 있습니다.
시장 적응성 - 다양한 품종의 특성에 따라 적응형 매개변수 조정 메커니즘을 개발할 수 있습니다.
이 전략은 추세 지표와 변동성 지표를 결합하여 역동적인 추세 추적과 위험 제어를 달성합니다. 전략 설계는 실용성과 실행성에 중점을 두었으며, 시장 적응력이 강합니다. 매개변수 최적화와 신호 개선을 통해 전략을 더욱 개선할 여지가 있습니다. 투자자들은 실제 적용에 대한 충분한 테스트를 수행하고 특정 시장 특성에 따라 타겟 조정을 하는 것이 좋습니다.
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("使用 DI+ 和 DI- 的策略 (最終完整修正且含圖表止損止盈線)", overlay=true)
// 輸入參數
diLength = input.int(title="DI 長度", defval=14)
adxSmoothing = input.int(title="ADX Smoothing", defval=14)
trendFilterLength = input.int(title="趨勢過濾均線長度", defval=20)
strengthThreshold = input.int(title="趨勢強度門檻值", defval=20)
atrLength = input.int(title="ATR 長度", defval=14)
atrMultiplierStop = input.float(title="ATR 停損倍數", defval=1.5)
atrMultiplierTakeProfit = input.float(title="ATR 止盈倍數", defval=2.5)
// 計算 DI+ 和 DI-
[diPlus, diMinus, _] = ta.dmi(diLength, adxSmoothing)
// 計算趨勢過濾均線
trendFilterMA = ta.sma(close, trendFilterLength)
// 判斷趨勢方向和強度
strongUpTrend = diPlus > diMinus + strengthThreshold and close > trendFilterMA
strongDownTrend = diMinus > diPlus + strengthThreshold and close < trendFilterMA
// 計算 ATR
atr = ta.atr(atrLength)
// 追蹤止損止盈價格 (使用 var 宣告,只在進場時更新)
var float longStopPrice = na
var float longTakeProfitPrice = na
var float shortStopPrice = na
var float shortTakeProfitPrice = na
// 進場邏輯
longCondition = strongUpTrend
shortCondition = strongDownTrend
if (longCondition)
strategy.entry("多單", strategy.long)
longStopPrice := close - atr * atrMultiplierStop // 進場時計算並更新止損價
longTakeProfitPrice := close + atr * atrMultiplierTakeProfit // 進場時計算並更新止盈價
if (shortCondition)
strategy.entry("空單", strategy.short)
shortStopPrice := close + atr * atrMultiplierStop // 進場時計算並更新止損價
shortTakeProfitPrice := close - atr * atrMultiplierTakeProfit // 進場時計算並更新止盈價
// 出場邏輯 (使用 time 限制和 ATR)
inLongPosition = strategy.position_size > 0
inShortPosition = strategy.position_size < 0
lastEntryTime = strategy.opentrades.entry_bar_index(strategy.opentrades - 1)
if (inLongPosition and time > lastEntryTime)
strategy.exit("多單出場", "多單", stop=longStopPrice, limit=longTakeProfitPrice)
if (inShortPosition and time > lastEntryTime)
strategy.exit("空單出場", "空單", stop=shortStopPrice, limit=shortTakeProfitPrice)
// 繪製 DI+、DI- 和趨勢過濾均線
plot(diPlus, color=color.green, title="DI+")
plot(diMinus, color=color.red, title="DI-")
plot(trendFilterMA, color=color.blue, title="趨勢過濾均線")
// 繪製止損止盈線 (使用 plot 函數繪製)
plot(strategy.position_size > 0 ? longStopPrice : na, color=color.red, style=plot.style_linebr, linewidth=2, title="多單停損")
plot(strategy.position_size > 0 ? longTakeProfitPrice : na, color=color.green, style=plot.style_linebr, linewidth=2, title="多單止盈")
plot(strategy.position_size < 0 ? shortStopPrice : na, color=color.red, style=plot.style_linebr, linewidth=2, title="空單停損")
plot(strategy.position_size < 0 ? shortTakeProfitPrice : na, color=color.green, style=plot.style_linebr, linewidth=2, title="空單止盈")