Theo dõi xu hướng và chiến lược giao dịch ngắn hạn dựa trên chỉ số ADX

Tác giả:ChaoZhang, Ngày: 2024-01-22 17:10:55
Tags:

img

Tổng quan

Chiến lược này kết hợp Super Trend, Pivot Points và Average True Range (ATR) để tạo thành một đường dừng lỗ động, và chỉ số Chỉ số Di chuyển theo hướng trung bình (ADX) để đánh giá và theo dõi xu hướng. Chiến lược này phù hợp với giao dịch ngắn hạn và có thể nắm bắt sự tiếp tục của xu hướng sau khi giới hạn phạm vi. Kiểm soát rút cũng khá.

Nguyên tắc

Super Trend kết hợp với Pivot Points và ATR stop loss đánh giá hướng giá phá vỡ đường stop loss động để xác định hướng mở cửa. Đồng thời, chỉ số ADX đánh giá sức mạnh của xu hướng và chỉ phát ra tín hiệu giao dịch khi xu hướng đủ mạnh.

Đặc biệt, các điểm trục đầu tiên lấy được hỗ trợ và kháng cự mới nhất, và sau đó tạo thành một giá trung bình năng động với trung bình toán học của hai ngày trước đó. Sau đó ATR được tính toán và nhân với nhân ATR, và sau đó thêm vào hoặc trừ ra từ giá trung bình năng động để có được đường ray trên và dưới. Khi giá vượt qua đường ray trên, nó tăng. Khi nó vượt qua đường ray dưới, nó giảm. Chỉ số ADX đánh giá sức mạnh của xu hướng, và chỉ tham gia giao dịch khi xu hướng đủ mạnh.

Đường dừng lỗ sẽ được điều chỉnh năng động theo giá và giá trị ATR mới nhất, có thể theo dõi xu hướng rất tốt.

Phân tích lợi thế

Chiến lược có những lợi thế sau:

  1. Sử dụng chỉ số Super Trend để theo dõi hướng của xu hướng để tránh khóa lợi nhuận bởi thị trường dao động.

  2. Với sự giúp đỡ của chỉ số ADX để đánh giá sức mạnh của xu hướng, tránh sai lầm trong giao dịch trong quá trình hợp nhất.

  3. Đường dừng lỗ được điều chỉnh năng động để tối đa hóa lợi nhuận khóa.

  4. Kết hợp RSI để tránh mua quá mức và bán quá mức.

  5. Nhìn chung, việc thiết lập tham số chiến lược là hợp lý. Việc lựa chọn dframe xem xét tính liên tục. Việc thiết lập lấy lợi nhuận và dừng lỗ cũng là tốt.

Phân tích rủi ro

Chiến lược này cũng có một số rủi ro:

  1. Chỉ số Super Trend và MA có thể phát ra các tín hiệu mâu thuẫn.

  2. Chỉ số ADX được thiết lập cho 14 chu kỳ, không đủ nhạy cảm với các sự kiện đột ngột.

  3. Các thông số RSI được thiết lập theo mặc định, có thể không hoàn toàn tránh mua quá mức và bán quá mức.

  4. Tác động của các sự kiện đột ngột đã không được xem xét, chẳng hạn như tin xấu / tin tốt lớn.

Các giải pháp tương ứng:

  1. Điều chỉnh chu kỳ MA để phù hợp với chỉ số Super Trend.

  2. Cố gắng rút ngắn chu kỳ ADX để tăng độ nhạy cảm với các sự kiện đột ngột.

  3. Tối ưu hóa các thông số RSI để tìm ra các giá trị tối ưu.

  4. Thêm mô-đun lọc tin tức để tránh các thông cáo tin tức lớn.

Tối ưu hóa

Chiến lược cũng có thể được tối ưu hóa trong các khía cạnh sau:

  1. Thêm mô hình học máy để đánh giá xu hướng, làm cho các quyết định giao dịch thông minh hơn.

  2. Cố gắng giới thiệu các chỉ số cảm xúc thay vì ADX để đánh giá sức mạnh của xu hướng.

  3. Tăng mô-đun dừng lỗ thích nghi để làm cho dừng lỗ năng động và chính xác hơn.

  4. Tạo thêm các tính năng với công nghệ học sâu để tối ưu hóa chiến lược tổng thể.

  5. Sử dụng các ngôn ngữ tiên tiến như Python để phát triển chiến lược để tăng khả năng mở rộng chiến lược.

Tóm lại

Nhìn chung, chiến lược này rất thực tế. Cốt lõi là theo dõi hướng chạy xu hướng và tham gia khi xu hướng đủ mạnh. Cài đặt dừng lỗ và lấy lợi nhuận cũng rất phù hợp để tối đa hóa việc khóa lợi nhuận trong khi tránh thua lỗ. Tất nhiên, vẫn còn rất nhiều chỗ để tối ưu hóa. Thêm công nghệ học máy và học sâu sẽ làm cho chiến lược hiệu quả và mở rộng hơn.


/*backtest
start: 2023-01-15 00:00:00
end: 2024-01-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Bendre ADX STrend", 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 = 21, title = "ATR Period")

StartDate = input(timestamp("1 Dec 2023"), title="Start Date")
EndDate = input(timestamp("12 Jan 2024"), title="End Date")
window()  => true

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)

//
// DMI - Direction Movement Index
// 
[diplus1, diminus1, adx] = ta.dmi(14, 14)

// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP 


if (buy and vrsi > overBought and adx > 19)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long, when = window())
    // 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 and adx > 25)
    strategy.entry("Sell", strategy.short, when = window())

if ( ta.crossover( diminus1, diplus1) or ((buy) and (strategy.position_size > 0)) )
    strategy.close("Sell", "close Sell")

// if(sell) and (diminus1 > diplus1) and adx > 23 and adx > adx[1] and (vrsi < overSold)
//     strategy.entry("Sell", strategy.short, when = window())

// if (strategy.position_size > 0 and ta.crossunder(diminus1, adx)) or (strategy.position_size > 0  and (buy))
//     strategy.close("Sell", "close Sell")





Thêm nữa