Chiến lược định lượng phân kỳ động RSI

RSI ATR SL/TP risk management DIVERGENCE Pivot
Ngày tạo: 2025-04-25 14:57:31 sửa đổi lần cuối: 2025-04-25 14:57:31
sao chép: 0 Số nhấp chuột: 455
2
tập trung vào
319
Người theo dõi

Chiến lược định lượng phân kỳ động RSI Chiến lược định lượng phân kỳ động RSI

Tổng quan

Chiến lược định lượng lệch hai trục RSI là một chiến lược giao dịch cao cấp để xác định các cơ hội đảo ngược tiềm năng bằng cách phát hiện hành vi giá và đà tăng và giảm thông thường giữa chỉ số tương đối mạnh ((RSI)). Chiến lược này sử dụng thuật toán phát hiện điểm trung tâm tự động, kết hợp hai phương pháp quản lý dừng / dừng khác nhau để tự động thiết lập vị trí khi xác nhận tín hiệu lệch.

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

  1. Mô-đun tính toán RSI: Sử dụng phương pháp Wilder Smooth để tính toán giá trị RSI 14 chu kỳ, sử dụng giá đóng cửa như nguồn đầu vào mặc định.
  2. Xác định điểm trung tâm:
    • Sử dụng cửa sổ trượt 5 chu kỳ (được điều chỉnh) để phát hiện các điểm cao và thấp của chỉ số RSI
    • Sử dụng hàm ta.barssince để đảm bảo khoảng cách giữa các điểm trục là 5 - 60 đường K (range có thể điều chỉnh)
  3. Không có gì là chính xác.
    • Đánh giá: Giá sáng tạo thấp và RSI hình thành mức thấp cao hơn
    • Giảm giá quay trở lại: Giá sáng tạo cao và RSI hình thành điểm cao thấp hơn
  4. Hệ thống thực hiện giao dịch:
    • Sử dụng cơ chế dừng hai chế độ: dựa trên 20 chu kỳ gần đây ((được điều chỉnh) điểm dao động hoặc cường độ dao động của ATR
    • Tính toán dừng động: tỷ lệ rủi ro cho lợi nhuận theo số tiền rủi ro nhân với tỷ lệ rủi ro dự kiến (bằng mặc định 2: 1)
  5. Hệ thống hiển thị: đánh dấu trên biểu đồ tất cả các tín hiệu lệch hiệu quả và hiển thị trong thời gian thực các đường ngang của lệnh dừng (đỏ) và dừng (xanh) của vị trí hiện tại.

Phân tích lợi thế

  1. Cơ chế xác minh đa chiều: yêu cầu giá cả và RSI phải đáp ứng cùng một hình thức cụ thể, và khoảng thời gian trong phạm vi cài đặt, làm giảm đáng kể khả năng tín hiệu giả.
  2. Quản lý rủi ro tự điều chỉnh:
    • Mô hình điểm dao động phù hợp với thị trường xu hướng, có thể nắm bắt hiệu quả các hoạt động của băng tần
    • Mô hình ATR phù hợp với thị trường bất ổn, tự động điều chỉnh mức dừng tùy theo biến động
  3. Các tham số có thể được cấu hình cao: Tất cả các tham số quan trọng (chu kỳ RSI, phạm vi kiểm tra trục chính, tỷ lệ lợi nhuận rủi ro, v.v.) có thể được điều chỉnh theo đặc điểm của thị trường.
  4. Quản lý tài chính khoa học: 10% tỷ lệ vị trí được sử dụng mặc định để ngăn chặn việc giao dịch một lần có thể gây rủi ro quá mức.
  5. Trả lời trực quan trong thời gian thực: hỗ trợ quyết định giao dịch trực quan thông qua biểu đồ và đường dừng / dừng động.

Phân tích rủi ro

  1. Rủi ro tụt hậu: RSI là chỉ số tụt hậu, có thể tạo ra tín hiệu chậm trễ trong tình huống đơn phương mạnh mẽ. Giải pháp giảm nhẹ: kết hợp bộ lọc xu hướng hoặc rút ngắn chu kỳ RSI.
  2. Rủi ro thị trường chấn động: có thể tạo ra các tín hiệu giả liên tục khi không có xu hướng rõ ràng. Giải pháp giảm thiểu: bật chế độ ATR và tăng số nhân, hoặc thêm bộ lọc tỷ lệ dao động.
  3. Rủi ro quá phù hợp của tham số: Một tập hợp tham số cụ thể có thể hoạt động tốt trong dữ liệu lịch sử nhưng không hoạt động trên đĩa thật. Giải pháp giảm thiểu: Thực hiện thử nghiệm áp lực đa chu kỳ đa giống.
  4. Rủi ro thị trường cực đoan: lỗ hổng nhảy vọt có thể dẫn đến hiệu quả dừng lỗ. Giải pháp giảm thiểu: tránh giao dịch trước và sau một sự kiện kinh tế lớn hoặc sử dụng bảo hiểm quyền chọn.
  5. Tùy thuộc khung thời gian: Hiệu suất khác nhau trong các chu kỳ thời gian khác nhau. Giải pháp giảm nhẹ: Tối ưu hóa phản hồi đầy đủ trong khung thời gian mục tiêu.

Hướng tối ưu hóa

  1. Xác nhận chỉ số tổng hợp: Thêm MACD hoặc chỉ số khối lượng giao dịch làm xác nhận thứ hai, nâng cao chất lượng tín hiệu.
  2. Điều chỉnh tham số động: Điều chỉnh tự động chu kỳ RSI và ATR theo biến động thị trường.
  3. Tối ưu hóa học máy: Tối ưu hóa các tham số quan trọng bằng thuật toán di truyền.
  4. Phân tích nhiều khung thời gian: lọc hướng xu hướng trong các khung thời gian cao hơn.
  5. Quản lý vị trí động: Điều chỉnh kích thước vị trí theo tỷ lệ biến động, để đạt được sự cân bằng rủi ro.
  6. Bộ lọc sự kiện: tích hợp dữ liệu lịch kinh tế, tránh các giao dịch trước và sau khi dữ liệu quan trọng được công bố.

Tóm tắt

Chiến lược định lượng lệch hai trục RSI cung cấp một phương pháp giao dịch đảo ngược có cấu trúc thông qua nhận dạng lệch hệ thống và quản lý rủi ro nghiêm ngặt. Giá trị cốt lõi của nó là chuyển đổi các khái niệm phân tích kỹ thuật truyền thống thành các quy tắc giao dịch có thể đo lường được và thích ứng với các môi trường thị trường khác nhau thông qua cơ chế dừng lỗ hai mô hình. Chiến lược hoạt động tốt đòi hỏi ba yếu tố quan trọng: tối ưu hóa tham số thích hợp, kiểm soát rủi ro nghiêm ngặt và kỷ luật thực hiện nhất quán. Chiến lược này đặc biệt phù hợp với môi trường thị trường có một số biến động nhưng không có xu hướng cực đoan, là mô hình tuyệt vời cho các nhà giao dịch trung cấp chuyển sang định lượng giao dịch.

Mã nguồn chiến lược
/*backtest
start: 2024-04-25 00:00:00
end: 2025-04-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=6
strategy("RSI Divergence Strategy - AliferCrypto", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// === RSI Settings ===
rsiLength      = input.int(14, minval=1, title="RSI Length", group="RSI Settings", tooltip="Number of periods for RSI calculation")
rsiSource      = input.source(close, title="RSI Source", group="RSI Settings", tooltip="Price source used for RSI calculation")

// === Divergence Settings ===
lookLeft       = input.int(5, minval=1, title="Pivot Lookback Left", group="Divergence Settings", tooltip="Bars to the left for pivot detection")
lookRight      = input.int(5, minval=1, title="Pivot Lookback Right", group="Divergence Settings", tooltip="Bars to the right for pivot detection")
rangeLower     = input.int(5, minval=1, title="Min Bars Between Pivots", group="Divergence Settings", tooltip="Minimum bars between pivots to validate divergence")
rangeUpper     = input.int(60, minval=1, title="Max Bars Between Pivots", group="Divergence Settings", tooltip="Maximum bars between pivots to validate divergence")

// === SL/TP Method ===
method         = input.string("Swing", title="SL/TP Method", options=["Swing", "ATR"], group="SL/TP Settings", tooltip="Choose between swing-based or ATR-based stop and target")

// === Swing Settings ===
swingLook      = input.int(20, minval=1, title="Swing Lookback (bars)", group="Swing Settings", tooltip="Bars to look back for swing high/low")
swingMarginPct = input.float(1.0, minval=0.0, title="Swing Margin (%)", group="Swing Settings", tooltip="Margin around swing levels as percentage of price")
rrSwing        = input.float(2.0, title="R/R Ratio (Swing)", group="Swing Settings", tooltip="Risk/reward ratio when using swing-based method")

// === ATR Settings ===
atrLen         = input.int(14, minval=1, title="ATR Length", group="ATR Settings", tooltip="Number of periods for ATR calculation")
atrMult        = input.float(1.5, minval=0.1, title="ATR SL Multiplier", group="ATR Settings", tooltip="Multiplier for ATR-based stop loss calculation")
rrAtr          = input.float(2.0, title="R/R Ratio (ATR)", group="ATR Settings", tooltip="Risk/reward ratio when using ATR-based method")

// === RSI Calculation ===
_d    = ta.change(rsiSource)
up    = ta.rma(math.max(_d, 0), rsiLength)
down  = ta.rma(-math.min(_d, 0), rsiLength)
rsi   = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

// === Divergence Detection ===
defPl      = not na(ta.pivotlow(rsi, lookLeft, lookRight))
defPh      = not na(ta.pivothigh(rsi, lookLeft, lookRight))
rsiAtRR   = rsi[lookRight]
barsPl    = ta.barssince(defPl)
barsPl1   = barsPl[1]
inRangePL = barsPl1 >= rangeLower and barsPl1 <= rangeUpper
barsPh    = ta.barssince(defPh)
barsPh1   = barsPh[1]
inRangePH = barsPh1 >= rangeLower and barsPh1 <= rangeUpper
prevPlRsi   = ta.valuewhen(defPl, rsiAtRR, 1)
prevPhRsi   = ta.valuewhen(defPh, rsiAtRR, 1)
prevPlPrice = ta.valuewhen(defPl, low[lookRight], 1)
prevPhPrice = ta.valuewhen(defPh, high[lookRight], 1)
bullCond    = defPl and low[lookRight] < prevPlPrice and rsiAtRR > prevPlRsi and inRangePL
bearCond    = defPh and high[lookRight] > prevPhPrice and rsiAtRR < prevPhRsi and inRangePH

plotshape(bullCond, title="Bullish Divergence", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny)
plotshape(bearCond, title="Bearish Divergence", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny)

// === Entries ===
if bullCond
    strategy.entry("Long", strategy.long)
if bearCond
    strategy.entry("Short", strategy.short)

// === Pre-calculate SL/TP components ===
swingLow    = ta.lowest(low, swingLook)
swingHigh   = ta.highest(high, swingLook)
atrValue    = ta.atr(atrLen)

// === SL/TP Calculation & Exits ===
var float slPrice = na
var float tpPrice = na
var float rr      = na

// Long exits
if strategy.position_size > 0
    entryPrice = strategy.position_avg_price
    if method == "Swing"
        slPrice := swingLow * (1 - swingMarginPct / 100)
        rr      := rrSwing
    else
        slPrice := entryPrice - atrValue * atrMult
        rr      := rrAtr
    risk     = entryPrice - slPrice
    tpPrice  := entryPrice + risk * rr
    strategy.exit("Exit Long", from_entry="Long", stop=slPrice, limit=tpPrice)

// Short exits
if strategy.position_size < 0
    entryPrice = strategy.position_avg_price
    if method == "Swing"
        slPrice := swingHigh * (1 + swingMarginPct / 100)
        rr      := rrSwing
    else
        slPrice := entryPrice + atrValue * atrMult
        rr      := rrAtr
    risk     = slPrice - entryPrice
    tpPrice  := entryPrice - risk * rr
    strategy.exit("Exit Short", from_entry="Short", stop=slPrice, limit=tpPrice)

// === Plot SL/TP Levels ===
plot(strategy.position_size != 0 ? slPrice : na, title="Stop Loss", style=plot.style_linebr, color=color.red)
plot(strategy.position_size != 0 ? tpPrice : na, title="Take Profit", style=plot.style_linebr, color=color.green)

// === Alerts ===
alertcondition(bullCond, title="Bull RSI Divergence", message="Bullish RSI divergence detected")
alertcondition(bearCond, title="Bear RSI Divergence", message="Bearish RSI divergence detected")