이 전략은 동적 지표 DMI를 기반으로 트렌드 거래를 실현한다. DMI는 세 개의 곡선을 구성한다: ADX, + DI 및 -DI. ADX는 트렌드의 강도를 나타내고, 주어진 하위값보다 큰 경우 트렌드에 들어가는 것을 나타냅니다.
ADX, +DI 및 -DI의 곡선을 계산한다. ADX의 합리적인 하위값을 설정하여 트렌드에 진입했는지 판단한다. 예를 들어 25이다. ADX가 그 하위값보다 크면, +DI가 -DI보다 크면 상승 추세로 판단하고, 더 많이 한다. -DI가 +DI보다 크면 하향 추세로 판단하고, 공백을 한다. 역전 신호가 나타나기 전까지 포지션을 유지하고 있다.
적절히 포지션 기간을 단축하거나, 다른 지표와 함께 추세 반전을 판단할 수 있다.
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)