Stratégie quantitative de divergence dynamique RSI

RSI ATR SL/TP risk management DIVERGENCE Pivot
Date de création: 2025-04-25 14:57:31 Dernière modification: 2025-04-25 14:57:31
Copier: 0 Nombre de clics: 455
2
Suivre
319
Abonnés

Stratégie quantitative de divergence dynamique RSI Stratégie quantitative de divergence dynamique RSI

Aperçu

La stratégie de quantification de la déviation du double axe RSI est une stratégie de trading avancée qui identifie les opportunités de reprise potentielles en détectant les déviations conventionnelles de hausse et de baisse entre le comportement des prix et l’indice relativement fort et faible ((RSI)). La stratégie utilise un algorithme de détection de pivot automatique, combinant deux méthodes de gestion de stop-loss/stop-loss différentes, pour établir automatiquement des positions lors de la confirmation d’un signal de déviation.

Principe de stratégie

  1. Module de calcul du RSI: Calcul du RSI à 14 cycles en utilisant la méthode de simplification de Wilder (modifiable), avec le cours de clôture comme source d’entrée par défaut (configurable).
  2. Détection des axes:
    • Détection des hauts et des bas locaux de l’indicateur RSI à l’aide d’une fenêtre coulissante (réglable) de 5 cycles à droite et à gauche
    • La fonction ta.barssince assure un espacement de 5 à 60 lignes K entre les axes cardinaux
  3. La logique de la confirmation est détournée:
    • Le réveil de l’horoscope: les prix innovent en bas et le RSI forme des bas plus élevés
    • Les baisseurs se détournent: prix innovent haut et RSI forme des sommets plus bas
  4. Système d’exécution des transactions:
    • Le stop-loss est en double mode: basé sur les 20 derniers cycles de points de basculement (modifiables) ou sur l’amplitude des fluctuations ATR.
    • Calcul de l’arrêt dynamique: Ratio de risque de rendement prédéterminé multiplié par le montant du risque (défaut 2: 1)
  5. Système de visualisation: marque sur le graphique tous les signaux d’écart effectifs et affiche en temps réel la ligne horizontale des positions en cours (arrêt en rouge) et arrêt en vert).

Analyse des avantages

  1. Mécanisme de vérification multidimensionnelle: les prix et les RSI doivent satisfaire simultanément à une forme spécifique, et l’intervalle de temps dans les limites prédéfinies réduit considérablement la probabilité de faux signaux.
  2. Gestion des risques adaptée:
    • Le modèle de point oscillant est adapté aux marchés tendanciels et permet de saisir efficacement les tendances des bandes
    • Le mode ATR est adapté aux marchés en crise et ajuste automatiquement le stop loss en fonction de la volatilité
  3. Hauteur des paramètres: tous les paramètres clés (cycle RSI, portée de détection de l’axe central, taux de rendement du risque, etc.) peuvent être ajustés en fonction des caractéristiques du marché.
  4. Gestion scientifique de l’argent: 10% de position par défaut pour éviter une exposition excessive au risque de chaque transaction.
  5. Retour visuel en temps réel: aide à la prise de décision de négociation intuitive grâce à des marquages graphiques et des lignes de stop/stop dynamiques.

Analyse des risques

  1. Risque de retard: le RSI est un indicateur de retard qui peut générer des signaux de retard dans des conditions unilatérales extrêmes. Options d’atténuation: combinaison de filtres de tendance ou raccourcissement du cycle RSI.
  2. Risque de choc du marché: peut générer de faux signaux en série en l’absence de tendance claire. Solution d’atténuation: activer le mode ATR et augmenter le multiplicateur, ou un filtre de taux d’oscillation supplémentaire.
  3. Risque d’hyperadaptation des paramètres: une combinaison spécifique de paramètres peut bien fonctionner dans les données historiques mais ne fonctionner pas sur le disque. Solution d’atténuation: effectuer des tests de stress multivariés à plusieurs cycles.
  4. Risque de marché extrême: la faille de saut peut entraîner une perte de liquidité. Méthode d’atténuation: éviter de négocier avant ou après un événement économique majeur ou utiliser une couverture d’options.
  5. Dépendance du cadre temporel: les performances varient considérablement d’une période à l’autre. Solution d’atténuation: optimisation du plein retour dans le cadre temporel cible.

Direction d’optimisation

  1. Vérification d’indicateurs composés: ajout d’un MACD ou d’un indicateur de volume de transaction comme confirmation secondaire, améliorant la qualité du signal.
  2. Ajustement des paramètres dynamiques: Ajustement automatique des cycles RSI et des multiples ATR en fonction des fluctuations du marché.
  3. Optimisation de l’apprentissage automatique: optimisation des combinaisons de paramètres clés à l’aide d’algorithmes génétiques.
  4. Analyse de plusieurs périodes: filtre les tendances pour les périodes plus longues.
  5. Gestion dynamique des positions: Ajustez la taille des positions en fonction de la volatilité pour équilibrer le risque.
  6. Filtre d’événements: intégrer les données du calendrier économique pour éviter les transactions avant et après la publication des données importantes.

Résumer

La stratégie de quantification de la déviation du double axe RSI offre une approche de trading inversée structurée grâce à une identification systématique de la déviation et à une gestion rigoureuse du risque. Sa valeur centrale réside dans la conversion des concepts traditionnels d’analyse technique en règles de trading quantifiables et dans l’adaptation aux différents environnements de marché grâce à un mécanisme de stop-loss bidirectionnel.

