Stratégie de trading quantitative à paramètres dynamiques RSI assistée par croisement de moyennes mobiles multiples

RSI MA SMA EMA WMA SMMA RMA
Date de création: 2025-01-17 16:14:38 Dernière modification: 2025-01-17 16:14:38
Copier: 1 Nombre de clics: 410
1
Suivre
1617
Abonnés

Stratégie de trading quantitative à paramètres dynamiques RSI assistée par croisement de moyennes mobiles multiples

Aperçu

Il s’agit d’une stratégie de trading quantitative qui combine l’indice de force relative (RSI) avec plusieurs moyennes mobiles. Cette stratégie détermine principalement la tendance du marché en surveillant les signaux de croisement de différents types de moyennes mobiles (y compris SMA, EMA, WMA et SMMA) sur l’indicateur RSI, et combine les plages de surachat et de survente de l’indicateur RSI lui-même comme base auxiliaire pour jugement, afin de déterminer la tendance du marché. Moment de négociation.

Principe de stratégie

La stratégie comprend principalement les étapes de calcul clés suivantes :

  1. Calculez l’indicateur RSI sur 14 périodes, définissez la zone de surachat à 70 et la zone de survente à 30
  2. Calculez trois moyennes mobiles avec différents paramètres sur la courbe RSI :
    • MA1 : 20 périodes, SMA/EMA/WMA/SMMA en option
    • MA2 : 50 périodes, SMA/EMA/WMA/SMMA en option
    • MA3 : période de 100, SMA/EMA/WMA/SMMA en option
  3. Règles de génération de signaux de trading :
    • Signal d’achat : lorsque MA2 croise MA3 vers le haut
    • Signal de vente : lorsque MA2 croise MA3 vers le bas
  4. En même temps, détectez l’écart de l’indicateur RSI pour fournir une référence auxiliaire pour les décisions de trading

Avantages stratégiques

  1. Plusieurs indicateurs techniques se valident de manière croisée pour améliorer la fiabilité des signaux de trading
  2. Le type et les paramètres de moyenne mobile sont réglables, ce qui offre une grande flexibilité
  3. La fonction de détection de divergence RSI peut aider à détecter à l’avance les points de retournement du marché
  4. Utilisez la gestion des positions en pourcentage pour contrôler efficacement les risques
  5. Excellent effet de visualisation, facile à analyser et à tester

Risque stratégique

  1. Les croisements de moyennes mobiles peuvent avoir un effet retardateur
  2. De fréquents faux signaux peuvent survenir sur des marchés latéraux
  3. Distorsion de l’indicateur RSI dans certaines conditions de marché
  4. Une sélection incorrecte des paramètres peut entraîner un nombre trop élevé ou trop faible de signaux de trading Solution de contournement :
  • Il est recommandé de combiner les tendances du marché et le volume des transactions pour une validation croisée
  • La fréquence de trading peut être optimisée en ajustant les paramètres de la moyenne mobile
  • Définissez un stop loss et un take profit pour contrôler le risque

Orientation de l’optimisation de la stratégie

  1. Optimisation du filtrage du signal :
  • Ajouter des indicateurs de confirmation de tendance
  • Ajouter une analyse de volume
  1. Optimisation dynamique des paramètres :
  • Ajustez automatiquement les paramètres RSI et MA en fonction de la volatilité du marché
  • Présentation d’une méthode de calcul de cycle adaptatif
  1. Optimisation du contrôle des risques :
  • Développer un mécanisme dynamique de stop loss et de take profit
  • Concevoir un système de gestion d’entrepôt dynamique

Résumer

Cette stratégie combine le RSI et plusieurs moyennes mobiles pour créer un système de trading hautement adaptable. L’avantage principal de la stratégie réside dans la validation croisée de plusieurs indicateurs techniques et dans la configuration flexible des paramètres, mais en même temps, il convient de prêter attention au décalage de la moyenne mobile et à l’impact des conditions du marché sur la performance de la stratégie. Grâce à une optimisation continue et à un contrôle des risques, cette stratégie devrait permettre d’obtenir des performances stables dans les transactions réelles.

Code source 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 -----