Diese Strategie ist eine Kombinationsstrategie, die Dynamikindikatoren, Trend-Folgende Indikatoren und gleitende Durchschnittsindikatoren integriert, um Trend-Folgende und Breakout-Eintritt/Ausgang zu realisieren.
Die Strategie besteht aus folgenden Indikatoren:
EMA-Linien: Verwenden Sie EMA 25, 50, 100 und 200 zur Bestimmung des Haupttrends. Wenn EMA25 über EMA50 und EMA100 über EMA200 kreuzt, ist dies ein Aufwärtstrend, andernfalls ist es ein Abwärtstrend.
Supertrend Trend Following Indikator: Die Parameter sind Faktor 3 und ATR 10, um zu beurteilen, ob sich der aktuelle Preis in einem Aufwärtstrend oder einem Abwärtstrend befindet.
Stochastic Momentum-Indikator: %K 8 und %D 3, um festzustellen, ob Stochastic ein goldenes Kreuz oder ein totes Kreuz erzeugt. Wenn die %K-Linie die %D-Linie von unten überquert, ist dies ein goldenes Kreuzsignal und umgekehrt für ein totes Kreuz.
Die Kaufstrategie lautet: EMA zeigt Aufwärtstrend + Supertrend zeigt Aufwärtstrend + Stochastische goldene Kreuzung.
Die Verkaufsstrategie lautet: EMA zeigt Abwärtstrend + Supertrend zeigt Abwärtstrend + Stochastic Dead Cross.
Diese Strategie integriert Trend-, Dynamik- und Breakout-Indikatoren, um Marktbewegungen und Handelspunkte zuverlässig zu bestimmen.
Die wichtigsten Vorteile dieser Strategie sind:
Die Kombination mehrerer Indikatoren verbessert die Robustheit und filtert gefälschte Ausbrüche effektiv aus.
Durch das Hinzufügen eines Impulsindikators können wichtige Punkte frühzeitig erkannt werden.
Anpassungsfähige Parameter eignen sich für verschiedene Marktumgebungen.
Realisiert eine relativ effiziente Stop-Loss- und Take-Profit-Einstellung.
Funktioniert gut, wenn es in hohen Zeitrahmen wie täglich getestet wird.
Es gibt auch einige Risiken:
Eine falsche Einstellung der Parameter kann zu einem zu häufigen Handel oder zu instabilen Signalen führen.
Es kann immer noch zu Fehleinschätzungen im Timing kommen, mehr Filterindikatoren können hinzugefügt werden.
Ein Stop-Loss, der auf Stochastik-Extreme gesetzt ist, ist möglicherweise zu nah.
Unzureichende Backtestdaten können bei der Anpassung der Parameter zu Verzerrungen führen.
Die Strategie kann wie folgt optimiert werden:
Testen Sie mehr Parametermengen, um das Optimum zu finden.
Fügen Sie mehr Filterindikatoren wie Energie oder Volatilität hinzu, um Fehleinschätzungen zu reduzieren.
Versuche verschiedene Stop-Loss-Methoden, z. B. prozentual basierte Stop-Loss-Methoden.
Optimieren, Gewinn machen, wie ein Trailing Stop, um mehr Gewinn zu erzielen.
Umfang erweitern, sich an mehr Produkte oder längere Zeitrahmen anpassen.
Die Logik der Strategie ist klar und die Indikatorauswahl vernünftig. Sie realisiert Trendfollowing und Momentum-Breakout-Trading mit guten Backtest-Ergebnissen. Aber es gibt immer noch Raum für Optimierungen, z. B. Parameter-Tuning, Hinzufügen von Filtern, Verbesserung von Stops und Gewinnentnahme. Mehrdimensionale Optimierung kann die Strategie robuster machen.
/*backtest start: 2023-12-05 00:00:00 end: 2023-12-06 07:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Supertrend + Stoch Strategy", overlay=true) // ---inputs--- pl = input(1.5, title="P/L", minval=0.1) lossPercentage = input(1, title="Loss Percentage", minval=1, maxval=100) atrPeriod = input(10, "ATR Length") factor = input(3, "Supertrend Factor") periodK = input(8, title="%K Length", minval=1) smoothK = input(3, title="%K Smoothing", minval=1) periodD = input(3, title="%D Smoothing", minval=1) ema1l = input(25, title="EMA 1 Length", minval=1) ema2l = input(50, title="EMA 2 Length", minval=1) ema3l = input(100, title="EMA 3 Length", minval=1) ema4l = input(200, title="EMA 4 Length", minval=1) // ---lines--- ema1 = ema(close, ema1l) ema2 = ema(close, ema2l) ema3 = ema(close, ema3l) ema4 = ema(close, ema4l) trendUpper = ema1 > ema2 and ema3 > ema4 trendLower = ema1 < ema2 and ema3 < ema4 [supertrend, direction] = supertrend(factor, atrPeriod) supertrendUpper = direction < 0 supertrendLower = direction > 0 k = sma(stoch(close, high, low, periodK), smoothK) d = sma(k, periodD) stochCrossOver = crossover(k, d) stochCrossUnder = crossunder(k, d) // ---plot--- plot(ema1, color=color.green) plot(ema2, color=color.orange) plot(ema3, color=color.blue) plot(ema4, color=color.purple) bodyMiddle = plot((open + close) / 2, display=display.none) upTrend = plot(direction < 0 ? supertrend : na, "Up Trend", color = color.green, style=plot.style_linebr) downTrend = plot(direction < 0 ? na : supertrend, "Down Trend", color = color.red, style=plot.style_linebr) fill(bodyMiddle, upTrend, color.new(color.green, 95), fillgaps=false) fill(bodyMiddle, downTrend, color.new(color.red, 95), fillgaps=false) // ---stop place compute--- edge = 0. // periodly high/low edge := stochCrossOver ? high : stochCrossUnder ? low : k > d ? max(edge[1], high) : k < d ? min(edge[1], low) : edge[1] // plot(edge) // ---trade condition--- // longCond = trendUpper and supertrendUpper and stochCrossOver // shortCond = trendLower and supertrendLower and stochCrossUnder longCond = trendUpper and supertrendUpper and stochCrossOver and strategy.position_size == 0 shortCond = trendLower and supertrendLower and stochCrossUnder and strategy.position_size == 0 // ---stop & take--- stop = 0. stop := nz(stop[1], stop) take = 0. take := nz(take[1], take) if longCond stop := edge[1] take := close + (close - stop) * pl if shortCond stop := edge[1] take := close - (stop - close) * pl // ---trade--- qty = strategy.equity / abs(stop - close) / 100 * lossPercentage strategy.entry("Buy", strategy.long, when=longCond, qty=qty) strategy.exit("Close Buy","Buy", limit=take, stop=stop) strategy.entry("Sell", strategy.short, when=shortCond, qty=qty) strategy.exit("Close Sell","Sell", limit=take, stop=stop) stopLine = plot(strategy.position_size != 0 ? stop : na, color=color.red, style=plot.style_linebr) takeLine = plot(strategy.position_size != 0 ? take : na, color=color.green, style=plot.style_linebr) entryLine = plot(strategy.position_size != 0 ? strategy.position_avg_price : na, color=color.blue, style=plot.style_linebr) fill(entryLine, stopLine, color.new(color.red, 90), fillgaps=false) fill(entryLine, takeLine, color.new(color.green, 90), fillgaps=false)