Die Ressourcen sind geladen. Beförderung...

Dynamische RSI-Quantitative Handelsstrategie mit mehrfacher gleitender Durchschnittsverknüpfung

Schriftsteller:ChaoZhang, Datum: 2025-01-17 16:14:38
Tags:RSI- Nein.SMAEMAWMASMMARMA

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

Übersicht

Dies ist eine quantitative Handelsstrategie, die den Relative Strength Index (RSI) mit mehreren gleitenden Durchschnitten kombiniert. Die Strategie identifiziert hauptsächlich Markttrends, indem sie Crossover-Signale zwischen verschiedenen Arten von gleitenden Durchschnitten (einschließlich SMA, EMA, WMA und SMMA) auf dem RSI-Indikator überwacht, wobei RSI-Überkauf- und Überverkaufszonen als ergänzende Entscheidungskriterien verwendet werden.

Strategieprinzipien

Die Strategie umfasst mehrere Schlüsselberechnungsschritte: 1. Berechnen Sie den 14-Perioden-RSI mit einem Überkauf von 70 und einem Überverkauf von 30 2. Berechnen Sie drei verschiedene gleitende Durchschnitte auf der RSI-Kurve: - MA1: 20 Jahre, Wahl der SMA/EMA/WMA/SMMA - MA2: 50-Periode, Wahl der SMA/EMA/WMA/SMMA - MA3: 100-Periode, Wahl der SMA/EMA/WMA/SMMA 3. Regeln für die Erzeugung von Handelssignalen: - Kaufsignal: Wenn MA2 über MA3 kreuzt - Verkaufssignal: Wenn der MA2 unter den MA3 fällt 4. Gleichzeitige Erkennung von RSI-Divergenzen für zusätzliche Referenzen

Strategische Vorteile

  1. Die Kreuzvalidierung mehrerer technischer Indikatoren verbessert die Signalsicherheit
  2. Flexible gleitende Durchschnittsarten und -parameter
  3. Die Erkennung von RSI-Divergenzen hilft, Marktwendepunkte frühzeitig zu erkennen
  4. Prozentsatzbasiertes Positionsmanagement für eine wirksame Risikokontrolle
  5. Ausgezeichnete Visualisierung für Analyse und Backtesting

Strategische Risiken

  1. Bewegliche Durchschnittsquerschnitte können Verzögerungseffekte haben
  2. Falsche Signale können auf verschiedenen Märkten auftreten
  3. RSI-Verzerrung unter bestimmten Marktbedingungen
  4. Eine falsche Parameterwahl kann zu übermäßigen oder unzureichenden Handelssignalen führen Risikominderung:
  • Empfehlung für eine Quervalidierung mit Marktentwicklung und Volumen
  • Optimierung der Handelsfrequenz durch Anpassung der gleitenden Durchschnittsparameter
  • Festlegen von Stop-Loss- und Take-Profit-Leveln für die Risikokontrolle

Strategieoptimierungsrichtlinien

  1. Optimierung der Signalfilterung:
  • Hinzufügen von Trendbestätigungsindikatoren
  • Einbeziehung von Volumenanalysen
  1. Dynamische Optimierung der Parameter:
  • Automatische Anpassung der RSI- und MA-Parameter anhand der Marktvolatilität
  • Einführung von Methoden zur Berechnung der anpassungsfähigen Zeit
  1. Optimierung der Risikokontrolle:
  • Entwicklung dynamischer Stop-Loss- und Take-Profit-Mechanismen
  • Entwurf eines dynamischen Positionsmanagementsystems

Zusammenfassung

Die Strategie baut ein anpassungsfähiges Handelssystem auf, indem sie RSI und mehrere gleitende Durchschnitte kombiniert. Seine Hauptvorteile liegen in der Quervalidierung mehrerer technischer Indikatoren und einer flexiblen Parameterkonfiguration, während auf die Verzögerung des gleitenden Durchschnitts und die Auswirkungen der Marktbedingungen auf die Strategieleistung geachtet werden muss. Durch kontinuierliche Optimierung und Risikokontrolle verspricht diese Strategie eine stabile Performance im tatsächlichen Handel.


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


Verwandt

Mehr