Strategie für Stochastische Momentum-Doppelindikatoren

Schriftsteller:ChaoZhang, Datum: 2023-10-07 16:45:25
Tags:

Übersicht

Diese Strategie verwendet zwei stochastische Impulsindikatoren (SMI und RSI) für lange und kurze Signale sowie Martingale und Body-Filter für die Handelssignalwahl, um mittelfristige Trends und Kursschwankungen zu erfassen.

Strategie Logik

Die Strategie beurteilt Long und Short anhand von zwei stochastischen Indikatoren SMI und RSI. SMI wird auf der Grundlage des gleitenden Durchschnitts der Bar-Range und des Schlusskurses berechnet, gut bei der Identifizierung von Umkehrpunkten. RSI vergleicht die Bullen- und Bärenkraft, um den Überkauf- und Überverkaufstatus zu bestimmen. Die Strategie geht lang, wenn SMI unter -50 und RSI unter 20 ist; geht kurz, wenn SMI über 50 und RSI über 80 ist.

Um falsche Ausbrüche zu filtern, verwendet die Strategie auch 1/3 der 10-Perioden-Körper-SMA als Durchbruchfilterbedingung.

Darüber hinaus setzt die Strategie optional Martingale ein, bei dem es darum geht, Lots bei verlorenen Trades zu skalieren und zu versuchen, frühere Verluste wiederherzustellen.

Die Backtest-Funktionalität überprüft die Strategie durch Eingabe eines Datumsbereichs.

Analyse der Vorteile

Die Strategie kombiniert zwei stochastische Indikatoren und Filter, die in der Lage sind, Umkehrpunkte effektiv zu identifizieren, mittelfristige Trends zu erfassen und Kursschwankungen zu verfolgen.

  • SMI hat eine starke Fähigkeit zur Erkennung von Umkehrpunkten und kann überkaufte und überverkaufte Bedingungen effektiv bestimmen.
  • Durch das Hinzufügen des RSI werden fehlende Trades vermieden.
  • Der Körperfilter beseitigt falsche Ausbrüche und verbessert die Signalgenauigkeit.
  • Die optionale Martingale-Strategie ermöglicht die Erholung eines Teils der Verluste.

Risikoanalyse

  • Als nachlassende Indikatoren haben SMI und RSI das Risiko, Höchststände zu verfolgen und Tiefstände zu töten.
  • Martingale birgt das Risiko, dass sich die Verluste beschleunigen.
  • Filter können einige gültige Signale in unterschiedlichen Märkten herausfiltern.

Die Risiken können gemildert werden, indem die SMI- und RSI-Parameter optimiert werden, um die Verfolgungs-/Tötungswahrscheinlichkeit zu senken, indem die Martingale strategisch verwendet wird, indem die Skalierungsquote und -zeiten gesteuert werden, und Filter nach Ermessen basierend auf den Marktbedingungen aktiviert werden.

Optimierungsrichtlinien

  • Optimierung der SMI- und RSI-Parameter für eine optimale Urteilswirksamkeit.
  • Filterparameter anpassen, um die Wahrscheinlichkeit der Filterung gültiger Signale zu verringern.
  • Optimieren Sie Martingale-Skalierungszeiten und -Verhältnis.
  • Verwenden Sie Trendindikatoren, um nicht gegen den Trend zu handeln.
  • Hinzufügen von Stop Loss, um Verluste bei einzelnen Trades zu begrenzen.

Zusammenfassung

Die Strategie kombiniert doppelte stochastische Indikatoren, um Umkehrpunkte zu erfassen, mit Filtern und Martingale für die Handelssignalauswahl und -verfolgung. Sie kann mittelfristige Trends effektiv identifizieren und Kursschwankungen verfolgen, geeignet für Anleger, die eine hohe Gewinnrate anstreben. Achten Sie auf Indikatorverzögerungen und Marktrisiken, verwalten Sie Risiken durch Parameteroptimierung und Stop-Loss.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy(title = "CS Basic Scripts - Stochastic Special (Strategy)", shorttitle = "Stochastic Special", 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")

//Backtesting Input Range
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 = SMI < -1 * limit and close < open and body and usesmi
dn1 = SMI > 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()

Mehr