Die Ressourcen sind geladen. Beförderung...

Dynamisches RSI-Preisdivergenz-Erkennungssystem und adaptiver Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2025-01-10 16:20:25
Tags:RSITPSL

 Dynamic RSI-Price Divergence Detection and Adaptive Trading Strategy System

Übersicht

Diese Strategie ist ein intelligentes Handelssystem, das auf RSI und Preisdivergenz basiert und Marktumkehrsignale erfasst, indem es die Divergenzbeziehung zwischen RSI-Indikatoren und Preistrends dynamisch überwacht.

Strategieprinzipien

Die Kernlogik der Strategie beruht auf folgenden Schlüsselelementen: 1. RSI-Divergenzdetektion: Identifiziert potenzielle Divergenzmuster, indem die Höhen und Tiefen der RSI-Indikatoren und die Preisentwicklung verglichen werden. 2. Fraktalbestätigung: Verwendet die Fraktaltheorie, um die Preisstruktur zu analysieren und die Divergenzvalidität zu bestätigen, indem lokale Höhen und Tiefen erkannt werden, um die Signalzuverlässigkeit zu verbessern. 3. Anpassung von Parametern: Einführung des Sensitivitätsparameters zur dynamischen Anpassung von Fraktalentscheidungsintervallen und Anpassung an verschiedene Marktumgebungen. 4. Risikokontrolle: Integriert prozentual basierte Stop Loss- und Take Profit-Mechanismen, um für jeden Handel ein kontrollierbares Risiko zu gewährleisten.

Strategische Vorteile

  1. Hohe Signalzuverlässigkeit: Der doppelte Bestätigungsmechanismus der RSI-Divergenz und der Fraktaltheorie verbessert die Genauigkeit der Handelssignale erheblich.
  2. Starke Anpassungsfähigkeit: Die Strategie kann die Parameter flexibel an unterschiedliche Marktbedingungen anpassen und zeigt eine gute Umweltanpassungsfähigkeit.
  3. Umfassendes Risikomanagement: Integrierte dynamische Stop-Loss- und Take-Profit-Mechanismen kontrollieren das Risikopositionsniveau für jeden Handel wirksam.
  4. Hohe Automatisierungsstufe: Die vollständige Automatisierung von der Signalidentifizierung bis zur Handelsausführung verringert die emotionale Auswirkung menschlichen Eingriffs.
  5. Gute Skalierbarkeit: Der Strategie-Rahmen unterstützt Anwendungen mit mehreren Instrumenten und mehreren Zeitrahmen und erleichtert Portfolioinvestitionen.

Strategische Risiken

  1. Abhängigkeit vom Marktumfeld: Die Zuverlässigkeit des Divergenzsignals kann in Trendmärkten abnehmen, was zusätzliche Trendfiltermechanismen erfordert.
  2. Parameterempfindlichkeit: Schlüsselparameter wie RSI-Schwellenwerte und Fraktal-Urteilsintervalle müssen sorgfältig abgestimmt werden, unsachgemäße Parameter-Einstellungen können die Strategieleistung beeinträchtigen.
  3. Signalverzögerung: Warten auf die vollständige Divergenzmusterbildung, bevor Signale bestätigt werden, kann zu verzögerten Einstiegszeiten führen.
  4. Marktlärmstörungen: Auf volatilen Märkten können falsche Divergenzsignale auftreten, die zusätzliche Filterbedingungen erfordern.

Strategieoptimierungsrichtlinien

  1. Hinzufügen von Trendfiltern: Einführung von Trendbeurteilungsindikatoren zur Filterung von Gegentrendsignalen in starken Trendmärkten, wodurch die Anpassungsfähigkeit der Strategie in verschiedenen Marktumgebungen verbessert wird.
  2. Optimierung der Anpassung der Parameter: Entwicklung dynamischer Mechanismen zur Anpassung der Parameter auf der Grundlage der Marktvolatilität, um die Strategie auf Marktveränderungen zu verbessern.
  3. Verbesserung der Risikokontrolle: Einführung dynamischer Stop-Loss-Mechanismen zur automatischen Anpassung von Stop-Loss-Positionen anhand der Marktvolatilität und Optimierung der Effekte des Geldmanagements.
  4. Verbesserung der Signalbestätigung: Aufbau eines umfassenderen Signalbestätigungssystems durch Kombination von Volumen, Volatilität und anderen Marktmikrostrukturindikatoren.

Zusammenfassung

Die Strategie baut durch eine innovative Kombination aus RSI-Divergenz und Fraktaltheorie ein robustes Handelssystem auf. Ihre Vorteile liegen in hoher Signalzuverlässigkeit, starker Anpassungsfähigkeit und umfassenden Risikokontrollmechanismen. Durch kontinuierliche Optimierung und Verbesserung wird erwartet, dass die Strategie eine stabile Performance in verschiedenen Marktumgebungen aufrechterhält. Beim Live-Handel wird empfohlen, Parameter entsprechend den Merkmalen des Marktes gründlich zu testen und zu optimieren und Risikokontrollmaßnahmen streng umzusetzen.


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


Verwandt

Mehr