Dynamische Preiskanal-Ausbruchstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-13 16:03:37
Tags:

img

Übersicht

Die Dynamic Price Channel Breakout Strategy ist eine quantitative Handelsstrategie, die auf dem Donchian Price Channel-Indikator basiert.

Die Hauptidee dieser Strategie ist die Verwendung von Ausbrüchen des Donchan-Preiskanales. Wenn der Preis die obere Grenze des Kanals durchbricht, erstellen Sie eine Long-Position, um den Trend zu suchen; Wenn der Preis die untere Grenze des Kanals durchbricht, erstellen Sie eine Short-Position, um den Trend zu suchen.

Strategieprinzip

Berechnung der Indikatoren

Der Preiskanal wird nach folgenden Formeln berechnet:

Höchstwert = Höchstwert der letzten N-Perioden

Niedrigste Linie = Tiefpunkt der letzten N-Perioden

Mittlere Linie = (Oberste Linie + Unterste Linie) / 2

Hierbei stellt N die Länge des Kanalzyklus dar.

Eintrittsregeln

Wenn der höchste Preis der jüngsten K-Line die obere Grenze des Kanals durchbricht, wird eine Long-Position eingerichtet.

Wenn der niedrigste Preis der letzten K-Line die untere Grenze des Kanals durchbricht, wird eine Short-Position eingerichtet.

Beispiel:

Der Höhepunkt der vorherigen K-Linie überschritt nicht die obere Grenze des Kanals;
Der Höhepunkt der Strom-K-Linie durchbricht die obere Grenze des Kanals; ==> Eine Long-Position festlegen

Ausgangsregeln

Es gibt zwei optionale Ausstiegsregeln:

  1. Ausgang des Kanals

Schließung der Long-Position: Der Stop-Loss-Preis ist die untere Grenze des Kanals;

Schließung der Shortposition: Der Stop-Loss-Preis ist die obere Grenze des Kanals;

  1. Mittellinienausgang

Unabhängig von Long- oder Short-Positionen, schließen Sie alle Positionen, wenn die Preise unter die mittlere Linie des Kanals fallen.

Risikokontrolle

Die Risikokontrolle setzt proportionale Stoppverluste ein, um die spezifische Stoppverlustdistanz anhand der Kanalamplitude und des akzeptablen Risikoprozentsatzes zu berechnen.

Die Risikopositionen werden in den folgenden Kategorien aufgeführt:

Die Risikopositionen sind in der Tabelle 1 aufgeführt, wenn die Risikopositionen in der Tabelle 1 aufgeführt sind.

Wenn beispielsweise das akzeptable Risiko auf 2% festgelegt ist, beträgt der Einstiegspreis 10.000 USD, dann beträgt die Stop-Loss-Linie für eine Long-Position 10.000 * (1 - 2%) = 9.800 USD.

Analyse der Vorteile

Erfassen Sie Trend-Ausbrüche

Wenn die Preise die oberen und unteren Grenzen des Kanals durchbrechen, beginnt mit großer Wahrscheinlichkeit ein neuer richtungsweisender Trend.

Kontrollierbare Risiken

Die Verwendung eines proportionalem Stop-Loss kann Einzelverluste innerhalb eines akzeptablen Bereichs halten.

Großer Parameteroptimierungsraum

Parameter wie Kanalzyklus, Risikoverhältnis, Stop-Loss-Methode können optimiert und kombiniert werden, um mehr Marktumgebungen anzupassen.

Risikoanalyse

Versagte Ausbrüche

Preisdurchbrüche von Kanallimits bilden nicht unbedingt einen Trend, es besteht die Wahrscheinlichkeit von fehlgeschlagenen Durchbrüchen, was wahrscheinlich zu einem Stop-Loss führt.

Markt mit Bandbreite

Wenn der Markt an eine Bandbreite gebunden ist, können sich die Preise häufig an die obere und untere Grenze des Kanals berühren, was zu einem übermäßig häufigen Handel führt, wodurch die Transaktionskosten und Schlupfverluste steigen.

Optimierungsrichtlinien

Dynamischer Kanal

Überlegen Sie, ob Sie die Länge des Preiskanals zu einer Variablen machen, die sich automatisch anhand der Marktvolatilität anpasst.

Optimieren Sie die Eintrittsmöglichkeiten

