Indicateur de stratégie quantitative de divergence de prix RSI, système de surveillance dynamique et d'optimisation adaptative

RSI TP SL
Date de création: 2025-01-10 16:20:25 Dernière modification: 2025-01-10 16:20:25
Copier: 5 Nombre de clics: 421
1
Suivre
1617
Abonnés

Indicateur de stratégie quantitative de divergence de prix RSI, système de surveillance dynamique et d’optimisation adaptative

Aperçu

Cette stratégie est un système de trading intelligent basé sur le RSI et la divergence des prix. Il capture les signaux de retournement du marché en surveillant de manière dynamique la relation de divergence entre l’indicateur RSI et les tendances des prix. La stratégie intègre les fractales comme confirmation auxiliaire et est équipée d’un mécanisme adaptatif de stop-profit et de stop-loss pour obtenir une exécution de transaction entièrement automatisée. Le système prend en charge des applications multi-variétés et multi-cycles et présente une grande flexibilité et praticité.

Principe de stratégie

La logique fondamentale de la stratégie repose sur les éléments clés suivants :

  1. Identification des divergences RSI : identifiez les divergences potentielles en comparant les hauts et les bas de l’indicateur RSI et l’action des prix. Lorsque le prix atteint un nouveau sommet mais que le RSI n’atteint pas un nouveau sommet, un signal de vente de divergence supérieure se forme ; lorsque le prix atteint un nouveau plus bas mais que le RSI n’atteint pas un nouveau plus bas, un signal d’achat de divergence inférieure se forme.
  2. Confirmation fractale : utilisez les fractales pour analyser la structure des prix, confirmer la validité de la divergence en détectant les hauts et les bas locaux et améliorer la fiabilité des signaux.
  3. Adaptation des paramètres : Le système introduit le paramètre de sensibilité pour ajuster dynamiquement l’intervalle de jugement fractal afin de parvenir à une adaptation à différents environnements de marché.
  4. Contrôle des risques : intègre des mécanismes Stop Loss et Take Profit basés sur un pourcentage pour garantir que le risque de chaque transaction est contrôlable.

Avantages stratégiques

  1. Fiabilité élevée du signal : le double mécanisme de confirmation de la divergence RSI et de la théorie fractale améliore considérablement la précision des signaux de trading.
  2. Forte adaptabilité : la stratégie peut ajuster de manière flexible les paramètres en fonction des différentes conditions du marché et présente une bonne adaptabilité environnementale.
  3. Gestion parfaite des risques : elle intègre des mécanismes dynamiques de stop-profit et de stop-loss pour contrôler efficacement l’exposition au risque de chaque transaction.
  4. Haut degré d’automatisation : l’ensemble du processus, depuis la reconnaissance du signal jusqu’à l’exécution de la transaction, est automatisé, réduisant ainsi l’impact émotionnel de l’intervention humaine.
  5. Bonne évolutivité : le cadre stratégique prend en charge les applications multi-variétés et multi-cycles, facilitant ainsi l’investissement de portefeuille.

Risque stratégique

  1. Dépendance à l’environnement du marché : Dans un marché avec des tendances évidentes, la fiabilité des signaux de divergence peut diminuer et il est nécessaire d’ajouter un mécanisme de filtrage des tendances.
  2. Sensibilité des paramètres : les paramètres clés de la stratégie, tels que le seuil RSI et l’intervalle de jugement fractal, doivent être soigneusement débogués. Des réglages de paramètres incorrects peuvent affecter les performances de la stratégie.
  3. Décalage du signal : Étant donné qu’il est nécessaire d’attendre que le modèle de divergence soit complètement formé avant que le signal puisse être confirmé, il peut y avoir un certain décalage d’entrée.
  4. Interférence du bruit du marché : dans un marché volatil, de faux signaux de divergence peuvent être générés et des conditions de filtrage supplémentaires doivent être ajoutées.

Orientation de l’optimisation de la stratégie

  1. Augmenter le filtrage des tendances : introduire des indicateurs de jugement de tendance pour filtrer les signaux inverses dans les marchés à forte tendance et améliorer l’adaptabilité des stratégies dans différents environnements de marché.
  2. Optimiser l’adaptation des paramètres : Développer un mécanisme d’ajustement dynamique des paramètres basé sur la volatilité du marché pour améliorer la réactivité de la stratégie aux changements du marché.
  3. Améliorer le contrôle des risques : introduire un mécanisme de stop-loss dynamique pour ajuster automatiquement la position de stop-loss en fonction des fluctuations du marché et optimiser les effets de la gestion des fonds.
  4. Confirmation de signal améliorée : combinez des indicateurs de microstructure de marché tels que le volume des transactions et la volatilité pour établir un système de confirmation de signal plus complet.

Résumer

