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

Système dynamique de détection des divergences de prix RSI et de stratégie de négociation adaptative

Auteur:ChaoZhang est là., Date: 2025-01-10 16:20:25 Je vous en prie.
Les étiquettes:Indice de résistanceTPSL

 Dynamic RSI-Price Divergence Detection and Adaptive Trading Strategy System

Résumé

Cette stratégie est un système de trading intelligent basé sur le RSI et la divergence des prix, qui capture les signaux d'inversion du marché en surveillant dynamiquement la relation de divergence entre les indicateurs du RSI et les tendances des prix.

Principes de stratégie

La logique de base de la stratégie repose sur les éléments clés suivants: 1. Détection de la divergence RSI: Identifie les modèles de divergence potentiels en comparant les hauts et les bas des indicateurs RSI et les tendances des prix. Les signaux de vente de divergence baissière se forment lorsque le prix atteint de nouveaux sommets alors que le RSI ne le fait pas; les signaux d'achat de divergence haussière se forment lorsque le prix atteint de nouveaux sommets alors que le RSI ne le fait pas. Confirmation fractale: utilise la théorie des fractals pour analyser la structure des prix, confirmant la validité de la divergence en détectant des hauts et des bas locaux pour améliorer la fiabilité du signal. 3. Adaptation des paramètres: Introduit le paramètre de sensibilité pour ajuster dynamiquement les intervalles de jugement fractaux, ce qui permet une adaptation aux différents environnements du marché. Contrôle des risques: intègre des mécanismes de stop loss et de take profit basés sur le pourcentage pour assurer un risque contrôlable pour chaque transaction.

Les avantages de la stratégie

  1. Haute fiabilité du signal: le double mécanisme de confirmation de la divergence du RSI et de la théorie des fractales améliore considérablement la précision du signal de trading.
  2. Une forte adaptabilité: la stratégie peut ajuster de manière flexible les paramètres en fonction des différentes conditions du marché, ce qui montre une bonne adaptabilité environnementale.
  3. Gestion complète du risque: des mécanismes dynamiques intégrés de stop-loss et de prise de profit contrôlent efficacement l'exposition au risque pour chaque transaction.
  4. Niveau élevé d'automatisation: l'automatisation complète de l'identification du signal à l'exécution des transactions réduit l'impact émotionnel de l'intervention humaine.
  5. Une bonne évolutivité: le cadre stratégique prend en charge des applications multi-instruments et multi-temps, facilitant ainsi l'investissement de portefeuille.

Risques stratégiques

  1. Dépendance de l'environnement du marché: la fiabilité du signal de divergence peut diminuer sur les marchés en tendance, ce qui nécessite des mécanismes de filtrage de tendance supplémentaires.
  2. Sensibilité des paramètres: Les paramètres clés tels que les seuils de l'indice de résistance et les intervalles de jugement fractaux nécessitent un réglage minutieux, les paramètres incorrects peuvent affecter les performances de la stratégie.
  3. Décalage du signal: Attendre la formation complète d'un schéma de divergence avant de confirmer les signaux peut entraîner un délai d'entrée retardé.
  4. Interférence du bruit du marché: des signaux de fausse divergence peuvent apparaître sur les marchés volatils, ce qui nécessite des conditions de filtrage supplémentaires.

Directions d'optimisation de la stratégie

  1. Ajouter le filtrage des tendances: introduire des indicateurs de jugement des tendances pour filtrer les signaux de contre-tendance sur les marchés à forte tendance, améliorant ainsi l'adaptabilité de la stratégie dans différents environnements de marché.
  2. Optimiser l'adaptation des paramètres: développer des mécanismes dynamiques d'ajustement des paramètres basés sur la volatilité du marché, améliorant la réponse de la stratégie aux changements du marché.
  3. Améliorer le contrôle des risques: introduire des mécanismes de stop-loss dynamiques pour ajuster automatiquement les positions stop-loss en fonction de la volatilité du marché, optimisant ainsi les effets de la gestion de l'argent.
  4. Améliorer la confirmation du signal: Construire un système de confirmation du signal plus complet en combinant le volume, la volatilité et d'autres indicateurs de la microstructure du marché.

Résumé

La stratégie construit un système de trading robuste grâce à une combinaison innovante de la divergence du RSI et de la théorie des fractals. Ses avantages résident dans une fiabilité élevée du signal, une forte adaptabilité et des mécanismes complets de contrôle des risques. Grâce à une optimisation et à une amélioration continues, la stratégie devrait maintenir une performance stable dans différents environnements de marché. Lorsqu'elle s'applique au trading en direct, il est recommandé de tester et d'optimiser en profondeur les paramètres en fonction des caractéristiques du marché et de mettre en œuvre strictement des mesures de contrôle des risques.


/*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!")


Relationnée

Plus de