Die Stochastic Momentum Strategy ist eine quantitative Handelsstrategie, die den Stochastic Momentum Index (SMI) und den Relative Strength Index (RSI) kombiniert.
Der Stochastic Momentum Index (SMI) ist ein allgemeiner technischer Indikator, der im quantitativen Handel verwendet wird und die Stärken von Momentum- und Oszillationsindikatoren kombiniert.
Insbesondere wird der SMI berechnet:
SMI = (nahe - (HH + LL) /2)/(0,5*(HH - LL)) * 100
wobei HH der höchste Preis in den letzten N Tagen und LL der niedrigste Preis ist.
Der SMI beinhaltet also sowohl das trendfolgende Urteil der Dynamik als auch das umgekehrte Urteil der Oszillation. Werte über 80 gelten als überkauft, während Werte unter 20 als überverkauft gelten.
Der Relative Strength Index (RSI) ist ein Standard-Indikator für Überkauf/Überverkauf.
Bei Messungen unter 20 gelten als überverkauft, während bei Messungen über 80 als übergekauft angesehen wird.
Die Strategie implementiert auch einen Körperfilter, indem sie die Körpergröße des Kerzenhalters überprüft, um bestimmte Signale zu filtern.
Dies filtert einige falsche Signale aus und erhöht die Zuverlässigkeit.
Dieser Ansatz kombiniert SMI, schnelle RSI und Körperfilter zu einem robusten 3-teiligen System.
Sowohl der SMI als auch der schnelle RSI eignen sich hervorragend zur Erkennung erschöpfter Trends.
Die Fähigkeit, sowohl Tiefgänge als auch kurze Rallyes zu kaufen, maximiert die Chancen unter Marktbedingungen.
Der Körperfilter vermeidet Whipsaws, indem er in schwierigen Bedingungen Signalen mit geringer Überzeugung ablehnt.
Häufige lange/kurze Umschaltungen bringen das Whipsaw-Risiko mit sich.
Die Signalübertragung kann Marktteilnehmer zusammenführen und schnelle Umkehrungen beim Eintritt auslösen.
Extreme Ereignisse können alle Modelle auf den Kopf stellen. Intelligente Stop-Loss sind notwendig, um systematische Risiken zu kontrollieren.
Durch die Prüfung verschiedener SMI/RSI-Perioden und Körperfilterschwellenwerte könnten optimale Werte für höhere Renditen ermittelt werden.
Die Einbeziehung von volatilitätsbasierten oder ATR-Stopps würde besser das Positions- und Portfoliorisiko enthalten.
Modelle, die zukünftige Indikatorniveaus vorhersagen, könnten Wendepunkte früher identifizieren.
Zusammenfassend lässt sich sagen, dass diese Strategie durch die Integration von SMI, schnellerem RSI und Körperfilter ein ziemlich umfassendes Überkauf/Überverkaufssystem geschaffen hat.
/*backtest start: 2023-12-22 00:00:00 end: 2024-01-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", 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") usebod = input(true, defval = true, title = "Use Body-Filter") a = input(5, "SMI Percent K Length") b = input(3, "SMI Percent D Length") limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit") fromyear = input(2017, defval = 2017, 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), 7) fastdown = rma(-min(change(close), 0), 7) 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) 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(limit, color = black, title = "Over Bought") plot(-1 * limit, color = black, title = "Over Sold") plot(0, color = blue, title = "Zero Line") //Body Filter nbody = abs(close - open) abody = sma(nbody, 10) body = nbody > abody / 3 or usebod == false //Signals up1 = SMIsignal < -1 * limit and close < open and body and usesmi dn1 = SMIsignal > limit and close > open and body and usesmi up2 = fastrsi < 20 and close < open and body and usersi dn2 = fastrsi > 80 and close > open and body and usersi exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body //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()