Diese Strategie ist ein Long-Short-Handelssystem, das Crossover-Signale des einfachen gleitenden Durchschnitts (SMA) mit Spitzenrückzugskontrolle kombiniert. Es verwendet den Crossover von 14-Perioden- und 28-Perioden-SMAs, um lange und kurze Handelssignale zu generieren und gleichzeitig den Spitzenrückgang der Strategie zu überwachen. Wenn der Rückzug einen vorgegebenen Schwellenwert überschreitet, stoppt die Strategie automatisch den Handel. Darüber hinaus enthält die Strategie eine detaillierte Spitzen-zu-Trop-Zyklusanalyse, um den Händlern zu helfen, die Risikokarakteristiken der Strategie besser zu verstehen.
Erzeugung von Handelssignalen:
Spitzenentzugskontrolle:
Analyse des Zyklus von der Spitze bis zum Durchlauf:
Kombination von Trendverfolgung und Risikokontrolle: Die SMA-Crossover-Strategie ist eine klassische Trend-Folge-Methode, während die Peak-Drawdown-Kontrolle eine zusätzliche Schicht des Risikomanagements bietet.
Hohe Anpassungsfähigkeit: Durch die Parametrierung der Höchst- und Mindestzinsschwellen kann die Strategie flexibel an unterschiedliche Marktbedingungen und persönliche Risikopräferenzen angepasst werden.
Transparente Risikoindikatoren: Die Spitzen-Trop-Zyklanalyse liefert detaillierte historische Auslastungsinformationen, die es Händlern ermöglichen, die Risikokarakteristiken der Strategie intuitiv zu verstehen und somit fundierte Handelsentscheidungen zu treffen.
Automatisierte Risikokontrolle: Wenn die Auslastung die vorgegebene Schwelle überschreitet, stoppt die Strategie automatisch den Handel.
Umfassende Leistungsanalyse: Zusätzlich zu den herkömmlichen Backtesting-Metriken enthält die Strategie detaillierte Daten über den Zyklus von Spitze bis Tief, einschließlich der Prozentsätze der Vorlaufzeit, der Abzugsprozentsätze und der Zeitinformationen, die eine eingehende Analyse der Strategieleistung erleichtern.
Übermäßige Abhängigkeit von historischen Daten: Die SMA-Crossover-Strategie basiert auf historischen Preisdaten und kann in schnell wechselnden Märkten langsam reagieren und zu falschen Signalen führen.
Häufiger Handel: In schwingen Märkten können sich die SMAs häufig kreuzen, was zu einem übermäßigen Handel und hohen Transaktionskosten führt.
Potenzial für große Abzüge: Trotz einer maximalen Zugriffskontrolle kann ein einziger großer Rückgang bei starker Marktvolatilität immer noch zu erheblichen Verlusten führen.
Parameterempfindlichkeit: Die Strategieleistung hängt stark von der Wahl der SMA-Perioden und der Auslastungsschwellen ab.
Verpasste Chancen, umzukehren: Wenn der Handel nach Erreichen der maximalen Abzugsschwelle eingestellt wird, kann die Strategie Chancen verpassen, die durch Marktumkehrungen entstehen.
Einführung dynamischer Parameteranpassung: Es sollte in Erwägung gezogen werden, die SMA-Perioden und die Anziehungsschwellen auf der Grundlage der Marktvolatilität dynamisch anzupassen, um sich an unterschiedliche Marktumgebungen anzupassen.
Zusätzliche Marktfilter: Einbeziehen Sie andere technische Indikatoren oder grundlegende Faktoren, wie RSI oder Volumen, um potenzielle falsche Signale zu filtern.
Implementieren von Eingang und Ausgang in Phasen: Anstelle von Alles-oder-Nichts-Operationen sollten die Positionsbildung und -schließung schrittweise durchgeführt werden, um das Risiko einzelner Entscheidungen zu verringern.
Hinzufügen von Profit-Mechanismus: Zusätzlich zur Abzugskontrolle fügen Sie eine dynamische Gewinnfunktion hinzu, um Gewinne zu erzielen und die Gesamtrendite zu verbessern.
Geldmanagement optimieren: Einführung einer dynamischen Positionsgröße basierend auf Kontogröße und Marktvolatilität zur besseren Risikokontrolle.
Einführung von Machine Learning Algorithmen: Verwenden von Techniken des maschinellen Lernens zur Optimierung der Parameterwahl- und Signalgenerierungsprozesse und zur Verbesserung der Anpassungsfähigkeit und Genauigkeit der Strategie.
Die SMA-Crossover-Lang-Short-Strategie in Kombination mit Peak-Drawdown-Kontrolle und Automatisierung ist ein quantitatives Handelssystem, das Trendverfolgung und Risikomanagement ausgleicht. Es erfasst Markttrends durch einfache gleitende Durchschnitts-Crossovers und verwaltet gleichzeitig das Abwärtsrisiko mithilfe der Peak-Drawdown-Kontrolle. Das einzigartige Merkmal der Strategie liegt in ihrer detaillierten Peak-to-Trop-Zyklusanalyse, die den Händlern ein Werkzeug bietet, um die Risikokarakteristiken der Strategie zu verstehen.
Während die Strategie einige inhärente Risiken birgt, wie z. B. eine übermäßige Abhängigkeit von historischen Daten und Parameterempfindlichkeit, kann sie durch angemessene Optimierungen und Verbesserungen ihre Robustheit und Rentabilität erheblich verbessern.
Insgesamt bietet diese Strategie den Händlern einen guten Ausgangspunkt, der weiter angepasst und optimiert werden kann, um individuelle Handelsziele und Risikopräferenzen zu erfüllen.
/*backtest start: 2023-07-23 00:00:00 end: 2024-07-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ capital = 10000 //@version=5 strategy(title = "Correct Strategy Peak-Drawdown Cycles [Tradingwhale]", shorttitle = "Peak-Draw [Tradingwhale]", initial_capital = capital, overlay=true, margin_long=100, margin_short=100) // The code below is from Tradingwhale LLC /// ============================================================================== // Peak-Trough Cycles with Date and Prev. RunUp // Initialize variables showTable = input.bool(true, title = "Plot Peak to Bottom Drawdown Cycles table?") min_trough = input.float(3.0, title = "Define Minimum Drawdown/Trough to Display (%)", minval = 1, maxval = 100, step = 0.5, tooltip = "Peaks and Trough Cycles have to be roped in by either a lookback period or minmimum troughs to show. If you don't then every bar could be a peak or trough/bottom. I've decided to use minimum declines here because lookback seems more arbitrary.") maxdraw = input.float(40.0, title = "Max Drawdown", minval = 1, maxval = 100, step = 0.5, tooltip = "Define the drawdown level where the srtategy stops executing trades.") var float equityPeak = na var float equityTrough = na var int cycleCount = 0 var bool inDrawdown = false var float initialCapital = capital var float prevTrough = initialCapital var float prevRunUp = na var bool useLighterGray = true var int lastYear = na // Variable to indicate whether the strategy should end var bool end_strategy = false // Table to display data var table resultTable = table.new(position.top_right, 5, 30, bgcolor=#ffffff00, frame_color=#4f4040, frame_width=1) // Function to convert float to percentage string f_to_percent(value) => str.tostring(value, "#.##") + "%" // Function to get month/year string without commas get_month_year_string() => str.tostring(year) + "/" + str.tostring(month) // Update the table headers if (bar_index == 0 and showTable) table.cell(resultTable, 0, 0, "Show Min Trough: " + f_to_percent(min_trough), bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 1, 0, "Cycle Count", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 2, 0, "Prev.RunUp(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 3, 0, "Drawdown(%)", bgcolor=#a8a8a88f, text_size=size.normal) table.cell(resultTable, 4, 0, "Year/Month", bgcolor=#a8a8a88f, text_size=size.normal) // Track peaks and troughs in equity if (na(equityPeak) or strategy.equity > equityPeak) if (inDrawdown and strategy.equity > equityPeak and not na(equityTrough)) // Confirm end of drawdown cycle drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage > min_trough cycleCount += 1 prevRunUp := (equityPeak - prevTrough) / prevTrough * 100 if cycleCount <= 20 and showTable currentYear = year if na(lastYear) or currentYear != lastYear useLighterGray := not useLighterGray lastYear := currentYear rowColor = useLighterGray ? color.new(color.gray, 80) : color.new(color.gray, 50) table.cell(resultTable, 1, cycleCount, str.tostring(cycleCount), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 2, cycleCount, f_to_percent(prevRunUp), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 3, cycleCount, f_to_percent(drawdownPercentage), bgcolor=rowColor, text_size=size.normal) table.cell(resultTable, 4, cycleCount, get_month_year_string(), bgcolor=rowColor, text_size=size.normal) prevTrough := equityTrough equityPeak := strategy.equity equityTrough := na inDrawdown := false else if (strategy.equity < equityPeak) equityTrough := na(equityTrough) ? strategy.equity : math.min(equityTrough, strategy.equity) inDrawdown := true // Calculate if the strategy should end if not na(equityPeak) and not na(equityTrough) drawdownPercentage = (equityPeak - equityTrough) / equityPeak * 100 if drawdownPercentage >= maxdraw end_strategy := true // This code below is from Tradingview, but with additions where commented (see below) longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28)) if (longCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Long Entry Id", strategy.long) shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28)) if (shortCondition) and not end_strategy // Add 'and not end_strategy' to your order conditions to automatically end the strategy if max_draw is exceeded/ strategy.entry("My Short Entry Id", strategy.short)