SuperTrend-Doppelrichtungsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-10-08 15:02:45
Tags:

Übersicht

Diese Strategie verwendet die auf der Grundlage des ATR-Indikators berechneten oberen und unteren Bands, um die aktuelle Trendrichtung zu bestimmen und Kauf- und Verkaufssignale zu generieren.

Strategie Logik

  1. Berechnen Sie den ATR-Indikator, der die durchschnittliche Preisschwankungen darstellt.
  2. Die oberen und unteren Bands werden anhand des ATR-Wertes multipliziert mit einem Faktor berechnet.
  3. Die Trendrichtung wird anhand des Verhältnisses des Preises zu den Bands bestimmt.
    • Wenn der Preis über dem oberen Bereich liegt, ist es ein Aufwärtstrend.
    • Wenn der Preis unter dem unteren Band liegt, ist es ein Abwärtstrend.
  4. Erzeugen Sie Kauf- und Verkaufssignale, wenn sich der Trend ändert.
    • Ein Kaufsignal wird in der Nähe des oberen Bandes erzeugt, wenn sich der Trend von Abwärtstrend zu Aufwärtstrend verändert.
    • Ein Verkaufssignal wird in der Nähe des unteren Bandes erzeugt, wenn sich der Trend von Aufwärtstrend zu Abwärtstrend verändert.
  5. Visualisieren Sie die oberen/unteren Bands, die Trendrichtung und die Handelssignale.

Analyse der Vorteile

  • Die Verwendung von ATR zur Bestimmung des Trends kann die Bands an die Marktvolatilität anpassen, indem Parameter angepasst werden.
  • Erfasst die Trendumkehr rechtzeitig durch das Ausbrechen der Bands.
  • Filtert Signale nach Trendrichtung, um gefälschte Ausbrüche zu vermeiden.
  • Klare Visualisierung von Bands und Signalen.

Risikoanalyse

  • Eine unangemessene ATR-Periode kann die Bands vom Preis lösen.
  • Zu großer/kleinerer Multiplikator führt zu mehr falschen Signalen und Nachlässignal.
  • Unpräzise Umkehrzeiten führen zu Verlusten durch Umkehrhandel.
  • Benötigt andere Filter, um zu reduzieren, dass er gewischt wird.

Optimierungsrichtlinien

  • Dynamische Optimierung der ATR-Periode, um der Marktvolatilität gerecht zu werden.
  • Parameter-Tuning für verschiedene Produkte und Zeitrahmen.
  • Kombination anderer Indikatoren wie Volumen zur Validierung von Trends.
  • Verwenden Sie maschinelles Lernen für die Optimierung von Parametern.

Zusammenfassung

Diese Strategie implementiert die Idee der Bestimmung eines zweidimensionalen Trends basierend auf ATR. Breakout-Signale werden durch die Trendrichtung erzeugt und gefiltert, um gefälschte Signale zu vermeiden. Die Parameter können für verschiedene Marktumgebungen eingestellt werden. Es gibt immer noch einige Risiken, die weiter optimiert werden müssen. Insgesamt ist dies eine einfache und praktische Strategie, die es wert ist, recherchiert und verbessert zu werden.


/*backtest
start: 2022-10-01 00:00:00
end: 2023-10-07 00:00:00
period: 3d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

TradeId = "RVG"

InitCapital = 1000
InitPosition = 1000
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true

//@version=4
// strategy("Supertrend RG", overlay = true,process_orders_on_close=true,commission_type=strategy.commission.percent,commission_value=InitCommission,
//  currency=currency.USD,initial_capital=InitCapital,default_qty_type=strategy.cash, default_qty_value=InitPosition, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick,pyramiding=InitPyramidMax)

//
////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE

// From Date Inputs
fromDay = input(defval=1, title="From Day", minval=1, maxval=31)
fromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
fromYear = input(defval=2018, title="From Year", minval=1970)

// To Date Inputs
toDay = input(defval=1, title="To Day", minval=1, maxval=31)
toMonth = input(defval=1, title="To Month", minval=1, maxval=12)
toYear = input(defval=2100, title="To Year", minval=1970)

// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true



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)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
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)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


strategy.entry(TradeId + " Long", true, when=buySignal[1] and time_cond)
strategy.entry(TradeId + " Short", false, when=sellSignal[1] and time_cond)   




Mehr