Handelsstrategie für den Ausbruch aus dem Donchian Channel

Schriftsteller:ChaoZhang, Datum: 2023-11-08 12:31:56
Tags:

img

Übersicht

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.

Strategie Logik

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:

  1. boundup = high > yh, um festzustellen, ob die oberste Schiene defekt ist

  2. bounddn = low < yl, um festzustellen, ob die Untergleise defekt ist

  3. Upsign = sma(bounddn, 2) == 1 verwendet sma von bounddn, um einen anhaltenden Ausbruch der unteren Schiene zu bestimmen

  4. dnsign = sma(boundup, 2) == 1 verwendet sma von boundup, um anhaltende Ausbrechung der oberen Schiene zu bestimmen

  5. Ausfahrt = dnsign Ausbruch der oberen Schiene erzeugt Ausfahrtssignal

  6. Ausfahrtdn = Ausbruch der unteren Schiene erzeugt Ausfahrtssignal

  7. wenn ein Ausbruch der unteren Schiene bei der Aufzeichnung ein langes Signal erzeugt

  8. 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.

Vorteile der Strategie

  1. Benutzt den Donchian-Kanal, um Trends zu bestimmen, gute Backtest-Ergebnisse

  2. Hat sowohl lange als auch kurze Signale, ermöglicht den Handel in zwei Richtungen

  3. Verwendet SMA, um Signale zu filtern und schlechte Trades zu vermeiden

  4. Die Risikopositionen werden in der Tabelle 1 aufgeführt.

  5. Festlegen von Handelsbeginn- und -endezeiten zur Vermeidung von Overnight-Risiken

Risiken der Strategie

  1. Empfindlich für Historie und %Dev-Parameter, muss für verschiedene Produkte optimiert werden

  2. Kann bei Märkten mit Bandbreitefehler erzeugen

  3. Nicht berücksichtigt Auftragsverwaltung, kann sich auf die Rentabilität beim Live-Handel auswirken

  4. Die Risikopositionsgröße wird nicht berücksichtigt, Risiken bei übergroßen Positionen

  5. Nicht in Betracht zieht Geldmanagement, benötigt angemessenes Handelskapital

Verbesserungsideen

  1. Optimieren Sie die Parameter für den Verlauf und den %Dev für verschiedene Produkte

  2. Fügen Sie Filter hinzu, um falsche Signale in verschiedenen Märkten zu vermeiden

  3. Hinzufügen von Positionsgrößenmodul zur Steuerung der einzelnen Positionsgröße

  4. Hinzufügen eines Geldmanagementmoduls zur Begrenzung der Gesamtpositiongröße

  5. Hinzufügen von Auftragsverwaltung für eine optimale Auftragsdurchführung

Schlussfolgerung

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)

Mehr