Strategie für die Verlagerung des gleitenden Durchschnitts

Schriftsteller:ChaoZhang, Datum: 10.10.2023
Tags:

Übersicht

Der gleitende Durchschnitts-Crossover ist eine häufig verwendete Handelsstrategie, die auf gleitenden Durchschnitten basiert. Er verwendet den Crossover eines schnelleren gleitenden Durchschnitts und eines langsameren gleitenden Durchschnitts als Handelssignale. Wenn der schnellere gleitende Durchschnitts über den langsameren gleitenden Durchschnitts von unten kreuzt, ist es ein Kaufsignal. Wenn der schnellere gleitende Durchschnitts unter den langsameren gleitenden Durchschnitts von oben kreuzt, ist es ein Verkaufssignal. Diese Strategie verwendet 50-Tage-MA als schnelleren MA und 200-Tage-MA als langsameren MA.

Strategie Logik

Die Kernlogik dieser Strategie basiert auf der Theorie der gleitenden Durchschnitte. Gleitende Durchschnitte können Preisschwankungen effektiv glätten und Preistrends anzeigen. Der schnellere MA ist empfindlicher auf Preisänderungen und kann Trendumkehrpunkte erfassen. Der langsamere MA ist weniger empfindlich auf Preisänderungen und kann kurzfristige Schwankungen ausfiltern. Wenn der schnellere MA über den langsameren MA überschreitet, zeigt er einen Aufwärtstrend an. Wenn der schnellere MA unter den langsameren MA überschreitet, zeigt er einen Abwärtstrend an.

Diese Strategie definiert zunächst den 50-Tage-MA und den 200-Tage-MA. Die Long-Entry-Bedingung wird gesetzt, wenn der schnellere MA über den langsameren MA überschreitet. Die Short-Entry-Bedingung wird gesetzt, wenn der schnellere MA unter den langsameren MA überschreitet. Um Überschneidungen von Trades zu vermeiden, verwendet die Strategie die isEntry- und isExit-Flaggen zur Steuerung. Wenn die Einstiegsbedingung erfüllt ist, wird isEntry auf true gesetzt. Wenn die Ausgangsbedingung erfüllt ist, wird isExit auf true gesetzt. Eine Long-Position wird nur geöffnet, wenn isEntry falsch ist und ein Kaufsignal angezeigt wird. Eine Short-Position wird nur geöffnet, wenn isExit falsch ist und ein Verkaufssignal angezeigt wird.

Darüber hinaus legt die Strategie auch die Gewinn- und Stop-Loss-Level fest. Benutzer können die TP/SL-Prozentsatzdistanz durch Eingaben definieren. Die TP- und SL-Preise werden auf der Grundlage des Eingangspreisprozentsatzes berechnet. Wenn die Positionsgröße größer als 0 ist, werden TP und SL auf der Grundlage des langen TP/SL-Prozentsatzes ausgeführt. Wenn die Positionsgröße kleiner als 0 ist, basieren TP und SL auf dem kurzen TP/SL-Prozentsatz.

Analyse der Vorteile

Zu den Vorteilen dieser Strategie gehören:

  1. Einfach zu implementieren. Es handelt ausschließlich auf Basis von MA-Kreuzungen, geeignet für Anfänger ohne Handelserfahrung.

  2. Steuerbarer Rückzug mit Risikomanagement. gleitende Durchschnitte können kurzfristige Schwankungen filtern und vermeiden, ausgeschaltet zu werden.

  3. Anpassungsfähige Parameter für die Anpassungsfähigkeit. Benutzer können Parameter wie MA-Perioden und TP/SL-Level optimieren.

  4. Die Strategie zeigt die wichtigsten MAs, Einträge und TP/SL-Levels auf dem Diagramm.

  5. Erweiterbare Rahmenbedingungen. Die Strategiestruktur ist abgeschlossen. Neue Signale und Indikatoren können hinzugefügt werden, um sie zu verbessern.

