Ausgangskreuzqualifikator ATR Volatilität & HMA Trendverzerrung Mittelumkehrstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-17 16:37:23
Tags:

img

Übersicht

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.

Strategie Logik

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.

Analyse der Vorteile

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.

Risiken und Lösungen

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.

Optimierungsrichtlinien

Die Strategie kann in folgenden Aspekten optimiert werden:

  1. Versuche mehr Parameterkombinationen, um den optimalen Wert zu finden, z. B. Basiszeitraum, ATR-Zeitraum, Volatilitätskoeffizient usw.

  2. Mehr Filter oder Oszillatoren hinzufügen, um die Marktbedingungen zu beurteilen, um die Robustheit des Modells zu verbessern.

  3. Optimierung der Parameter für Profit-taking-Mechanismen, Prüfung mehrer Preisniveaus und Zuteilungsregelungen.

  4. Einbeziehung von Modellen des maschinellen Lernens zur Erzeugung effektiverer Handelssignale.

Schlussfolgerung

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)


Mehr