En la carga de los recursos... Cargando...

Se trata de una estrategia de seguimiento de tendencias multi-EMA con filtro dinámico de volatilidad.

El autor:¿ Qué pasa?, Fecha: 2025-01-17 15:00:37
Las etiquetas:El EMAEn el caso de lasEl ATR

 Multi-EMA Trend Following Strategy with Dynamic Volatility Filter

Resumen general

Esta estrategia es un sistema de negociación inteligente que combina el seguimiento de tendencias con el filtrado de volatilidad. Identifica las tendencias del mercado utilizando promedios móviles exponenciales (EMA), determina el momento de entrada a través de True Range (TR) y filtros de volatilidad dinámica, y gestiona el riesgo utilizando un mecanismo dinámico de stop-loss / take-profit basado en la volatilidad. La estrategia admite dos modos de negociación: Scalp y Swing, que se pueden cambiar de manera flexible en función de diferentes entornos de mercado y estilos de negociación.

Principios de estrategia

La lógica central incluye los siguientes componentes clave: 1. Identificación de tendencias: utiliza la EMA de 50 períodos como filtro de tendencias, tomando solo posiciones largas por encima de la EMA y posiciones cortas por debajo de la EMA. 2. Filtración de volatilidad: Calcula la EMA de True Range (TR) y utiliza un coeficiente de filtro ajustable (por defecto 1.5) para filtrar el ruido del mercado. Condiciones de entrada: Combina el análisis de tres velas consecutivas, que requieren que el movimiento del precio muestre características de continuidad y aceleración. 4. Stop-Loss/Take-Profit: Se establece basándose en la TR actual en el modo cuero cabelludo y basándose en los máximos/bajos anteriores en el modo swing, logrando una gestión dinámica del riesgo.

Ventajas estratégicas

  1. Una gran adaptabilidad: se adapta a diferentes entornos de mercado mediante la combinación de filtro de volatilidad dinámica y seguimiento de tendencias.
  2. Gestión integral del riesgo: proporciona mecanismos dinámicos de stop-loss/take-profit para ambos modos de negociación, lo que permite una selección flexible basada en las características del mercado.
  3. Buen ajuste de parámetros: los parámetros clave como el coeficiente de filtro y el período de tendencia pueden optimizarse de acuerdo con las características del instrumento de negociación.
  4. Excelente visualización: Proporciona marcadores claros de señales de compra / venta y pantallas de nivel de stop-loss / take-profit para un fácil monitoreo comercial.

Riesgos estratégicos

  1. Riesgo de reversión de tendencia: puede haber paradas consecutivas en puntos de inflexión de tendencia.
  2. Riesgo de ruptura falsa: puede desencadenar señales falsas durante aumentos repentinos de la volatilidad.
  3. Sensibilidad del parámetro: la configuración incorrecta del coeficiente de filtro puede dar lugar a demasiadas o muy pocas señales.
  4. Impacto del deslizamiento: Puede enfrentar deslizamiento significativo en mercados rápidos, lo que afecta el rendimiento de la estrategia.

Direcciones para la optimización de la estrategia

  1. Añadir el filtrado de la fuerza de la tendencia: puede introducir indicadores como ADX para evaluar la fuerza de la tendencia y mejorar la efectividad de la tendencia.
  2. Optimizar Stop-Loss / Take-Profit: Puede considerar la introducción de paradas de seguimiento para proteger más ganancias.
  3. Mejorar el modo swing: puede añadir más condiciones específicas de negociación swing para mejorar la capacidad de tenencia a medio y largo plazo.
  4. Añadir análisis de volumen: Combinar cambios de volumen para confirmar la validez de la ruptura.

Resumen de las actividades

Esta estrategia construye un sistema comercial completo combinando orgánicamente el seguimiento de tendencias, el filtrado de volatilidad y la gestión dinámica de riesgos. Sus fortalezas se encuentran en su adaptabilidad, riesgo controlable, al tiempo que proporciona un potencial de optimización significativo. A través de la configuración adecuada de parámetros y la selección adecuada del modo de negociación, la estrategia puede mantener un rendimiento estable en diferentes entornos de mercado.


/*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)

Relacionados

Más.