Risikoanalyse

Zu den Risiken dieser Strategie gehören:

  1. Eine schnellere MA ist empfindlich auf Preisänderungen und kann unter extremen Bedingungen scheitern.

  2. Anfällig für Schlagzeilen in verschiedenen Märkten, was zu aufeinanderfolgenden Verlusten führt.

  3. Die Handelskosten werden nicht berücksichtigt, da Gebühren und Verschiebungen beim tatsächlichen Handel erhebliche Auswirkungen auf die Rentabilität haben.

  4. Die tatsächlichen Marktbedingungen sind komplex und die Ergebnisse der Backtest können nicht die Leistung im Live-Umfeld repräsentieren.

Zu den Lösungen gehören:

  1. Verwenden Sie einen breiteren Stop Loss oder fügen Sie einen zusätzlichen Breakout Stop Loss hinzu.

  2. Vergrößern Sie die MA-Distanz, reduzieren Sie die Handelsfrequenz oder fügen Sie andere Filter hinzu.

  3. Betrachten Sie die tatsächlichen Handelskosten, setzen Sie einen breiteren Gewinnzielbereich.

  4. Graduelle Optimierung der Parameter und Reduzierung der Überanpassung unter Berücksichtigung der sich ändernden Marktbedingungen.

Optimierungsrichtlinien

Diese Strategie kann in folgenden Aspekten optimiert werden:

  1. Testen Sie verschiedene Parameterkombinationen, um die optimalen Parameter zu finden, wie z. B. MA-Perioden.

  2. Zusätzliche Indikatoren als Filter, um Whipsaws zu vermeiden, wie MACD, KD usw.

  3. Optimieren Sie die Stop-Loss-Strategie für ein besseres Risikomanagement, z. B. einen Trailing-Stop-Loss.

  4. Erhöhen Sie die Positionsgröße mit Hebelwirkung, um die Gewinne zu erhöhen und gleichzeitig das Risiko zu kontrollieren.

  5. Berücksichtigen Sie die Handelskosten, optimieren Sie die Parameter für den Live-Handel.

  6. Die Stabilität der Parameter ist anhand statistischer Methoden zu bewerten, um die Überanpassung zu verringern.

Schlussfolgerung

Diese Strategie hat eine klare Logik und ist einfach zu implementieren, geeignet als einführende Strategie für den Algo-Handel. Aber sie hat auch Risiken und Einschränkungen. Sorgfältige Parameter- und Filteroptimierung und Risikokontrolle sind erforderlich, um stetige Gewinne zu erzielen. Diese Strategie hat eine große Erweiterbarkeit für Benutzer, um darauf basierend zu innoveren und zu optimieren, um ihrem eigenen Handelsstil zu entsprechen.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-09 00:00:00
period: 3m
basePeriod: 1m
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/
// © gjfsdrtytru

//@version=4
strategy("Backtest Engine", "Backtest", overlay=true, commission_type=strategy.commission.percent, commission_value=0.07, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)


// Start code here...
fastMA = sma(close,50)
slowMA = sma(close,200)

plot(fastMA, "Fast MA",  color.blue)
plot(slowMA, "Slow MA",  color.red)

// Long Enrty/Exit
longCondition = crossover(fastMA,slowMA)
closeLong = crossover(slowMA,fastMA)

// Short Enrty/Exit
shortCondition = crossover(slowMA,fastMA)
closeShort = crossover(fastMA,slowMA)


// Bot web-link alert - {{strategy.order.comment}}
botLONG = "ENTRY LONG ALERT"
botCLOSELONG = "CLOSE LONG ALERT"
botSHORT = "ENTRY SHORT ALERT"
botCLOSESHORT = "CLOSE SHORT ALERT"

//////////////////////////////////////////////////////////////////
//////////////////////// BACKTEST ENGINE \\\\\\\\\\\\\\\\\\\\\\\\\
/////////////////// [NO USER INPUT REQUIRED] /////////////////////
//////////////////////////////////////////////////////////////////

