Les ressources ont été chargées... Je charge...

Stratégie de négociation quantitative RSI dynamique avec croisement des moyennes mobiles multiples

Auteur:ChaoZhang est là., Date: 2025-01-17 16:14:38 Je suis désolé
Les étiquettes:Indice de résistance- Je vous en prie.SMALe taux d'intérêtLa WMALe secteur privéRMA

 Dynamic RSI Quantitative Trading Strategy with Multiple Moving Average Crossover

Résumé

Il s'agit d'une stratégie de trading quantitative qui combine l'indice de force relative (RSI) avec plusieurs moyennes mobiles. La stratégie identifie principalement les tendances du marché en surveillant les signaux croisés entre différents types de moyennes mobiles (y compris SMA, EMA, WMA et SMMA) sur l'indicateur RSI, tout en utilisant les zones de surachat et de survente du RSI comme critères de décision supplémentaires.

Principes de stratégie

La stratégie comprend plusieurs étapes de calcul clés: 1. Calculer le RSI de 14 périodes avec un niveau de surachat à 70 et un niveau de survente à 30 Calculer trois moyennes mobiles différentes sur la courbe RSI: - MA1: période de 20 ans, choix de SMA/EMA/WMA/SMMA - MA2: période de 50 ans, choix de SMA/EMA/WMA/SMMA - MA3: période de 100 ans, choix de SMA/EMA/WMA/SMMA Règles de génération de signaux de négociation: - Signal d' achat: lorsque le MA2 dépasse le MA3 - Signal de vente: lorsque le MA2 dépasse le MA3 4. Détecter simultanément les divergences de l'ISR pour une référence supplémentaire

Les avantages de la stratégie

  1. La validation croisée d'indicateurs techniques multiples améliore la fiabilité du signal
  2. Types et paramètres de moyennes mobiles flexibles
  3. La détection des divergences de l'indicateur de risque contribue à identifier tôt les points tournants du marché
  4. Gestion des positions en pourcentage pour un contrôle efficace des risques
  5. Excellente visualisation pour l'analyse et le backtesting

Risques stratégiques

  1. Les croisements de moyennes mobiles peuvent avoir des effets de retard
  2. Des signaux erronés peuvent se produire sur les marchés variés
  3. Distorsion de l'indice de risque sous certaines conditions de marché
  4. Une mauvaise sélection de paramètres peut entraîner des signaux de négociation excessifs ou insuffisants Réduction des risques:
  • Recommander la validation croisée avec les tendances et le volume du marché
  • Optimiser la fréquence de négociation grâce à un ajustement des paramètres de la moyenne mobile
  • Définir les niveaux de stop-loss et de take-profit pour la maîtrise des risques

Directions d'optimisation de la stratégie

  1. Optimisation du filtrage du signal:
  • Ajouter des indicateurs de confirmation de tendance
  • Incorporer une analyse du volume
  1. Optimisation dynamique des paramètres:
  • Ajuster automatiquement les paramètres RSI et MA en fonction de la volatilité du marché
  • Introduction de méthodes de calcul de la période d'adaptation
  1. Optimisation du contrôle des risques:
  • Développer des mécanismes dynamiques de stop-loss et de prise de bénéfices
  • Conception d'un système de gestion dynamique de la position

Résumé

La stratégie construit un système de trading adaptatif en combinant RSI et plusieurs moyennes mobiles. Ses principaux avantages résident dans la validation croisée de plusieurs indicateurs techniques et la configuration de paramètres flexibles, tandis que l'attention doit être portée au décalage des moyennes mobiles et aux effets des conditions du marché sur la performance de la stratégie.


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


Relationnée

Plus de