Cette stratégie construit un système de trading robuste grâce à la combinaison innovante de la divergence RSI et de la théorie fractale. Les avantages de la stratégie résident dans sa grande fiabilité du signal, sa forte adaptabilité et un mécanisme complet de contrôle des risques. Grâce à une optimisation et une amélioration continues, la stratégie devrait permettre de maintenir des performances stables dans différents environnements de marché. Il est recommandé, lors de l’application en temps réel, de tester entièrement les paramètres et de les optimiser en fonction des caractéristiques du marché, et de mettre en œuvre strictement des mesures de contrôle des risques.

Code source de la stratégie
/*backtest
start: 2025-01-02 00:00:00
end: 2025-01-09 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//FRACTALS
//@version=5

//last : 30m 70 68 22 25 0 0 4.7 11.5

//init
capital=1000
percent=100
fees=0//in percent for each entry and exit

//Inputs
start = input(timestamp("1 Feb 2002"), "Start Time", group = "Date")
end = input(timestamp("1 Feb 2052"), "End Time", group = "Date")

//Strategy
strategy("Divergence Finder (RSI/Price) Strategy with Options", overlay = true, initial_capital=capital, default_qty_value=percent, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, calc_on_order_fills=false,process_orders_on_close=true , commission_value=fees, currency=currency.EUR, calc_on_every_tick=true, use_bar_magnifier=false)
//indicator("Divergence Finder (RSI/Price) with Options", overlay=true, max_boxes_count=200, max_bars_back=500,max_labels_count=500)


srcUp=input.source(close, "Source for Price Buy Div", group="sources")
srcDn=input.source(close, "Source for Price Sell Div", group="sources")
srcRsi=input.source(close, "Source for RSI Div", group="sources")


HighRSILimit=input.int(70, "Min RSI for Sell divergence (p1:pre last)", group="signals", inline="1", step=1)
HighRSILimit2=input.int(68, "Min RSI for Sell divergence (p2):last", group="signals", inline="1", step=1)
LowRSILimit=input.int(22, "Min RSI for Buy divergence (p1:pre last)", group="signals", inline="2", step=1)
LowRSILimit2=input.int(25, "Min RSI for Buy divergence (p2:last)", group="signals", inline="2", step=1)


minMarginP=input.float(0, "Min margin between price for displaying divergence (%)", group="signals", step=0.01)
minMarginR=input.float(0, "Min margin between RSI for displaying divergence (%)", group="signals", step=1)

nb=input.int(2, "Sensivity: Determine how many candle will be used to determine last top or bot (too high cause lag, too low cause repaint)", group="Sensivity", inline="3", step=1)


stopPer= input.float(4.7, title='Stop %', group = "Per", inline="3", step=0.01)
tpPer = input.float(11.5, title='TP %', group = "Per", inline="4", step=0.01)

//nb=2
leftBars = nb
rightBars=nb


labels=input.bool(true, "Display Divergence labels", group="Display")
draw=input.bool(true, "Display tops/bottoms")



dnFractal = (close[nb-2] < close[nb]) and (close[nb-1] < close[nb]) and (close[nb+1] < close[nb]) and (close[nb+2] < close[nb])
upFractal = (close[nb-2] > close[nb]) and (close[nb-1] > close[nb]) and (close[nb+1] > close[nb]) and (close[nb+2] > close[nb])
ph=dnFractal
pl=upFractal

plot(dnFractal and draw ? close[nb] : na, style=plot.style_line,offset=-2, color=color.lime, title="tops")
plot(upFractal and draw ? close[nb] : na,  style=plot.style_line, offset=-2, color=color.red, title="botts")

plotchar(dnFractal ? high[nb] : na, char='⮝',location=location.absolute,offset=-2, color=color.rgb(236, 255, 63), title="Down Fractal")
plotchar(upFractal ? low[nb] : na, char='⮟', location=location.absolute, offset=-2, color=color.rgb(67, 227, 255), title="Up Fractal")


float myRSI=ta.rsi(srcRsi, 14)

bool divUp=false
bool divDn=false

//compare lasts bots
p2=ta.valuewhen( ph,srcDn[nb], 0 ) //last price
p1=ta.valuewhen( ph,srcDn[nb], 1 ) //pre last price

r2=ta.valuewhen( ph,myRSI[nb], 0 )  //last rsi
r1=ta.valuewhen( ph,myRSI[nb], 1 )  //pre last rsi


if ph
    if p1 < p2// - (p2 * minMarginP)/100
        if r1 > HighRSILimit and r2 > HighRSILimit2
            if r1 > r2 + (r2 * minMarginR)/100
                divDn:=true

plot(divDn ? close:na, style=plot.style_cross, linewidth=3, color= color.red, offset=-rightBars, title="Sell Div")
if labels and divDn and strategy.position_size >= 0
    label.new(bar_index-nb,high, "Sell Divergence "+str.tostring(p1)+"   "+str.tostring(math.round(r1, 2))+"  "+str.tostring(p2)+"   "+str.tostring(math.round(r2, 2)),xloc=xloc.bar_index,yloc=yloc.abovebar, color = color.red, style = label.style_label_down)
else if divDn and strategy.position_size >= 0
    label.new(bar_index-nb,high, "Sell Divergence",xloc=xloc.bar_index,yloc=yloc.abovebar, color = color.red, style = label.style_label_down)



p2:=ta.valuewhen( pl,srcUp[nb], 0 )
p1:=ta.valuewhen( pl,srcUp[nb], 1 )

r2:=ta.valuewhen( pl,myRSI[nb], 0 )
r1:=ta.valuewhen( pl,myRSI[nb], 1 )


if pl
    if p1 > p2 + (p2 * minMarginP)/100
        if r1 < LowRSILimit and r2 < LowRSILimit2
            if r1 < r2 - (r2 * minMarginR)/100
                divUp:=true
               
plot(divUp ? close:na, style=plot.style_cross, linewidth=3, color= color.green, offset=-rightBars, title="Buy Div")
if labels and divUp and strategy.position_size <= 0
    label.new(bar_index-nb,high, "Buy Divergence "+str.tostring(p1)+"   "+str.tostring(math.round(r1, 2))+"  "+str.tostring(p2)+"   "+str.tostring(math.round(r2, 2)),xloc=xloc.bar_index,yloc=yloc.belowbar, color = color.green, style = label.style_label_up)
else if divUp and strategy.position_size <= 0
    label.new(bar_index-nb,high, "Buy Divergence",xloc=xloc.bar_index,yloc=yloc.belowbar, color = color.green, style = label.style_label_up)


//strat LONG
longEntry = divUp//  and strategy.position_size == 0
longExit = divDn//  and strategy.position_size == 0

//strat SHORT
shortEntry = divDn
shortExit = divUp

LongActive=input(true, title='Activate Long', group = "Directions", inline="2")
ShortActive=input(true, title='Activate Short', group = "Directions", inline="2")
//StopActive=input(false, title='Activate Stop', group = "Directions", inline="2")


//tpActive =  input(false, title='Activate Take Profit', group = "TP", inline="4")
//RR=input(0.5, title='Risk Reward Multiplier', group = "TP")
//QuantityTP = input(100.0, title='Trade Ammount %', group = "TP")


//calc stop
//longStop = strategy.position_avg_price * (1 - stopPer)
//shortStop = strategy.position_avg_price * (1 + stopPer)

longStop = strategy.position_avg_price - (strategy.position_avg_price * stopPer/100)
shortStop = strategy.position_avg_price + (strategy.position_avg_price * stopPer/100)

longTP = strategy.position_avg_price + (strategy.position_avg_price * tpPer/100)
shortTP = strategy.position_avg_price - (strategy.position_avg_price * tpPer/100)

//Calc TP
//longTP = ((strategy.position_avg_price-longStop)*RR+strategy.position_avg_price)
//shortTP = (strategy.position_avg_price-((shortStop-strategy.position_avg_price)*RR))


//display stops
plot(strategy.position_size > 0 ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL")
plot(strategy.position_size < 0 ? shortStop : na, style=plot.style_linebr, color=color.purple, linewidth=1, title="Short Fixed SL")


//display TP
plot(strategy.position_size > 0 ? longTP : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Fixed TP")
plot(strategy.position_size < 0 ? shortTP : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Fixed TP")

//do
if true
    //check money available
    if strategy.equity > 0
        //if tpActive //Need to put TP before Other exit
        strategy.exit("Close Long", from_entry="Long", limit=longTP,stop=longStop, comment="Close Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ", qty_percent=100)
        strategy.exit("Close Short", from_entry="Short", limit=shortTP,stop=shortStop, comment="Close Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ", qty_percent=100)
        //Set Stops
        //if StopActive
        //    strategy.exit("Stop Long", from_entry="Long", stop=longStop, comment="Stop Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
        //    strategy.exit("Stop Short", from_entry="Short", stop=shortStop, comment="Stop Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
        if longEntry
            if ShortActive
                strategy.close("Short",comment="Close Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Close Short")
            if LongActive
                strategy.entry("Long", strategy.long, comment="Open Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Open Long")
        if longExit
            if LongActive
                strategy.close("Long",comment="Close Long with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Close Long")
            if ShortActive
                strategy.entry("Short", strategy.short, comment="Open Short with : "+ str.tostring(math.round(strategy.equity)) +" $ ")
                alert("Open Short")


//alertcondition(longEntry and LongActive, title="Buy Divergence Open", message="Buy Divergence Long Opened!")
//alertcondition(longExit and ShortActive, title="Sell Divergence Open", message="Buy Divergence Short Opened!")

//alertcondition(longExit and LongActive, title="Buy Divergence Closed", message="Buy Divergence Long Closed!")
//alertcondition(longEntry and ShortActive, title="Sell Divergence Closed", message="Buy Divergence Short Closed!")