// Time period
testStartYear = input(2020, "Backtest Start Year")
testStartMonth = input(5, "Backtest Start Month")
testStartDay = input(11, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

periodLength = input(3650, "Backtest Period (days)", minval=0,tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStop = testPeriodStart + periodLength

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false

// Convert Take profit and Stop loss to percentage
longTP = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
longSL = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortTP = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options
shortSL = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0) * 0.01 // Set levels with input options

// 0% TP/SL = OFF (a value of 0 turns off TP/SL feature)
longProfitPerc = longTP == 0 ? 1000 : longTP
longStopPerc = longSL == 0 ? 1 : longSL
shortProfitPerc = shortTP == 0 ? 1 : shortTP
shortStopPerc = shortSL == 0 ? 1000 : shortSL

// Determine TP/SL price based on percentage given
longProfitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
longStopPrice  = strategy.position_avg_price * (1 - longStopPerc)
shortProfitPrice  = strategy.position_avg_price * (1 - shortProfitPerc)
shortStopPrice  = strategy.position_avg_price * (1 + shortStopPerc)

// Anti-overlap
isEntry_Long = false
isEntry_Long := nz(isEntry_Long[1], false)
isExit_Long = false
isExit_Long := nz(isExit_Long[1], false)
isEntry_Short = false
isEntry_Short := nz(isEntry_Short[1], false)
isExit_Short = false
isExit_Short := nz(isExit_Short[1], false)

entryLong = not isEntry_Long and longCondition
exitLong = not isExit_Long and closeLong
entryShort = not isEntry_Short and  shortCondition
exitShort = not isExit_Short and closeShort

if (entryLong)
    isEntry_Long := true
    isExit_Long := false
if (exitLong)
    isEntry_Long := false
    isExit_Long := true
if (entryShort)
    isEntry_Short := true
    isExit_Short := false
if (exitShort)
    isEntry_Short := false
    isExit_Short := true

// Order Execution
if testPeriod() 
    if entryLong
        strategy.entry(id="Long", long=true, when = entryLong, comment=botLONG) // {{strategy.order.comment}}
    if entryShort
        strategy.entry(id="Short", long=false, when = entryShort, comment=botSHORT) // {{strategy.order.comment}}


// TP/SL Execution
if (strategy.position_size > 0)
    strategy.exit(id="Long SL/TP", from_entry="Long", limit=longProfitPrice, stop=longStopPrice)
    strategy.close(id="Long", when=exitLong, comment=botCLOSELONG) // {{strategy.order.comment}}

if (strategy.position_size < 0)
    strategy.exit(id="Short TP/SL", from_entry="Short", limit=shortProfitPrice, stop=shortStopPrice)
    strategy.close(id="Short", when=exitShort, comment=botCLOSESHORT) // {{strategy.order.comment}}
    
// Draw Entry, TP and SL Levels for Long Positions
plot(strategy.position_size > 0 ? longTP == 0 ? na : longProfitPrice : na, style=plot.style_linebr, color=color.green, title="Long TP")
plot(strategy.position_size > 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Long Entry")
plot(strategy.position_size > 0 ? longSL == 0 ? na : longStopPrice : na, style=plot.style_linebr, color=color.red, title="Long SL")
// Draw Entry, TP and SL Levels for Short Positions
plot(strategy.position_size < 0 ? shortTP == 0 ? na : shortProfitPrice : na, style=plot.style_linebr, color=color.green, title="Short TP")
plot(strategy.position_size < 0 ? strategy.position_avg_price : na, style=plot.style_linebr, color=color.blue, title="Short Entry")
plot(strategy.position_size < 0 ? shortSL == 0 ? na : shortStopPrice : na, style=plot.style_linebr, color=color.red, title="Short SL")

Mehr