Die Donchian-Kanal-Breakout-Handelsstrategie beurteilt aktuelle Preistrends, indem sie den Kanal mit den höchsten und niedrigsten Preisen über einen bestimmten Zeitraum berechnet und auf der Grundlage von Kanal-Breakouts lang und kurz handelt.
Diese Strategie konstruiert einen Kanal, indem sie den höchsten Preis pcmx und den niedrigsten Preis pcmn in den letzten historischen Perioden berechnet.
Höhere Schiene yh = pcmax - (pcmax - pcmin) * (100 - ProzentDev)/100
Unterbahn yl = pcmin + (pcmax - pcmin) * %Dev/100
wo %Dev standardmäßig auf 13 liegt.
Ein langes Signal wird erzeugt, wenn der Preis die obere Schiene durchbricht. Ein kurzes Signal wird erzeugt, wenn der Preis die untere Schiene durchbricht.
Die spezifische Logik zur Erzeugung von Handelssignalen ist:
boundup = high > yh, um festzustellen, ob die oberste Schiene defekt ist
bounddn = low < yl, um festzustellen, ob die Untergleise defekt ist
Upsign = sma(bounddn, 2) == 1 verwendet sma von bounddn, um einen anhaltenden Ausbruch der unteren Schiene zu bestimmen
dnsign = sma(boundup, 2) == 1 verwendet sma von boundup, um anhaltende Ausbrechung der oberen Schiene zu bestimmen
Ausfahrt = dnsign Ausbruch der oberen Schiene erzeugt Ausfahrtssignal
Ausfahrtdn = Ausbruch der unteren Schiene erzeugt Ausfahrtssignal
wenn ein Ausbruch der unteren Schiene bei der Aufzeichnung ein langes Signal erzeugt
wenn ein Ausbruch der oberen Schiene ein Kurzsignal erzeugt
Die Strategie legt außerdem den Zeitpunkt des Börsengangs und des Börsengangs fest, um unnötige Overnight-Positionen zu vermeiden.
Benutzt den Donchian-Kanal, um Trends zu bestimmen, gute Backtest-Ergebnisse
Hat sowohl lange als auch kurze Signale, ermöglicht den Handel in zwei Richtungen
Verwendet SMA, um Signale zu filtern und schlechte Trades zu vermeiden
Die Risikopositionen werden in der Tabelle 1 aufgeführt.
Festlegen von Handelsbeginn- und -endezeiten zur Vermeidung von Overnight-Risiken
Empfindlich für Historie und %Dev-Parameter, muss für verschiedene Produkte optimiert werden
Kann bei Märkten mit Bandbreitefehler erzeugen
Nicht berücksichtigt Auftragsverwaltung, kann sich auf die Rentabilität beim Live-Handel auswirken
Die Risikopositionsgröße wird nicht berücksichtigt, Risiken bei übergroßen Positionen
Nicht in Betracht zieht Geldmanagement, benötigt angemessenes Handelskapital
Optimieren Sie die Parameter für den Verlauf und den %Dev für verschiedene Produkte
Fügen Sie Filter hinzu, um falsche Signale in verschiedenen Märkten zu vermeiden
Hinzufügen von Positionsgrößenmodul zur Steuerung der einzelnen Positionsgröße
Hinzufügen eines Geldmanagementmoduls zur Begrenzung der Gesamtpositiongröße
Hinzufügen von Auftragsverwaltung für eine optimale Auftragsdurchführung
Die Donchian-Kanal-Breakout-Strategie verwendet Kanal-Breakouts, um Trends und Handelssignale zu bestimmen, mit guten Backtest-Ergebnissen und der Fähigkeit, sowohl lang als auch kurz zu handeln. Allerdings bestehen Risiken in Bezug auf Parameteroptimierung, Filter, Positionsgröße, Geldmanagement, Ordermanagement usw. Richtige Verbesserungen in diesen Bereichen sind vor einem stabilen Live-Handel erforderlich. Insgesamt handelt es sich um eine traditionelle Trend-Folge-Strategie und kann mit Optimierungen zu einer zuverlässigen quantitativen Handelsstrategie werden.
/*backtest start: 2023-10-31 00:00:00 end: 2023-11-07 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //////////////////////////////////////////////////////////// // Copyright by AlexInc v1.0 02/07/2018 @aav_1980 // PriceChannel strategy // If you find this script helpful, you can also help me by sending donation to // BTC 16d9vgFvCmXpLf8FiKY6zsy6pauaCyFnzS // LTC LQ5emyqNRjdRMqHPHEqREgryUJqmvYhffM //////////////////////////////////////////////////////////// //@version=3 strategy("AlexInc PriceChannel Str", overlay=false) history = input(20) percentDev = input(13) capital = input(100) needlong = input(true, defval = true, title = "Long") needshort = input(true, defval = true, title = "Short") usestoploss = input(true, defval = true, title = "Stop Loss") stoplossmult = input(3.8, defval = 3.8, minval = 1, maxval = 10, title = "Stop loss multiplicator") fromyear = input(2018, defval = 2018, 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") bodymin = min( open, close) bodymax = max(open, close) pcmax = highest(bodymax, history) pcmin = lowest(bodymin, history) yh = ((pcmax - pcmin) / 100 * (100 - percentDev)) + pcmin yl = ((pcmax - pcmin) / 100 * percentDev) + pcmin plot(pcmax) plot(pcmin) plot(yh) plot(yl) //1 bounddn = low < yl ? 1 : 0 boundup = high > yh ? 1 : 0 upsign = sma(bounddn, 2) == 1 dnsign = sma(boundup, 2) == 1 //2 //upsign = crossover(bodymin, yl) //dnsign = crossunder(bodymax , yh) exitup = dnsign exitdn = upsign lot = strategy.equity / close * capital / 100 xATR = atr(history) nLoss = usestoploss ? stoplossmult * xATR : na stop_level_long = 0.0 stop_level_long := nz(stop_level_long[1]) stop_level_short = 0.0 stop_level_short := nz(stop_level_short[1]) pos = strategy.position_size if pos >0 and pos[1] <= 0 //crossover(pos, 0.5) stop_level_long = strategy.position_avg_price - nLoss if pos < 0 and pos[1] >= 0 //crossunder(pos, -0.5) stop_level_short = strategy.position_avg_price + nLoss if pos == 0 stop_level_long = bodymin - nLoss stop_level_short = bodymax + nLoss //plot(bodymax + nLoss, color=red) //plot(bodymin - nLoss, color=red) plot(stop_level_long, color=red) plot(stop_level_short, color=red) if upsign strategy.entry("Long", strategy.long, needlong == false ? 0 : lot) if dnsign strategy.entry("Short", strategy.short, needshort == false ? 0 : na) if true strategy.close_all() //if strategy.position_size != 0 // strategy.exit("Exit Long", from_entry = "Long", stop = stop_level_long) // strategy.exit("Exit Short", from_entry = "Short", stop = stop_level_short)