Dreifache stochastische Momentum-Strategie


Erstellungsdatum: 2024-01-26 12:15:20 zuletzt geändert: 2024-01-26 12:15:20
Kopie: 2 Klicks: 768
1
konzentrieren Sie sich auf
1617
Anhänger

Dreifache stochastische Momentum-Strategie

Überblick

Die Triple-Overlay-Random-Dynamik-Strategie ist eine typische Short-Line-Handelsstrategie. Sie bildet ein Handelssignal, indem sie drei Zufalls-Dynamik-Indikatoren mit verschiedenen Parameter-Sets berechnet und mehrfach überlappt. Wenn drei Zufalls-Dynamik-Indikatoren gleichzeitig ein Überkauf- oder Überverkaufssignal anzeigen, wird ein Kauf oder Verkauf getätigt. Die Strategie kombiniert die Vorteile der Mehrzeit-Zyklus-Analyse, um Marktlärm effektiv zu filtern und die Signalqualität zu verbessern.

Strategieprinzip

Der Kern der Strategie ist der Zufallsdynamik-Indikator (SMI). Die Berechnungsformel für den SMI-Indikator lautet:

SMI = 100 * EMA(EMA(收盘价-最高价和最低价的中点,N1),N2) / 0.5 * EMA(EMA(最高价-最低价,N1),N2)

N1 und N2 sind die Parameterlängen. Der SMI-Indikator nimmt Werte zwischen -100 und 100, wenn der SMI höher als 0 ist, ist der Schlusskurs in der oberen Hälfte des Preisbereichs für den Tag, wenn er niedriger als 0 ist, ist der Schlusskurs in der unteren Hälfte des Preisbereichs.

Ähnlich wie bei herkömmlichen Stoch-Indikatoren erzeugt der SMI ein Kaufsignal, wenn er die vorgegebene Überkauflinie (wie 40) und Überverkauflinie (wie 40) überschreitet. Ein Verkaufsignal wird erzeugt, wenn der SMI seinen Moving Average überschreitet und ein Kaufsignal erzeugt, wenn er seinen Moving Average unterschreitet.

Die Strategie überlagert die SMI-Indikatoren in drei Gruppen mit unterschiedlichen Parameter-Einstellungen, die jeweils so eingestellt sind:

  • SMI1: %K Länge 10 Zyklen, %K Gleitzeit 3 Zyklen
  • SMI2: %K Länge 20 Zyklen, %K Gleitzeit 3 Zyklen
  • SMI3: %K Länge 5 Zyklen, %K Gleitzeit 3 Zyklen

Wenn die drei SMI-Indikatoren gleichzeitig überkauft oder überverkauft sind, wird ein Handelssignal ausgegeben. Dies kann falsche Signale effektiv filtern und die Signalqualität verbessern.

Strategische Vorteile

  • Mehrzeit-Analysen, umfassende Beurteilung und effektive Geräuschfilterung
  • SMI-Indikatoren erweitern die Benutzerfreundlichkeit von Stoch-Indikatoren
  • Triple-Overlay-Methoden sind zuverlässiger als ein einzelner Indikator
  • Die Parameter sind flexibel und anpassbar
  • Anwendbar für Hochfrequenzkurzleitungen

Strategisches Risiko

  • Mehrfache Indikatoren überlappen sich, es gibt einen Rückstand
  • Kurzleitungen sind häufig und die Transaktionskosten hoch.
  • Risiko der Datengerechtigkeit
  • Risiko von Parameterversagen nach Veränderung der Marktstruktur

Risikominderungsmaßnahmen:

  • Optimierung der Parameter und Verringerung der Rückstände
  • Um die Haltedauer entsprechend anzupassen und die Transaktionskosten zu senken
  • Erhöhung der statistischen Überprüfungen und Tests auf Gesundheit
  • Dynamische Anpassungsparameter