Kombination anderer Indikatoren zur Filterung des Eintrittszeitraums, wie Volumenindikatoren, gleitende Durchschnitte usw., um unwirksame Ausbrüche in schwankenden Märkten zu vermeiden.

Optimierung der Parameter

Verwenden Sie mehr historische Daten, um Parameterkombinationen zu testen und zu optimieren, um die optimalen Parameter zu bestimmen, um sich an breitere Marktbedingungen anzupassen.

Zusammenfassung

Die Dynamic Price Channel Strategy ist im Allgemeinen eine relativ einfache und intuitive Trend-Tracking-Strategie. Ihre Vorteile sind klare Signale und leicht zu verstehen; Die Risikokontrolle ist relativ angemessen. Es gibt jedoch noch einige Probleme, die weiter optimiert werden müssen, wie zum Beispiel das Umgehen mit fehlgeschlagenen Ausbrüchen und oszillierenden Märkten. Diese Strategie eignet sich besser als Hilfsmittel für den Trendhandel und der Effekt wird besser sein, wenn sie mit anderen technischen Indikatoren oder Modellen kombiniert wird.


/*backtest
start: 2022-12-06 00:00:00
end: 2023-12-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro

//@version=4
strategy(title = "Noro's RiskChannel Strategy", shorttitle = "RiskChannel str", overlay = true, default_qty_type = strategy.percent_of_equity, initial_capital = 100, default_qty_value = 100, pyramiding = 0, commission_value = 0.1)

//Settings
needlong  = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
risklong  = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(2.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
stoptype  = input(defval = "Center", options = ["Channel", "Center"], title = "Stop-loss type")
lotsize   = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
pclen     = input(50, minval = 1, title = "Price Channel Length")
showll    = input(true, defval = true, title = "Show lines")
showof    = input(true, defval = true, title = "Show offset")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(false, defval = false, title = "Show background")
fromyear  = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear    = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth   = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday   = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today     = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Price Channel
h = highest(high, pclen)
l = lowest(low, pclen)
center = (h + l) / 2

//Stop-loss
needstop = stoptype == "Center" or needlong == false or needshort == false
sl = center

//Lines
pccol = showll ? color.black : na
slcol = showll and stoptype == "Center" ? color.red : na
offset = showof ? 1 : 0
plot(h, offset = offset, color = pccol, title = "Channel High")
plot(center, offset = offset, color = slcol, title = "Cannel Center")
plot(l, offset = offset, color = pccol, title = "Channel Low")

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size > 0 ? color.lime : size < 0 ? color.red : na
bgcolor(bgcol, transp = 70)

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//Lot size
risksizelong = -1 * risklong
risklonga = stoptype == "Center" ? ((center / h) - 1) * 100 : ((l / h) - 1) * 100
coeflong = abs(risksizelong / risklonga)
lotlong = (strategy.equity / close) * coeflong
risksizeshort = -1 * riskshort
riskshorta = stoptype == "Center" ? ((center / l) - 1) * 100 : ((h / l) - 1) * 100
coefshort = abs(risksizeshort / riskshorta)
lotshort = (strategy.equity / close) * coefshort

//Trading
if h > 0
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime)
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime)
sl := sl != 0 ? sl : size > 0 ? l : size < 0 ? h : na
if size > 0 and needstop
    strategy.exit("Stop Long", "Long", stop = sl)
if size < 0 and needstop
    strategy.exit("Stop Short", "Short", stop = sl)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showdd

    //Drawdown
    max = 0.0
    max := max(strategy.equity, nz(max[1]))
    dd = (strategy.equity / max - 1) * 100
    min = 100.0
    min := min(dd, nz(min[1]))
    
    //Max loss size
    equity := strategy.position_size == 0 ? strategy.equity : equity[1]
    loss := equity < equity[1] ? ((equity / equity[1]) - 1) * 100 : 0
    maxloss := min(nz(maxloss[1]), loss)
    
    //Label
    min := round(min * 100) / 100
    maxloss := round(maxloss * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%" + "\nMax.loss " + tostring(maxloss) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)
    // la := label.new(x = osx, y = osy, text = labeltext, xloc = xloc.bar_time, yloc = yloc.price, color = color.black, style = label.style_labelup, textcolor = tc)

Mehr