
La estrategia se basa en el comportamiento de los precios de mercado de la ruptura de los niveles de precios críticos, y aumenta la fiabilidad de la señal de negociación mediante el movimiento de la media y el índice de dirección media (ADX) como filtro. El sistema utiliza un marco de tiempo de 1 hora, la identificación de los puntos altos y bajos del eje central para construir una zona de resistencia de la ruptura de soporte dinámico, la salida de la señal de negociación en estas zonas de la ruptura de los precios, mientras que el establecimiento de un parálisis de pérdidas de un porcentaje fijo para controlar el riesgo.
El principio central de esta estrategia se basa en el comportamiento de ruptura de los precios en los puntos de resistencia de soporte clave, combinado con la dirección de la tendencia y la filtración de la intensidad del mercado, para formar un sistema de negociación completo. Los principios concretos de implementación incluyen:
Identificación de la resistencia de soporteEl sistema utiliza el método de Pivot Points para identificar los niveles de precios importantes.ta.pivothighyta.pivotlowFunción que calcula los puntos altos y bajos del eje central con los parámetros por defecto de 5 ciclos y los sitúa como puntos de resistencia y soporte potenciales.
Gestión dinámica de las zonasEl sistema utiliza la estructura de la matriz:supportLevelsyresistanceLevelsAlmacenamiento de soporte de resistencia y mediante funciones personalizadasf_add_levelLa función asegura que los niveles nuevos que se agregan tengan una distancia suficiente entre ellos y los niveles existentes (el 2% por defecto) para evitar el hacinamiento de la zona, mientras que se limita a mantener hasta 5 niveles más recientes.
Filtrador de confirmación de tendencia: La estrategia utiliza el promedio móvil simple de 50 ciclos (SMA) como indicador de la dirección de la tendencia. Sólo se considera el exceso cuando el precio está por encima de la media, y se considera el vacío cuando está por debajo de la media, para seguir la tendencia general del mercado.
Verificación de la fuerza del mercado: Evaluar la fuerza del mercado a través de la función ADX (indice de dirección promedio) personalizada. El valor de ADX debe ser mayor que el umbral establecido (el valor predeterminado es de 25), asegurando la entrada a la negociación solo cuando el mercado es lo suficientemente fuerte para evitar falsas rupturas en un entorno de mercado débil.
Generación de señales de entrada:
Mecanismo de gestión de riesgosLa estrategia utiliza un parón fijo de un porcentaje, el parón múltiple de un 15% y el parón por defecto de un 10%, y el parón en blanco de un 10%. Una vez que el precio alcanza estos niveles, el sistema automáticamente cierra la posición y restablece el estado de negociación.
Basado en un análisis profundo del código, la estrategia tiene las siguientes ventajas:
Mecanismo de confirmación múltiple: La triple confirmación de soportes de ruptura de resistencia, dirección de la tendencia y la fuerza de ADX reduce el riesgo de falsas rupturas. En comparación con un solo indicador, el mecanismo de confirmación múltiple mejora la fiabilidad de las señales de negociación.
Zonas de resistencia de soporte dinámico: El sistema identifica y gestiona de forma dinámica los puntos de resistencia de soporte, adaptándose a diferentes entornos de mercado. Se mantienen hasta 5 puntos de resistencia de soporte más recientes, asegurando que la estrategia se enfoca en los niveles de precios más relevantes.
Agrupación de áreas inteligentes: A través del parámetro de porcentaje de la máxima anchura de zona ((maxZoneWidthPct), se evita el recomputo de la resistencia de soporte demasiado cercana, reduciendo la redundancia de la señal.
Cálculo de ADX personalizado: La estrategia utiliza funciones ADX personalizadas para garantizar la precisión y la flexibilidad de los cálculos del indicador mediante el cálculo directo de la amplitud de onda real, el movimiento de la dirección y el procesamiento suave.
Configuración de parámetros flexible: La estrategia ofrece varios parámetros ajustables, incluyendo longitud de eje, ciclo de retroceso, ancho máximo de área, porcentaje de stop loss y umbral de ADX, que el usuario puede optimizar según las diferentes condiciones del mercado y preferencias de negociación.
El control de riesgos es claro: Proporciona un marco claro de gestión de riesgos para cada transacción a través de un porcentaje de stop loss predeterminado, que evita pérdidas excesivas en una sola transacción, mientras se bloquea una ganancia razonable.
La visualización intuitivaLa estrategia marca los puntos de resistencia de soporte y las señales de transacción en el gráfico, y proporciona una retroalimentación visual intuitiva a través de la codificación de colores (posición de soporte en verde, punto de resistencia en rojo) y las etiquetas (largo, corto, salida) para facilitar el análisis de retroalimentación y la supervisión en tiempo real.
A pesar de la buena concepción de la estrategia, existen los siguientes riesgos y limitaciones potenciales:
Falsos avances en mercados muy volátiles: En un entorno de mercado de alta volatilidad, los precios pueden romper con frecuencia los niveles de resistencia de soporte y luego regresar a la zona original, lo que provoca un aumento en las señales de falsas rupturas. Solución: Se puede considerar aumentar el ciclo de confirmación, que requiere que los precios permanezcan un cierto tiempo después de la ruptura o que formen una forma específica para confirmar la señal.
Exceso de confianza en los soportes históricos de resistencia: La estrategia se basa en la formación histórica de los niveles de resistencia de soporte, que pueden no ser válidos en caso de cambios fundamentales en la estructura del mercado (por ejemplo, eventos de noticias importantes). Solución: Se puede considerar la posibilidad de agregar un mecanismo de ajuste dinámico para ajustar automáticamente los niveles de resistencia de soporte en función de la volatilidad del mercado.
Limitaciones del porcentaje fijo de stop lossEl porcentaje fijo de stop loss puede no ser adecuado para todos los entornos de mercado, puede ser demasiado grande en mercados con baja volatilidad y puede ser demasiado pequeño en mercados con alta volatilidad. Solución: Se puede considerar el ajuste dinámico del nivel de stop loss basado en el ATR.
Riesgo de inversión de tendencia: El uso de la SMA de 50 ciclos como indicador de tendencia puede retrasar la reacción inicial de la reversión de la tendencia, lo que lleva a una entrada de tendencia cuando la tendencia está a punto de terminar. . Solución: Se puede considerar agregar un indicador de tendencia más sensible a corto plazo o un indicador de dinámica como un juicio auxiliar.
Estrategias intensivas en computación: La estrategia requiere el cálculo y mantenimiento de múltiples matrices e indicadores en tiempo real, y puede enfrentar desafíos de rendimiento en entornos de transacciones de alta frecuencia o recursos limitados. Soluciones: optimización de la eficiencia del algoritmo, reducción de cálculos innecesarios o consideración de la reducción de la frecuencia de actualización.
Sensibilidad de los parámetrosLa estrategia de rendimiento es sensible a la configuración de parámetros (como la longitud del eje central, los umbrales ADX) y la elección incorrecta de los parámetros puede conducir a una sobrecomercialización o a oportunidades perdidas. Solución: Establecer un marco de optimización de parámetros mediante el seguimiento del rendimiento de los parámetros en diferentes condiciones de mercado.
Basado en un análisis profundo del código de la estrategia, las siguientes son las direcciones potenciales de optimización:
Mecanismo de parámetros de adaptaciónIntroducción de mecanismos para ajustar automáticamente los parámetros clave en función de la volatilidad del mercado. Por ejemplo, aumentar los umbrales de ADX o la anchura de las áreas de resistencia de soporte durante la alta volatilidad y reducir estos parámetros durante la baja volatilidad, para que la estrategia se adapte mejor a diferentes circunstancias del mercado.
Análisis de marcos de tiempo múltiplesAumento de la Resistencia de Apoyo en los Fases de Tiempo Más Altas Confirmación de la Resistencia de Apoyo en el Diagrama de la Línea de Día o el Diagrama de la Línea de circunferencia para identificar las áreas de precios clave más fuertes y reconocidas en las Fases de Tiempo Más Altas, mejorando la calidad de la señal
Confirmación de la transacción: Combinación de análisis de volumen de transacciones para verificar la efectividad de las brechas. Las brechas realmente efectivas suelen ir acompañadas de un aumento significativo en el volumen de transacciones, y se puede reducir el riesgo de falsas brechas causadas por un bajo volumen de transacciones mediante la adición de condiciones de filtro de volumen de transacciones.
Dinámica paralización de pérdidas: Establece el nivel de stop loss de forma dinámica en función de la volatilidad del mercado (como ATR), en lugar de un porcentaje fijo. Esto hace que la gestión de riesgos sea más flexible, permitiendo ajustar automáticamente el nivel de protección en función de las condiciones del mercado actual, estableciendo un stop loss más flexible en mercados de alta volatilidad y un stop loss más ajustado en mercados de baja volatilidad.
Mecanismo de bloqueo parcial de las gananciasIntroducción de un mecanismo de ganancias por etapas, que permite el traslado de los pérdidas al precio de costo o el bloqueo de una parte de las ganancias después de alcanzar un determinado nivel de ganancias. Este método puede reducir el riesgo de retiro mientras se mantiene un alto potencial de ganancias.
Integración de los indicadores emocionalesConsidere la integración de indicadores de sentimiento de mercado (como VIX o indicadores de fuerza relativa) como condiciones de filtrado adicionales. El sentimiento de mercado a menudo afecta la sostenibilidad de las rupturas. Aumentando la dimensión de análisis de sentimiento, se puede mejorar la comprensión de la estrategia sobre el estado del mercado.
Clasificación de la resistencia de soporteIntroducción de un mecanismo de evaluación de la intensidad de la resistencia de soporte, basado en el número de pruebas históricas, la duración del tiempo de formación y otros factores para calificar la intensidad de cada nivel. De esta manera, se puede priorizar los niveles de precios que son más fuertes y más propensos a generar una respuesta efectiva.
Mejoras en el aprendizaje automáticoConsidere el uso de métodos de aprendizaje automático para optimizar la selección de parámetros y la generación de señales. Los algoritmos de aprendizaje automático pueden ayudar a identificar las combinaciones de parámetros y condiciones de mercado más efectivas mediante el análisis de los patrones de transacciones exitosas y fallidas en los datos históricos.
La estrategia de soporte de ruptura de resistencia con filtración de la tendencia-filtrador ADX es un sistema de trading integral bien diseñado, que combina varios elementos clave en el análisis técnico. La estrategia identifica y monitorea dinámicamente los puntos de resistencia de soporte, junto con la dirección de la tendencia y la intensidad del mercado, para crear un mecanismo de generación de señales de trading relativamente fiable.
La ventaja central de la estrategia es que su mecanismo de confirmación múltiple y su marco de gestión de riesgos son perfectos, lo que reduce efectivamente el riesgo de brechas falsas y limita las pérdidas potenciales de una sola transacción. Al mismo tiempo, la estrategia ofrece una gran cantidad de opciones de configuración de parámetros, lo que permite a los comerciantes adaptarse de manera flexible a las preferencias de riesgo personales y al entorno del mercado.
Sin embargo, la estrategia también se enfrenta a algunos desafíos, como el riesgo de brechas falsas en mercados altamente volátiles, las limitaciones de los stop-loss fijos y la sensibilidad de los parámetros. Se espera que el rendimiento de la estrategia mejore aún más mediante la introducción de medidas de optimización como mecanismos de parámetros adaptables, análisis de marcos temporales múltiples, confirmación de volumen de transacciones y gestión de riesgo dinámica.
En general, se trata de una estrategia de trading cuantitativa, con claridad lógica y diseño razonable, adecuada para el uso de los operadores con un cierto entendimiento del análisis técnico y la estructura del mercado. Mediante la optimización continua y la adaptación a los cambios del mercado, la estrategia tiene el potencial de mantener un rendimiento estable en diferentes entornos de mercado.
/*backtest
start: 2024-05-30 00:00:00
end: 2025-05-29 00:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("S/R Breakout Strategy (1H) with Trend and ADX Filter", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// ─────────────────────────────────────────────────────────────
// INPUTS
// ─────────────────────────────────────────────────────────────
pivotLen = input.int(5, title="Pivot Length")
lookbackBars = input.int(300, title="Lookback Bars")
maxZoneWidthPct = input.float(2.0, title="Max Zone Width %")
tpLong = input.float(0.15, title="Take Profit % (Long)")
slLong = input.float(0.10, title="Stop Loss % (Long)")
tpShort = input.float(0.10, title="Take Profit % (Short)")
slShort = input.float(0.10, title="Stop Loss % (Short)")
allowLong = input.bool(true, title="Allow Long Trades")
allowShort = input.bool(true, title="Allow Short Trades")
// ADX settings
adxThreshold = input.float(25.0, title="ADX Threshold")
adxLen = input.int(14, title="ADX Length")
// Trend filter: 50-period moving average
ma50 = ta.sma(close, 50)
// ─────────────────────────────────────────────────────────────
// CUSTOM ADX FUNCTION
// ─────────────────────────────────────────────────────────────
// This function calculates ADX using the common method based on true range,
// directional movement and smoothing it with the RMA.
f_adx(len) =>
// true range for the current bar
tr = ta.tr
// Calculate upward and downward moves
upMove = high - high[1]
downMove = low[1] - low
// Determine directional movements
plusDM = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0
// Smooth the values using RMA (running moving average)
smPlusDM = ta.rma(plusDM, len)
smMinusDM = ta.rma(minusDM, len)
smTR = ta.rma(tr, len)
// Calculate the directional indicators, avoid division by zero
plusDI = (smTR != 0) ? 100 * smPlusDM / smTR : 0.0
minusDI = (smTR != 0) ? 100 * smMinusDM / smTR : 0.0
diSum = plusDI + minusDI
dx = (diSum != 0) ? 100 * math.abs(plusDI - minusDI) / diSum : 0.0
// Smooth the DX to get ADX
ta.rma(dx, len)
// Compute ADX value using the custom function
adxValue = f_adx(adxLen)
// ─────────────────────────────────────────────────────────────
// PIVOT DETECTION & SUPPORT/RESISTANCE LEVELS
// ─────────────────────────────────────────────────────────────
pivotHigh = ta.pivothigh(high, pivotLen, pivotLen)
pivotLow = ta.pivotlow(low, pivotLen, pivotLen)
// Declare arrays for support and resistance levels
var float[] supportLevels = array.new_float()
var float[] resistanceLevels = array.new_float()
// Function to add a level into the provided array if it meets the criteria.
// Always returns a float (0.0) for consistency.
f_add_level(arr, newLevel) =>
if array.size(arr) == 0
array.push(arr, newLevel)
else
shouldAdd = true
for i = 0 to (array.size(arr) - 1)
existing = array.get(arr, i)
if math.abs(existing - newLevel) / newLevel * 100 <= maxZoneWidthPct
shouldAdd := false
if shouldAdd
array.push(arr, newLevel)
if array.size(arr) > 5
array.shift(arr)
0.0
// Update support and resistance arrays once sufficient bars have formed
if bar_index > pivotLen * 2
if not na(pivotLow)
f_add_level(supportLevels, pivotLow)
if not na(pivotHigh)
f_add_level(resistanceLevels, pivotHigh)
// ─────────────────────────────────────────────────────────────
// TRADE MANAGEMENT VARIABLES
// ─────────────────────────────────────────────────────────────
var bool inTrade = false
var bool isLong = false
var float entryPrice = na
// Signal flags
longSignal = false
shortSignal = false
// Detect long signal: price crosses above support level
if array.size(supportLevels) > 0
for i = 0 to (array.size(supportLevels) - 1)
lvl = array.get(supportLevels, i)
if low < lvl and close > lvl
longSignal := true
// Detect short signal: price crosses below resistance level
if array.size(resistanceLevels) > 0
for i = 0 to (array.size(resistanceLevels) - 1)
lvl = array.get(resistanceLevels, i)
if high > lvl and close < lvl
shortSignal := true
// ─────────────────────────────────────────────────────────────
// ENTRY CONDITIONS & EXECUTION
// ─────────────────────────────────────────────────────────────
if not inTrade
// Long entry: require long signal, price above 50MA, and ADX above threshold
if allowLong and longSignal and close > ma50 and adxValue > adxThreshold
strategy.entry("Long", strategy.long)
label.new(x=bar_index, y=low, text="LONG", xloc=xloc.bar_index, style=label.style_label_up, color=color.green, textcolor=color.white)
entryPrice := close
isLong := true
inTrade := true
// Short entry: require short signal, price below 50MA, and ADX above threshold
else if allowShort and shortSignal and close < ma50 and adxValue > adxThreshold
strategy.entry("Short", strategy.short)
label.new(x=bar_index, y=high, text="SHORT", xloc=xloc.bar_index, style=label.style_label_down, color=color.red, textcolor=color.white)
entryPrice := close
isLong := false
inTrade := true
// ─────────────────────────────────────────────────────────────
// EXIT CONDITIONS
// ─────────────────────────────────────────────────────────────
if inTrade
ret = isLong ? (close - entryPrice) / entryPrice : (entryPrice - close) / entryPrice
tp = isLong ? tpLong : tpShort
sl = isLong ? slLong : slShort
if ret >= tp or ret <= -sl
strategy.close_all()
label.new(x=bar_index, y=close, text="EXIT", xloc=xloc.bar_index, style=label.style_label_left, color=color.orange, textcolor=color.black)
inTrade := false
entryPrice := na
// ─────────────────────────────────────────────────────────────
// ALERT CONDITIONS
// ─────────────────────────────────────────────────────────────
alertcondition(longSignal and allowLong, title="Long Breakout", message="🚀 Long breakout on {{ticker}} at {{close}}")
alertcondition(shortSignal and allowShort, title="Short Breakout", message="🔻 Short breakout on {{ticker}} at {{close}}")