Die Ressourcen sind geladen. Beförderung...

Multi-EMA-Strategie mit dynamischem Volatilitätsfilter

Schriftsteller:ChaoZhang, Datum: 2025-01-17 15:00:37
Tags:EMADieATR

 Multi-EMA Trend Following Strategy with Dynamic Volatility Filter

Übersicht

Diese Strategie ist ein intelligentes Handelssystem, das Trendverfolgung mit Volatilitätsfilterung kombiniert. Es identifiziert Markttrends mithilfe von exponentiellen gleitenden Durchschnitten (EMA), bestimmt den Eintrittszeitpunkt durch True Range (TR) und dynamische Volatilitätsfilter und verwaltet das Risiko mithilfe eines auf Volatilität basierenden dynamischen Stop-Loss / Take-Profit-Mechanismus. Die Strategie unterstützt zwei Handelsmodi: Scalp und Swing, die flexibel basierend auf verschiedenen Marktumgebungen und Handelsstilen gewechselt werden können.

Strategieprinzipien

Die Kernlogik umfasst folgende Schlüsselelemente: 1. Trendidentifizierung: Verwendet die 50-Perioden-EMA als Trendfilter, wobei nur Long-Positionen über der EMA und Short-Positionen unterhalb der EMA eingesetzt werden. 2. Volatilitätsfilterung: Berechnet die EMA des wahren Bereichs (TR) und verwendet einen verstellbaren Filterkoeffizienten (Standard 1.5) zur Filterung von Marktlärm. 3. Einstiegsbedingungen: kombiniert die Analyse von drei aufeinanderfolgenden Kerzen, wobei die Preisbewegung Kontinuität und Beschleunigungsmerkmale aufweist. 4. Stop-Loss/Take-Profit: basierend auf dem aktuellen TR im Scalp-Modus und auf den vorherigen Höhen/Tiefständen im Swing-Modus, um ein dynamisches Risikomanagement zu erreichen.

Strategische Vorteile

  1. Starke Anpassungsfähigkeit: Anpasst sich an verschiedene Marktumgebungen durch die Kombination aus dynamischer Volatilitätsfilterung und Trendverfolgung.
  2. Umfassendes Risikomanagement: bietet für beide Handelsmodi dynamische Stop-Loss-/Take-Profit-Mechanismen, die eine flexible Auswahl auf der Grundlage der Merkmale des Marktes ermöglichen.
  3. Gute Parameteranpassung: Schlüsselparameter wie Filterkoeffizient und Trendperiode können entsprechend den Merkmalen des Handelsinstruments optimiert werden.
  4. Ausgezeichnete Visualisierung: Bietet klare Kauf/Verkauf-Signalmarker und Stop-Loss/Take-Profit-Level-Displays für eine einfache Handelsüberwachung.

Strategische Risiken

  1. Trendumkehrrisiko: Es kann zu aufeinanderfolgenden Stopps an Trendwendepunkten kommen.
  2. Falsches Ausbruchrisiko: Kann bei plötzlichen Anstiegen der Volatilität falsche Signale auslösen.
  3. Parameterempfindlichkeit: Eine unsachgemäße Einstellung des Filterkoeffizienten kann zu zu vielen oder zu wenigen Signalen führen.
  4. Schwankungswirkung: Es kann auf schnellen Märkten zu erheblichen Schwankungen kommen, die sich auf die Strategieentwicklung auswirken.

Strategieoptimierungsrichtlinien

  1. Hinzufügen der Trendstärke Filterung: Kann Indikatoren wie ADX einführen, um die Trendstärke zu bewerten und die Effektivität nach dem Trend zu verbessern.
  2. Optimieren Sie Stop-Loss/Take-Profit: Sie können die Einführung von Trailing-Stops in Betracht ziehen, um mehr Gewinne zu schützen.
  3. Verbesserung des Swing-Modus: Es können mehr spezifische Bedingungen für den Swing-Handel hinzugefügt werden, um die mittelfristige bis langfristige Haltungsfähigkeit zu verbessern.
  4. Volumenanalyse hinzufügen: Kombination von Volumenänderungen zur Bestätigung der Breakout-Gültigkeit.

