Chiến lược theo dõi xu hướng Trailing Stop

Tác giả:ChaoZhang, Ngày: 2024-01-17 11:19:06
Tags:

img

Tổng quan

Chiến lược Trailing Stop 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ác cơ chế dừng sau. Chiến lược này sử dụng chỉ số Supertrend để xác định hướng xu hướng hiện tại, và sử dụng một đường dừng sau để theo dõi sự thay đổi giá trong thời gian thực, đạt được theo dõi xu hướng và kiểm soát rủi ro.

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

Chiến lược đầu tiên tính toán chỉ số Supertrend để đánh giá xu hướng hiện tại là tăng hay giảm. Chỉ số Supertrend kết hợp chỉ số ATR và điểm pivot để xác định chính xác hơn hướng xu hướng. Nếu chỉ số Supertrend đánh giá xu hướng tăng, một tín hiệu mua được tạo ra. Nếu đánh giá xu hướng giảm, một tín hiệu bán được tạo ra.

Khi một tín hiệu mua được tạo ra, chiến lược sẽ mở một vị trí dài. Đồng thời, nó tính toán một đường dừng kéo theo trong thời gian thực. Phương pháp tính toán của đường dừng này là điểm trục trừ giá trị chỉ số ATR. Miễn là giá đóng hiện tại cao hơn đường dừng này, đường dừng sẽ di chuyển lên trong thời gian thực và duy trì một vị trí dừng lỗ hợp lý. Nếu giá vượt qua đường dừng, vị trí sẽ được đóng với mức dừng lỗ.

Chiến lược cũng 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ý, các tín hiệu từ chỉ số Supertrend sẽ được tin cậy để mở các vị trí.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là nó có thể nắm bắt được hướng xu hướng tốt và đạt được theo dõi xu hướng. Chỉ số Supertrend chính xác hơn so với các đường trung bình di chuyển đơn giản và có thể nhanh chóng xác định các bước ngoặt. Đồng thời, cơ chế dừng lại có thể tự động điều chỉnh mức dừng để tối đa hóa việc khóa lợi nhuận và kiểm soát rủi ro hiệu quả.

Ngoài ra, các chỉ số ADX và RSI được thêm vào chiến lược lọc, tránh lỗi trong thời kỳ biến động thị trường cao.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược này là đánh giá xu hướng sai và chỉ số Supertrend phát ra tín hiệu sai. Mặc dù chỉ số Supertrend vượt trội hơn so với các đường trung bình động đơn giản, nhưng không thể tránh khỏi việc đánh giá sai sẽ xảy ra trong điều kiện thị trường phức tạp. Tại thời điểm này, cần phải dựa vào các cơ chế dừng lỗ để kiểm soát lỗ.

Ngoài ra, cài đặt tham số chiến lược không đúng cũng có thể gây ra rủi ro. Ví dụ, một tham số ATR quá lớn sẽ dẫn đến điều chỉnh đường dừng lỗ quá hung hăng. Các cài đặt không đúng của các tham số ADX và RSI cũng có thể bỏ lỡ cơ hội giao dịch hoặc làm tăng xác suất giao dịch sai. Điều này đòi hỏi phải kiểm tra hậu trường lịch sử rộng rãi để tìm các tham số tối ưu.

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

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

  1. Hãy thử các chỉ số đánh giá xu hướng khác như DMI và KDJ kết hợp với chỉ số Supertrend để tạo thành một hệ thống đánh giá nhiều yếu tố, có thể cải thiện độ chính xác đánh giá.

  2. Tăng mô-đun tối ưu hóa tham số thích nghi dựa trên máy học để tham số ATR, tham số ADX, tham số RSI v.v. có thể điều chỉnh theo thị trường thời gian thực thay vì các giá trị cố định.

  3. giới thiệu các chỉ số tâm lý để thay thế các chỉ số RSI để lọc tín hiệu. Các chỉ số RSI không hoạt động tốt trong điều kiện thị trường phức tạp, trong khi các chỉ số tâm lý xã hội có thể xác định tốt hơn sự nhiệt tình của thị trường.

  4. Tăng mô-đun quản lý kích thước vị trí. Theo khoảng cách giữa đường dừng và giá hiện tại, điều chỉnh kích thước vị trí một cách năng động. Càng xa đường dừng, kích thước vị trí càng lớn có thể được tăng phù hợp để cải thiện tiềm năng lợi nhuận.

Kết luận

Chiến lược Trailing Stop sử dụng các phương pháp như phân tích xu hướng, trailing stop và lọc đa yếu tố. Trong khi nắm bắt xu hướng, nó kiểm soát rủi ro nghiêm ngặt và là một chiến lược định lượng trưởng thành 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")





Thêm nữa