Tài nguyên đang được tải lên... tải...

Chiến lược giao dịch định lượng RSI năng động với Crossover đa đường trung bình động

Tác giả:ChaoZhang, Ngày: 2025-01-17 16:14:38
Tags:RSIMASMAEMAWMASMMARMA

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

Tổng quan

Đây là một chiến lược giao dịch định lượng kết hợp chỉ số sức mạnh tương đối (RSI) với nhiều đường trung bình động. Chiến lược chủ yếu xác định xu hướng thị trường bằng cách theo dõi các tín hiệu chéo giữa các loại đường trung bình động khác nhau (bao gồm SMA, EMA, WMA và SMMA) trên chỉ số RSI, trong khi sử dụng các vùng mua quá mức và bán quá mức RSI như các tiêu chí quyết định bổ sung.

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

Chiến lược bao gồm một số bước tính toán chính: 1. Tính toán chỉ số RSI 14 giai đoạn với mức mua quá mức ở 70 và mức bán quá mức ở 30 2. Tính toán ba trung bình động khác nhau trên đường cong RSI: - MA1: 20 giai đoạn, lựa chọn SMA/EMA/WMA/SMMA - MA2: 50 thời gian, lựa chọn SMA/EMA/WMA/SMMA - MA3: Thời gian 100, lựa chọn SMA/EMA/WMA/SMMA 3. Quy tắc tạo tín hiệu giao dịch: - Báo hiệu mua: Khi MA2 vượt trên MA3 - Sản xuất tín hiệu: Khi MA2 vượt qua dưới MA3 4. Đồng thời phát hiện sự khác biệt của chỉ số RSI để tham khảo thêm

Ưu điểm chiến lược

  1. Xác nhận chéo nhiều chỉ số kỹ thuật cải thiện độ tin cậy tín hiệu
  2. Các loại và tham số trung bình động linh hoạt
  3. Phát hiện sự khác biệt RSI giúp xác định sớm các điểm chuyển đổi thị trường
  4. Quản lý vị thế dựa trên tỷ lệ phần trăm để kiểm soát rủi ro hiệu quả
  5. Hiển thị xuất sắc cho phân tích và backtesting

Rủi ro chiến lược

  1. Các đường chéo trung bình động có thể có tác dụng chậm trễ
  2. Các tín hiệu sai có thể xảy ra trên các thị trường khác nhau
  3. Sự biến dạng RSI trong điều kiện thị trường nhất định
  4. Chọn tham số không chính xác có thể dẫn đến tín hiệu giao dịch quá mức hoặc không đủ Giảm rủi ro:
  • Đề nghị xác nhận chéo với xu hướng thị trường và khối lượng
  • Tối ưu hóa tần suất giao dịch thông qua điều chỉnh tham số trung bình động
  • Đặt mức dừng lỗ và lấy lợi nhuận để kiểm soát rủi ro

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

  1. Tối ưu hóa lọc tín hiệu:
  • Thêm các chỉ số xác nhận xu hướng
  • Bao gồm phân tích khối lượng
  1. Parameter tối ưu hóa động:
  • Tự động điều chỉnh các thông số RSI và MA dựa trên biến động thị trường
  • Đưa ra các phương pháp tính toán thời gian thích nghi
  1. Tối ưu hóa kiểm soát rủi ro:
  • Phát triển các cơ chế dừng lỗ và lấy lợi nhuận năng động
  • Thiết kế hệ thống quản lý vị trí động

Tóm lại

Chiến lược này xây dựng một hệ thống giao dịch thích nghi bằng cách kết hợp chỉ số RSI và nhiều đường trung bình động. Ưu điểm cốt lõi của nó nằm trong việc xác nhận chéo của nhiều chỉ số kỹ thuật và cấu hình tham số linh hoạt, trong khi phải chú ý đến sự chậm trễ của đường trung bình động và tác động của điều kiện thị trường đối với hiệu suất chiến lược. Thông qua tối ưu hóa liên tục và kiểm soát rủi ro, chiến lược này cho thấy hứa hẹn cho hiệu suất ổn định trong giao dịch thực tế.


