Trendfolgende Momentum-Breakout-Strategie


Erstellungsdatum: 2023-11-15 11:09:21 zuletzt geändert: 2023-11-15 11:09:21
Kopie: 0 Klicks: 584
1
konzentrieren Sie sich auf
1617
Anhänger

Trendfolgende Momentum-Breakout-Strategie

Überblick

Die Dynamik-Breakout-Strategie ist eine quantitative Handelsstrategie, die dem Markttrend folgt. Sie ermittelt den Trend und die Intensität der Marktpreisbewegung, indem sie die Dynamikindikatoren der historischen Preise berechnet, um die mittlere Trendlinie des Marktes zu erfassen. Wenn die Dynamik von einer negativen Korrektur überschreitet und von einer positiven Korrektur frei ist, gehört sie zur Trendverfolgungsstrategie.

Strategieprinzip

Die Strategie basiert hauptsächlich auf Dynamikindikatoren. Der Dynamikindikator ist der aktuelle Zyklus-Schlusskurs abzüglich des Schlusskurses vor N-Zyklen. Wenn der Schlusskurs der neuesten K-Linie höher ist als vor N-Zyklen, ist die Dynamik positiv und zeigt eine steigende Dynamik an.

Die Strategie berechnet zunächst die Dynamik mit einer Länge von 18 Zyklen, d.h. der aktuelle Schlusskurs abzüglich des Schlusskurses vor dem 18. Zyklus, um mom0 ≠ zu erhalten. Dann berechnet sie die Dynamik von einem Zyklus von mom0 und erhält mom1 ≠.

Wenn Mom0>0 und Mom1>0 mehrere Signale erzeugen, bedeutet dies, dass die Preise stark steigen. Wenn Mom0 und Mom1 ein Kurzsignal erzeugen, bedeutet dies, dass die Preise stark fallen.

Die Strategie zeichnet die Zeit der letzten Über- und Nachlasssignale auf. Wenn die Über- und Nachlasssignale größer sind als die Nachlasssignale, wird eine Position gehalten.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Die Strategie ist klar, einfach und leicht zu verstehen und eignet sich für Anfänger, die mit Quantity Trading beginnen.

  2. Die Dynamikindikatoren sind in der Lage, die Markttrends und -stärken zu erfassen und die mittleren Langstreckentrends mit einer hohen Gewinnrate zu verfolgen.

  3. Mit einem doppelten Massefilter kann ein Teil des durch einen falschen Durchbruch verursachten Schadens gefiltert werden.

  4. Nach dem Erscheinen des Handelssignals wird eine Trendposition eingerichtet, um zusätzliche Gewinne aus dem Trend zu erzielen.

  5. Ein zeitnaher Stop-Loss-Ausgang kann einzelne Verluste kontrollieren und verhindert, dass durch die Umkehrung zu große Verluste verursacht werden.

Risikoanalyse

Die Strategie birgt auch einige Risiken, die beachtet werden müssen:

  1. Kurzfristige Anpassungen in mehrköpfigen Trends führen zu Stop-Loss-Ausgängen, die den gesamten Zyklus nicht erfassen können. Der Stop-Loss-Bereich kann entsprechend gelockert werden.

  2. Häufige Aus- und Auslagerungen in schwankenden Verhältnissen erhöhen leicht die Transaktionsgebühren und Schlupfpunkte. Die Filterbedingungen können entsprechend gelockert und die Handelsfrequenz reduziert werden.

  3. Nach einem Trendwechsel kann ein Trendwechsel in Verbindung mit einem Trendindikator beurteilt werden, wenn die Position in der ursprünglichen Richtung gehalten wird.

  4. Die Parameter können falsch eingestellt werden, was zu einem Fehlschlag oder falschen Signalen führen kann. Die Parameter müssen für verschiedene Märkte angepasst werden.

Optimierungsrichtung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Optimierung der Dynamikparameter, Berechnung der Dynamiklänge für verschiedene Zyklen und Marktanpassungen, Verbesserung der Signalqualität.

  2. Filter für andere Indikatoren wie MACD, KD usw. werden hinzugefügt, um zu vermeiden, dass eine Trendwende zu Verlusten führt.

  3. Optimierung der Stop-Loss-Strategie, angemessene Lockerung der Stop-Loss-Strategie in den Handelstrends; angemessene Verschärfung der Stop-Loss-Strategie in den Nicht-Trends.

  4. Steigerung der Positionsmanagement-Strategie, Verringerung der Positionen bei Nicht-Trends; Erhöhung der Positionen bei Trends, um mehr zu erzielen.

  5. Optimierung der Parameter für verschiedene Sorten und Verbesserung der Anpassungsfähigkeit der Parameter

  6. Die Einführung von Machine-Learning-Algorithmen ermöglicht die dynamische Optimierung der Parameter der Strategie.

Zusammenfassen

Die Dynamik-Breakout-Strategie overall ist eine einfache und intuitive Trend-Tracking-Strategie. Sie kann die langfristigen Trends in den Märkten effektiv erfassen und in Trends bessere Erträge erzielen. Sie muss auch auf Risikokontrolle achten, Stop-Loss-Strategien optimieren und Trends mit anderen Kennzahlen beurteilen. Durch ständige Optimierung kann die Strategie zu einem stabilen, profitablen, quantifizierten Handelssystem gemacht werden.

Strategiequellcode
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close

momentum(seria, length) =>
    mom = seria - seria[length]
    mom

mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

/////////////// Strategy /////////////// 
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Stop Losses Long ///////////////
_5 = input(false,  "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1l = atr(atrLkbl)

longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]

slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na

/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1s = atr(atrLkbs)

shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]

slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na

_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)