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.
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
Die Vorteile dieser Strategie sind:
Diese Strategie birgt auch einige Risiken:
Diese Risiken können durch Anpassung der Parameter und manuelle Überwachung verringert und kontrolliert werden.
Diese Strategie kann auch in folgenden Aspekten optimiert werden:
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)