Trend nach Kanal-Breakout-Strategie mit gleitendem Durchschnitt und Trailing Stop

Schriftsteller:ChaoZhang, Datum: 2024-01-15 12:25:26
Tags:

img

Übersicht

Dies ist eine Breakout-Strategie, die auf dem Preiskanal basiert, kombiniert mit gleitenden Durchschnittsindikatoren und Trailing Stop/Take Profit für den Ein- und Ausstieg. Sie verwendet den gleitenden Durchschnitt der hohen/niedrigen Preise, um den Preiskanal zu konstruieren, und geht lang/kurz ein, wenn der Preis aus dem Kanal ausbricht, mit einem festen Stop-Loss oder Trailing Stop, um Risiken zu kontrollieren.

Strategie Logik

Die Strategie berechnet gleitende Durchschnitte der hohen/niedrigen Preise, um einen Preiskanal zu bilden. Insbesondere berechnet sie die Länge 10 SMA der hohen/niedrigen Preise, um das obere und untere Band des Kanals zu zeichnen. Wenn der Preis über das untere Band in das obere Band bricht, tritt er lang ein. Wenn der Preis vom oberen Band in das untere Band bricht, tritt er kurz ein.

Nach dem Eintritt verwendet die Strategie entweder einen festen Stop-Loss oder einen Trailing-Stop zum Ausstieg. Der Trailing-Stop besteht aus zwei Parametern: einem festen Take-Profit-Level und einem aktivierenden Offset.

Die Strategie kombiniert auch einen Zeitrahmenfilter, bei dem nur ein Backtest innerhalb eines bestimmten historischen Zeitrahmens durchgeführt wird, um die Leistung in verschiedenen Marktstadien zu testen.

Analyse der Vorteile

Die Strategie nutzt den Preiskanal und den Trend folgend mit Trailing Stop, wodurch sie mittelfristige bis langfristige Trendrichtungen erfassen kann. Im Vergleich zu einfachen gleitenden Durchschnittsstrategien vermeidet sie unwirksame Trades aufgrund von Kursschwankungen. Mit Trailing Stops kann sie die Preise dynamisch verfolgen, um Gewinne zu erzielen.

Insgesamt hat die Strategie eine klare Logik, minimale Indikatoren und Parameter, eine einfache Rückprüfung, eignet sich für den mittelfristigen bis langfristigen Trendhandel und kann von starken Trends profitieren.

Risikoanalyse

Die Strategie neigt dazu, leicht während der schwankenden, unruhigen Märkte gestoppt zu werden, unfähig, Gewinne aufrechtzuerhalten.

Die Anpassung der Parameter ist recht subjektiv und erfordert Anpassungen in verschiedenen Marktstadien.

Möglichkeiten zur Verbesserung

Andere Indikatoren wie Volumen, Bollinger Bands können eingebunden werden, um Eingangssignale zu filtern und Fallen zu vermeiden.

Ausgangsregeln können auf Trailing Stop oder Chandelier Exit aktualisiert werden. Teilweise Gewinnziele können in Betracht gezogen werden, wenn der Preis den Kanal wieder betritt. Die Optimierung von Eintrittsfiltern und Ausgangsregeln kann die Stabilität der Strategie erheblich verbessern.

Schlussfolgerung

Zusammenfassend ist dies eine quantitative Strategie, die auf Preiskanal, Trendfolgung, Stop-Loss/Profit-Taking-Management basiert. Sie hat einen klaren Logikfluss, eine einfache Parameterstruktur, leicht zu verstehen und zu backtesten. Sie eignet sich zum Erlernen algorithmischer Handelskonzepte. Die Strategie kann in verschiedenen Aspekten verbessert werden, um Stabilität und Rentabilität zu verbessern. Die Kernidee besteht darin, die Trendrichtung zu erfassen und Risiken über Stop-Loss und Take-Profit zu managen.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-21 23:59:59
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Generalized SSL Backtest w/ TSSL", shorttitle="GSSL Backtest", overlay=true )
// Generalized SSL:
//  This is the very first time the SSL indicator, whose acronym I ignore, is on Tradingview. 
//  It is based on moving averages of the highs and lows. 
//  Similar channel indicators can be found, whereas 
//  this one implements the persistency inside the channel, which is rather tricky.
//  The green line is the base line which decides entries and exits, possibly with trailing stops.
//  With respect to the original version, here one can play with different moving averages.
//  The default settings are (10,SMA)
//
// Vitelot/Yanez/Vts March 2019

lb = input(10, title="Lb", minval=1)
maType = input( defval="SMA", title="MA Type", options=["SMA","EMA","HMA","McG","WMA","Tenkan"])

fixedSL = input(title="SL Activation", defval=300)
trailSL = input(title="SL Trigger", defval=1)
fixedTP = input(title="TP Activation", defval=150)
trailTP = input(title="TP Trigger", defval=1)

FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 6, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 19, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
startTimeOk()  => true // create function "within window of time" if statement true
// QUANDL:BCHAIN/ETRVU is USD-denominated daily transaction value on BTC blockchain
// QUANDL:BCHAIN/MKTCP is USD-denominated Bitcoin marketcap

hma(sig, n) => // Hull moving average definition
    wma( 2*wma(sig,round(n/2))-wma(sig,n), round(sqrt(n)))

mcg(sig,length) => // Mc Ginley MA definition
    mg = 0.0
    mg := na(mg[1]) ? ema(sig, length) : mg[1] + (sig - mg[1]) / (length * pow(sig/mg[1], 4))

tenkan(sig,len) =>
    0.5*(highest(sig,len)+lowest(sig,len))

ma(t,sig,len) =>
    sss=na
    if t =="SMA"
        sss := sma(sig,len)
    if t == "EMA"
        sss := ema(sig,len)
    if t == "HMA"
        sss := hma(sig,len)
    if t == "McG" // Mc Ginley
        sss := mcg(sig,len)
    if t == "Tenkan"
        sss := tenkan(sig,len)
    if t == "WMA"
        sss := wma(sig,len)
    sss

base(mah, mal) =>
    bbb = na
    inChannel = close<mah and close>mal
    belowChannel = close<mah and close<mal
    bbb := inChannel? bbb[1]: belowChannel? -1: 1
    uuu = bbb==1? mal: mah
    ddd = bbb==1? mah: mal
    [uuu, ddd]

maH = ma(maType, high, lb)
maL = ma(maType, low, lb)

[up, dn] = base(maH,maL)

plot(up, title="High MA", color=lime, linewidth=3)
plot(dn, title="Low MA", color=orange, linewidth=3)

long = crossover(dn,up)
short = crossover(up,dn)

// === STRATEGY - LONG POSITION EXECUTION ===
strategy.entry("Long", strategy.long, when= long and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) 
strategy.exit("Exit", when= short)
// === STRATEGY - SHORT POSITION EXECUTION ===
strategy.entry("Short", strategy.short, when= short and startTimeOk())
strategy.exit("Exit", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)
strategy.exit("Exit", when= long)

Mehr