Chiến lược giao dịch siêu xu hướng chuyển động theo ADX

Tác giả:ChaoZhang, Ngày: 2024-02-19 15:01:36
Tags:

img

Tổng quan

Chiến lược này kết hợp các điểm trục SuperTrend và chỉ số ADX cho giao dịch tần số cao. Các đường SuperTrend tính toán động các mức hỗ trợ và kháng cự mới nhất để xác định xu hướng giá và tạo ra tín hiệu giao dịch. Chỉ số ADX đo cường độ xu hướng và hoạt động như một bộ lọc, chỉ giao dịch khi xu hướng đủ mạnh.

Chiến lược logic

  1. Tính toán các đường hỗ trợ và kháng cự trục trục. Lấy giá đóng cửa và thêm / trừ một phạm vi ATR trên và dưới. Việc phá vỡ các đường này báo hiệu đảo ngược xu hướng.

  2. ADX xác định sức mạnh của xu hướng. Giá trị ADX cao cho thấy xu hướng mạnh mẽ.

  3. Kết hợp cả hai cho các tín hiệu giao dịch. Đi dài / ngắn chỉ trên pivot break và ADX cao.

Phân tích lợi thế

Ưu điểm của chiến lược này:

  1. Đường siêu xu hướng năng động nhanh chóng xác định sự đột phá.

  2. Bộ lọc ADX tránh các tín hiệu sai trong các thị trường giới hạn phạm vi.

  3. Tỷ lệ rủi ro-lợi nhuận tốt và kiểm soát rút tiền.

Phân tích rủi ro

Rủi ro của chiến lược này:

  1. Các bước Gap có thể vô hiệu hóa đường SuperTrend.

  2. Thiết lập ngưỡng ADX kém ảnh hưởng đến hiệu suất.

  3. Tần suất giao dịch cao làm tăng chi phí giao dịch.

Giải pháp:

  1. Tối ưu hóa các tham số để cho phép phạm vi đột phá rộng hơn.

  2. Kiểm tra giá trị ADX tốt hơn.

  3. Giảm tần suất giao dịch.

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

Các lĩnh vực cần cải thiện:

  1. Tối ưu hóa hệ số ATR cho các đường dây mạnh mẽ hơn.

  2. Kiểm tra các thông số ADX khác nhau.

  3. Thêm stop-loss để giới hạn lỗ.

Kết luận

Chiến lược này kết hợp các điểm mạnh của SuperTrend và ADX để xác định các điểm đảo ngược xu hướng có khả năng cao, được lọc bởi ADX về chất lượng.


/*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)

Thêm nữa