Schnelle RSI-Umkehrhandelsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-03-01 11:55:56
Tags:

img

Übersicht

Die Fast RSI Reversal Trading Strategie erzeugt Handelssignale, indem sie den Fast RSI Indikator, den Kerzenkörperfilter, den Min/Max-Preisfilter und den SMA-Filter kombiniert, um Trendumkehrpunkte für einen risikoarmen Umkehrhandel zu bestimmen.

Strategie Logik

Die Strategie stützt sich hauptsächlich auf folgende Indikatoren:

  1. Schneller RSI-Indikator: Berechnet den RSI mit Hilfe der RMA-Funktion, um ihn empfindlicher zu machen, um überkaufte/überverkaufte Signale schneller zu erfassen.

  2. Leuchterkörperfilter: Erfordert, dass die Leuchtturmkörpergröße 1/5 des EMA-Körperdurchschnitts übersteigt, um Situationen mit geringer Volatilität zu filtern.

  3. Min/Max-Preisfilter: Beurteilt, ob der Preis ein neues Hoch oder ein neues Tief erreicht, um eine Trendwende zu bestätigen.

  4. SMA-Filter: Erfordert den Preis, um die SMA-Linie für eine zusätzliche Bestätigung zu durchbrechen.

Handelssignale werden erzeugt, wenn mehrere der oben genannten Bedingungen gleichzeitig ausgelöst werden.

Long-Entry: Schneller RSI unter dem Überverkaufsniveau UND Kerzenkörper > 1/5 des EMA-Körpers UND Min-Preisdurchbruch UND Preiskreuzungen über der SMA

Kurzer Einstieg: Schneller RSI über dem überkauften Niveau UND Kerzenkörper > 1/5 des EMA-Körpers UND maximaler Preisdurchbruch UND Kurskreuzungen unterhalb der SMA

Ausgang: Schneller RSI zurück in den Normalbereich

Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Erfasst Volatilität aus kurzfristigen Umkehrungen
  2. Schneller RSI-Indikator ist empfindlich
  3. Mehrfache Filter verringern Falschsignale
  4. Kontrollierbares Risiko, geringe Auslastung

Risiken und Optimierung

Die Strategie birgt auch einige Risiken:

  1. Risiko einer fehlgeschlagenen Umkehrung
  2. Beschränkter Optimierungsraum

Kann weiter optimiert werden, indem:

  1. Filter zum Handelsvolumen hinzufügen
  2. Implementieren von Stop Loss
  3. Optimierung der Parameterkombination

Schlussfolgerung

Insgesamt handelt es sich um eine risikoarme kurzfristige Mittelumkehrhandelsstrategie. Sie identifiziert Handelssignale mit Fast RSI und verwendet mehrere Filter, um falsche Signale zu reduzieren, um einen kontrollierbaren Risikoumkehrhandel zu erreichen.


/*backtest
start: 2024-02-01 00:00:00
end: 2024-02-26 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy(title = "Noro's Fast RSI Strategy v1.4", shorttitle = "Fast RSI str 1.4", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 5)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usersi = input(true, defval = true, title = "Use Fast RSI Strategy")
usemm = input(true, defval = true, title = "Use Min/Max Strategy")
usesma = input(true, defval = true, title = "Use SMA Filter")
smaperiod = input(20, defval = 20, minval = 2, maxval = 1000, title = "SMA Filter Period")
rsiperiod = input(7, defval = 7, minval = 2, maxval = 50, title = "RSI Period")
limit = input(30, defval = 30, minval = 1, maxval = 100, title = "RSI limit")
rsisrc = input(close, defval = close, title = "RSI Price")
rsibars = input(1, defval = 1, minval = 1, maxval = 20, title = "RSI Bars")
mmbars = input(1, defval = 1, minval = 1, maxval = 5, title = "Min/Max Bars")
showsma = input(false, defval = false, title = "Show SMA Filter")
showarr = input(false, defval = false, title = "Show Arrows")
fromyear = input(2018, defval = 2018, 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")

//Fast RSI
fastup = rma(max(change(rsisrc), 0), rsiperiod)
fastdown = rma(-min(change(rsisrc), 0), rsiperiod)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Limits
bar = close > open ? 1 : close < open ? -1 : 0
uplimit = 100 - limit
dnlimit = limit

//RSI Bars
upsignal = fastrsi > uplimit ? 1 : 0
dnsignal = fastrsi < dnlimit ? 1 : 0
uprsi = sma(upsignal, rsibars) == 1
dnrsi = sma(dnsignal, rsibars) == 1

//Body
body = abs(close - open)
emabody = ema(body, 30)

//MinMax Bars
min = min(close, open)
max = max(close, open)
minsignal = min < min[1] and bar == -1 and bar[1] == -1 ? 1 : 0
maxsignal = max > max[1] and bar == 1 and bar[1] == 1 ? 1 : 0
mins = sma(minsignal, mmbars) == 1
maxs = sma(maxsignal, mmbars) == 1

//SMA Filter
sma = sma(close, smaperiod)
colorsma = showsma ? blue : na
plot(sma, color = colorsma, linewidth = 3)

//Signals
up1 = bar == -1 and (strategy.position_size == 0 or close < strategy.position_avg_price) and dnrsi and body > emabody / 5 and usersi
dn1 = bar == 1 and (strategy.position_size == 0 or close > strategy.position_avg_price) and uprsi and body > emabody / 5 and usersi
up2 = mins and (close > sma or usesma == false) and usemm
dn2 = maxs and (close < sma or usesma == false) and usemm 
exit = ((strategy.position_size > 0 and fastrsi > dnlimit and bar == 1) or (strategy.position_size < 0 and fastrsi < uplimit and bar == -1)) and body > emabody / 2

//Arrows
col = exit ? black : up1 or dn1 ? blue : up2 or dn2 ? red : 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
if up1 or up2
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)

if dn1 or dn2
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)
    
if time > timestamp(toyear, tomonth, today, 00, 00) or exit
    strategy.close_all()

Mehr