
Chiến lược chỉ số xu hướng trung bình động ADX là một chiến lược giao dịch định lượng sử dụng chỉ số ADX để đánh giá sức mạnh của xu hướng thị trường và hướng của xu hướng. Chiến lược này đánh giá thị trường có xu hướng hay không bằng cách tính toán chỉ số hướng trung bình ((ADX) và đánh giá hướng của xu hướng bằng cách tính toán chỉ số tích cực ((DI +) và chỉ số tiêu cực ((DI -)) để tạo ra tín hiệu mua và bán.
Chiến lược này đầu tiên sử dụng chỉ số ADX để xác định thị trường có xu hướng hay không. ADX cao hơn giá trị quan trọng mà người dùng đặt ra (định nghĩa mặc định là 23), cho thấy thị trường đang có xu hướng mạnh. Khi giá trị hiện tại của ADX cao hơn giá trị n ngày trước ADX (định nghĩa mặc định là n ngày xem lại cho người dùng), cho thấy ADX đang tăng và xu hướng thị trường đang hình thành.
Chiến lược sau đó sử dụng DI+ và DI- để xác định hướng của xu hướng thị trường. Khi DI+ cao hơn DI-, thị trường có xu hướng tăng; khi DI+ thấp hơn DI-, thị trường có xu hướng giảm.
Cuối cùng, tổng hợp chiến lược đánh giá ADX và DI, tạo ra các tín hiệu mua và bán cụ thể:
Chiến lược này cũng cung cấp các tính năng như lọc trung bình di chuyển và phạm vi thời gian phản hồi tùy chỉnh, có thể được cấu hình theo nhu cầu.
Chiến lược chỉ số xu hướng trung bình động của ADX có những ưu điểm sau:
Chiến lược này cũng có một số rủi ro:
Để giảm thiểu nguy cơ, bạn có thể xem xét:
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Chiến lược chỉ số xu hướng trung bình động ADX sử dụng ADX để xác định xu hướng và DI để xác định xu hướng, tạo ra tín hiệu giao dịch khi có xu hướng, chiến lược tư duy rõ ràng. Chiến lược này có thể tự động xác định xu hướng, theo dõi xu hướng, tránh giao dịch không hiệu quả ở thị trường không xu hướng. Với một số tối ưu hóa, chiến lược này có thể trở thành một công cụ mạnh mẽ để định lượng giao dịch đường dài và trung bình.
/*backtest
start: 2024-01-07 00:00:00
end: 2024-01-14 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')