Die Super Trend Daily Reversal Strategy ist eine quantitative Handelsstrategie, die den Super Trend-Indikator verwendet, um Markttrends zu bestimmen, Preisdurchbruch und durchschnittlichen wahren Bereich kombiniert, um Stop-Loss zu berechnen, und den Preisänderungsrate-Indikator verwendet, um Super Trend-Signale zu filtern.
Der Kernindikator dieser Strategie ist der Super Trend-Indikator. Der Super Trend-Indikator basiert auf der Average True Range (ATR) und kann die Richtung der Markttrends klarer bestimmen.
Die Strategie verwendet den Preisänderungsrate (ROC) Indikator, um den Super Trend Indikator zu filtern, um ungültige Signale zu vermeiden.
Für den Stop-Loss bietet die Strategie zwei Stop-Loss-Methoden: festen Stop-Loss-Prozentsatz und ATR-basierten adaptive Stop-Loss.
Die Einstiegsbedingungen sind eine Umkehrung des Super Trend-Indikators und der Preisänderungsrate-Indikator geht den Filter. Die Ausgangsbedingungen sind, dass der Super Trend wieder umkehrt oder die Stop-Loss-Linie durchbricht. Die Strategie folgt dem Trend-Tracking-Prinzip und erlaubt nur eine Position in jeder Richtung.
Der größte Vorteil dieser Strategie besteht darin, dass der Super Trend-Indikator im Vergleich zu gewöhnlichen gleitenden Durchschnitten eine höhere Klarheit und Stabilität bei der Beurteilung der Trendrichtung aufweist, mit weniger Lärm. Darüber hinaus filtert der Preisänderungsindikator einige falsche Signale effektiv aus.
Der adaptive Stop-Loss-Mechanismus ATR ermöglicht es der Strategie auch, sich an ein breiteres Marktumfeld anzupassen.
Nach den Testergebnissen ist diese Strategie in einem Bullenmarkt außergewöhnlich erfolgreich. Die Gewinnrate ist bei langfristigen Trends von erheblicher Größe mit langen aufeinanderfolgenden profitablen Zyklen sehr hoch.
Das Hauptrisiko dieser Strategie besteht darin, eine Fehleinschätzung der Trendumkehr zu erwarten, die Umkehrsignale verpassen oder unnötige Umkehrsignale erzeugen kann.
Darüber hinaus kann ein zu breiter eingestellter Stop-Loss auch zu größeren Verlusten führen.
Um diesen Risiken entgegenzuwirken, kann der ATR-Berechnungszeitraum angemessen verkürzt oder der ATR-Stop-Loss-Multiplikator angepasst werden.
Die Strategie kann in folgenden Aspekten optimiert werden:
Anpassung der Parameter des Super Trend-Indikators zur Optimierung der ATR-Periode und ATR-Multiplikatoren, um die Super Trend-Linie glatter zu gestalten.
Anpassung der Parameter des Preisänderungsindikators zur Optimierung des Zeitraums und der Wechselkursschwelle zur Verringerung falscher Signale.
Versuchen Sie verschiedene Stop-Loss-Mechanismen wie Trailing-Stops oder optimieren Sie die Stop-Loss-Amplitude von festen Stops.
Zusätzliche Beurteilungsindikatoren werden hinzugefügt, um die wichtigsten Unterstützungs-/Widerstandsfaktoren zu ermitteln und eine Fehleinschätzung von Trendumkehrungen zu vermeiden.
Prüfen Sie die Einstellungen der Parameter und die Auswirkungen auf verschiedene Produkte, um die optimale Parameterkombination zu finden.
Durchführung von Backtest-Optimierungen, um die besten Parameter-Einstellungen zu finden.
Insgesamt ist die Super Trend Daily Reversal Strategy eine relativ stabile und zuverlässige Trendfolgestrategie. Sie kombiniert den Super Trend-Indikator und den Preisänderungsrate-Indikator zur Filterung, der die Richtung mittelfristiger und langfristiger Trends effektiv identifizieren kann. Der adaptive Stop-Loss-Mechanismus ATR ermöglicht es auch, sich an die meisten Marktumgebungen anzupassen. Durch die weitere Optimierung der Parameter-Einstellungen und zusätzliche Beurteilungsindikatoren können die Stabilität und Rentabilität dieser Strategie verbessert werden.
/*backtest start: 2024-01-22 00:00:00 end: 2024-02-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("Super Trend Daily BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075) /////////////// Time Frame /////////////// _1 = input(false, "════════ Test Period ═══════") testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true ///////////// Super Trend ///////////// _2 = input(false, "══════ Super Trend ══════") length = input(title="ATR Period", type=input.integer, defval=3) mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=1.3) atr = mult * atr(length) longStop = hl2 - atr longStopPrev = nz(longStop[1], longStop) longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop shortStop = hl2 + atr shortStopPrev = nz(shortStop[1], shortStop) shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop dir = 1 dir := nz(dir[1], dir) dir := dir == -1 and close > shortStopPrev ? 1 : dir == 1 and close < longStopPrev ? -1 : dir ///////////// Rate Of Change ///////////// _3 = input(false, "══════ Rate of Change ══════") source = close roclength = input(30, "ROC Length", minval=1) pcntChange = input(6, "ROC % Change", minval=1) roc = 100 * (source - source[roclength]) / source[roclength] emaroc = ema(roc, roclength / 2) isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2)) /////////////// Strategy /////////////// long = dir == 1 and dir[1] == -1 and isMoving() short = dir == -1 and dir[1] == 1 and isMoving() last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) /////////////// Dynamic ATR Stop Losses /////////////// _4 = input(false, "════════ Stop Loss ═══════") SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type") sl_inp = input(6.0, title='Fixed Stop Loss %') / 100 atrLkb = input(20, minval=1, title='ATR Stop Period') atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier') atr1 = atr(atrLkb) longStop1 = 0.0 longStop1 := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1] shortStop1 = 0.0 shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1] slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na slShort = strategy.position_avg_price * (1 + sl_inp) long_sl = in_long_signal ? slLong : na short_sl = in_short_signal ? slShort : na /////////////// Execution /////////////// if testPeriod() strategy.entry("L", strategy.long, when=long) strategy.entry("S", strategy.short, when=short) strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > 0) strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > 0) /////////////// Plotting /////////////// bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30) bgcolor(isMoving() ? dir == 1 ? color.lime : color.red : color.white , transp=80)