Momentum-basierte Breakout-Strategie


Erstellungsdatum: 2024-02-23 14:27:21 zuletzt geändert: 2024-02-23 14:27:21
Kopie: 0 Klicks: 646
1
konzentrieren Sie sich auf
1621
Anhänger

Momentum-basierte Breakout-Strategie

Überblick

Die Dynamik-Breakout-Strategie ist eine Trendstrategie, die die Dynamik des Marktes verfolgt. Sie kombiniert mehrere Indikatoren, um zu beurteilen, ob sich der Markt derzeit in einem Auf- oder Abwärtstrend befindet, und setzt bei einem Durchbruch der kritischen Resistenzpositionen zu viel und bei einem Durchbruch der kritischen Unterstützung Positionen frei.

Strategieprinzip

Die Strategie beurteilt Markttrends und Schlüsselpreise durch die Berechnung von Donchian-Kanälen über mehrere Längenperioden. Konkret bezeichnet sie einen Aufwärtstrend, wenn der Preis über einen längeren Zeitraum wie den 40-Tage-Donchian-Kanal hinausgeht, und sendet auf dieser Grundlage mehrere Signale aus, die mit Filterbedingungen wie einem neuen Höchstwert im Jahr und einer linearen Ausrichtung des gleitenden Durchschnitts verbunden sind.

Die Strategie bietet zwei Optionen, um aus einer Position auszusteigen: eine feste Cancellation-Linie und einen Tracking-Stop. Die feste Cancellation-Linie ist ein Stop-Loss, der auf einen kürzeren Zeitraum wie dem 20-Tage-Donchian-Kanal basiert. Der Tracking-Stop ist ein Floating-Stop, der täglich auf Basis von ATR-Werten berechnet wird. Beide Stop-Loss-Methoden sind gut geeignet, um das Risiko zu kontrollieren.

Analyse der Stärken

Diese Strategie kombiniert Trendbeurteilung und Durchbruch-Operation, um die Richtung der kurzen Linie im Markt zu erfassen. Im Vergleich zu einem einzigen Indikator verwendet sie mehrere Filterbedingungen, die einige falsche Durchbrüche filtern können, um die Qualität des eingehenden Signals zu verbessern. Darüber hinaus macht die Anwendung der Stop-Loss-Strategie ihre Widerstandskraft so stark, dass die Verluste auch bei kurzfristigen Rückschlägen wirksam kontrolliert werden können.

Risikoanalyse

Das Hauptrisiko dieser Strategie besteht darin, dass es zu starken Schwankungen kommen kann, die dazu führen, dass die Stop-Loss-Position ausgelöst wird. Wenn sich die Situation schnell umkehrt, kann die Gelegenheit verpasst werden. Darüber hinaus filtert die Verwendung von mehreren Filterbedingungen einige Chancen aus und reduziert die Häufigkeit der Positionen der Strategie.

Um das Risiko zu verringern, kann der ATR-Wert entsprechend angepasst oder der Donchian-Streckenabstand erweitert werden, was die Wahrscheinlichkeit verringert, dass ein Stoppschaden durchbrochen wird. Die Filterbedingungen können auch teilweise reduziert oder abgeschafft werden, um die Eintrittsfrequenz zu erhöhen, aber das Risiko wird ebenfalls erhöht.

Optimierungsrichtung

Diese Strategie kann in folgenden Bereichen optimiert werden:

  1. Optimierung der Länge des Donchian-Kanals auf der Suche nach der optimalen Kombination von Parametern
  2. Versuchen Sie, verschiedene Arten von Moving Averages als Anzeige von Schwankungen zu verwenden
  3. Anpassung der ATR-Multiplikation oder Umstellung auf eine Fixpunkt-Stopp-Lösung
  4. Mehr Trends mit Indikatoren wie MACD
  5. Optimierung der Urteilsfenster für neue Höhen und Tiefen im Jahr usw.

Durch das Testen verschiedener Parameter kann die optimale Kombination gefunden werden, um ein Gleichgewicht zwischen Risiko und Ertrag zu erzielen.

Zusammenfassen

Die Strategie verwendet mehrere Indikatoren, um die Richtung des Trends zu bestimmen. Die Stop-Loss-Mechanismen ermöglichen eine starke Risikokontrolle. Durch die Optimierung der Parameter kann die Strategie einen stabilen Überschuss erzielen. Sie ist für Investoren geeignet, die keine klare Einschätzung des Marktes haben, aber den Trend verfolgen möchten.

Strategiequellcode
/*backtest
start: 2024-01-23 00:00:00
end: 2024-02-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyHigh-SellLow Strategy", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)
donchianEntryLength = input(40, step=10)
donchianExitLength = input(20, step=10)

considerNewLongTermHighLows = input(true)
shortHighLowPeriod = input(120, step=10)
longHighLowPeriod = input(180, step=10)

considerMAAlignment = input(true)
MAType = input(title="Moving Average Type", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
LookbackPeriod = input(40, minval=10,step=10)

atrLength = input(22)
atrMult = input(4)

exitStrategy = input(title="Exit Strategy", defval="tsl", options=["dc", "tsl"])

considerYearlyHighLow = input(true)
backtestYears = input(10, minval=1, step=1)
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0

//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
    newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
    newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
    [newHigh,newLow]

//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
    yhigh = security(syminfo.tickerid, '12M', high[1]) 
    ylow = security(syminfo.tickerid, '12M', low[1]) 
    yhighlast = yhigh[365]
    ylowlast = ylow[365]
    yhighllast = yhigh[2 * 365]
    ylowllast = ylow[2 * 365]
    
    yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
    yearlyHighCondition = (  (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
    yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
    yearlyLowCondition = (  (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
    
    label_x = time+(60*60*24*1000*1)
    [yearlyHighCondition,yearlyLowCondition]

donchian(rangeLength)=>
    upper = highest(rangeLength)
    lower = lowest(rangeLength)
    middle = (upper+lower)/2
    [middle, upper, lower]

inDateRange = true
[eMiddle, eUpper, eLower] = donchian(donchianEntryLength)
[exMiddle, exUpper, exLower] = donchian(donchianExitLength)
maAlignment = f_getMaAlignment(MAType, false)
[yearlyHighCondition, yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHigh,newLow] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)

maAlignmentLongCondition = highest(maAlignment, LookbackPeriod) == 1 or not considerMAAlignment 

atr = atr(atrLength)
tsl = f_getTrailingStop(atr, atrMult)

//U = plot(eUpper, title="Up", color=color.green, linewidth=2, style=plot.style_linebr)
//D = plot(exLower, title="Ex Low", color=color.red, linewidth=2, style=plot.style_linebr)
longCondition = crossover(close, eUpper[1]) and yearlyHighCondition and newHigh and maAlignmentLongCondition
exitLongCondition = crossunder(close, exLower[1])

shortCondition = crossunder(close, eLower[1]) and yearlyLowCondition and newLow
exitShortCondition = crossover(close, exUpper[1])
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange, oca_name="oca_buy")
strategy.exit("ExitBuyDC", "Buy", when=exitStrategy=='dc', stop=exLower)
strategy.exit("ExitBuyTSL", "Buy", when=exitStrategy=='tsl', stop=tsl)
plot(strategy.position_size > 0 ? (exitStrategy=='dc'?exLower:tsl) : na, title="Trailing Stop", color=color.red, linewidth=2, style=plot.style_linebr)
//strategy.close("Buy", when=exitLongCondition)