/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy(title="Relative Strength Index with MA Strategy", shorttitle="RSI-MA Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=200)

// RSI Inputs
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
calculateDivergence = input.bool(false, title="Calculate Divergence", group="RSI Settings", tooltip="Calculating divergences is needed in order for divergence alerts to fire.")

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

// RSI Plot
plot(rsi, "RSI", color=#7E57C2)
hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
hline(30, "RSI Lower Band", color=#787B86)
fill(hline(70), hline(30), color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")

// RSI-based MA Inputs
grpRSIMovingAverages = "RSI Moving Averages"
ma1Length = input.int(20, title="MA1 Length", group=grpRSIMovingAverages)
ma2Length = input.int(50, title="MA2 Length", group=grpRSIMovingAverages)
ma3Length = input.int(100, title="MA3 Length", group=grpRSIMovingAverages)
ma1Type = input.string("SMA", title="MA1 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)
ma2Type = input.string("EMA", title="MA2 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)
ma3Type = input.string("WMA", title="MA3 Type", options=["SMA", "EMA", "WMA", "SMMA"], group=grpRSIMovingAverages)

// MA Calculation Function
calcMA(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "WMA" => ta.wma(source, length)
        "SMMA" => ta.rma(source, length)

// MA Calculations
ma1 = calcMA(rsi, ma1Length, ma1Type)
ma2 = calcMA(rsi, ma2Length, ma2Type)
ma3 = calcMA(rsi, ma3Length, ma3Type)

// MA Plots
plot(ma1, title="RSI MA1", color=color.blue)
plot(ma2, title="RSI MA2", color=color.green)
plot(ma3, title="RSI MA3", color=color.red)

// Divergence (Retained from original script)
lookbackRight = 5
lookbackLeft = 5
rangeUpper = 60
rangeLower = 5
bearColor = color.red
bullColor = color.green
textColor = color.white
noneColor = color.new(color.white, 100)

_inRange(bool cond) =>
    bars = ta.barssince(cond)
    rangeLower <= bars and bars <= rangeUpper

plFound = false
phFound = false

bullCond = false
bearCond = false

rsiLBR = rsi[lookbackRight]

if calculateDivergence
    // Regular Bullish
    plFound := not na(ta.pivotlow(rsi, lookbackLeft, lookbackRight))    
    rsiHL = rsiLBR > ta.valuewhen(plFound, rsiLBR, 1) and _inRange(plFound[1])
    lowLBR = low[lookbackRight]
    priceLL = lowLBR < ta.valuewhen(plFound, lowLBR, 1)
    bullCond := priceLL and rsiHL and plFound

    // Regular Bearish
    phFound := not na(ta.pivothigh(rsi, lookbackLeft, lookbackRight))
    rsiLH = rsiLBR < ta.valuewhen(phFound, rsiLBR, 1) and _inRange(phFound[1])
    highLBR = high[lookbackRight]
    priceHH = highLBR > ta.valuewhen(phFound, highLBR, 1)
    bearCond := priceHH and rsiLH and phFound

// plot(
//      plFound ? rsiLBR : na,
//      offset=-lookbackRight,
//      title="Regular Bullish",
//      linewidth=2,
//      color=(bullCond ? bullColor : noneColor),
//      display = display.pane
//      )

plotshape(
     bullCond ? rsiLBR : na,
     offset=-lookbackRight,
     title="Regular Bullish Label",
     text=" Bull ",
     style=shape.labelup,
     location=location.absolute,
     color=bullColor,
     textcolor=textColor
     )

// plot(
//      phFound ? rsiLBR : na,
//      offset=-lookbackRight,
//      title="Regular Bearish",
//      linewidth=2,
//      color=(bearCond ? bearColor : noneColor),
//      display = display.pane
//      )

plotshape(
     bearCond ? rsiLBR : na,
     offset=-lookbackRight,
     title="Regular Bearish Label",
     text=" Bear ",
     style=shape.labeldown,
     location=location.absolute,
     color=bearColor,
     textcolor=textColor
     )

alertcondition(bullCond, title='Regular Bullish Divergence', message="Found a new Regular Bullish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.")
alertcondition(bearCond, title='Regular Bearish Divergence', message='Found a new Regular Bearish Divergence, `Pivot Lookback Right` number of bars to the left of the current bar.')

// ----- MUA/BÁN -----

// Điều kiện Mua: MA2 cắt lên MA3 và MA3 < 55
buyCondition = ta.crossover(ma2, ma3) 

// Điều kiện Bán: MA2 cắt xuống MA3 và MA3 > 40
sellCondition = ta.crossunder(ma2, ma3)

// Thực hiện lệnh Mua/Bán
if (buyCondition)
    strategy.entry("Buy", strategy.long, comment="Buy Signal")

if (sellCondition)
    strategy.close("Buy", comment="Sell Signal")



// ----- KẾT THÚC -----


Có liên quan

Thêm nữa