
Chiến lược dừng động theo xu hướng là một chiến lược giao dịch định lượng kết hợp các chỉ số đánh giá xu hướng và cơ chế dừng động. Chiến lược này sử dụng các chỉ số siêu xu hướng để đánh giá hướng xu hướng hiện tại và sử dụng đường dừng động để theo dõi thay đổi giá trong thời gian thực, để thực hiện theo dõi xu hướng và kiểm soát rủi ro.
Chiến lược này đầu tiên tính toán các chỉ số siêu xu hướng để xác định hiện tại là xu hướng tăng hoặc xu hướng giảm. Chỉ số siêu xu hướng kết hợp với chỉ số ATR và điểm trung tâm, có thể xác định chính xác hơn về hướng xu hướng. Nếu chỉ số siêu xu hướng được xác định là xu hướng tăng, nó sẽ tạo ra tín hiệu mua; Nếu được xác định là xu hướng giảm, nó sẽ tạo ra tín hiệu bán.
Khi tạo ra tín hiệu mua, chiến lược này sẽ mở thêm vị trí; đồng thời, nó sẽ tính toán một đường dừng chân di chuyển trong thời gian thực, đường dừng chân được tính bằng cách lấy điểm trung tâm trừ số chỉ số ATR. Chừng nào giá đóng cửa hiện tại cao hơn đường dừng chân, đường dừng chân sẽ di chuyển trong thời gian thực và luôn ở vị trí dừng chân hợp lý.
Chiến lược này kết hợp các chỉ số ADX và RSI để lọc các tín hiệu giao dịch không phù hợp. Chỉ khi ADX lớn hơn ngưỡng thiết lập và RSI ở mức hợp lý, tín hiệu của chỉ số siêu xu hướng sẽ được sử dụng để mở vị trí.
Ưu điểm lớn nhất của chiến lược này là có thể nắm bắt hướng xu hướng tốt, theo dõi xu hướng. Chỉ số siêu xu hướng chính xác hơn so với trung bình di chuyển đơn giản, có thể nhanh chóng xác định điểm biến. Đồng thời, cơ chế dừng lỗ di động có thể tự động điều chỉnh điểm dừng lỗ, tối đa hóa lợi nhuận và kiểm soát rủi ro hiệu quả.
Ngoài ra, chiến lược này bao gồm các chỉ số ADX và RSI để lọc và tránh giao dịch sai trong thời gian thị trường biến động lớn. Chỉ số ADX đảm bảo có đủ xu hướng, chỉ số RSI tránh quá mua quá bán, do đó tăng khả năng kiếm lợi nhuận.
Rủi ro lớn nhất của chiến lược này là khả năng đánh giá xu hướng sai, và chỉ số siêu xu hướng phát ra tín hiệu sai. Mặc dù chỉ số siêu xu hướng tốt hơn trung bình di chuyển đơn giản, nhưng trong các trường hợp phức tạp, không thể tránh được sai lầm.
Ngoài ra, thiết lập tham số chiến lược không chính xác cũng mang lại một số rủi ro. Ví dụ: tham số ATR qua hội nghị dẫn đến việc điều chỉnh đường dừng quá mạnh; tham số ADX và RSI được thiết lập không chính xác cũng có thể bỏ lỡ cơ hội giao dịch hoặc tăng khả năng giao dịch sai. Điều này cần tìm tham số tối ưu bằng cách sử dụng rất nhiều lịch sử.
Chiến lược này có thể được tối ưu hóa hơn nữa ở những khía cạnh sau:
Thử các chỉ số đánh giá xu hướng khác, như DMI, KDJ, v.v., kết hợp với các chỉ số siêu xu hướng, tạo thành hệ thống đánh giá đa yếu tố, có thể giúp tăng độ chính xác đánh giá.
Thêm mô-đun tối ưu hóa tham số thích ứng dựa trên học máy, cho phép tham số ATR, tham số ADX, tham số RSI, v.v. có thể được điều chỉnh theo thị trường thời gian thực, chứ không phải là giá trị cố định đơn giản.
Các chỉ số RSI thay thế như chỉ số cảm xúc được đưa ra để lọc tín hiệu. Chỉ số RSI không thích hợp để đánh giá các tình huống phức tạp, trong khi các chỉ số cảm xúc xã hội có thể đánh giá tốt hơn về sự nóng của thị trường.
Thêm mô-đun quản lý vị trí, tùy theo khoảng cách từ đường dừng lỗ đến giá hiện tại, kích thước vị trí được điều chỉnh động. Càng xa đường dừng lỗ, bạn có thể tăng vị trí phù hợp để tăng lợi nhuận.
Theo dõi xu hướng chiến lược dừng di động sử dụng các phương pháp như phân tích xu hướng, dừng di động và lọc đa yếu tố, trong khi nắm bắt xu hướng và kiểm soát nghiêm ngặt rủi ro, là một chiến lược định lượng đã trưởng thành. Chiến lược này vẫn còn rất nhiều chỗ để tối ưu hóa và đáng để nghiên cứu thêm để cải thiện nó để thích ứng với môi trường thị trường phức tạp hơn.
/*backtest
start: 2023-01-16 00:00:00
end: 2024-01-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Bendre ADX Sup Trend", overlay = true)
///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////
src = input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period")
AtrFactor=input(defval = 2, title = "ATR Factor")
AtrPd=input(defval = 18, title = "ATR Period")
StartDate = input(timestamp("1 Dec 2022"), title="Start Date")
EndDate = input(timestamp("12 Jan 2023"), title="End Date")
var float ph = na
var float pl = na
ph := ta.pivothigh(PPprd, PPprd)
pl :=ta.pivotlow(PPprd, PPprd)
float center = na
center := center[1]
// float lastpp = ph ? ph : pl ? pl : 0.0
float lastpp = na(ph) ? na(pl) ? na : pl : ph
if lastpp > 0
if na(center)
center := lastpp
else
center := (center * 2 + lastpp) / 3
Up = center - (AtrFactor * ta.atr(AtrPd))
Dn = center + (AtrFactor * ta.atr(AtrPd))
var float TUp = na
var float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? math.max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? math.min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown
// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor , linewidth = 2, title = "PP SuperTrend")
bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl
///////
// ADX
//////
lenADX = 14
th = 14
TrueRange = math.max(math.max(high-low, math.abs(high-nz(close[1]))), math.abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? math.max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? math.max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = math.abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = ta.sma(DX, lenADX)
//////
// MA
/////
lenMA = 21
srcMA = input(close, title="Source")
// offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
offsetMA = input(0, title="Offset")
outMA = ta.sma(srcMA, lenMA)
//
// RSI
//
length = input( 14 )
overSold = input( 30 )
overBought = input( 65 )
price = close
vrsi = ta.rsi(price, length)
// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP
if (buy and vrsi > overBought)
// .order // Tuned version
strategy.entry("Buy", strategy.long)
// strategy.close("Sell", "close Sell")
if (sell) and (strategy.position_size > 0)
// strategy.entry("Sell", strategy.short)
strategy.close("Buy", "Close Buy")
// if(sell and vrsi < overSold )
// strategy.entry("Sell", strategy.short)
// if(buy) and (strategy.position_size > 0)
// strategy.close("Sell", "close Sell")