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.
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.
Zu den Vorteilen dieser Strategie gehören:
Einfach zu implementieren. Es handelt ausschließlich auf Basis von MA-Kreuzungen, geeignet für Anfänger ohne Handelserfahrung.
Steuerbarer Rückzug mit Risikomanagement. gleitende Durchschnitte können kurzfristige Schwankungen filtern und vermeiden, ausgeschaltet zu werden.
Anpassungsfähige Parameter für die Anpassungsfähigkeit. Benutzer können Parameter wie MA-Perioden und TP/SL-Level optimieren.
Die Strategie zeigt die wichtigsten MAs, Einträge und TP/SL-Levels auf dem Diagramm.
Erweiterbare Rahmenbedingungen. Die Strategiestruktur ist abgeschlossen. Neue Signale und Indikatoren können hinzugefügt werden, um sie zu verbessern.
Zu den Risiken dieser Strategie gehören:
Eine schnellere MA ist empfindlich auf Preisänderungen und kann unter extremen Bedingungen scheitern.
Anfällig für Schlagzeilen in verschiedenen Märkten, was zu aufeinanderfolgenden Verlusten führt.
Die Handelskosten werden nicht berücksichtigt, da Gebühren und Verschiebungen beim tatsächlichen Handel erhebliche Auswirkungen auf die Rentabilität haben.
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:
Verwenden Sie einen breiteren Stop Loss oder fügen Sie einen zusätzlichen Breakout Stop Loss hinzu.
Vergrößern Sie die MA-Distanz, reduzieren Sie die Handelsfrequenz oder fügen Sie andere Filter hinzu.
Betrachten Sie die tatsächlichen Handelskosten, setzen Sie einen breiteren Gewinnzielbereich.
Graduelle Optimierung der Parameter und Reduzierung der Überanpassung unter Berücksichtigung der sich ändernden Marktbedingungen.
Diese Strategie kann in folgenden Aspekten optimiert werden:
Testen Sie verschiedene Parameterkombinationen, um die optimalen Parameter zu finden, wie z. B. MA-Perioden.
Zusätzliche Indikatoren als Filter, um Whipsaws zu vermeiden, wie MACD, KD usw.
Optimieren Sie die Stop-Loss-Strategie für ein besseres Risikomanagement, z. B. einen Trailing-Stop-Loss.
Erhöhen Sie die Positionsgröße mit Hebelwirkung, um die Gewinne zu erhöhen und gleichzeitig das Risiko zu kontrollieren.
Berücksichtigen Sie die Handelskosten, optimieren Sie die Parameter für den Live-Handel.
Die Stabilität der Parameter ist anhand statistischer Methoden zu bewerten, um die Überanpassung zu verringern.
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")