Donchian Channel Trend nach der Strategie

Schriftsteller:ChaoZhang, Datum: 2024-01-22 12:30:05
Tags:

img

Übersicht

Die Donchian Channel Trend Following Strategie ist eine Trend Following Strategie, die auf dem Donchian Channel Indikator basiert.

Die Hauptidee dieser Strategie besteht darin, einen längeren Donchian-Kanal zur Bestimmung der Haupttrendrichtung und einen kürzeren Donchian-Kanal als Signal für den Einstieg und den Stop-Loss zu verwenden.

Strategie Logik

  1. Berechnen Sie den höchsten Schlusskurs und den niedrigsten Schlusskurs über einen langen Zeitraum (z. B. 50 Tage) um den Donchian Channel zu bauen. Ein Ausbruch über dem oberen Band zeigt einen Aufwärtstrend an, während ein Ausbruch unter dem unteren Band einen Abwärtstrend anzeigt. Dies bestimmt die Haupttrendrichtung.

  2. Verwenden Sie den höchsten Schlusskurs und den niedrigsten Schlusskurs über einen kurzen Zeitraum (z. B. 20 Tage) als Kriterien für den Einstieg und den Stop-Loss.

  3. Bei einer Long-Position, wenn der Preis unter den kurzfristigen unteren Bereich fällt, stoppt man mit Verlust. Bei einer Short-Position, wenn der Preis über den kurzfristigen oberen Bereich bricht, stoppt man mit Verlust.

  4. Der Stop-Loss wird auf N mal ATR gesetzt, der sich automatisch anhand der Marktvolatilität anpasst, wodurch die Wahrscheinlichkeit, dass ein Stop-Loss erreicht wird, geringer ist.

  5. Es besteht die Möglichkeit, Positionen vor Ende der Handelssitzung zu schließen oder bis zum Erreichen eines Stop Loss zu halten.

Die Strategie berücksichtigt sowohl die Trendidentifizierung als auch den Profit Stop Loss. Sie kann Preistrends erfassen und gleichzeitig Risiken kontrollieren. Sie eignet sich für den mittelfristigen bis langfristigen Handel.

Analyse der Vorteile

  1. Wirksam identifiziert mittelfristige bis langfristige Trends, ohne von kurzfristigen Marktlärmen beeinträchtigt zu werden.

  2. Automatischer Stop-Loss-Mechanismus mit Grenzwerten pro Handelsverlust.

  3. Der ATR-basierte Stop-Loss passt die Stop-Distanz anhand der Marktvolatilität an und senkt die Wahrscheinlichkeit, dass ein Stop-Loss erreicht wird.

  4. Automatische Schließung von Positionen, wenn es nicht möglich ist, Risiken zu managen.

  5. Einfache und klare Strategie-Logik, die leicht zu verstehen ist.

Risikoanalyse

  1. In nicht-trendigen Märkten kann die Strategie mehr Trades generieren, was die Handelskosten und die Verlustchancen erhöht.

  2. Obwohl sie einen Stop-Loss-Mechanismus haben, können Preislücken unter volatilen Bedingungen den Stop-Loss-Punkt durchdringen und unmittelbar einen großen Verlust verursachen.

  3. Die ATR-Berechnung basiert ausschließlich auf historischen Daten und kann zukünftige Kursbewegungen und Volatilität nicht genau vorhersagen.

  4. Stop-Loss-Orders können im Live-Handel nicht immer ausgeführt werden, sie können in extremen volatilen Bedingungen übersprungen werden und Verluste verursachen.

Optimierungsrichtlinien

  1. Anpassung der Donchian-Kanalparameter zur Optimierung der Trenderkennungsleistung.

  2. Einbeziehung anderer Indikatoren wie MACD, KDJ zur Bestätigung von Handelssignalen und Verbesserung der Strategie-Stabilität.

  3. Fügen Sie den Stop-Loss hinzu, um den Stop-Loss-Punkt zusammen mit dem Preis zu bewegen und die Verluste weiter zu begrenzen.

  4. Testen Sie die Auswirkungen verschiedener Aufbewahrungszeiten, um optimale Gesamtergebnisse zu erzielen.

  5. Überlegen Sie, ob Sie die Positionsgröße dynamisch anpassen und Positionen unter Trendbedingungen vergrößern möchten.

Zusammenfassung

Die Donchian Channel Trend Following Strategie integriert Trendidentifikation und Risikokontrolle. Sie zielt darauf ab, überschüssige Renditen zu generieren, indem Trends identifiziert und Schwanzrisiken mit Stop-Loss-Mechanismen kontrolliert werden. Diese Strategie eignet sich zur Identifizierung und Erfassung mittelfristiger und langfristiger Preistrends. Mit Parameteroptimierung und Mechanismusverbesserungen kann sie stetige positive Ergebnisse erzielen.


/*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, calc_on_every_tick=true)

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

donch_string = input.string(title="Lenght", options = ['20/10','50/20', '50/50', '20/20', '100/100'], defval='20/10')
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 = true)


// =============================================================================
// 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 BG VERTICAL COLOR
// =============================================================================

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 HORIZONTAL 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='In end')

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

Mehr