Trend nach der auf den Donchian-Kanälen basierenden Strategie

Schriftsteller:ChaoZhang, Datum: 31.10.2023 17:44:19
Tags:

img

Übersicht

Die Pulling-Strategie ist eine Trend-Folge-Strategie, die auf Donchian-Kanälen basiert. Sie verwendet schnelle und langsame Donchian-Kanäle, um die Trendrichtung zu identifizieren und Pullbacks einzugehen. Die Vorteile dieser Strategie sind, dass sie Trends automatisch verfolgen und Verluste rechtzeitig reduzieren kann, wenn sich der Trend ändert.

Strategie Logik

Die Strategie definiert zunächst den schnellen Kanalzeitraum als 20 Bar und den langsamen Kanalzeitraum als 50 Bar. Der schnelle Kanal wird verwendet, um den Stop-Loss-Preis festzulegen, während der langsame Kanal verwendet wird, um die Trendrichtung und den Eintrittszeitpunkt zu bestimmen.

Zunächst werden der höchste Höchststand und das niedrigste Tiefstand des schnellen Kanals berechnet und der Mittelpunkt als Stop-Loss-Linie genommen.

Wenn der Preis durch die Spitze des langsamen Kanals bricht, gehen Sie lang. Wenn der Preis durch die Unterseite des langsamen Kanals bricht, gehen Sie kurz. Nachdem Sie die Position eingegeben haben, setzen Sie den Stop-Loss an der Mitte des schnellen Kanals.

Der langsame Kanal bestimmt also die Haupttrendrichtung, während der schnelle Kanal kleinere Ausbrüche innerhalb eines kleinen Bereichs verfolgt, um den Stop-Loss-Punkt zu bestimmen.

Vorteile

  • Die Doppelkanalstruktur kann Trends automatisch verfolgen und Verluste schnell reduzieren, wenn sich Trends umkehren.

  • Eintritt bei Pullbacks, mit einem gewissen Trendfilterungseffekt. Nur Eintritte, wenn der Preis durch die Kanalgrenzen bricht, können einige falsche Ausbrüche ohne echten Trend filtern.

  • Die enge Stop-Loss-Distanz kann einen einzelnen Verlust kontrollieren.

Risiken

  • Größere Abzüge: Trendfolgende Strategien können relativ große Abzüge haben, was eine psychologische Vorbereitung erfordert.

  • Der Fast-Channel-Periode ist kurz, so dass der Stop-Loss ist nah, anfällig für gestoppt werden.

  • Zu viele Trades. Die Doppelkanalstruktur kann zu übermäßigen Einträgen führen, die eine angemessene Positionsgröße erfordern.

Optimierungsrichtlinien

  • Wir können Volatilität usw. in den Einstiegsbedingungen hinzufügen, um Ausbrüche ohne ausreichende Trendstärke zu filtern.

  • Wir können die optimalen Kanalparameterkombinationen systematisch finden.

  • Kombination mehrerer Zeitrahmen: Feststellung des wichtigsten Trends in höheren Zeitrahmen und Handel in niedrigeren Zeitrahmen.

  • Dynamische Stop-Loss-Distanz, die dynamisch anhand der Marktvolatilität angepasst wird.

Zusammenfassung

Die Pulling-Strategie ist eine Standard-Trend-Folge-Strategie insgesamt. Sie verwendet Preiskanäle, um die Trendrichtung zu bestimmen und setzt Stop-Loss, um Risiken zu kontrollieren. Die Strategie hat einige Vorteile, aber auch die Probleme von Drawdown und Stop-Loss, die zu nahe sind. Wir können sie optimieren, indem wir die Kanalparameter anpassen, Filter hinzufügen usw. Aber wir sollten beachten, dass Trend-Folge-Strategien eine starke Psychologie erfordern, um Drawdowns zu ertragen.


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2020

//@version=4
strategy("Noro's RiskTurtle Strategy", shorttitle = "RiskTurtle 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")
risk      = input(2, minval = 0.1, maxval = 99, title = "Risk size, %")
fast      = input(20, minval = 1, title = "Fast channel (for stop-loss)")
slow      = input(50, minval = 1, title = "Slow channel (for entries)")
showof    = input(true, defval = true, title = "Show offset")
showll    = input(true, defval = true, title = "Show lines")
showdd    = input(true, defval = true, title = "Show label (drawdown)")
showbg    = input(true, defval = true, 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")

//Donchian price channel fast
hf = highest(high, fast)
lf = lowest(low, fast)
center = (hf + lf) / 2

//Donchian price chennal slow
hs = highest(high, slow)
ls = lowest(low, slow)

//Lines
colorpc = showll ? color.blue : na
colorsl = showll ? color.red : na
offset = showof ? 1 : 0
plot(hs, offset = offset, color = colorpc, title = "Slow channel high")
plot(ls, offset = offset, color = colorpc, title = "Slow channel low")
plot(center, offset = offset, color = colorsl, title = "Fast channel stop-loss")

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

//Var
loss = 0.0
maxloss = 0.0
equity = 0.0
truetime = true

//Lot size
risksize = -1 * risk
risklong = ((center / hs) - 1) * 100
coeflong = abs(risksize / risklong)
lotlong = (strategy.equity / close) * coeflong
riskshort = ((center / ls) - 1) * 100
coefshort = abs(risksize / riskshort)
lotshort = (strategy.equity / close) * coefshort

//Orders
strategy.entry("Long", strategy.long, lotlong, stop = hs, when = needlong and strategy.position_size == 0 and hs > 0 and truetime)
strategy.entry("Short", strategy.short, lotshort, stop = ls, when = needshort and strategy.position_size == 0 and ls > 0 and truetime)
strategy.exit("LongExit", "Long", stop = center, when = needlong and strategy.position_size > 0)
strategy.exit("Short", stop = center, when = needshort and strategy.position_size < 0)
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)

Mehr