Chiến lược này thực hiện giao dịch xu hướng dựa trên chỉ số chuyển động theo hướng (DMI). DMI bao gồm ba đường: ADX, +DI và -DI. ADX cho thấy sức mạnh xu hướng, các giá trị trên ngưỡng cho thấy xu hướng; +DI và -DI cho thấy sức mạnh xu hướng tăng và giảm. Đi dài khi +DI vượt qua trên -DI, và ngắn khi -DI vượt qua trên +DI.
Tính toán các đường ADX, +DI và -DI. Đặt ngưỡng hợp lý cho ADX để xác định xem có xu hướng hiện diện hay không, chẳng hạn như 25. Khi ADX vượt quá mức này, nếu +DI lớn hơn -DI, xu hướng tăng được xác định, đi dài. Nếu -DI lớn hơn +DI, xu hướng giảm được xác định, đi ngắn. Giữ vị trí cho đến khi có tín hiệu ngược.
Giảm thiểu bằng cách rút ngắn thời gian giữ hoặc thêm các chỉ số khác để xác định sự đảo ngược xu hướng.
Chiến lược DMI xác định chính xác hướng xu hướng với việc rút tiền được kiểm soát. Những cải tiến hơn nữa có thể thông qua tối ưu hóa tham số. Một chiến lược theo xu hướng đơn giản và thực tế.
/*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)