RSI-Signalverfolgungs-Umkehrhandelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-09-28 10:54:24
Tags:

Übersicht

Diese Strategie implementiert Umkehrhandel, indem sie verpasste Überkauf- und Überverkaufssignale vom RSI-Indikator verfolgt.

Strategie Logik

Identifizierung des Signals

Der RSI-Indikator identifiziert Überkauf-/Überverkaufsniveaus. Überkauf, wenn der RSI die Überkaufschwelle überschreitet, und Überkauf, wenn er die Überkaufschwelle überschreitet.

overbought = rsi > uplimit
oversold = rsi < dnlimit

Wenn der RSI war überkauft letzte Bar und Exits überkauft diese Bar, ein Kaufsignalup1Wenn der RSI war überverkauft letzte Bar und verkauft diese Bar, ein Verkauf Signaldn1ist erzeugt.

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false

Ausgangslogik

Wenn die Stangrichtung mit der Positionsrichtung übereinstimmt und der Stangkörper die Hälfte seines 10-Perioden-Durchschnitts überschreitet, wird ein Ausstiegssignal ausgelöst.

exit = (((strategy.position_size > 0 and bar == 1) or  
         (strategy.position_size < 0 and bar == -1)) and  
        body > abody / 2)

Vorteile

  1. Verfolgen Sie verpasste RSI-Umkehrsignale und vermeiden Sie die Notwendigkeit, überkaufte/überverkaufte Punkte rechtzeitig zu erfassen.

  2. Verwenden Sie die Umkehrungseigenschaft des RSI, um Wendepunkte zu erfassen.

  3. Einbeziehen Sie die Richtung und Größe der Stange in die Ausfahrtlogik, um eine weitere Verfolgung nach Rückzügen zu vermeiden.

Risiken und Lösungen

  1. Risiko falscher Signale durch RSI

    • Lösung: Bestätigen Sie Signale mit anderen Indikatoren, um falsche Signale zu vermeiden
  2. Die Preise sind möglicherweise bereits deutlich zurückgegangen, als das Signal verfolgt wurde, was das Verlustrisiko erhöht.

    • Lösung: Reduzieren Sie die Positionsgröße beim Einstieg oder optimieren Sie den Einstiegszeitplan
  3. Risiko eines vorzeitigen Ausstiegs vor vollständiger rentabler Umkehrung

    • Lösung: Verbessern Sie die Exit-Logik, um die Gewinnchancen zu erhöhen

Möglichkeiten zur Verbesserung

  1. Optimierung von Parametern wie Überkauf/Überverkauf, Rückblick auf die Vergangenheit usw. basierend auf verschiedenen Märkten

  2. Anpassung der Positionsgröße, z. B. Verringerung der Größe beim Verfolgen von Signalen

  3. Verbesserte Eingabezeit, Filter außerhalb von Signalverfolgung hinzufügen

  4. Verbessern Sie die Ausgänge, um die Rentabilität zu erhöhen, wie bei Profitstopps

  5. Optimieren Sie Stopps, um Verluste zu reduzieren, wie Trailing Stops oder Kegel Stops

Zusammenfassung

Diese Strategie implementiert Umkehrhandel, indem sie RSI-Überkauf/Überverkaufssignale verfolgt. Sie hat den Vorteil, Umkehrsignale zu erfassen, hat aber auch Risiken für falsche Signale und Verluste. Weitere Optimierungen können die Stabilität und Rentabilität der Strategie verbessern.


/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Anti RSI Strategy v1.0", shorttitle = "Anti RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
rsiperiod1 = input(14, defval = 14, minval = 2, maxval = 50, title = "RSI Period")
rsilimit1 = input(25, defval = 25, minval = 1, maxval = 100, title = "RSI limit")
showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//RSI
uprsi1 = rma(max(change(close), 0), rsiperiod1)
dnrsi1 = rma(-min(change(close), 0), rsiperiod1)
rsi = dnrsi1 == 0 ? 100 : uprsi1 == 0 ? 0 : 100 - (100 / (1 + uprsi1 / dnrsi1))
uplimit = 100 - rsilimit1
dnlimit = rsilimit1

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overbought = rsi > uplimit
oversold = rsi < dnlimit

up1 = bar == -1 and strategy.position_size == 0 and overbought[1] and overbought == false
dn1 = bar == 1 and strategy.position_size == 0 and oversold[1] and oversold == false
up2 = bar == -1 and strategy.position_size > 0 and overbought == false
dn2 = bar == 1 and strategy.position_size < 0 and oversold == false

norma = overbought == false and oversold == false
exit = (((strategy.position_size > 0 and bar == 1) or (strategy.position_size < 0 and bar == -1)) and body > abody / 2)

//Arrows
col = exit ? black : up1 or dn1 or up2 or dn2 ? blue : na
needup = up1 or up2
needdn = dn1 or dn2
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Mehr