Donchian Trend nach Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-31 16:53:31
Tags:

img

Übersicht

Die Donchian Trend Following Strategie basiert auf dem Donchian Channel-Prinzip, das im Artikel Black Box Trend Following Lifting the Veil beschrieben wurde.

Strategie Logik

Die Strategie basiert auf dem Donchian Channel Indikator, um die Trendrichtung zu beurteilen. Der Donchian Channel besteht aus einem längeren Zeitraum Kanal und einem kürzeren Zeitraum Kanal. Wenn der Preis durch den längeren Zeitraum Kanal bricht, signalisiert es den Beginn eines Trends. Wenn der Preis durch den kürzeren Zeitraum Kanal bricht, signalisiert es das Ende des Trends.

Insbesondere beträgt die längere Kanallänge 50 Tage oder 20 Tage und die kürzere Kanallänge 50 Tage, 20 Tage oder 10 Tage. Wenn der Preis dem höchsten Preis in 50 Tagen entspricht, wird eine Long-Position eröffnet. Wenn der Preis dem niedrigsten Preis in 50 Tagen entspricht, wird eine Short-Position eröffnet. Wenn der Preis dem niedrigsten Preis in 20 oder 10 Tagen entspricht, werden Long-Positionen geschlossen. Wenn der Preis dem höchsten Preis in 20 oder 10 Tagen entspricht, werden Short-Positionen geschlossen.

Durch die Kombination von zwei Donchian-Kanälen unterschiedlicher Perioden kann es die Richtung bestimmen, um Positionen zu etablieren, wenn ein Trend beginnt, und rechtzeitig Stop Loss realisieren, wenn der Trend endet.

Analyse der Vorteile

Die wichtigsten Vorteile dieser Strategie sind:

  1. Starke Fähigkeit, Trends zu erfassen. Es kann Trends effektiv verfolgen, indem es den Beginn und das Ende von Trends mit Donchian Channel Breakouts identifiziert.

  2. Es verwendet einen beweglichen Stop Loss, um Einzelhandelsverluste zu kontrollieren.

  3. Flexible Anpassung der Parameter: Die Kombination der Kanalzeiten kann frei gewählt werden, um sich an verschiedene Produkte und Marktumgebungen anzupassen.

  4. Einfache und klare Handelslogik, leicht zu verstehen und umzusetzen.

Risikoanalyse

Zu den Risiken dieser Strategie gehören:

  1. Unfähigkeit zur Anpassung an die Märkte mit begrenztem Marktumfang, wenn der Trend unklar ist.

  2. Das Risiko eines Ausbruchs, bei dem die Preise nach dem Durchbruch des Kanals zurückschreiten können, was zu einem Stop-Loss führt.

  3. Unangemessene Einstellungen der Kanalzeit können zu einem Lärmhandel führen.

  4. Das Risiko eines Rückgangs der Sharpe-Ratio: Eine Erhöhung der Positionsgröße ohne Anpassung des Stop-Loss kann zu einem Rückgang der Sharpe-Ratio führen.

Die Lösungen sind:

  1. Optimierung der Parameter zur Auswahl geeigneter Kanalzeitkombinationen.
  2. Anpassen der Positionsgröße und Stop-Loss, um das Risiko zu kontrollieren.
  3. Verwenden Sie diese Strategie für Produkte und Märkte mit offensichtlichen Trends.

Optimierungsrichtlinien

Die Optimierungsrichtungen für diese Strategie:

  1. Hinzufügen von Filterbedingungen, um Whipsaws zu vermeiden, z. B. Kombination von Lautstärke, um wahre Ausbrüche zu beurteilen.

  2. Optimierung der Kombination von Kanalperioden und Positionsgröße zur Erhöhung der Gewinnquote.

  3. Ich versuche die Optimierung des Bruchpunktes, um optimale Parameter zu finden.

  4. Erweiterung von Algorithmen für maschinelles Lernen zur dynamischen Optimierung und Anpassung von Parametern.

Schlussfolgerung

Die Donchian Trend Following Strategie identifiziert den Beginn und das Ende der Preistrends mit Hilfe von zwei Kanälen und übernimmt den Trend Following-Handelsstil mit einer effektiven Einfachhandelsverlustkontrolle. Diese Strategie hat eine flexible Parameteranpassung und eine einfache Implementierung, was sich zu einer sehr praktischen Trend Following-Strategie macht.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Donchian", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=2, slippage=2)

// =============================================================================
// VARIABLES
// =============================================================================

