Die Donchian Trend Following Strategie basiert auf dem Donchian Channel-Prinzip, das im Artikel
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.
Die wichtigsten Vorteile dieser Strategie sind:
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.
Es verwendet einen beweglichen Stop Loss, um Einzelhandelsverluste zu kontrollieren.
Flexible Anpassung der Parameter: Die Kombination der Kanalzeiten kann frei gewählt werden, um sich an verschiedene Produkte und Marktumgebungen anzupassen.
Einfache und klare Handelslogik, leicht zu verstehen und umzusetzen.
Zu den Risiken dieser Strategie gehören:
Unfähigkeit zur Anpassung an die Märkte mit begrenztem Marktumfang, wenn der Trend unklar ist.
Das Risiko eines Ausbruchs, bei dem die Preise nach dem Durchbruch des Kanals zurückschreiten können, was zu einem Stop-Loss führt.
Unangemessene Einstellungen der Kanalzeit können zu einem Lärmhandel führen.
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:
Die Optimierungsrichtungen für diese Strategie:
Hinzufügen von Filterbedingungen, um Whipsaws zu vermeiden, z. B. Kombination von Lautstärke, um wahre Ausbrüche zu beurteilen.
Optimierung der Kombination von Kanalperioden und Positionsgröße zur Erhöhung der Gewinnquote.
Ich versuche die Optimierung des Bruchpunktes, um optimale Parameter zu finden.
Erweiterung von Algorithmen für maschinelles Lernen zur dynamischen Optimierung und Anpassung von Parametern.
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 // =============================================================================