Die Schnellschnittlinie ist eine übliche Handelsstrategie, die auf einer beweglichen Schnittlinie basiert. Die Schnellschnittlinie verwendet eine Kreuzung einer schnellen und einer langsam beweglichen Schnittlinie als Kauf- und Verkaufssignal. Wenn die schnelle Schnittlinie die langsame Schnittlinie von unten durchdringt, wird dies als Kaufsignal betrachtet; wenn die schnelle Schnittlinie die langsame Schnittlinie von oben durchdringt, wird dies als Verkaufssignal betrachtet.
Die Kernlogik der Strategie basiert auf der Theorie der Durchschnittslinie. Die bewegliche Durchschnittslinie ist in der Lage, Preisschwankungen effektiv zu glätten und die Preisentwicklung zu reflektieren. Die schnelle Durchschnittslinie ist empfindlicher auf Preisänderungen und kann Trendwendepunkte erfassen. Die langsame Durchschnittslinie ist weniger empfindlich auf Preisänderungen und filtert kurzfristige Schwankungen.
Konkret definiert die Strategie zunächst die 50-Tage- und die 200-Tage-Mittellinie. Dann wird die Mehrkopf-Eintrittsbedingung als schnelle Durchschnittslinie auf der schnellen Durchschnittslinie und die Leerkopf-Eintrittsbedingung als schnelle Durchschnittslinie unter der schnellen Durchschnittslinie festgelegt. Um überlappende Transaktionen zu vermeiden, werden die isEntry- und isExit-Markenpositionen verwendet.
Darüber hinaus hat die Strategie einen Stop-Loss-Punkt festgelegt. Der Benutzer kann den Stop-Loss-Abstand durch Eingabe eines Prozentsatzes festlegen. Die Stop-Loss- und Stop-Loss-Preise werden anhand der prozentualen Veränderung des Einstiegspreises berechnet.
Diese Strategie hat folgende Vorteile:
Die Bedienung ist einfach und leicht zu realisieren. Der Handel kann nur mit einer linearen Kreuzung erfolgen und eignet sich für Anfänger ohne Erfahrung.
Die Rücknahme ist kontrollierbar und mit einem gewissen Risikomanagementsystem. Die Moving Average Filtert kurzfristige Preisschwankungen und verhindert die Verwertung.
Benutzerdefinierte Parameter, sehr anpassungsfähig. Der Benutzer kann selbst die Parameter für die Durchschnittslinie und die Stop-Loss-Standards festlegen, um die Strategie zu optimieren.
Die Strategie zeichnet die wichtigsten Mittellinien, Einstiegspunkte und Stopp-Loss-Punkte direkt auf der Tabelle ab.
Der Strategie-Rahmen ist vollständig und kann nur verbessert werden, wenn die wichtigsten Handelssignale geändert, Kennzahlen hinzugefügt werden usw.
Die Strategie birgt auch einige Risiken:
Die schnelle Durchschnittslinie ist sehr empfindlich auf Preisänderungen und kann nicht effektiv auf diese reagieren.
In einem schwankenden Umfeld kann man leicht eingeschlagen werden. In einem schwankenden Umfeld kann man wiederholt verlieren.
Transaktionskosten werden nicht berücksichtigt. Die Gebühren für die tatsächlichen Transaktionen und der Verlust von Gleitpunkten wirken sich stark auf die Gewinnmarge aus.
Rückmeldungsdaten passen nicht zu den Risiken. Die Situation im Einsatz ist kompliziert und wechselhaft.
Entsprechende Lösungen:
Es können auch zusätzliche Durchbruchstopps hinzugefügt werden.
Die Abweichung zwischen den Durchschnittslinien kann gegebenenfalls erweitert, die Handelsfrequenz verringert oder die Filtersignale durch andere Indikatoren geändert werden.
Es sollte ein größerer Freiraum für die Verzögerung gegeben werden, um die tatsächlichen Transaktionskosten zu berücksichtigen.
Die Veränderungen der Marktumgebung sollten berücksichtigt werden, die Parameter optimiert und die Anpassung schrittweise reduziert werden.
Diese Strategie kann in folgenden Bereichen optimiert werden:
Verschiedene Parameterkombinationen werden getestet, um die optimale Parameter zu finden. Die Anzahl der Tage, an denen die schnelle und langsame Durchschnittslinie getestet werden kann, und andere Parameterkombinationen werden getestet.
Filterung mit anderen Indikatoren, um Fehlverhandlungen in schwankenden Zeiten zu vermeiden.
Optimierung der Stop-Loss-Strategie, um ein effizienteres Risikomanagement zu ermöglichen.
Es ist notwendig, die Position zu vergrößern, die Leverage zu nutzen, um die Gewinnspanne zu erhöhen.
Berücksichtigung der Transaktionskosten auf der Festplatte, Anpassung und Optimierung der Rückmessparameter, um die Strategieparameter für den Einsatz in der Praxis zu optimieren.
Die Stabilität der Parameter wird in Kombination mit statistischen Methoden bewertet, wodurch das Risiko einer Datenübereinstimmung verringert und die Stabilität erhöht wird.
Insgesamt ist die Strategie klar, einfach zu implementieren und eignet sich als Einstiegsstrategie für quantitative Transaktionen. Die Strategie besteht jedoch aus Risiken und Mängeln, die eine sorgfältige Optimierung der Parameter und Filter erfordern.
/*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")