Sumber dimuat naik... memuat...

Strategi Dagangan Kuantitatif RSI Dinamis dengan Crossover Purata Bergerak Berganda

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

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

Ringkasan

Ini adalah strategi perdagangan kuantitatif yang menggabungkan Indeks Kekuatan Relatif (RSI) dengan pelbagai purata bergerak. Strategi ini terutamanya mengenal pasti trend pasaran dengan memantau isyarat silang antara pelbagai jenis purata bergerak (termasuk SMA, EMA, WMA, dan SMMA) pada penunjuk RSI, sambil menggunakan zon overbought dan oversold RSI sebagai kriteria keputusan tambahan.

Prinsip Strategi

Strategi ini merangkumi beberapa langkah pengiraan utama: 1. Mengira RSI 14 tempoh dengan tahap overbought pada 70 dan tahap oversold pada 30 2. Hitung tiga purata bergerak yang berbeza pada lengkung RSI: - MA1: tempoh 20, pilihan SMA/EMA/WMA/SMMA - MA2: tempoh 50, pilihan SMA/EMA/WMA/SMMA - MA3: 100 tempoh, pilihan SMA/EMA/WMA/SMMA 3. Peraturan penjanaan isyarat dagangan: - Isyarat beli: Apabila MA2 melintasi di atas MA3 - Isyarat jual: Apabila MA2 melintasi di bawah MA3 4. Pada masa yang sama mengesan perbezaan RSI untuk rujukan tambahan

Kelebihan Strategi

  1. Penanda teknikal berbilang penanda silang meningkatkan kebolehpercayaan isyarat
  2. Jenis dan parameter purata bergerak yang fleksibel
  3. Pengesanan perbezaan RSI membantu mengenal pasti titik perubahan pasaran lebih awal
  4. Pengurusan kedudukan berasaskan peratusan untuk kawalan risiko yang berkesan
  5. Visualisasi yang sangat baik untuk analisis dan backtesting

Risiko Strategi

  1. Pembebasan purata bergerak mungkin mempunyai kesan lag
  2. Isyarat palsu mungkin berlaku di pasaran pelbagai
  3. Penyimpangan RSI dalam keadaan pasaran tertentu
  4. Pilihan parameter yang tidak betul boleh menyebabkan isyarat perdagangan yang berlebihan atau tidak mencukupi Pengurangan risiko:
  • Mencadangkan pengesahan silang dengan trend pasaran dan jumlah
  • Mengoptimumkan kekerapan dagangan melalui pelarasan parameter purata bergerak
  • Tetapkan paras stop loss dan mengambil keuntungan untuk kawalan risiko

Arahan Pengoptimuman Strategi

  1. Pengoptimuman penapisan isyarat:
  • Tambah penunjuk pengesahan trend
  • Menggabungkan analisis jumlah
  1. Pengoptimuman dinamik parameter:
  • Sesuaikan parameter RSI dan MA secara automatik berdasarkan turun naik pasaran
  • Memperkenalkan kaedah pengiraan tempoh penyesuaian
  1. Pengoptimuman kawalan risiko:
  • Membangunkan mekanisme berhenti rugi dan mengambil keuntungan yang dinamik
  • Reka bentuk sistem pengurusan kedudukan dinamik

Ringkasan

Strategi ini membina sistem perdagangan adaptif dengan menggabungkan RSI dan pelbagai purata bergerak. Kelebihannya utama terletak pada pengesahan silang beberapa penunjuk teknikal dan konfigurasi parameter yang fleksibel, sementara perhatian mesti diberikan kepada kelewatan purata bergerak dan kesan keadaan pasaran terhadap prestasi strategi. Melalui pengoptimuman dan kawalan risiko yang berterusan, strategi ini menunjukkan janji untuk prestasi yang stabil dalam perdagangan sebenar.


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