Stochastic Momentum Index und RSI-basierte Quant Trading Strategie

Schriftsteller:ChaoZhang, Datum: 2023-12-12 15:20:29
Tags:

img

Übersicht

Diese Strategie basiert hauptsächlich auf zwei Indikatoren - Stochastic Momentum Index (SMI) und Relative Strength Index (RSI). Sie beinhaltet auch einen Farbfilter und einen Kerzenkörperfilter als Hilfsbedingungen. Handelssignale werden basierend auf den Kauf- und Verkaufssignalen von SMI und RSI erzeugt, kombiniert mit Filterbedingungen. Diese Strategie kann kurzfristige Handelsmöglichkeiten auf dem Markt effektiv entdecken.

Strategie Logik

Diese Strategie stützt sich auf SMI und RSI Indikatoren für das Urteil. SMI beurteilt hauptsächlich, ob eine Aktie überkauft oder überverkauft ist, während RSI die relative Stärke einer Aktie bestimmt. Wenn beide Indikatoren gleichzeitig Kaufsignale geben, wird eine Kaufaktion ausgelöst. Die spezifische Logik ist wie folgt:

  1. Wenn SMI überverkauft ist (unterhalb der unteren Grenze), wird es als Kaufsignal betrachtet
  2. Wenn der RSI unterhalb des Schwellenwerts liegt, gilt er als Kaufsignal
  3. Wenn sowohl der SMI-Überverkauf als auch der RSI unter dem entsprechenden Schwellenwert auftreten, wird ein Kaufsignal ausgelöst.
  4. Die Logik des Verkaufssignals ist ähnlich.

Darüber hinaus verfügt diese Strategie über einen Dual-Signal-Modus. Dieser Modus erfordert sowohl SMI- als auch RSI-Signale, um alle Trades auszulösen. Dies kann falsche Signale effektiv reduzieren.

Darüber hinaus sind Farbfilter und Kerzenkörperfilter integriert. Diese Filter erfordern einen relativ großen Kerzenkörper und die letzte Kerze schließt höher als geöffnet.

Vorteile

  1. Verwenden Sie SMI für Überkauf/Überverkauf und RSI für relative Stärke, doppelte Bestätigung kann falsche Signale reduzieren
  2. Dual-Signal-Modus kann unwirksame Trades erheblich verringern
  3. Farb- und Körperfilter können falsche Ausbrüche effektiv filtern
  4. Strategie ist einfach und klar.
  5. Die meisten Parameter sind anpassbar

Risiken und Optimierung

  1. SMI und RSI können mehr falsche Signale erzeugen, wenn sie alleine verwendet werden, müssen sorgfältig untersucht werden
  2. Im Dual-Signal-Modus können gute Handelschancen verpasst werden, wenn die Parameter nicht richtig eingestellt werden
  3. Kann die Rentabilität der Strategie unter verschiedenen periodischen Parametern testen, um eine optimale Parameterkombination zu finden
  4. Kann Schwellenparameter durch Simulation oder Backtesting bewerten
  5. Kann die Einbeziehung von mehr Filtern zur Optimierung der Strategie in Betracht ziehen

Zusammenfassung

Diese Strategie integriert die Signale sowohl von SMI als auch von RSI-Indikatoren und erzeugt Handelsorders durch doppelte Bestätigung. Farbfilter und Kerzenkörperfilter werden auch implementiert, um falsche Ausbrüche auszufiltern. Die Strategie hat einen einfachen und sauberen Logikfluss und die meisten Parameter sind anpassbar. Eine bessere Rendite kann durch entsprechende Anpassung der Parameter erzielt werden.


/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-06 19:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.3", shorttitle = "Stochastic str 1.3", overlay = false, 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, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usecol = input(true, defval = true, title = "Use Color-Filter")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent K Length")
b = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent D Length")
limitsmi = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
periodrsi = input(2, defval = 2, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(10, defval = 10, minval = 1, maxval = 50, title = "RSI Limit")
double = input(false, defval = false, title = "SMI+RSI Mode")
showbg = input(false, defval = false, title = "Show background")
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(close), 0), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
//avgrel = ema(ema(rdiff,b),b)
//avgdiff = ema(ema(diff,b),b)
avgrel = sma(sma(rdiff,b),b)
avgdiff = sma(sma(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limitsmi, color = black, title = "Over Bought")
plot(-1 * limitsmi, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Color-Filter
gb = close > open or usecol == false
rb = close < open or usecol == false

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limitsmi and rb and body and usesmi
dn1 = SMI > limitsmi and gb and body and usesmi
up2 = fastrsi < limitrsi and rb and body and usersi
dn2 = fastrsi > 100 - limitrsi and gb and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Background
redb = (SMI > limitsmi and usesmi) or (fastrsi > 100 - limitrsi and usersi)
limeb = (SMI < -1 * limitsmi and usesmi) or (fastrsi < limitrsi and usersi)
col = showbg == false ? na : redb ? red : limeb ? lime : na
bgcolor(col, transp = 50)

//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]

signalup = ((up1 or up2) and double == false) or (up1 and up2 and double)
if signalup
    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)))

signaldn = ((dn1 or dn2) and double == false) or (dn1 and dn2 and double)
if signaldn
    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