Strategieoptimierung

  • Verschiedene Kombinationen von SMI-Parametern testen
  • Erhöhung der statistischen Kennzahlen zur Beurteilung der Parameterstabilität
  • In Kombination mit anderen Hilfsindikatoren, wie Transaktionen, Brin-Band usw.
  • Wechselparameter basierend auf dem dynamischen Marktumfeld
  • Optimierung der Stop-Loss-Strategie

Zusammenfassen

Die Triple-Random-Dynamik-Strategie erzeugt ein hochwertiges Überkauf-Überverkauf-Handelssignal, indem sie drei verschiedene Sätze von SMI-Indikatoren mit unterschiedlichen Parameter-Sätzen über mehrere Zeiträume hinweg zusammengefasst beurteilt wird. Die Strategie filtert mehr Geräusche und erhöht die Stabilität im Vergleich zu einem einzelnen Indikator. Im nächsten Schritt kann die Strategie durch Parameteroptimierung, statistische Prüfung und Hilfsindikatoren verbessert werden, um die Strategie robuster zu machen.

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

//@version=2
strategy("Stochastic Momentum multi strategy", "Stochastic Momentum Index multi strategy", overlay=false)

q = input(10, title="%K Length")
r = input(3, title="%K Smoothing Length")
s = input(3, title="%K Double Smoothing Length")
nsig = input(10, title="Signal Length")
matype = input("ema", title="Signal MA Type")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought = input(40, title="Overbought Level", type=float)
oversold = input(-40, title="Oversold Level", type=float)

trima(src, length) => sma(sma(src,length),length)
hma(src, length) => wma(2*wma(src, length/2)-wma(src, length), round(sqrt(length)))
dema(src, length) => 2*ema(src,length) - ema(ema(src,length),length)
tema(src, length) => (3*ema(src,length) - 3*ema(ema(src,length),length)) + ema(ema(ema(src,length),length),length)
zlema(src, length) => ema(src,length) + (ema(src,length) - ema(ema(src,length),length))

smi = 100 * ema(ema(close-0.5*(highest(q)+lowest(q)),r),s) / (0.5 * ema(ema(highest(q)-lowest(q),r),s))
sig = matype=="ema" ? ema(smi,nsig) : matype=="sma" ? sma(smi,nsig) : matype=="wma" ? wma(smi,nsig) : matype=="trima" ? trima(smi,nsig) : matype=="hma" ? hma(smi,nsig) : matype=="dema" ? dema(smi,nsig) : matype=="tema" ? tema(smi,nsig) : matype=="zlema" ? zlema(smi,nsig) : ema(smi,nsig)

p_smi = plot(smi, title="SMI", color=aqua)
p_sig = plot(sig, title="Signal", color=red)

// plotchar(crossover(smi, sig), title= "low", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi, sig), title= "high", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////2
q2 = input(20, title="%K Length 2")
r2 = input(3, title="%K Smoothing Length 2")
s2 = input(3, title="%K Double Smoothing Length 2")
nsig2 = input(10, title="Signal Length 2")
matype2 = input("ema", title="Signal MA Type 2")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought2 = input(40, title="Overbought Level 2", type=float)
oversold2 = input(-40, title="Oversold Level 2", type=float)

trima2(src2, length2) => sma(sma(src2,length2),length2)
hma2(src2, length2) => wma(2*wma(src2, length2/2)-wma(src2, length2), round(sqrt(length2)))
dema2(src2, length2) => 2*ema(src2,length2) - ema(ema(src2,length2),length2)
tema2(src2, length2) => (3*ema(src2,length2) - 3*ema(ema(src2,length2),length2)) + ema(ema(ema(src2,length2),length2),length2)
zlema2(src2, length2) => ema(src2,length2) + (ema(src2,length2) - ema(ema(src2,length2),length2))

