SuperTrend-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-02 11:11:48
Tags:

img

Übersicht

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.

Strategie Logik

Die Supertrend-Strategie beruht auf folgenden Grundprinzipien:

  1. Berechnung des ATR-Wertes: Auswahl zwischen SMA-Berechnung oder integriertem ATR-Indikator.

    atr2 = sma(tr, Periods)
    
  2. 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)
    
  3. 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
    
  4. 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 
    
  5. Filter Eingang auf der Grundlage von Signalen und zusätzlichen Bedingungen.

  6. 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.

Vorteile

Die Supertrend-Strategie hat mehrere Vorteile:

  1. Supertrend selbst identifiziert Trends effektiv und wird häufig für Trailing Stops verwendet.

  2. Anpassbare ATR-Parameter können für die beste Anpassung von Produkten optimiert werden.

  3. Konfigurierbare Backtest- und Live-Handelszeitenbereiche eignen sich für verschiedene Handelssitzungen.

  4. Die Option, sofort den ersten Handel zu beginnen oder auf ein Signal zu warten, richtet sich an verschiedene Produkte.

  5. Ein eingebautes Stop-Loss- und Take-Profit-System hilft, das Risikomanagement zu verbessern oder mehr Gewinne zu erzielen.

  6. Anpassbare Handelswarnungen für die Integration in automatisierte Handelssysteme und Bots.

Risiken

Es gibt auch einige Risiken, die zu berücksichtigen sind:

  1. Supertrend kann falsche Signale erzeugen, die mit zusätzlichen Bedingungen gefiltert werden müssen.

  2. Unzulässige ATR-Parameter können zu Überhandelungen oder fehlenden Trends führen.

  3. Ein zu nahes Stop-Loss kann dazu führen, dass man vorzeitig aus profitablen Trades aussteigt.

  4. 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.

Optimierungsmöglichkeiten

Einige Möglichkeiten, wie die Strategie weiter optimiert werden kann:

  1. Versuche verschiedene ATR-Perioden, um das richtige Gleichgewicht zu finden, normalerweise funktionieren 10-20 gut.

  2. Versuchen Sie verschiedene ATR-Multiplikatorwerte, im Allgemeinen 2-5 sind angemessen, passen Sie an, um das optimale zu finden.

  3. Fügen Sie Filter wie MACD, RSI usw. hinzu, um falsche Signale zu reduzieren.

  4. Optimieren Sie den Stop-Loss und nehmen Sie Gewinnniveaus für die besten Ergebnisse.

  5. Test verschiedene Handelszeitenbereiche. Kürzere Laufzeiten passen zu Intraday- und Hochfrequenzstrategien.

  6. Implementieren Sie die automatische Symbolwahl, um hohe Dynamik oder Volatilität zu verfolgen.

Schlussfolgerung

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)






Mehr