
Die Donatella-Strategie ist eine Trendverfolgungsstrategie, die nach dem Donatella-Kanalprinzip entwickelt wurde, das in dem Artikel Black Box Trend Following und Lifting the Veil beschrieben wird. Die Strategie nutzt den Donatella-Kanal, um die Preisentwicklung zu bestimmen und nach dem Preis zu übertreffen oder zu brechen.
Die Strategie basiert auf den Donnie Channels, um die Richtung des Trends zu bestimmen. Die Donnie Channels bestehen aus einem Kanal mit einer längeren und einem Kanal mit einer kürzeren Periode. Der Trend beginnt, wenn der Preis den Kanal mit einer längeren Periode durchbricht, und der Trend endet, wenn der Preis den Kanal mit einer kürzeren Periode durchbricht.
Die Länge der längeren und der kürzeren Perioden ist 50 Tage, 20 Tage oder 10 Tage. Wenn der Preis dem höchsten Preis innerhalb von 50 Tagen entspricht, wird ein Aufschlag eröffnet. Wenn der Preis dem niedrigsten Preis innerhalb von 50 Tagen entspricht, wird ein Leerlauf eröffnet.
Auf diese Weise kann durch die Kombination von zwei verschiedenen periodischen Donya-Kanälen die Position zu Beginn des Trends festgelegt und die Schadensbegrenzung zum Ende des Trends rechtzeitig beendet werden.
Diese Strategie hat folgende Vorteile:
Die Fähigkeit, Trends zu erfassen, ist sehr stark. Durch das Durchbrechen des Donau-Kanals kann man Trends effektiv verfolgen, indem man den Anfang und das Ende des Trends beurteilt.
Risikokontrolle ist vorhanden. Die Einzelschäden werden durch mobile Stop-Losses kontrolliert.
Die Parameter können flexibel angepasst werden. Sie können die Kombination der Zyklen der Kanäle frei wählen, um sie an verschiedene Sorten und Marktbedingungen anzupassen.
Einfache und klare Transaktionslogik.
Die Strategie birgt auch folgende Risiken:
Es ist unmöglich, sich an einen Schaukelmarkt anzupassen. Wenn die Tendenz nicht sichtbar ist, werden mehrere kleine Anpassungen vorgenommen, die zu Stop-Loss-Verlusten führen.
Das Risiko eines Durchbruchs. Wenn der Preis den Kanal durchbricht, kann er erneut zurückgerufen werden, was zu einem Stop-Loss führt.
Risiken bei der Zykluswahl. Wenn die Durchlaufzyklen falsch eingestellt sind, führt dies zu einem Trading in Noise.
Sharp-Ratio-Risiken. Wenn die Position erhöht wird, ohne die Stop-Loss-Marge anzupassen, besteht ein Sharp-Ratio-Risiko.
Entsprechende Lösungen:
Die Strategie kann in folgenden Richtungen optimiert werden:
Filterbedingungen hinzugefügt, um Whipsaws zu vermeiden.
Optimierung der Portfolio- und Positionskontrolle im Channel-Zyklus und Verbesserung der Verlustquote. Anpassungs- und Verlustschutzmechanismen können eingeführt werden.
Versuchen Sie, die Breakpoint-Optimierung zu optimieren, um die beste Kombination von Parametern zu finden.
Die Erweiterung der Algorithmen für das maschinelle Lernen, die dynamische Optimierung und Anpassung der Parameter.
Die Doniphan-Trend-Tracking-Strategie ist eine sehr praktische Trend-Tracking-Strategie, die durch die Doppelkanal-Ermittlung des Anfangs und des Endes des Preis-Trends und die Einführung einer Trend-Tracking-Handelsweise die Einzelschäden wirksam kontrolliert. Die Strategie ist flexibel und leicht umzusetzen und ist eine sehr praktische Trend-Tracking-Strategie.
/*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
// =============================================================================