smi2 = 100 * ema(ema(close-0.5*(highest(q2)+lowest(q2)),r2),s2) / (0.5 * ema(ema(highest(q2)-lowest(q2),r2),s2))
sig2 = matype2=="ema" ? ema(smi2,nsig2) : matype2=="sma 2" ? sma(smi2,nsig2) : matype2=="wma 2" ? wma(smi2,nsig2) : matype2=="trima 2" ? trima2(smi2,nsig2) : matype2=="hma 2" ? hma2(smi2,nsig2) : matype=="dema 2" ? dema2(smi2,nsig2) : matype2=="tema 2" ? tema2(smi2,nsig2) : matype2=="zlema 2" ? zlema2(smi2,nsig2) : ema(smi2,nsig2)

p_smi2 = plot(smi2, title="SMI 2", color=aqua)
p_sig2 = plot(sig2, title="Signal2", color=red)

// plotchar(crossover(smi2, sig2), title= "low2", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi2, sig2), title= "high2", location=location.top, color=red, char="▼", size= size.tiny)

/////////////////////////////3
q3 = input(5, title="%K Length 3")
r3 = input(3, title="%K Smoothing Length 3")
s3 = input(3, title="%K Double Smoothing Length 3")
nsig3 = input(10, title="Signal Length 3")
matype3 = input("ema", title="Signal MA Type 3")  // possible: ema, sma, wma, trima, hma, dema, tema, zlema
overbought3 = input(40, title="Overbought Level 3", type=float)
oversold3 = input(-40, title="Oversold Level 3", type=float)

trima3(src3, length3) => sma(sma(src3,length3),length3)
hma3(src3, length3) => wma(2*wma(src3, length3/2)-wma(src3, length3), round(sqrt(length3)))
dema3(src3, length3) => 2*ema(src3,length3) - ema(ema(src3,length3),length3)
tema3(src3, length3) => (3*ema(src3,length3) - 3*ema(ema(src3,length3),length3)) + ema(ema(ema(src3,length3),length3),length3)
zlema3(src3, length3) => ema(src3,length3) + (ema(src3,length3) - ema(ema(src3,length3),length3))

smi3 = 100 * ema(ema(close-0.5*(highest(q3)+lowest(q3)),r3),s3) / (0.5 * ema(ema(highest(q3)-lowest(q3),r3),s3))
sig3 = matype3=="ema" ? ema(smi3,nsig3) : matype3=="sma 3" ? sma(smi3,nsig3) : matype3=="wma 3" ? wma(smi3,nsig3) : matype3=="trima 3" ? trima3(smi3,nsig3) : matype3=="hma 3" ? hma3(smi3,nsig3) : matype=="dema 3" ? dema3(smi3,nsig3) : matype3=="tema 3" ? tema3(smi3,nsig3) : matype3=="zlema 3" ? zlema3(smi3,nsig3) : ema(smi3,nsig3)

p_smi3 = plot(smi3, title="SMI 3", color=aqua)
p_sig3 = plot(sig3, title="Signal3", color=red)

// plotchar(crossover(smi3, sig3) and crossover(smi2, sig2) and crossover(smi, sig), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
// plotchar(crossunder(smi3, sig3) and crossunder(smi2, sig2) and crossunder(smi, sig), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)
plotchar (((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title= "low3", location=location.bottom, color=green, char="▲", size= size.tiny)
plotchar (((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title= "high3", location=location.top, color=red, char="▼", size= size.tiny)

// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

longCondition = ((smi3 < sig3) and (smi2 < sig2) and (smi < sig))
shortCondition = ((smi3 > sig3) and (smi2 > sig2) and (smi > sig))

// buy = longCondition == 1 and longCondition[1] == 1 ? longCondition : na
buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// === ALERTS ===
strategy.entry("L", strategy.long, when=buy)

strategy.entry("S", strategy.short, when=sell)

alertcondition(((smi3 < sig3) and (smi2 < sig2) and (smi < sig)), title='Low Fib.', message='Low Fib. Buy')
alertcondition(((smi3 > sig3) and (smi2 > sig2) and (smi > sig)), title='High Fib.', message='High Fib. Low')