Diese Strategie verwendet den Supertrend-Indikator, um Preistrends zu bestimmen, und tritt bei Veränderung der Trends in Long- oder Short-Positionen ein. Die Strategie ermöglicht die Anpassung der ATR-Periode und des Multiplikators zur Optimierung der Parameter. Sie bietet auch die Möglichkeit, die ATR-Berechnungsmethode für leicht unterschiedliche Ergebnisse zu ändern.
Die Strategie verfügt über integrierte Backtesting-Datumbereiche und die Fähigkeit, nur zu bestimmten Tageszeiten zu handeln und alle Trades am Ende dieses Zeitrahmens zu schließen. Dies ist besonders nützlich für Tageshandelsaktien. Wenn die Zeitrahmenoption aktiviert ist, können Sie wählen, ob Sie die aktuelle Position sofort eingeben, wenn der Zeitrahmen beginnt, oder auf eine Trendänderung warten, um die erste Position zu betreten.
Die Strategie ermöglicht es Ihnen auch, prozentual basierte Stop Loss- und Take Profit-Levels anzugeben. In den meisten Fällen macht der ATR-basierte Stop, der von Supertrend selbst bereitgestellt wird, einen zusätzlichen Stop Loss unnötig.
Schließlich gibt es benutzerdefinierte Warnfelder für Eingangs- und Ausstiegsnachrichten, die mit automatisierten Handelsdiensten verwendet werden sollen.
Die Supertrend-Strategie beruht auf folgenden Grundprinzipien:
Berechnung des ATR-Wertes: Auswahl zwischen SMA-Berechnung oder integriertem ATR-Indikator.
atr2 = sma(tr, Periods)
Berechnen Sie die oberen und unteren Bands. Der obere Band ist nahe minus ATR Multiplikator mal ATR. Der untere Band ist nahe plus Multiplikator mal ATR.
up = close - (Multiplier * atr)
dn = close + (Multiplier * atr)
Bestimmung der Trendrichtung durch Vergleich des Preises mit den Bands. Aufwärtstrend, wenn der Preis über das untere Band geht. Abwärtstrend, wenn der Preis unter das obere Band geht.
trend := trend == -1 and close > dn ? 1 : trend == 1 and close < up ? -1 : trend
Erstellen Sie Handelssignale für eine Trendänderung, z. B. Verkaufssignale bei einem Wechsel von einem Aufwärtstrend zu einem Abwärtstrend:
sellSignal = trend == -1 and trend[1] == 1
Filter Eingang auf der Grundlage von Signalen und zusätzlichen Bedingungen.
Verwenden Sie Stop Loss und Take Profit, um Gewinne zu erzielen oder Risiken zu begrenzen.
Dies sind die wichtigsten Arbeitsprinzipien hinter der Supertrend-Strategie. In Kombination mit Parameteroptimierung kann sie gute Handelsergebnisse erzielen.
Die Supertrend-Strategie hat mehrere Vorteile:
Supertrend selbst identifiziert Trends effektiv und wird häufig für Trailing Stops verwendet.
Anpassbare ATR-Parameter können für die beste Anpassung von Produkten optimiert werden.
Konfigurierbare Backtest- und Live-Handelszeitenbereiche eignen sich für verschiedene Handelssitzungen.
Die Option, sofort den ersten Handel zu beginnen oder auf ein Signal zu warten, richtet sich an verschiedene Produkte.
Ein eingebautes Stop-Loss- und Take-Profit-System hilft, das Risikomanagement zu verbessern oder mehr Gewinne zu erzielen.
Anpassbare Handelswarnungen für die Integration in automatisierte Handelssysteme und Bots.
Es gibt auch einige Risiken, die zu berücksichtigen sind:
Supertrend kann falsche Signale erzeugen, die mit zusätzlichen Bedingungen gefiltert werden müssen.
Unzulässige ATR-Parameter können zu Überhandelungen oder fehlenden Trends führen.
Ein zu nahes Stop-Loss kann dazu führen, dass man vorzeitig aus profitablen Trades aussteigt.
Eine schlechte Zeitrahmenkonfiguration kann dazu führen, dass Handelssitzungen verpasst oder die Marge unnötig gebunden wird.
Diese Risiken können durch geeignete Anpassungen der Parameter oder zusätzliche Filter zur Verbesserung der Robustheit bekämpft werden.
Einige Möglichkeiten, wie die Strategie weiter optimiert werden kann:
Versuche verschiedene ATR-Perioden, um das richtige Gleichgewicht zu finden, normalerweise funktionieren 10-20 gut.
Versuchen Sie verschiedene ATR-Multiplikatorwerte, im Allgemeinen 2-5 sind angemessen, passen Sie an, um das optimale zu finden.
Fügen Sie Filter wie MACD, RSI usw. hinzu, um falsche Signale zu reduzieren.
Optimieren Sie den Stop-Loss und nehmen Sie Gewinnniveaus für die besten Ergebnisse.
Test verschiedene Handelszeitenbereiche. Kürzere Laufzeiten passen zu Intraday- und Hochfrequenzstrategien.
Implementieren Sie die automatische Symbolwahl, um hohe Dynamik oder Volatilität zu verfolgen.
Insgesamt handelt es sich um eine ziemlich verbreitete und praktische Trend-Folge-Strategie. Es verfolgt Trends effizient mit anpassbaren Parametern, hat aber auch inhärente Risiken zu bewältigen. Mit Optimierung und zusätzlichen Bedingungen kann es in ein robustes Quant-Trading-System mit konsistentem Alpha verfeinert werden.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © REV0LUTI0N //@version=4 // Strategy strategy("Supertrend Strategy", overlay=true, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash) Periods = input(title="ATR Period", type=input.integer, defval=10) src = input(hl2, title="Source") Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true) enableentry = input(true, title="Enter First Trade ASAP") waitentry = input(false, title="Wait To Enter First Trade") atr2 = sma(tr, Periods) atr= changeATR ? atr(Periods) : atr2 up=src-(Multiplier*atr) up1 = nz(up[1],up) up := close[1] > up1 ? max(up,up1) : up dn=src+(Multiplier*atr) dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green) Long = (trend == 1 ? up : na) buySignal = trend == 1 and trend[1] == -1 dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red) Short = (trend == 1 ? na : dn) sellSignal = trend == -1 and trend[1] == 1 // Strategy Backtesting startDate = input(timestamp("2021-01-01T00:00:00"), type = input.time, title='Backtesting Start Date') finishDate = input(timestamp("2021-12-31T00:00:00"), type = input.time, title='Backtesting End Date') time_cond = true //Time Restriction Settings startendtime = input("", title='Time Frame To Enter Trades') enableclose = input(false, title='Enable Close Trade At End Of Time Frame') timetobuy = (time(timeframe.period, startendtime)) timetoclose = na(time(timeframe.period, startendtime)) // Stop Loss & Take Profit % Based enablesl = input(false, title='Enable Stop Loss') enabletp = input(false, title='Enable Take Profit') stopTick = input(5.0, title='Stop Loss %', type=input.float, step=0.1) / 100 takeTick = input(10.0, title='Take Profit %', type=input.float, step=0.1) / 100 longStop = strategy.position_avg_price * (1 - stopTick) shortStop = strategy.position_avg_price * (1 + stopTick) shortTake = strategy.position_avg_price * (1 - takeTick) longTake = strategy.position_avg_price * (1 + takeTick) plot(strategy.position_size > 0 and enablesl ? longStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Fixed SL") plot(strategy.position_size < 0 and enablesl ? shortStop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Short Fixed SL") plot(strategy.position_size > 0 and enabletp ? longTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Long Take Profit") plot(strategy.position_size < 0 and enabletp ? shortTake : na, style=plot.style_linebr, color=color.green, linewidth=1, title="Short Take Profit") // Alert messages message_enterlong = input("", title="Long Entry message") message_entershort = input("", title="Short Entry message") message_closelong = input("", title="Close Long message") message_closeshort = input("", title="Close Short message") // Strategy Execution if Long and time_cond and timetobuy and enableentry strategy.entry("Long", strategy.long, alert_message = message_enterlong) if Short and time_cond and timetobuy and enableentry strategy.entry("Short", strategy.short, alert_message = message_entershort) if buySignal and time_cond and timetobuy and waitentry strategy.entry("Long", strategy.long, alert_message = message_enterlong) if sellSignal and time_cond and timetobuy and waitentry strategy.entry("Short", strategy.short, alert_message = message_entershort) if strategy.position_size > 0 and timetoclose and enableclose strategy.close_all(alert_message = message_closelong) if strategy.position_size < 0 and timetoclose and enableclose strategy.close_all(alert_message = message_closeshort) if strategy.position_size > 0 and enablesl and time_cond strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong) if strategy.position_size < 0 and enablesl and time_cond strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort) if strategy.position_size > 0 and enabletp and time_cond strategy.exit(id="Close Long", stop=longStop, limit=longTake, alert_message = message_closelong) if strategy.position_size < 0 and enabletp and time_cond strategy.exit(id="Close Short", stop=shortStop, limit=shortTake, alert_message = message_closeshort)