Chiến lược giao dịch định lượng tham số động RSI hỗ trợ giao cắt trung bình động nhiều lần

RSI MA SMA EMA WMA SMMA RMA
Ngày tạo: 2025-01-17 16:14:38 sửa đổi lần cuối: 2025-01-17 16:14:38
sao chép: 1 Số nhấp chuột: 410
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch định lượng tham số động RSI hỗ trợ giao cắt trung bình động nhiều lần

Tổng quan

Đây là 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 này 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 giao nhau của các loại đường trung bình động khác nhau (bao gồm SMA, EMA, WMA và SMMA) trên chỉ báo RSI và kết hợp các phạm vi quá mua và quá bán của chính chỉ báo RSI làm cơ sở phụ trợ cho phán đoán, để xác định xu hướng thị trường. Thời điểm giao dịch.

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

Chiến lược này chủ yếu bao gồm các bước tính toán chính sau đây:

  1. Tính toán chỉ báo RSI 14 kỳ, đặt vùng quá mua là 70 và vùng quá bán là 30
  2. Tính ba đường trung bình động có các tham số khác nhau trên đường cong RSI:
    • MA1: 20 chu kỳ, tùy chọn SMA/EMA/WMA/SMMA
    • MA2: chu kỳ 50, tùy chọn SMA/EMA/WMA/SMMA
    • MA3: chu kỳ 100, tùy chọn SMA/EMA/WMA/SMMA
  3. Quy tắc tạo tín hiệu giao dịch:
    • Tín hiệu mua: Khi MA2 cắt MA3 hướng lên
    • Tín hiệu bán: Khi MA2 cắt MA3 hướng xuống
  4. Đồng thời, phát hiện độ lệch của chỉ báo RSI để cung cấp tham chiếu phụ trợ cho các quyết định giao dịch

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

  1. Nhiều chỉ báo kỹ thuật xác thực chéo để cải thiện độ tin cậy của tín hiệu giao dịch
  2. Loại và thông số trung bình động có thể điều chỉnh được, có tính linh hoạt cao
  3. Chức năng phát hiện phân kỳ RSI có thể giúp phát hiện các điểm đảo chiều của thị trường trước
  4. Sử dụng quản lý vị thế phần trăm để kiểm soát rủi ro hiệu quả
  5. Hiệu ứng trực quan tuyệt vời, dễ phân tích và kiểm tra ngược

Rủi ro chiến lược

  1. Sự giao thoa của đường trung bình động có thể có tác động trễ
  2. Tín hiệu sai thường xuyên có thể xảy ra ở thị trường đi ngang
  3. Sự biến dạng của chỉ báo RSI trong một số điều kiện thị trường nhất định
  4. Việc lựa chọn tham số không phù hợp có thể dẫn đến quá nhiều hoặc quá ít tín hiệu giao dịch Giải pháp thay thế:
  • Nên kết hợp xu hướng thị trường và khối lượng giao dịch để xác thực chéo
  • Tần suất giao dịch có thể được tối ưu hóa bằng cách điều chỉnh các tham số trung bình động
  • Đặt lệnh dừng lỗ và chốt lời để kiểm soát rủi ro

Hướng 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ỉ báo xác nhận xu hướng
  • Thêm phân tích khối lượng
  1. Tối ưu hóa động các tham số:
  • Tự động điều chỉnh các thông số RSI và MA theo biến động của thị trường
  • Giới thiệu phương pháp tính toán chu kỳ thích ứng
  1. Tối ưu hóa kiểm soát rủi ro:
  • Phát triển cơ chế dừng lỗ và chốt lời năng động
  • Thiết kế hệ thống quản lý kho năng động

Tóm tắt

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

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