donch_string = input.string(title="Length", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='50/50')
permit_long  = input.bool(title = 'Permit long', defval = true)
permit_short  = input.bool(title = 'Permit short', defval = true)
risk_percent = input.float(title="Position Risk %", defval=0.5, step=0.25)
stopOffset = input.float(title="ATR mult", defval=2.0, step=0.5)
atrLen = input.int(title="ATR Length", defval=20)
close_in_end  = input.bool(title = 'Close in end', defval = true)
permit_stop  = input.bool(title = 'Permit stop', defval = false)

// =============================================================================
// CALCULATIONS
// =============================================================================

donch_len_big = 
 donch_string == '50/20' ? 50 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 20 : 
 donch_string == '100/100' ? 100 : 
 na
donch_len_small = 
 donch_string == '50/20' ? 20 : 
 donch_string == '50/50' ? 50 : 
 donch_string == '20/20' ? 20 : 
 donch_string == '20/10' ? 10 : 
 donch_string == '100/100' ? 100 : 
 na

big_maxclose = ta.highest(close, donch_len_big)
big_minclose = ta.lowest(close, donch_len_big)
small_maxclose = ta.highest(close, donch_len_small)
small_minclose = ta.lowest(close, donch_len_small)

atrValue = ta.atr(atrLen)[1]

tradeWindow  = true

// =============================================================================
// NOTOPEN QTY
// =============================================================================

risk_usd = (risk_percent / 100) * strategy.equity
atr_currency = (atrValue * syminfo.pointvalue)
notopen_qty = risk_usd / (stopOffset * atr_currency)

// =============================================================================
// LONG STOP
// =============================================================================

long_stop_price = 0.0
long_stop_price := 
 strategy.position_size > 0 and na(long_stop_price[1]) ? strategy.position_avg_price - stopOffset * atrValue : 
 strategy.position_size > 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price:
 strategy.position_size > 0 ? long_stop_price[1] : 
 na

// =============================================================================
// SHORT STOP
// =============================================================================

short_stop_price = 0.0
short_stop_price := 
 strategy.position_size < 0 and na(short_stop_price[1]) ? strategy.position_avg_price + stopOffset * atrValue : 
 strategy.position_size < 0 and strategy.openprofit > risk_usd ? strategy.position_avg_price :
 strategy.position_size < 0 ? short_stop_price[1] : 
 na

// =============================================================================
// PLOT VERTICAL COLOR BAR
// =============================================================================

cross_up = strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
cross_dn =  strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
bg_color = cross_up ? color.green : cross_dn ? color.red : na
bg_color := color.new(bg_color, 70)
bgcolor(bg_color)

// =============================================================================
// PLOT DONCHIAN LINES
// =============================================================================

s1 = cross_up ? na : cross_dn ? na : strategy.position_size != 0 ? strategy.position_avg_price : na
s2 = cross_up ? na : cross_dn ? na : strategy.position_size > 0 ? small_minclose : strategy.position_size < 0 ? small_maxclose : na
s3 = cross_up ? na : cross_dn ? na : not permit_stop ? na : 
 strategy.position_size > 0 ? long_stop_price : strategy.position_size < 0 ? short_stop_price : na

plot(series=big_maxclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Maxclose Black")
plot(series=big_minclose, style=plot.style_linebr, color=color.black, linewidth=1, title="Donch Big Minclose Black")

plot(series=s1, style=plot.style_linebr, color=color.yellow, linewidth=2, title="Entry Yellow")
plot(series=s2, style=plot.style_linebr, color=color.red, linewidth=1, title="Donch Small Red")
plot(series=s3, style=plot.style_linebr, color=color.fuchsia, linewidth=2, title="Stop Fuchsia")

// =============================================================================
// ENTRY ORDERS
// =============================================================================

if strategy.position_size <= 0 and close == big_maxclose and close >= syminfo.mintick and tradeWindow and permit_long
    strategy.entry("Long", strategy.long, qty=notopen_qty)

if strategy.position_size >= 0 and close == big_minclose and close >= syminfo.mintick and tradeWindow and permit_short
    strategy.entry("Short", strategy.short, qty=notopen_qty)

// =============================================================================
// EXIT ORDERS
// =============================================================================

if strategy.position_size > 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Long", stop=long_stop_price)

if strategy.position_size < 0 and permit_stop
    strategy.exit(id="Stop", from_entry="Short", stop=short_stop_price)

// ==========

if strategy.position_size > 0 and close == small_minclose and not barstate.islast
    strategy.close(id="Long", comment='Donch')

if strategy.position_size < 0 and close == small_maxclose and not barstate.islast
    strategy.close(id="Short", comment='Donch')

// ==========

if close_in_end
    if not tradeWindow
        strategy.close_all(comment='Close in end')

// =============================================================================
// END
// =============================================================================

Mehr