Dynamischer Preiskanal mit Stop-Loss-Tracking-Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-01 10:52:33
Tags:

img

Übersicht

Diese Strategie wird auf der Grundlage des Donchian-Preiskanales entwickelt. Der Indikator bildet einen Preiskanal, indem er die höchsten und niedrigsten Preise über einen bestimmten Zeitraum berechnet. Die Strategie nutzt den Preiskanal, um den Zwei-Wege-Handel umzusetzen und Stop-Loss- und Take-Profit-Preise festzulegen. Der Stop-Loss-Preis wird an der Mittellinie des Preiskanals festgelegt, und der Take-Profit-Preis wird auf einen bestimmten Prozentsatz über die oberen und unteren Grenzen des Preiskanals gesetzt. Die Strategie implementiert auch die Verfolgung von Stop-Loss und Take-Profit.

Strategieprinzip

Zunächst berechnet die Strategie die obere Grenze h und die untere Grenze l des Preiskanals basierend auf dem Parameter pclen. Die mittlere Linie Mitte ist der Durchschnitt der oberen und unteren Grenzen des Preiskanals. Dann werden die Take-Profit-Preise tpl und tps nach den Take-Profit-Parametern tp für lange und kurze Positionen berechnet. Der Stop-Loss-Preis wird an der mittleren Linie Mitte des Preiskanals festgelegt. Wenn der Preis durch den Preiskanal bricht, werden Handelspositionen unterschiedlicher Richtungen nach den Risikogrößen risklong und riskshort berechnet. Die Strategie schließt, wenn der Preis wieder in den Kanal eintritt. Darüber hinaus ist das Zeitfiltern so eingestellt, dass nur innerhalb des angegebenen Datumsbereichs gehandelt wird.

Die spezifische Handelslogik lautet:

Long-Entry-Signal: Long-Open, wenn der Preis über der Obergrenze des Kanals h liegt und wieder in den Kanal fällt

Long-Exit-Signal: Schließen von Long, wenn der Preis unter dem Mittelpunkt des Kanals liegt (Stop-Loss) oder höher als der Gewinnpreis (take profit)

Kurz-Eintrittssignal: kurz geöffnet, wenn der Preis unter der unteren Grenze des Kanals liegt und wieder in den Kanal fällt

Short-Exit-Signal: Schließen von Short, wenn der Preis höher als die mittlere Linie des Kanals (Stop Loss) oder niedriger als der Gewinnpreis (Take Profit) ist

Analyse der Vorteile

Die Vorteile dieser Strategie sind:

  1. Zwei-Wege-Handel kann Umkehrungen der Preisentwicklung erfassen
  2. Verwenden Sie den Preiskanal, um die Trendrichtung zu bestimmen und falsche Ausbrüche zu vermeiden
  3. Einstellen von Stop-Loss und Gewinngewinn, um Risiken zu kontrollieren
  4. Berechnung der mit der Risikogröße verbundenen Positionsgröße zur Erreichung kontrollierbarer Risiken
  5. Implementieren Sie die Verfolgung von Stop Loss und Take Profit, um mehr Gewinne zu erzielen

Risikoanalyse

Diese Strategie birgt auch einige Risiken:

  1. Eine falsche Einstellung der Parameter des Preiskanals kann zu einer zu hohen Handelsfrequenz oder fehlenden Handelsmöglichkeiten führen
  2. Der zu hohe Stop-Loss-Preis kann das Risikopositionsniveau erhöhen
  3. Die Verfolgung der Gewinnentnahmen kann in Zeiten hoher Volatilität vorzeitig ausgelöst werden

Diese Risiken können durch Anpassung der Parameter und manuelle Überwachung verringert und kontrolliert werden.

Optimierungsrichtlinien

