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.
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.
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
Es gibt zwei optionale Ausstiegsregeln:
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;
Unabhängig von Long- oder Short-Positionen, schließen Sie alle Positionen, wenn die Preise unter die mittlere Linie des Kanals fallen.
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.
Wenn die Preise die oberen und unteren Grenzen des Kanals durchbrechen, beginnt mit großer Wahrscheinlichkeit ein neuer richtungsweisender Trend.
Die Verwendung eines proportionalem Stop-Loss kann Einzelverluste innerhalb eines akzeptablen Bereichs halten.
Parameter wie Kanalzyklus, Risikoverhältnis, Stop-Loss-Methode können optimiert und kombiniert werden, um mehr Marktumgebungen anzupassen.
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.
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.
Überlegen Sie, ob Sie die Länge des Preiskanals zu einer Variablen machen, die sich automatisch anhand der Marktvolatilität anpasst.
Kombination anderer Indikatoren zur Filterung des Eintrittszeitraums, wie Volumenindikatoren, gleitende Durchschnitte usw., um unwirksame Ausbrüche in schwankenden Märkten zu vermeiden.
Verwenden Sie mehr historische Daten, um Parameterkombinationen zu testen und zu optimieren, um die optimalen Parameter zu bestimmen, um sich an breitere Marktbedingungen anzupassen.
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)