방향성 이동 지표(DMI) 거래 전략


생성 날짜: 2023-09-18 14:11:21 마지막으로 수정됨: 2023-09-18 14:11:21
복사: 0 클릭수: 804
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 동적 지표 DMI를 기반으로 트렌드 거래를 실현한다. DMI는 세 개의 곡선을 구성한다: ADX, + DI 및 -DI. ADX는 트렌드의 강도를 나타내고, 주어진 하위값보다 큰 경우 트렌드에 들어가는 것을 나타냅니다.

전략 원칙

ADX, +DI 및 -DI의 곡선을 계산한다. ADX의 합리적인 하위값을 설정하여 트렌드에 진입했는지 판단한다. 예를 들어 25이다. ADX가 그 하위값보다 크면, +DI가 -DI보다 크면 상승 추세로 판단하고, 더 많이 한다. -DI가 +DI보다 크면 하향 추세로 판단하고, 공백을 한다. 역전 신호가 나타나기 전까지 포지션을 유지하고 있다.

우위 분석

  • DMI 지표는 트렌드 방향을 정확하게 판단하고, 신호는 적습니다.
  • ADX를 사용하여 강하고 약한 추세를 판단하여 무효의 돌파구를 방지하여 노이즈 거래를 방지합니다.
  • 한 번에 하나만 더하거나 한 번에 하나만 채우면 반복되는 거래를 피할 수 있습니다.
  • 변수 조정 공간이 넓어서 ADX 값, DI 주기 등을 조정할 수 있다.

위험 분석

  • 트렌드 반전으로 인한 손실에 주의해야 합니다.
  • ADX는 동향이 강하고 약하며 지연된다고 평가했다.
  • 장기간 포지션을 보유하면 더 큰 인출 위험

적절히 포지션 기간을 단축하거나, 다른 지표와 함께 추세 반전을 판단할 수 있다.

최적화 방향

  • ADX 매개 변수를 최적화하고, 반응 민감도와 필터링 가짜 신호를 균형 잡는다.
  • 다른 포지션 주기 변수의 효과를 테스트하는 방법
  • 평균선과 같은 지표들을 고려할 수 있는 추세 역전
  • 다양한 품종의 변수에서의 안정성을 테스트하는 것

요약하다

DMI 전략은 트렌드 방향을 정확하게 판단하고, 회수 통제가 더 좋다. 파라미터 최적화를 통해 더 개선할 수 있으며, 간단한 실용적인 트렌드 추적 전략이다.

