Adaptive Supertrend-Kanal-Handelsstrategie

Schriftsteller:ChaoZhang, Datum: 2023-09-20 15:17:51
Tags:

Übersicht

Diese Strategie baut doppelgeschichtete Supertrend-Kanäle auf und erzeugt Handelssignale, wenn der Preis durch die Kanäle bricht.

Strategie Logik

  1. Berechnen Sie die Preisstandardabweichung und Volatilität ATR, verwenden Sie die Volatilität, um die Kanalbreite anzupassen.

  2. Erstellen Sie doppelgeschichtete Supertrend-Kanäle, wobei die innere Schicht empfindlicher und die äußere Schicht stabiler ist.

  3. Erzeugen Sie Kauf-/Verkaufssignale, wenn der Preis den inneren oder äußeren Kanal durchbricht.

  4. Die Doppelkanalstruktur hilft, einige falsche Ausbrüche zu filtern.

  5. Die ATR-Volatilität passt sich der Kanalbreite an und wird bei steigender Volatilität breiter.

Vorteile

  1. Supertrend-Kanäle sind einfach und effektiv, um Trends zu verfolgen.

  2. Der Doppelkanal filtert falsche Ausbrüche und verbessert die Signalqualität.

  3. Durch die an die Volatilität angepasste Anpassung passen die Kanäle unterschiedlichen Marktumgebungen an.

  4. Einfach zu implementieren mit einfachen Parameter-Tuning.

  5. Visualisierte Kanäle und Breakouts bilden intuitive Handelssignale.

Risiken

  1. Ausbruchssignale können falsche Signale erzeugen, die zu unnötigen Verlusten führen.

  2. Es kann nicht die Trendrichtung bestimmen, die Risiken des gegentrendischen Handels.

  3. Die Anpassung kann zu empfindlich sein, mit Überanpassungen.

  4. Eine unsachgemäße Optimierung der Parameter führt zu Überanpassung.

  5. Als Trend-Nachfolge-Strategie kämpft es in den Märkten mit Bandbreiten.

Erweiterung

  1. Prüfparameter Auswirkungen auf die Anpassungswirkung.

  2. Um die wichtigsten Trends zu ermitteln, wird MA einbezogen.

  3. Optimieren Sie die Ausbruchbestätigung, um falsche Ausbrüche zu vermeiden.

  4. Hinzufügen von Stop-Loss zu Limit-Loss pro Trade.

  5. Beurteilen Sie die Kanal-Tuning auf die Handelsfrequenz.

  6. Verwenden Sie maschinelles Lernen, um Parameter dynamisch zu optimieren.

Schlussfolgerung

Diese Strategie verwendet adaptive doppelte Supertrend-Kanäle, um Preistrends zu erfassen. Es ist einfach und intuitiv bei der Verfolgung von Trends. Zu den Risiken gehören jedoch falsche Ausbrüche und falsche Trendrichtung. Weitere Parameter-Tuning und ergänzende Mechanismen können die Strategieleistung verbessern und es zu einem robusten Trendfolgensystem machen.


/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Cloud Strategy", shorttitle="SuperTrend Cloud Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital = 1000)

//Inputs
multi = input(title="Multiplier", type=input.float, step=0.1, defval=3, minval=1)
period = input(title="Period", type=input.integer, step=1, defval=10, minval=1)
SelfAdjust = input(title="Self-Adjusting", type=input.bool, defval = false)


////////////////////////////////////////////////////////////////////////////////
// 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 = 2019, 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 = 2020, 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
 
////////////////////////////////////////////////////////////////////////////////

dev = stdev(close, period)
stdDev = (dev / close) * 100 + 1
MultDev = SelfAdjust ? multi * stdDev : multi

up_lev1 = hl2 - MultDev * atr(period)
dn_lev1 = hl2 + MultDev * atr(period)
up_lev2 = hl2 - (MultDev * 2 * atr(period))
dn_lev2 = hl2 + (MultDev * 2 * atr(period))

up_trend1 = 0.0
up_trend1 := close[1] > up_trend1[1] ? max(up_lev1, up_trend1[1]) : up_lev1
up_trend2 = 0.0
up_trend2 := close[1] > up_trend2[1] ? max(up_lev2, up_trend2[1]) : up_lev2

down_trend1 = 0.0
down_trend1 := close[1] < down_trend1[1] ? min(dn_lev1, down_trend1[1]) : dn_lev1
down_trend2 = 0.0
down_trend2 := close[1] < down_trend2[1] ? min(dn_lev2, down_trend2[1]) : dn_lev2

trend1 = 0
trend1 := close > down_trend1[1] ? 1: close < up_trend1[1] ? -1 : nz(trend1[1], 1)
trend2 = 0
trend2 := close > down_trend2[1] ? 1: close < up_trend2[1] ? -1 : nz(trend2[1], 1)

st_line1 = trend1 == 1 ? up_trend1 : down_trend1
st_line2 = trend2 == 1 ? up_trend2 : down_trend2

// Plotting
plot1 = plot(st_line1, color = trend1 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 1")
plot2 = plot(st_line2, color = trend2 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 2")
fill(plot1, plot2, color = color.aqua, title = "Cloud")

buy = crossover(close, st_line1) and close > st_line2 or crossover(close, st_line2) and close > st_line1
sell = crossunder(close, st_line1) and close < st_line2 or crossunder(close, st_line2) and close < st_line1

if(buy and time_cond)
    strategy.entry("long", long = true , comment="long")

if (close < st_line1 and time_cond or close < st_line2 and time_cond)
    strategy.close("long")
    
if (not time_cond)
    strategy.close_all()





 


Mehr