Diese Strategie kann auch in folgenden Aspekten optimiert werden:

  1. Hinzufügen von mehr Indikatorfiltern, um häufige Eröffnungen und Schließungen in Bereichsgebundenen Märkten zu vermeiden
  2. Es können verschiedene Stop-Loss- und Take-Profit-Algorithmen getestet werden, z. B. ATR-Stop-Loss
  3. Ausweitung auf ein Zeitrahmenübergreifendes Handelssystem mit höherem Zeitrahmen zur Bestimmung der Trendrichtung
  4. Hinzufügen eines Positionsgrößenmoduls zur Anpassung von Positionen anhand der Kapitalverwertung
  5. Einbeziehung von Modellen des maschinellen Lernens zur Bewertung der Erfolgsquote von Preisdurchbrüchen, um falsche Durchbrüche zu vermeiden

Schlussfolgerung

Zusammenfassend ist dies eine effektive Strategie, um den Zwei-Wege-Handel mithilfe von Preiskanalindikatoren umzusetzen. Mit geeigneten Stop-Loss-, Take-Profit- und Position-Size-Control-Modulen können Risiken gut kontrolliert werden. Mit einigen Optimierungen und Anpassungen kann es zu einer leistungsstarken quantitativen Handelsstrategie werden.


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

//Noro
//2020

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

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
tp = input(defval = 20.0, minval = 1, title = "Take-profit, %")
tptype = input(defval = "2. Fix", options = ["1. None", "2. Fix", "3. Trailing"], title = "Take-profit type")
sltype = input(defval = "2. Center", options = ["1. None", "2. Center"], title = "Take-profit type")
risklong  = input(5.0, minval = 0.0, maxval = 99.9, title = "Risk size for long, %")
riskshort = input(5.0, minval = 0.0, maxval = 99.9, title = "Risk size for short, %")
pclen = input(50, minval = 1, title = "Price Channel Length")
showll = input(true, defval = true, title = "Show lines")
showbg = input(false, defval = false, title = "Show Background")
showof = input(true, defval = true, title = "Show Offset")
showlabel = input(true, defval = true, title = "Show label")
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

//Take-profit
tpl = 0.0
tpl := tptype == "2. Fix" and strategy.position_size > 0 ? tpl[1] : h * (100 + tp) / 100

//Stop-loss
tps = 0.0
tps := tptype == "2. Fix" and strategy.position_size < 0 ? tps[1] : l * (100 - tp) / 100

//Lines
tplcol = showll and needlong and tptype != "1. None" ? color.lime : na
pclcol = showll and needlong ? color.blue : na
sllcol = showll and needlong and sltype != "1. None" ? color.red : na
tpscol = showll and needshort and tptype != "1. None" ? color.lime : na
pcscol = showll and needshort ? color.blue : na
slscol = showll and needshort and sltype != "1. None" ? color.red : na
offset = showof ? 1 : 0
plot(tpl, offset = offset, color = tplcol, title = "TP Long")
plot(h, offset = offset, color = pclcol, title = "Channel High")
plot(center, offset = offset, color = sllcol, title = "SL Long")
plot(center, offset = offset, color = slscol, title = "SL Short")
plot(l, offset = offset, color = pcscol, title = "Channel Low")
plot(tps, offset = offset, color = tpscol, title = "TP Short")

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

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

//Trading
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)
mo = 0
mo := strategy.position_size != 0 ? 0 : high >= center[1] and low <= center[1] ? 1 : mo[1]

if h > 0
    longlimit = tptype == "1. None" ? na : tpl
    longstop = sltype == "1. None" ? na : center
    strategy.entry("Long", strategy.long, lotlong, stop = h, when = strategy.position_size <= 0 and needlong and truetime and mo)
    strategy.exit("TP Long", "Long", limit = longlimit, stop = longstop)
    shortlimit = tptype == "1. None" ? na : tps
    shortstop = sltype == "1. None" ? na : center
    strategy.entry("Short", strategy.short, lotshort, stop = l, when = strategy.position_size >= 0 and needshort and truetime and mo)
    strategy.exit("Exit Short", "Short", limit = shortlimit, stop = shortstop)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")
    
if showlabel

    //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]))
    
    //Label
    min := round(min * 100) / 100
    labeltext = "Drawdown: " + tostring(min) + "%"
    var label la = na
    label.delete(la)
    tc = min > -100 ? color.white : color.red
    osx = timenow + round(change(time)*10)
    osy = highest(100)

Mehr