Code source de la stratégie
/*backtest
start: 2024-04-25 00:00:00
end: 2025-04-23 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=6
strategy("RSI Divergence Strategy - AliferCrypto", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// === RSI Settings ===
rsiLength      = input.int(14, minval=1, title="RSI Length", group="RSI Settings", tooltip="Number of periods for RSI calculation")
rsiSource      = input.source(close, title="RSI Source", group="RSI Settings", tooltip="Price source used for RSI calculation")

// === Divergence Settings ===
lookLeft       = input.int(5, minval=1, title="Pivot Lookback Left", group="Divergence Settings", tooltip="Bars to the left for pivot detection")
lookRight      = input.int(5, minval=1, title="Pivot Lookback Right", group="Divergence Settings", tooltip="Bars to the right for pivot detection")
rangeLower     = input.int(5, minval=1, title="Min Bars Between Pivots", group="Divergence Settings", tooltip="Minimum bars between pivots to validate divergence")
rangeUpper     = input.int(60, minval=1, title="Max Bars Between Pivots", group="Divergence Settings", tooltip="Maximum bars between pivots to validate divergence")

// === SL/TP Method ===
method         = input.string("Swing", title="SL/TP Method", options=["Swing", "ATR"], group="SL/TP Settings", tooltip="Choose between swing-based or ATR-based stop and target")

// === Swing Settings ===
swingLook      = input.int(20, minval=1, title="Swing Lookback (bars)", group="Swing Settings", tooltip="Bars to look back for swing high/low")
swingMarginPct = input.float(1.0, minval=0.0, title="Swing Margin (%)", group="Swing Settings", tooltip="Margin around swing levels as percentage of price")
rrSwing        = input.float(2.0, title="R/R Ratio (Swing)", group="Swing Settings", tooltip="Risk/reward ratio when using swing-based method")

// === ATR Settings ===
atrLen         = input.int(14, minval=1, title="ATR Length", group="ATR Settings", tooltip="Number of periods for ATR calculation")
atrMult        = input.float(1.5, minval=0.1, title="ATR SL Multiplier", group="ATR Settings", tooltip="Multiplier for ATR-based stop loss calculation")
rrAtr          = input.float(2.0, title="R/R Ratio (ATR)", group="ATR Settings", tooltip="Risk/reward ratio when using ATR-based method")

// === RSI Calculation ===
_d    = ta.change(rsiSource)
up    = ta.rma(math.max(_d, 0), rsiLength)
down  = ta.rma(-math.min(_d, 0), rsiLength)
rsi   = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))

// === Divergence Detection ===
defPl      = not na(ta.pivotlow(rsi, lookLeft, lookRight))
defPh      = not na(ta.pivothigh(rsi, lookLeft, lookRight))
rsiAtRR   = rsi[lookRight]
barsPl    = ta.barssince(defPl)
barsPl1   = barsPl[1]
inRangePL = barsPl1 >= rangeLower and barsPl1 <= rangeUpper
barsPh    = ta.barssince(defPh)
barsPh1   = barsPh[1]
inRangePH = barsPh1 >= rangeLower and barsPh1 <= rangeUpper
prevPlRsi   = ta.valuewhen(defPl, rsiAtRR, 1)
prevPhRsi   = ta.valuewhen(defPh, rsiAtRR, 1)
prevPlPrice = ta.valuewhen(defPl, low[lookRight], 1)
prevPhPrice = ta.valuewhen(defPh, high[lookRight], 1)
bullCond    = defPl and low[lookRight] < prevPlPrice and rsiAtRR > prevPlRsi and inRangePL
bearCond    = defPh and high[lookRight] > prevPhPrice and rsiAtRR < prevPhRsi and inRangePH

plotshape(bullCond, title="Bullish Divergence", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny)
plotshape(bearCond, title="Bearish Divergence", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny)

// === Entries ===
if bullCond
    strategy.entry("Long", strategy.long)
if bearCond
    strategy.entry("Short", strategy.short)

// === Pre-calculate SL/TP components ===
swingLow    = ta.lowest(low, swingLook)
swingHigh   = ta.highest(high, swingLook)
atrValue    = ta.atr(atrLen)

// === SL/TP Calculation & Exits ===
var float slPrice = na
var float tpPrice = na
var float rr      = na

// Long exits
if strategy.position_size > 0
    entryPrice = strategy.position_avg_price
    if method == "Swing"
        slPrice := swingLow * (1 - swingMarginPct / 100)
        rr      := rrSwing
    else
        slPrice := entryPrice - atrValue * atrMult
        rr      := rrAtr
    risk     = entryPrice - slPrice
    tpPrice  := entryPrice + risk * rr
    strategy.exit("Exit Long", from_entry="Long", stop=slPrice, limit=tpPrice)

// Short exits
if strategy.position_size < 0
    entryPrice = strategy.position_avg_price
    if method == "Swing"
        slPrice := swingHigh * (1 + swingMarginPct / 100)
        rr      := rrSwing
    else
        slPrice := entryPrice + atrValue * atrMult
        rr      := rrAtr
    risk     = slPrice - entryPrice
    tpPrice  := entryPrice - risk * rr
    strategy.exit("Exit Short", from_entry="Short", stop=slPrice, limit=tpPrice)

// === Plot SL/TP Levels ===
plot(strategy.position_size != 0 ? slPrice : na, title="Stop Loss", style=plot.style_linebr, color=color.red)
plot(strategy.position_size != 0 ? tpPrice : na, title="Take Profit", style=plot.style_linebr, color=color.green)

// === Alerts ===
alertcondition(bullCond, title="Bull RSI Divergence", message="Bullish RSI divergence detected")
alertcondition(bearCond, title="Bear RSI Divergence", message="Bearish RSI divergence detected")