Chiến lược siêu xu hướng


Ngày tạo: 2023-10-13 17:03:55 sửa đổi lần cuối: 2023-10-13 17:03:55
sao chép: 0 Số nhấp chuột: 718
1
tập trung vào
1617
Người theo dõi

Tổng quan

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

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

Chiến lược này đầu tiên tính toán ATR của tần số thực trung bình trong một khoảng thời gian nhất định. Sau đó tính toán đường dừng dài và đường dừng ngắn dựa trên giá trị ATR nhân với hệ số thu nhỏ. Các phương pháp tính toán cụ thể như sau:

atr = mult * atr(length) 

longStop = hl2 - atr

shortStop = hl2 + atr

Trong đó, length là độ dài chu kỳ tính toán của ATR, và mult là hệ số thu nhỏ của ATR.

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

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

Khi phá vỡ đường dừng đường dài, nó được coi là xu hướng chuyển đổi nhiều, khi phá vỡ đường dừng đường ngắn, nó được coi là xu hướng chuyển đổi.

Các tín hiệu mua và bán được tạo ra dựa trên sự thay đổi hướng của xu hướng:

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

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

Cuối cùng, thực hiện các hoạt động giao dịch tương ứng khi có tín hiệu mua và bán.

Lợi thế chiến lược

  1. Sử dụng chiều dài sóng thực trung bình để tính toán đường dừng, nó có thể loại bỏ 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. Các tham số chiến lược ít hơn, dễ hiểu và vận hành. Chu kỳ ATR và hệ số nhân có thể được điều chỉnh để phù hợp với môi trường thị trường khác nhau.

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

  4. Có thể cấu hình giao dịch nhiều hoặc hai chiều, đáp ứng phong cách giao dịch khác nhau.

  5. Có thể được sử dụng trong bất kỳ khoảng thời gian nào và áp dụng cho nhiều loại giao dịch.

Rủi ro chiến lược

  1. Trong trường hợp chấn động, giá trị ATR có thể được nâng cao, dẫn đến đường dừng quá rộng, tạo ra nhiều tín hiệu giả hơn.

  2. Không thể xác định được sự kết hợp tham số tối ưu, chu kỳ ATR và số lần cần được tối ưu hóa theo tình hình thị trường.

  3. Không thể xác định được chu kỳ giao dịch tốt nhất cho các loại giao dịch, cần thử nghiệm cho từng loại giao dịch.

  4. Không thể xác định thời gian nhập cảnh tốt nhất, có một số chậm trễ.

  5. Có một số rủi ro trống, có thể ở trong trạng thái trống khi xu hướng yếu hơn.

  6. Có nguy cơ phá vỡ mức dừng, nên nới lỏng mức dừng thích hợp.

Hướng tối ưu hóa chiến lược

  1. Bạn có thể xem xét việc lọc kết hợp với các chỉ số khác để tránh tín hiệu sai trong tình huống chấn động. Ví dụ: MACD, RSI, v.v.

  2. Có thể sử dụng học máy hoặc thuật toán di truyền để tìm kiếm sự kết hợp tham số tốt nhất.

  3. Các tham số có thể được tối ưu hóa cho các giống khác nhau để xác định chu kỳ ATR và hệ số nhân tối ưu.

  4. Có thể kết hợp các chỉ số về số lượng để xác định thời gian nhập học, chẳng hạn như số lượng giao dịch, tránh nhập học sớm.

  5. Bạn có thể xem xét sử dụng chiến lược khóa, giữ vị trí khi vị trí trống.

  6. Có thể mở rộng phạm vi dừng lỗ thích hợp và kết hợp với chỉ số cường độ xu hướng để tối ưu hóa vị trí dừng lỗ.

Tóm tắt

Chiến lược siêu xu hướng là một trong những chiến lược theo dõi xu hướng đáng tin cậy và có thể kiểm soát rủi ro hơn. Chiến lược này rất đơn giản và dễ sử dụng, phù hợp với nhiều loại giao dịch, nhưng cần được tối ưu hóa cho các tham số và quy tắc chiến lược để có hiệu quả tốt hơn trong các thị trường khác nhau.

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