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

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

img

Tổng quan

Đây là một chiến lược đột phá dựa trên theo dõi xu hướng. nó mua sức mạnh khi một sự đột phá xảy ra và bán điểm yếu để theo dõi xu hướng.

Chiến lược logic

Chiến lược chủ yếu dựa trên hai chỉ số để xác định tín hiệu vào và ra - hàm cao nhất (định giá cao nhất trong một khoảng thời gian nhất định) và hàm thấp nhất (định giá thấp nhất trong một khoảng thời gian nhất định).

Khi giá đóng trên mức giá cao nhất trong một khoảng thời gian nhất định (công cụ highPeriod), nó được coi là một sự đột phá xu hướng tăng, do đó một tín hiệu dài được phát hành. Khi giá đóng dưới mức giá thấp nhất trong một khoảng thời gian nhất định (công cụ lowPeriod), nó được coi là một sự đột phá xu hướng giảm, do đó một tín hiệu ngắn được phát hành.

Chiến lược này cũng thiết lập một stop loss chuyển động và một stop loss cố định. Stop loss chuyển động dựa trên chỉ số ATR, được tính bằng giá trị ATR trong một khoảng thời gian nhất định nhân với một yếu tố (chỉ số trailingAtrMultiplier) là mức stop loss chuyển động. Stop loss cố định được tính tương tự dựa trên chỉ số ATR.

Sau khi đi dài hoặc ngắn, stop loss cố định có hiệu lực cho thanh đầu tiên; sau đó nó chuyển sang stop loss chủ yếu chuyển động.

Chiến lược cũng đặt ra các quy tắc để tính toán kích thước vị trí. Dựa trên tỷ lệ lỗ tối đa chấp nhận được, vốn hóa tài khoản vv, nó tính toán kích thước vị trí phù hợp. Nó cũng tính đến số lượng các công cụ giao dịch, giảm đúng kích thước vị trí cho mỗi công cụ.

Tóm lại, đây là một chiến lược breakout theo dõi xu hướng điển hình. Nó đi vào khi nó đánh giá một sự đột phá đã xảy ra, khóa lợi nhuận và theo dõi xu hướng thông qua dừng lỗ, và thoát ra khi xu hướng đảo ngược.

Phân tích lợi thế

Những lợi thế chính của chiến lược này là:

  1. Phân tích xu hướng chính xác. Sử dụng giá cao nhất và thấp nhất để xác định xem xu hướng có đảo ngược hay không, độ chính xác rất cao và tín hiệu sai là không có khả năng.

  2. Kích thước vị trí hợp lý và dừng lỗ. Cài đặt tỷ lệ phần trăm lỗ tối đa, liên kết vốn hóa tài khoản vv làm cho kích thước vị trí hợp lý, tránh giao dịch quá mức hoặc giao dịch không hiệu quả.

  3. Đơn giản và thực tế, dễ hiểu và sử dụng. Nó chỉ dựa trên các chỉ số cơ bản và logic là đơn giản, dễ hiểu.

  4. Khả năng mở rộng tốt. Các thông số chỉ số, quy tắc kích thước vị trí vv đều cung cấp các hộp đầu vào cho người dùng để điều chỉnh khi cần thiết.

Tóm lại, đây là một chiến lược thoát rất thực tế. an toàn và đáng tin cậy trong phán đoán, trong khi thiết kế xem xét kiểm soát rủi ro và theo dõi.

Phân tích rủi ro

Những rủi ro chính của chiến lược này là:

  1. Rủi ro đảo ngược xu hướng. Chiến lược đột phá phụ thuộc rất nhiều vào phán đoán xu hướng, nếu sai, bạn có thể phải đối mặt với những tổn thất lớn.

  2. Rủi ro tham số không chính xác. Nếu các tham số chu kỳ giá cao nhất / thấp nhất được chọn không chính xác, xu hướng có thể bị bỏ qua. Các tham số kích thước vị trí không chính xác có thể dẫn đến tổn thất quá lớn.

  3. Rủi ro dừng lỗ quá mạnh. Nếu khoảng cách dừng lỗ di chuyển quá nhỏ, tiếng ồn thị trường có thể đánh bại vị trí sớm.

Các giải pháp chính là:

  1. Thêm các bộ lọc xu hướng, chẳng hạn như các chỉ số bổ sung để kiểm tra các đột phá sai.

  2. Tối ưu hóa lựa chọn tham số thông qua các thử nghiệm ổn định.

  3. Thả lỏng khoảng cách dừng lỗ một cách thích hợp để chịu được sự khôi phục hợp lý.

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

Các hướng tối ưu hóa chính cho chiến lược này là:

  1. Thêm thêm các chỉ số để xác định xu hướng. Bên cạnh giá cao nhất / thấp nhất, các chỉ số như đường trung bình động cũng có thể được thêm để xác định xu hướng chính xác hơn.

  2. Tối ưu hóa cài đặt tham số. Kiểm tra và tìm kết hợp tối ưu cho các tham số như chu kỳ giá cao nhất / thấp nhất, nhân stop loss v.v.

  3. Điều chỉnh thuật toán kích thước vị trí dựa trên điều kiện thị trường. Ví dụ, kích thước vị trí thấp hơn khi biến động (ví dụ: VIX) tăng.

  4. Thêm bộ lọc âm lượng để xác nhận sự cố, để tránh sự cố sai.

  5. Xem xét chênh lệch và tương quan trong việc lựa chọn các công cụ giao dịch.

  6. Tối ưu hóa cơ chế dừng lỗ. Kiểm tra các thành phần khác nhau của các lỗ dừng di chuyển và cố định để làm cho các lỗ dừng ít hung hăng hơn.

