Chiến lược giao dịch tần suất cao dựa trên hỗ trợ và kháng cự siêu xu hướng và chỉ báo ADX


Ngày tạo: 2024-02-19 15:01:36 sửa đổi lần cuối: 2024-02-19 15:01:36
sao chép: 1 Số nhấp chuột: 871
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch tần suất cao dựa trên hỗ trợ và kháng cự siêu xu hướng và chỉ báo ADX

Tổng quan

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.

Nguyên tắc chiến lược

  1. 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.

  2. 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.

  3. 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.

Phân tích lợi thế

Chiến lược này có những ưu điểm sau:

  1. 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á.

  2. 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ả.

  3. Tỷ lệ rút tiền và lợi nhuận là khá tốt.

Phân tích rủi ro

Chiến lược này cũng có những rủi ro sau:

  1. 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.

  2. 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.

  3. Giao dịch có tần số cao có chi phí giao dịch cao hơn.

Giải pháp tương ứng:

  1. Tối ưu hóa siêu tham số, nới lỏng độ đột phá thích hợp.

  2. Thử nghiệm tham số ADX tốt hơn.

  3. Giảm tần suất giao dịch thích hợp.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa bằng cách:

  1. Tối ưu hóa tham số ATR để làm cho đường kháng cự hỗ trợ vững chắc hơn.

  2. Kiểm tra các tham số ADX khác nhau để tìm ra giá trị tối ưu.

  3. Tham gia hệ thống ngăn chặn để kiểm soát tổn thất đơn lẻ.

Tóm tắt

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.

Mã nguồn chiến lược
/*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)