
Chiến lược này sử dụng đường kháng cự hỗ trợ siêu xu hướng và chỉ số ADX để thực hiện giao dịch tần số cao. Đường kháng cự hỗ trợ siêu xu hướng được sử dụng để xác định xu hướng giá và phát tín hiệu giao dịch bằng cách tính toán động điểm kháng cự hỗ trợ mới nhất. Chỉ số ADX được sử dụng để xác định cường độ của xu hướng, đặt giá trị ADX làm điều kiện lọc và chỉ phát tín hiệu giao dịch khi xu hướng đủ mạnh.
Tính toán đường kháng cự hỗ trợ. Với giá đóng cửa là chuẩn, mỗi bên trên và bên dưới thêm một mức ATR. Khi giá vượt qua các đường này, nó được coi là một xu hướng đảo ngược.
Chỉ số ADX đánh giá cường độ của xu hướng. Khi ADX cao hơn giá trị thiết lập, xu hướng được coi là đủ mạnh.
Kết hợp cả hai để phát tín hiệu giao dịch. Chỉ cần phá vỡ đường kháng cự hỗ trợ và ADX đủ lớn, hãy thực hiện thêm lệnh hỏng.
Chiến lược này có những ưu điểm sau:
Tính năng tính toán đường siêu xu hướng hỗ trợ kháng cự, có thể nhanh chóng đánh giá đột phá.
Chỉ số ADX có hiệu quả trong việc lọc các tình huống không theo xu hướng, giảm giao dịch không hiệu quả.
Tỷ lệ rút tiền và lợi nhuận là khá tốt.
Chiến lược này cũng có những rủi ro sau:
Một bước nhảy vọt lớn có thể làm mất hiệu lực đường siêu xu hướng.
Thiết lập giá trị ADX không đúng cũng ảnh hưởng đến hiệu suất của chiến lược.
Giao dịch có tần số cao có chi phí giao dịch cao hơn.
Giải pháp tương ứng:
Tối ưu hóa siêu tham số, nới lỏng độ đột phá thích hợp.
Thử nghiệm tham số ADX tốt hơn.
Giảm tần suất giao dịch thích hợp.
Chiến lược này có thể được tối ưu hóa bằng cách:
Tối ưu hóa tham số ATR để làm cho đường kháng cự hỗ trợ vững chắc hơn.
Kiểm tra các tham số ADX khác nhau để tìm ra giá trị tối ưu.
Tham gia hệ thống ngăn chặn để kiểm soát tổn thất đơn lẻ.
Chiến lược này kết hợp các ưu điểm của đường siêu xu hướng và chỉ số ADX, thông qua tính toán động hỗ trợ kháng cự để đánh giá thời gian đảo ngược xu hướng, kết hợp với chỉ số ADX để lọc tín hiệu chất lượng thấp. Sau khi tối ưu hóa tham số và điều chỉnh cơ chế, có thể trở thành một chiến lược tần số cao có lợi nhuận ổn định.
/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("STPP20 + ADX", overlay = true)
///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////
src = input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period", minval = 1, maxval = 50)
AtrFactor=input(defval = 5, title = "ATR Factor", minval = 1, step = 0.1)
AtrPd=input(defval = 20, title = "ATR Period", minval=1)
float ph = na
float pl = na
ph := pivothigh(PPprd, PPprd)
pl := pivotlow(PPprd, PPprd)
float center = na
center := center[1]
float lastpp = ph ? ph : pl ? pl : na
if lastpp
if na(center)
center := lastpp
else
center := (center * 2 + lastpp) / 3
Up = center - (AtrFactor * atr(AtrPd))
Dn = center + (AtrFactor * atr(AtrPd))
float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? 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 = 25
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? 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 = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, lenADX)
//////
// MA
/////
lenMA = 21
srcMA = input(close, title="Source")
offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
outMA = sma(srcMA, lenMA)
// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP
if (buy)
// .order // Tuned version
strategy.entry("Buy", strategy.long)
if (sell) and (strategy.position_size > 0)
strategy.order("Sell", false, when = sell)