Kết luận

Là một chiến lược breakout theo dõi xu hướng, chiến lược này hoạt động tốt về độ chính xác của phán đoán, kích thước vị trí và kiểm soát rủi ro, dễ dàng hoạt động vv. Nó nắm bắt xu hướng sớm và cân bằng việc kiếm lợi nhuận và theo dõi thông qua việc dừng lỗ.

Tất nhiên, như một chiến lược đột phá, nó phụ thuộc rất nhiều vào đánh giá xu hướng và dễ bị nhiễu nhiễu thị trường. Điều chỉnh tham số kém cũng có thể làm suy yếu hiệu suất.

Nhìn chung đây là một chiến lược rất thực tế. Cấu trúc cơ bản của nó đã chứa các thành phần quan trọng nhất cho một chiến lược lượng tử. Với việc tối ưu hóa và cải tiến liên tục, nó chắc chắn có thể trở thành một chiến lược tự động có lợi nhuận ổn định. Có giá trị cho lượng tử để nghiên cứu và tham khảo.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout",
     overlay=true)

// Risk for position and pyramid
maxriskval = input(2, "Max % risk", type = input.float,
     tooltip="Risk % over total equity / Position", group = "Risk Management")
pairnumber = input(title = "How many pairs",type = input.integer, defval= 1,
     tooltip="How many pairs are you trading with the strategy?", group = "Risk Management")

// Emtry Exit
highPeriod = input(title="Highest High Period", type=input.integer, defval=168
     , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)"
     , group = "Entry Condition")
lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168,
     tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)"
     , group = "Entry Condition")
// Stoploss
trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Trailing Stop. (Thick Green Line) "
     , group = "Exit Condition")
trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8
     , group = "Exit Condition")
fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)"
     , group = "Exit Condition")
fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2
     , group = "Exit Condition")
// Pair info 
pair = syminfo.basecurrency + syminfo.currency

// High Low Variable
highestHigh = highest(high, highPeriod)[1]
lowestLow = lowest(low, lowPeriod)[1]
trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier

// Trade Condition
longCondition = crossover(close, highestHigh) 
shortCondition = crossunder(close, lowestLow)

// Risk Variable
fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier
stopvaluelong = close[1] - fixAtr[1]
stopvalueshort = close[1] + fixAtr[1]

// Position size Long
maxpossize = strategy.equity / close 
positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) 
stopperclong = ((close - stopvaluelong) / close) * 100
leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2
posperclong =  (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber
realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close

// Position size Short
positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) 
stoppercshort = ((close - stopvalueshort) / close) * 100
leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2
pospercshort =  (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber
realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close

// Alert Message
entry_long_message = '\nGo Long for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(posperclong) +
                     '\nLeverage' + tostring(leveragelong) +
                     '\nStoploss Price =' + tostring(stopvaluelong) +
                     '\nClose any Short position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

entry_short_message ='\nGo Short for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(pospercshort) +
                     '\nLeverage' + tostring(leverageshort) +
                     '\nStoploss Price =' + tostring(stopvalueshort) +
                     '\nClose any Long position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_short_message = '\nExit Short for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_long_message = '\nExit Long for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'
// Order
if longCondition 
    strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong
     , alert_message = entry_long_message)
if shortCondition
    strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort
     , alert_message = entry_short_message)

// Stoploss Trailing
longTrailing = close - trailingAtr
shortTrailing = close + trailingAtr

var longTrailingStop = 0.0
var shortTrailingStop = 999999.9

trailingStopLine = 0.0
trailingStopLine := na
fixedStopLine = 0.0
fixedStopLine := na
var inTrade = 0
if longCondition or shortCondition
    if 0 == inTrade
        if longCondition
            inTrade := 1
        else
            inTrade := -1
if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop))
    inTrade := 0
if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop))
    inTrade := 0

longTrailingStop := if (1 == inTrade)
    stopValue = longTrailing
    max(stopValue, longTrailingStop[1])
else
    0

shortTrailingStop := if (-1 == inTrade)
    stopValue = shortTrailing
    min(stopValue, shortTrailingStop[1])
else
    999999

// Fix Stoploss
firstPrice = 0.0
firstFixAtr = 0.0
firstPrice := na
firstFixAtr := na
if 0 != inTrade
    firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0)
    firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0)
    if 1 == inTrade
        fixedStopLine := firstPrice - firstFixAtr
        trailingStopLine := longTrailingStop
    else
        fixedStopLine := firstPrice + firstFixAtr
        trailingStopLine := shortTrailingStop

if (strategy.position_size > 0)
    strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop)
     , alert_message = exit_long_message)

if (strategy.position_size < 0)
    strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop)
     , alert_message = exit_long_message)
    

// Plot
plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High')
plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low')
plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop')
plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')

Thêm nữa