Zusammenfassung

Diese Strategie baut ein vollständiges Handelssystem auf, indem sie organisch Trendverfolgung, Volatilitätsfilterung und dynamisches Risikomanagement kombiniert. Ihre Stärken liegen in ihrer Anpassungsfähigkeit, kontrollierbarem Risiko und bieten gleichzeitig ein erhebliches Optimierungspotenzial. Durch richtige Parameter-Einstellungen und eine angemessene Auswahl des Handelsmodus kann die Strategie eine stabile Performance in verschiedenen Marktumgebungen aufrechterhalten. Händlern wird empfohlen, vor dem Live-Handel gründliches Backtesting und Parameteroptimierung durchzuführen und geeignete Anpassungen anhand spezifischer Handelsinstrumentmerkmale vorzunehmen.


/*backtest
start: 2024-12-17 00:00:00
end: 2025-01-15 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Creativ3mindz

//@version=5
strategy("Scalp Slayer (I)", overlay=true)

// Input Parameters
filterNumber = input.float(1.5, "Filter Number", minval=1.0, maxval=10.0, tooltip="Higher = More aggressive Filter, Lower = Less aggressive")
emaTrendPeriod = input.int(50, "EMA Trend Period", minval=1, tooltip="Period for the EMA used for trend filtering")
lookbackPeriod = input.int(20, "Lookback Period for Highs/Lows", minval=1, tooltip="Period for determining recent highs/lows")
colorTP = input.color(title='Take Profit Color', defval=color.orange)
colorSL = input.color(title='Stop Loss Color', defval=color.red)

// Inputs for visibility
showBuyLabels = input.bool(true, title="Show Buy Labels")
showSellLabels = input.bool(true, title="Show Sell Labels")

// Alert Options
alertOnCondition = input.bool(true, title="Alert on Condition Met", tooltip="Enable to alert when condition is met")

// Trade Mode Toggle
tradeMode = input.bool(false, title="Trade Mode (ON = Swing, OFF = Scalp)", tooltip="Swing-mode you can use your own TP/SL.")

// Calculations
tr = high - low
ema = filterNumber * ta.ema(tr, 50)
trendEma = ta.ema(close, emaTrendPeriod)  // Calculate the EMA for the trend filter

// Highest and lowest high/low within lookback period for swing logic
swingHigh = ta.highest(high, lookbackPeriod)
swingLow = ta.lowest(low, lookbackPeriod)

// Variables to track the entry prices and SL/TP levels
var float entryPriceLong = na
var float entryPriceShort = na
var float targetPriceLong = na
var float targetPriceShort = na
var float stopLossLong = na
var float stopLossShort = na
var bool tradeActive = false

// Buy and Sell Conditions with Trend Filter
buyCondition = close > trendEma and  // Buy only if above the trend EMA
      close[2] > open[2] and close[1] > open[1] and close > open and 
      (math.abs(close[2] - open[2]) > math.abs(close[1] - open[1])) and 
      (math.abs(close - open) > math.abs(close[1] - open[1])) and 
      close > close[1] and close[1] > close[2] and tr > ema

sellCondition = close < trendEma and  // Sell only if below the trend EMA
       close[2] < open[2] and close[1] < open[1] and close < open and 
       (math.abs(close[2] - open[2]) > math.abs(close[1] - open[1])) and 
       (math.abs(close - open) > math.abs(close[1] - open[1])) and 
       close < close[1] and close[1] < close[2] and tr > ema

// Entry Rules
if (buyCondition and not tradeActive)
    entryPriceLong := close  // Track entry price for long position
    stopLossLong := tradeMode ? ta.lowest(low, lookbackPeriod) : swingLow  // Scalping: recent low, Swing: lowest low of lookback period
    targetPriceLong := tradeMode ? close + tr : swingHigh  // Scalping: close + ATR, Swing: highest high of lookback period
    tradeActive := true

if (sellCondition and not tradeActive)
    entryPriceShort := close  // Track entry price for short position
    stopLossShort := tradeMode ? ta.highest(high, lookbackPeriod) : swingHigh  // Scalping: recent high, Swing: highest high of lookback period
    targetPriceShort := tradeMode ? close - tr : swingLow  // Scalping: close - ATR, Swing: lowest low of lookback period
    tradeActive := true

// Take Profit and Stop Loss Logic
signalBuyTPPrint = (not na(entryPriceLong) and close >= targetPriceLong)
signalSellTPPrint = (not na(entryPriceShort) and close <= targetPriceShort)

signalBuySLPrint = (not na(entryPriceLong) and close <= stopLossLong)
signalSellSLPrint = (not na(entryPriceShort) and close >= stopLossShort)

if (signalBuyTPPrint or signalBuySLPrint)
    entryPriceLong := na  // Reset entry price for long position
    targetPriceLong := na  // Reset target price for long position
    stopLossLong := na  // Reset stop-loss for long position
    tradeActive := false

if (signalSellTPPrint or signalSellSLPrint)
    entryPriceShort := na  // Reset entry price for short position
    targetPriceShort := na  // Reset target price for short position
    stopLossShort := na  // Reset stop-loss for short position
    tradeActive := false

// Plot Buy and Sell Labels with Visibility Conditions
plotshape(showBuyLabels and buyCondition, "Buy", shape.labelup, location=location.belowbar, color=color.green, text="BUY", textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and sellCondition, "Sell", shape.labeldown, location=location.abovebar, color=color.red, text="SELL", textcolor=color.white, size=size.tiny)

// Plot Take Profit Flags
plotshape(showBuyLabels and signalBuyTPPrint, title="Take Profit (buys)", text="TP", style=shape.flag, location=location.abovebar, color=colorTP, textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and signalSellTPPrint, title="Take Profit (sells)", text="TP", style=shape.flag, location=location.belowbar, color=colorTP, textcolor=color.white, size=size.tiny)

// Plot Stop Loss "X" Marker
plotshape(showBuyLabels and signalBuySLPrint, title="Stop Loss (buys)", text="X", style=shape.xcross, location=location.belowbar, color=colorSL, textcolor=color.white, size=size.tiny)
plotshape(showSellLabels and signalSellSLPrint, title="Stop Loss (sells)", text="X", style=shape.xcross, location=location.abovebar, color=colorSL, textcolor=color.white, size=size.tiny)

// Alerts

alertcondition(buyCondition and alertOnCondition, title="Buy Alert", message='{"content": "Buy {{ticker}} at {{close}}"}')
alertcondition(sellCondition and alertOnCondition, title="Sell Alert", message='{"content": "Sell {{ticker}} at {{close}}"}')
alertcondition(signalBuyTPPrint and alertOnCondition, title="Buy TP Alert", message='{"content": "Buy TP {{ticker}} at {{close}}"}')
alertcondition(signalSellTPPrint and alertOnCondition, title="Sell TP Alert", message='{"content": "Sell TP {{ticker}} at {{close}}"}')
alertcondition(signalBuySLPrint and alertOnCondition, title="Buy SL Alert", message='{"content": "Buy SL {{ticker}} at {{close}}"}')
alertcondition(signalSellSLPrint and alertOnCondition, title="Sell SL Alert", message='{"content": "Sell SL {{ticker}} at {{close}}"}')

if buyCondition
    strategy.entry("Enter Long", strategy.long)
else if sellCondition
    strategy.entry("Enter Short", strategy.short)

Verwandt

Mehr