Diese Strategie integriert das Baseline Mean Reverssion Signal, den ATR Volatilitätsfilter und den HMA Trendfilter, um robuste Handelssignale für quantitative Handelsstrategien zu generieren.
Die Strategie verwendet einen 37-Perioden- gleitenden Durchschnitt als Basislinie. Wenn der Preis von dieser Basislinie nach oben bricht, erzeugt er ein Kaufsignal, und wenn er von oben nach unten bricht, erzeugt er ein Verkaufssignal. Um falsche Signale zu vermeiden, erfordert die Strategie, dass sich der Preis nach dem Durchdringen der Basislinie über die 2xATR-Volatilität hinaus bewegt, um die Gültigkeit der Signale zu bestätigen. Außerdem verwendet die Strategie eine 11-Perioden-HMA, um den Haupttrend zu beurteilen. Sie bestätigt nur gültige Signale, wenn die Preisdurchdringungsbasis mit der HMA-Richtung ausgerichtet ist, um eine nachteilige Auswahl zu verhindern.
Für die Gewinnentnahme unterstützt die Strategie die Verwendung einer oder mehrerer (zwei oder drei) Gewinnspielstufen.
Im Vergleich zu einfachen gleitenden Durchschnitts-Breakout-Strategien fügt diese Strategie den ATR-Volatilitätsfilter hinzu, der viele ungültige Signale entfernt. Dies passt sehr gut zu visuellen Muster-Breakout-Techniken, was zu höheren Gewinnraten führt. Außerdem verhindert die HMA-Trendverzerrung eine negative Auswahl und reduziert unnötige Verluste erheblich. Das Multiple Take-Profit-Schema ermöglicht auch, mehr Gewinne zu erzielen.
Das Hauptrisiko ist, dass der ATR-Volatilitätsfilter einige gültige Signale entfernen kann, was dazu führt, dass Positionen nicht rechtzeitig geöffnet werden. Außerdem ist das HMA-Trendurteil manchmal nicht sehr signifikant, wenn der Preis nur einen kurzfristigen Rückschritt hat, nicht eine Umkehrung. Dies kann zu unnötigen Stop-Loss führen. Um die Risiken zu reduzieren, können wir den ATR-Volatilitätsfilterparameter senken, um mehr Signale zu ermöglichen. Wir können auch den HMA-Periodenparameter anpassen, um langfristige HMA für die Beurteilung großer Trends zu verwenden, um Störungen durch kurzfristige Schwankungen zu vermeiden.
Die Strategie kann in folgenden Aspekten optimiert werden:
Versuche mehr Parameterkombinationen, um den optimalen Wert zu finden, z. B. Basiszeitraum, ATR-Zeitraum, Volatilitätskoeffizient usw.
Mehr Filter oder Oszillatoren hinzufügen, um die Marktbedingungen zu beurteilen, um die Robustheit des Modells zu verbessern.
Optimierung der Parameter für Profit-taking-Mechanismen, Prüfung mehrer Preisniveaus und Zuteilungsregelungen.
Einbeziehung von Modellen des maschinellen Lernens zur Erzeugung effektiverer Handelssignale.
Diese Strategie integriert ein doppeltes gleitendes Durchschnitts-Baseline-Signal, den ATR-Volatilitätsfilter und den HMA-Trend-Bias-Filter in ein sehr praktisches quantitatives Handelssystem.
/*backtest start: 2023-01-10 00:00:00 end: 2024-01-16 00:00:00 period: 1d basePeriod: 1h 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/ // © sevencampbell //@version=5 strategy(title="Baseline Cross Qualifier Volatility Strategy with HMA Trend Bias", overlay=true) // --- User Inputs --- // Baseline Inputs baselineLength = input.int(title="Baseline Length", defval=20) baseline = ta.sma(close, baselineLength) // PBCQ Inputs pbcqEnabled = input.bool(title="Post Baseline Cross Qualifier Enabled", defval=true) pbcqBarsAgo = input.int(title="Post Baseline Cross Qualifier Bars Ago", defval=3) // Volatility Inputs atrLength = input.int(title="ATR Length", defval=14) multiplier = input.float(title="Volatility Multiplier", defval=2.0) rangeMultiplier = input.float(title="Volatility Range Multiplier", defval=1.0) qualifierMultiplier = input.float(title="Volatility Qualifier Multiplier", defval=0.5) // Take Profit Inputs takeProfitType = input.string(title="Take Profit Type", options=["1 Take Profit", "2 Take Profits", "3 Take Profits"], defval="1 Take Profit") // HMA Inputs hmaLength = input.int(title="HMA Length", defval=50) // --- Calculations --- // ATR atr = ta.atr(atrLength) // Range Calculation rangeHigh = baseline + rangeMultiplier * atr rangeLow = baseline - rangeMultiplier * atr rangeColor = rangeLow <= close and close <= rangeHigh ? color.yellow : na bgcolor(rangeColor, transp=90) // Qualifier Calculation qualifier = qualifierMultiplier * atr // Dot Calculation isLong = close > baseline and (close - baseline) >= qualifier and close > ta.hma(close, hmaLength) isShort = close < baseline and (baseline - close) >= qualifier and close < ta.hma(close, hmaLength) colorDot = isLong ? color.green : isShort ? color.red : na plot(isLong or isShort ? baseline : na, color=colorDot, style=plot.style_circles, linewidth=3) // --- Strategy Logic --- // PBCQ pbcqValid = not pbcqEnabled or low[pbcqBarsAgo] > baseline // Entry Logic longCondition = isLong and pbcqValid shortCondition = isShort and pbcqValid if (longCondition) strategy.entry("Long", strategy.long) if (shortCondition) strategy.entry("Short", strategy.short) // Exit Logic if (takeProfitType == "1 Take Profit") strategy.exit("TP/SL", "Long", limit=rangeHigh, stop=rangeLow) strategy.exit("TP/SL", "Short", limit=rangeLow, stop=rangeHigh) else if (takeProfitType == "2 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh) strategy.exit("TP1", "Short", qty=strategy.position_size * 0.5, limit=rangeLow / 2) strategy.exit("TP2", "Short", qty=strategy.position_size * 0.5, limit=rangeLow) else if (takeProfitType == "3 Take Profits") strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2) strategy.exit("TP2", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 0.75) strategy.exit("TP3", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 1.5)