Chiến lược SuperTrend

Tác giả:ChaoZhang, Ngày: 2023-10-13 17:03:55
Tags:

Tổng quan

Chiến lược siêu xu hướng là một chiến lược theo xu hướng dựa trên tính toán phạm vi trung bình thực sự. Nó sử dụng ATR để thiết lập các đường dừng lỗ và xác định hướng xu hướng bằng cách đánh giá liệu giá có phá vỡ các đường dừng lỗ hay không, do đó tạo ra các tín hiệu giao dịch.

Chiến lược logic

Chiến lược này đầu tiên tính toán phạm vi trung bình thực sự (ATR) trong một khoảng thời gian nhất định. Sau đó nó sử dụng giá trị ATR nhân với một yếu tố mở rộng để tính toán đường dừng lỗ dài và đường dừng lỗ ngắn.

atr = mult * atr(length)

longStop = hl2 - atr 

shortStop = hl2 + atr

Trong đó length là khoảng thời gian để tính ATR, và mult là hệ số mở rộng cho ATR.

Sau khi tính toán các đường dừng lỗ, chiến lược tiếp tục đánh giá liệu giá có phá vỡ đường dừng lỗ của thanh trước để xác định hướng xu hướng:

dir := dir == -1 and close > shortStopPrev ? 1 :  
         dir == 1 and close < longStopPrev ? -1 : dir

Khi đường dừng lỗ dài bị phá vỡ, xu hướng được coi là tăng. Khi đường dừng lỗ ngắn bị phá vỡ, xu hướng được coi là giảm.

Theo sự thay đổi hướng xu hướng, các tín hiệu mua và bán được tạo ra:

buySignal = dir == 1 and dir[1] == -1

sellSignal = dir == -1 and dir[1] == 1 

Cuối cùng, các hành động giao dịch tương ứng được thực hiện khi tín hiệu mua hoặc bán xuất hiện.

Ưu điểm

  1. Sử dụng ATR để tính toán các đường dừng lỗ có thể lọc hiệu quả tiếng ồn thị trường và nắm bắt các tín hiệu xu hướng đáng tin cậy hơn.

  2. Chiến lược có một số tham số dễ hiểu và hoạt động. Thời gian ATR và nhân có thể được điều chỉnh để thích nghi với các điều kiện thị trường khác nhau.

  3. Sử dụng đột phá đường dừng lỗ để xác định sự thay đổi hướng xu hướng có thể kiểm soát hiệu quả rủi ro và dừng lỗ kịp thời.

  4. Có thể cấu hình cho giao dịch chỉ dài hoặc hai hướng để phù hợp với các phong cách giao dịch khác nhau.

  5. Có thể được sử dụng trong bất kỳ khung thời gian nào và cho các công cụ giao dịch khác nhau.

Rủi ro

  1. Trong các thị trường dao động, ATR có thể được kéo cao hơn dẫn đến stop loss rộng hơn và nhiều tín hiệu sai hơn.

  2. Sự kết hợp thông số tối ưu là không chắc chắn. Thời gian ATR và nhân cần tối ưu hóa dựa trên điều kiện thị trường.

  3. Khung thời gian tối ưu cho mỗi công cụ giao dịch là không rõ và cần phải được thử nghiệm.

  4. Thời gian vào tốt nhất là không rõ ràng và một số sự chậm trễ tồn tại.

  5. Có những rủi ro không có mặt trên thị trường khi xu hướng yếu.

  6. Có những rủi ro của việc dừng lỗ bị tấn công.

Tăng cường

  1. Các chỉ số khác như MACD, RSI có thể được kết hợp để lọc để tránh các tín hiệu sai trong các thị trường khác nhau.

  2. Học máy hoặc thuật toán di truyền có thể được sử dụng để tìm các tập hợp tham số tối ưu.

  3. Tối ưu hóa tham số có thể được thực hiện cho mỗi thiết bị để tìm ra khoảng thời gian ATR và nhân tốt nhất.

  4. Các chỉ số khối lượng có thể được sử dụng để xác định thời gian nhập khẩu tốt hơn và tránh nhập khẩu sớm.

  5. Xem xét việc sử dụng các chiến lược khóa để giữ các vị trí khi không có mặt trên thị trường.

  6. Chiều rộng dừng lỗ có thể được thư giãn và tối ưu hóa với các chỉ số sức mạnh xu hướng.

Kết luận

Chiến lược SuperTrend sử dụng các đường dừng lỗ năng động được tính từ ATR để phát hiện những thay đổi xu hướng khi giá đột phá xảy ra. Đây là một hệ thống theo xu hướng tương đối đáng tin cậy và kiểm soát rủi ro. Chiến lược này rất đơn giản để sử dụng và áp dụng cho các công cụ khác nhau, nhưng các tham số và quy tắc cần tối ưu hóa để có hiệu suất tốt hơn trên các thị trường khác nhau. Kết hợp với các chỉ số và chiến lược kỹ thuật khác có thể cải thiện hơn nữa kết quả giao dịch. Nói chung, SuperTrend dựa trên các khái niệm hợp lý về mặt khoa học và đáng để các nhà giao dịch nghiên cứu và áp dụng thêm.


/*backtest
start: 2023-09-12 00:00:00
end: 2023-10-12 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// strategy("SuperTrend Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000)

LongOnly = input(title="Long Only ?", type=input.bool, defval=true)
length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=true)

////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2019, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2020, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true

////////////////////////////////////////////////////////////////////////////////


atr = mult * atr(length)

longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 : 
   dir == 1 and close < longStopPrev ? -1 : dir

longColor = color.green
shortColor = color.red


plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)

plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)

if LongOnly
    if buySignal and time_cond
        strategy.entry("Long", strategy.long, comment="Long")
    
    if(sellSignal and time_cond)
        strategy.close("Long")
else
    if buySignal and time_cond
        strategy.entry("Long", strategy.long, comment="Long")
    else
        strategy.cancel("Long")
    
    
    if sellSignal and time_cond
        strategy.entry("Short", strategy.short, comment="Short")
    else
        strategy.cancel("Short")

if not time_cond
    strategy.close_all()


Thêm nữa