Sumber daya yang dimuat... Pemuatan...

Strategi perdagangan kuantitatif RSI dinamis dengan crossover rata-rata bergerak ganda

Penulis:ChaoZhang, Tanggal: 2025-01-17 16:14:38
Tag:RSIMASMAEMAWMASMMARMA

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

Gambaran umum

Ini adalah strategi perdagangan kuantitatif yang menggabungkan Indeks Kekuatan Relatif (RSI) dengan beberapa rata-rata bergerak. Strategi ini terutama mengidentifikasi tren pasar dengan memantau sinyal silang antara berbagai jenis rata-rata bergerak (termasuk SMA, EMA, WMA, dan SMMA) pada indikator RSI, sambil menggunakan zona overbought dan oversold RSI sebagai kriteria keputusan tambahan.

Prinsip Strategi

Strategi ini mencakup beberapa langkah perhitungan utama: 1. Hitung RSI 14 periode dengan tingkat overbought pada 70 dan level oversold pada 30 2. Menghitung tiga rata-rata bergerak yang berbeda pada kurva RSI: - MA1: 20 periode, pilihan SMA/EMA/WMA/SMMA - MA2: 50 periode, pilihan SMA/EMA/WMA/SMMA - MA3: 100 periode, pilihan SMA/EMA/WMA/SMMA 3. Aturan pembuatan sinyal perdagangan: - Sinyal beli: Ketika MA2 melintasi di atas MA3 - Sinyal jual: Ketika MA2 melintasi di bawah MA3 4. Pada saat yang sama mendeteksi divergensi RSI untuk referensi tambahan

Keuntungan Strategi

  1. Validasi silang beberapa indikator teknis meningkatkan keandalan sinyal
  2. Jenis dan parameter rata-rata bergerak yang fleksibel
  3. Deteksi divergensi RSI membantu mengidentifikasi titik balik pasar lebih awal
  4. Manajemen posisi berdasarkan persentase untuk pengendalian risiko yang efektif
  5. Visualisasi yang sangat baik untuk analisis dan backtesting

Risiko Strategi

  1. Rata-rata bergerak crossover mungkin memiliki efek lag
  2. Sinyal palsu mungkin terjadi di pasar yang berbeda
  3. Distorsi RSI dalam kondisi pasar tertentu
  4. Pemilihan parameter yang tidak tepat dapat menyebabkan sinyal perdagangan yang berlebihan atau tidak cukup Pengurangan risiko:
  • Merekomendasikan penanda silang dengan tren pasar dan volume
  • Mengoptimalkan frekuensi perdagangan melalui penyesuaian parameter rata-rata bergerak
  • Tentukan tingkat stop loss dan take profit untuk pengendalian risiko

Arah Optimasi Strategi

  1. Optimasi penyaringan sinyal:
  • Tambahkan indikator konfirmasi tren
  • Masukkan analisis volume
  1. Optimasi parameter dinamis:
  • Mengatur secara otomatis parameter RSI dan MA berdasarkan volatilitas pasar
  • Memperkenalkan metode perhitungan periode adaptatif
  1. Optimasi pengendalian risiko:
  • Mengembangkan mekanisme stop loss dan take profit yang dinamis
  • Desain sistem manajemen posisi dinamis

Ringkasan

Strategi ini membangun sistem perdagangan adaptif dengan menggabungkan RSI dan beberapa rata-rata bergerak. Keuntungannya utama terletak pada validasi silang dari beberapa indikator teknis dan konfigurasi parameter yang fleksibel, sementara perhatian harus diberikan pada lag rata-rata bergerak dan dampak kondisi pasar pada kinerja strategi.


/*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 -----


Berkaitan

Lebih banyak