Chiến lược xu hướng động lực ADX

Tác giả:ChaoZhang, Ngày: 2024-01-16 15:57:17
Tags:

img

Tổng quan

Chiến lược này sử dụng chỉ số ADX để xác định xu hướng thị trường, kết hợp với chỉ số DMI để xác định hướng, sử dụng độ dốc ADX để đo sức mạnh xu hướng, đặt mức khóa ADX để lọc các thị trường không có xu hướng và sử dụng đường trung bình động để lọc tín hiệu giao dịch.

Chiến lược logic

  1. Tính toán các chỉ số ADX, DI + và DI-
  2. Độ nghiêng ADX > 0 cho thấy xu hướng tăng; mức chính được đặt là 23 để lọc các thị trường không có xu hướng.
  3. DI + trên DI- biểu thị động lực tăng vượt qua động lực giảm, cho tín hiệu mua.
  4. Khi bộ lọc đường trung bình động được bật, chỉ tạo tín hiệu mua khi gần trên đường trung bình động.
  5. Đóng các vị trí khi độ dốc ADX < 0, cho thấy xu hướng giảm dần.

Phân tích lợi thế

  1. Bộ lọc MA làm giảm tiếng ồn giao dịch trên các thị trường không có xu hướng.
  2. Độ nghiêng ADX xác định chính xác sức mạnh của xu hướng.
  3. DI chỉ ra hướng kết hợp với ADX cho sức mạnh tạo thành một hệ thống giao dịch xu hướng mạnh mẽ.
  4. Mong đợi rút vốn thấp hơn và tỷ lệ lợi nhuận cao hơn các chiến lược MA đơn giản.

Phân tích rủi ro

  1. Kết quả ADX khác nhau đáng kể với các thông số đầu vào khác nhau.
  2. DMI có thể đưa ra tín hiệu sai trước khi định hướng rõ ràng.
  3. Có một số sự chậm trễ, làm giảm hiệu quả chiến lược.

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa các thông số ADX để có kết quả tốt nhất.
  2. Thêm stop loss để giới hạn lỗ trên các giao dịch đơn.
  3. Hãy thử kết hợp các chỉ số khác để lọc tín hiệu, ví dụ RSI, Bollinger Bands.

Tóm lại

Chiến lược này sử dụng đầy đủ sức mạnh của ADX trong việc xác định xu hướng và động lực, kết hợp với DMI để phân tích hướng, tạo thành một hệ thống theo dõi xu hướng hoàn chỉnh. Bộ lọc MA làm giảm tiếng ồn hiệu quả.


/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © millerrh with inspiration from @9e52f12edd034d28bdd5544e7ff92e 
//The intent behind this study is to look at ADX when it has an increasing slope and is above a user-defined key level (23 default). 
//This is to identify when it is trending.
//It then looks at the DMI levels.  If D+ is above D- and the ADX is sloping upwards and above the key level, it triggers a buy condition.  Opposite for short.
//Can use a user-defined moving average to filter long/short if desried.
// NOTE: THIS IS MEANT TO BE USED IN CONJUNCTION WITH MY "ATX TRIGGER" INDICATOR FOR VISUALIZATION. MAKE SURE SETTINGS ARE THE SAME FOR BOTH.

strategy("ADX | DMI Trend", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.04)

// === BACKTEST RANGE ===
From_Year  = input(defval = 2019, title = "From Year")
From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
From_Day   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
To_Year    = input(defval = 9999, title = "To Year")
To_Month   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
To_Day     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
Start  = timestamp(From_Year, From_Month, From_Day, 00, 00)  // backtest start window
Finish = timestamp(To_Year, To_Month, To_Day, 23, 59)        // backtest finish window

// == INPUTS ==
// ADX Info
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Period")
keyLevel = input(23, title="Keylevel for ADX")
adxLookback = input(3, title="Lookback Period for Slope")

// == FILTERING ==
// Inputs
useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "MA Type For Filtering")
maLength   = input(defval = 200, title = "MA Period for Filtering", minval = 1)

// Declare function to be able to swap out EMA/SMA
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = ma(maType, close, maLength)
plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50)

// Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry 
maFilterCheck = if useMaFilter == true
    maFilter
else
    close

// == USE BUILT-IN DMI FUNCTION TO DETERMINE ADX AND BULL/BEAR STRENGTH
[diplus, diminus, adx] = dmi(dilen, adxlen)

buySignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus > diminus  and close >= maFilterCheck
// buySignalValue = valuewhen(buySignal, close, 0)
shortSignal = (adx[0]-adx[adxLookback] > 0) and adx > keyLevel and diplus < diminus  and close <= maFilterCheck
// shortSignalValue = valuewhen(shortSignal, close, 0)
sellCoverSignal = adx[0]-adx[adxLookback] < 0

// == ENTRY & EXIT CRITERIA
// Triggers to be TRUE for it to fire of the BUY Signal : (opposite for the SELL signal).
// (1): Price is over the 200 EMA line. (EMA level configurable by the user)
// (2): "D+" is OVER the "D-" line
// (3): RSI 7 is under 30 (for SELL, RSI 7 is over 70)
// 1* = The ultimate is to have a combination line of 3 EMA values, EMA 14, EMA 50 and EMA 200 - And if price is over this "combo" line, then it's a strong signal

// == STRATEGY ENTRIES/EXITS == 
strategy.entry("Long", strategy.long, when = buySignal)
strategy.close("Long", when = sellCoverSignal)
strategy.entry("Short", strategy.short, when = shortSignal)
strategy.close("Short", when = sellCoverSignal)
    
// == ALERTS == 
// alertcondition(buySignal, title='ADX Trigger Buy', message='ADX Trigger Buy')
// alertcondition(sellSignal, title='ADX Trigger Sell', message='ADX Trigger Sell')

Thêm nữa