전략 소스 코드
/*backtest
start: 2023-09-10 00:00:00
end: 2023-09-17 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// ©wojak_bogdanoff
// @version=5
// Directional Movement Index (DMI)

strategy(title="Directional Movement Index", shorttitle="DMI︎", overlay=true, pyramiding=1, calc_on_every_tick=false, calc_on_order_fills=false, initial_capital=100.0, default_qty_type=strategy.percent_of_equity, default_qty_value=100.0, commission_type=strategy.commission.percent, commission_value=0.1, slippage=1)

trade_type = 'Long' // input.string(defval = "Long", title="Position Type", options=["Both", "Long", "Short"], group='Trading Settings')
strategy_type = 'DMI' // input.string(defval="ECS︎", title="Strategy Type", options='[ECS︎'], group='Trading Settings')

start_date  = input(title='Testing Start Date', defval=timestamp("2017-01-01T00:00:00"), group='Trading Settings')
finish_date = input(title='Testing End Date', defval=timestamp("2025-01-01T00:00:00"), group='Trading Settings')

_testperiod = true
_check = _testperiod

// --- (Start) Directional Movement Index (DMI) ----------------------------- //

dmi_adxSmoothing = input.int(14, title="ADX Smoothing", minval=1, maxval=50)
dmi_len = input.int(7, minval=1, title="DI Length")
dmi_up = ta.change(high)
dmi_down = -ta.change(low)
dmi_plusDM = na(dmi_up) ? na : (dmi_up > dmi_down and dmi_up > 0 ? dmi_up : 0)
dmi_minusDM = na(dmi_down) ? na : (dmi_down > dmi_up and dmi_down > 0 ? dmi_down : 0)
dmi_rma = ta.rma(ta.tr, dmi_len)
dmi_plus = fixnan(100 * ta.rma(dmi_plusDM, dmi_len) / dmi_rma)
dmi_minus = fixnan(100 * ta.rma(dmi_minusDM, dmi_len) / dmi_rma)
dmi_sum = dmi_plus + dmi_minus
dmi_adx = 100 * ta.rma(math.abs(dmi_plus - dmi_minus) / (dmi_sum == 0 ? 1 : dmi_sum), dmi_adxSmoothing)

plot(dmi_adx, color=#F50057, title="ADX")
plot(dmi_plus, color=#2962FF, title="+DI")
plot(dmi_minus, color=#FF6D00, title="-DI")

dmi_consld_limit=input.int(defval=25, title='Consolidation ADX')
dmi_consld=dmi_adx<=dmi_consld_limit
dmi_strong_up=dmi_adx>dmi_consld_limit and dmi_plus>dmi_minus
dmi_strong_down=dmi_adx>dmi_consld_limit and dmi_plus<dmi_minus

barcolor(dmi_consld ? color.new(color.black,0) : na, title='Consolidation region', display=display.none)
barcolor(dmi_strong_up ? color.new(color.green,0) : na, title='Uptrend Region')
barcolor(dmi_strong_down ? color.new(color.red,0) : na, title='Downtrend Region')

dmi_long_e = (not dmi_strong_up[1]) and dmi_strong_up[0]
dmi_long_x = dmi_strong_up[1] and (not dmi_strong_up[0])

dmi_short_e = dmi_strong_up[1] and (not dmi_strong_up[0])
dmi_short_x = (not dmi_strong_up[1]) and dmi_strong_up[0]

// --- (End) Directional Movement Index (DMI) ------------------------------- //

// --- Trade Conditions ----------------------------------------------------- //

var is_long_open=false, var is_short_open=false

long_e = strategy_type == "DMI" ? dmi_long_e : na
long_x = strategy_type == "DMI" ? dmi_long_x : na

short_e = strategy_type == "DMI" ? dmi_short_e : na
short_x = strategy_type == "DMI" ? dmi_short_x : na

long_e_color = input.color(defval=color.new(color.teal,0), title='Long Entry', group='Signals Style - Setting')
long_x_color = input.color(defval=color.new(color.purple,0), title='Long Exit', group='Signals Style - Setting')

is_trade_bar = (long_e and not is_long_open) or (long_x and is_long_open)

barcolor(color=is_trade_bar ? na : (close>open ? color.new(color.green,90) : color.new(color.red,90)), title='Trade Bars')

barcolor(color=(trade_type == 'Long' or trade_type == 'Both') ? long_e and not is_long_open ? long_e_color : na : na, title="Long - Entry Bar", editable=false)
barcolor(color=(trade_type == 'Long' or trade_type == 'Both') ? long_x and is_long_open ? long_x_color : na : na, title="Long - Exit Bar", editable=false)

plotshape((trade_type == 'Long' or trade_type == 'Both') ? long_e and not is_long_open : na, text="B", textcolor=color.white, style=shape.labelup, color=long_e_color, size=size.tiny, location=location.belowbar, title="Long - Entry Labels")
plotshape((trade_type == 'Long' or trade_type == 'Both') ? long_x and is_long_open : na, text="S", textcolor=color.white, style=shape.labeldown, color=long_x_color, size=size.tiny, location=location.abovebar, title="Long - Exit Labels")

plotshape((trade_type == 'Short' or trade_type == 'Both') ? short_e and not is_short_open : na, text="E", textcolor=color.black, style=shape.labeldown, color=color.new(color.yellow,30), size=size.tiny, location=location.abovebar, title="Short - Entry Labels", editable=false)
plotshape((trade_type == 'Short' or trade_type == 'Both') ? short_x and is_short_open : na, text="X", textcolor=color.black, style=shape.labeldown, color=color.new(color.orange,30), size=size.tiny, location=location.abovebar, title="Short - Exit Labels", editable=false)

if long_e and not is_long_open
    is_long_open:=true
if long_x and is_long_open
    is_long_open:=false

if short_e and not is_short_open
    is_short_open:=true
if short_x and is_short_open
    is_short_open:=false

// --- Trade Executions ----------------------------------------------------- //

if trade_type == "Both" and _check
    strategy.entry("Long", strategy.long, comment="Long", when=long_e and _testperiod)
    strategy.close("Long", comment="Exit Long", when=long_x and _testperiod)
    strategy.entry("Short", strategy.short, comment="Short", when=short_e and _testperiod)
    strategy.close("Short", comment="Exit Short", when=short_x and _testperiod)

if trade_type == "Long" and _check
    strategy.entry("Long", strategy.long, comment=" ", when=long_e and _testperiod)
    strategy.close("Long", comment=" ", when=long_x and _testperiod)

if trade_type == "Short" and _check
    strategy.entry("Short", strategy.short, comment="Short", when=short_e and _testperiod)
    strategy.close("Short", comment="Exit Short", when=short_x and _testperiod)