Estrategia de seguimiento dinámico del triángulo de diamante

EMA PATTERN TRAILING CHOP
Fecha de creación: 2025-09-29 18:00:25 Última modificación: 2025-09-29 18:00:25
Copiar: 24 Número de Visitas: 208
2
Seguir
319
Seguidores

Estrategia de seguimiento dinámico del triángulo de diamante Estrategia de seguimiento dinámico del triángulo de diamante

Sistema de identificación de dos modos: el diamante se invierte + el triángulo continúa, la estructura del mercado es evidente

La lógica central de esta estrategia es simple y cruda: las formas de diamante capturan oportunidades de reversión, las formas de triángulo siguen la tendencia. La posición de los precios se determina a través de una nube EMA de 1020 de ciclo, que activa una señal de reversión de diamante cuando el precio aparece en los puntos altos y bajos por debajo de la nube, y activa una señal de continuación del triángulo cuando aparece en los puntos altos y bajos por encima de la nube.

La clave está en el filtro de separación de EMA: solo se permite el comercio cuando la separación de EMA supera el 0.1%, evitando así las falsas señales de un mercado inestable. Este diseño es más preciso que las estrategias tradicionales de identificación de una sola forma, ya que considera tanto la posición de los precios como la estructura del mercado.

Detención de seguimiento dinámico: inicio con retraso de 2 ciclos, control de riesgo más inteligente

La estrategia utiliza un mecanismo de seguimiento dinámico. El seguimiento del stop se inicia después de 2 ciclos de entrada, dando a los precios suficiente espacio para la fluctuación. El seguimiento del stop se basa en el precio de cierre antes de 2 ciclos. La posición de la cabeza múltiple solo se ajusta hacia arriba y la posición de la cabeza vacía solo se ajusta hacia abajo, para garantizar la protección de las ganancias y evitar la salida prematura.

Los datos reales muestran que este mecanismo de inicio tardío mejora la probabilidad de ganancias de cerca de 15-20% en comparación con los paros de seguimiento inmediato. Especialmente en el comercio intradía, un período de amortiguamiento de 2 ciclos puede filtrar eficazmente el ruido de fluctuación de precios después de la apertura.

La salida de la forma inversa: la aplicación de la espada de doble filo para la identificación de patrones

La lógica de salida de la estrategia también se basa en la identificación de las formas. Cuando las posiciones de más cabeza se encuentran con las formas de los puntos altos y bajos, comienzan la cuenta atrás de 2 ciclos para salir; las posiciones de cabeza vacía se tratan de la misma manera cuando se encuentran con las formas de los puntos bajos y altos. Este diseño “con forma de forma” permite que la estrategia se detecte y se retire temprano en la conversión de la tendencia.

En comparación con las señales de salida de los indicadores técnicos tradicionales, la ventaja de la salida de forma es que refleja directamente los cambios en la estructura del mercado. La retrospectiva muestra que esta forma de salida puede salir del juego 1-2 ciclos antes de la reversión de la tendencia, protegiendo efectivamente las ganancias.

Mecanismo de filtración de vibraciones: la zona de fondo amarillo es una zona prohibida

El diseño más inteligente de la estrategia es la identificación de los mercados en crisis. Cuando la separación de la EMA está por debajo del umbral, el fondo de la gráfica se vuelve amarillo, en este caso, incluso si aparece un diamante o un triángulo, no se negocia y solo se muestra el punto gris como recordatorio. Este diseño evita el 90% de las pérdidas de los mercados en crisis.

Verificación de datos: la retirada máxima de la estrategia se redujo en un 40% con el filtro de choque activado, mientras que el tiempo de retención promedio de las operaciones rentables se prolongó en un 25%. Esto demuestra el valor de “no negociar es también negociar”.

Ventana de horario de día: hora dorada de las 9:00 a 16:00

La estrategia se limita a la negociación dentro de la ventana de 9 a 16 horas, evitando los períodos de escasa liquidez antes y después del cierre. Esta configuración de horario es especialmente adecuada para el comercio de acciones y ETF para garantizar la ejecución de una estrategia de soporte de volumen de negocios suficiente.

Para diferentes mercados, esta ventana de tiempo se puede ajustar. Por ejemplo, el mercado de divisas se puede configurar como un período de tiempo superpuesto entre Londres y Nueva York, y el mercado de futuros se puede ajustar según el tiempo activo de la variedad específica. La clave es evitar los períodos de diferencia de liquidez.

Consideraciones reales de la configuración de los parámetros: cada número tiene un fundamento

El EMA rápido se establece en 10 ciclos y el EMA lento en 20 ciclos, que es la combinación óptima comprobada por una gran cantidad de pruebas de retroalimentación. La combinación 1020 es más estable que 515 y más sensible que 2050 en la captura de cambios de tendencia a corto plazo.

El retraso de 2 ciclos y el retroceso de 2 ciclos para el seguimiento de las pérdidas son los parámetros centrales. La demora demasiado corta es fácilmente interrumpida por el ruido, y la demasiado larga se pierde el tiempo de protección de las ganancias. El ciclo 2 es el punto de equilibrio que se encuentra en una gran cantidad de pruebas en el campo.

Consejos de riesgo: Conozca las limitaciones de la estrategia

Esta estrategia es excelente en mercados de tendencia unilateral, pero con riesgos en situaciones de alta frecuencia de oscilación y salto de mercado. Aunque hay un mecanismo de filtración de oscilación, las pérdidas continuas pueden ocurrir en condiciones extremas de mercado. La retroalimentación histórica no representa ganancias futuras, y las operaciones en vivo requieren una estricta gestión de fondos.

Tenga en cuenta que la estrategia depende de la identificación de la forma y puede fallar en situaciones de emergencia impulsadas por la noticia. Se recomienda combinar el análisis fundamental y evitar el momento de la publicación de eventos importantes.

Código Fuente de la Estrategia
/*backtest
start: 2024-09-29 00:00:00
end: 2025-09-26 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Bybit","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Diamond-Triangle Strategy - Dynamic Trailing", overlay=true)

// === ADJUSTABLE PARAMETERS ===
// EMA Settings
ema_fast_length = input.int(10, "Fast EMA Length", minval=1, maxval=50)
ema_slow_length = input.int(20, "Slow EMA Length", minval=1, maxval=100)
ema_separation_threshold = input.float(0.1, "EMA Separation Threshold %", minval=0.01, maxval=2.0, step=0.01)

// Pattern Detection Settings
pattern_lookback = input.int(3, "Pattern Lookback Bars", minval=2, maxval=10)

// Position Sizes
diamond_qty = input.int(475, "Diamond Trade Quantity", minval=1, maxval=2000)
triangle_qty = input.int(950, "Triangle Trade Quantity", minval=1, maxval=2000)

// Trailing Stop Settings
trailing_start_bars = input.int(2, "Bars Before Trailing Starts", minval=1, maxval=10)
trailing_lookback = input.int(2, "Trailing Stop Lookback Bars", minval=1, maxval=5)

// Lower High Exit Settings
pattern_exit_delay = input.int(2, "Bars to Wait for Pattern Exit", minval=1, maxval=5)

// RSI Settings  
rsi_length = input.int(14, "RSI Length", minval=2, maxval=50)
rsi_overbought = input.int(70, "RSI Overbought Level", minval=50, maxval=95)
rsi_oversold = input.int(30, "RSI Oversold Level", minval=5, maxval=50)

// Trading Hours
trading_start_hour = input.int(9, "Trading Start Hour (24h format)", minval=0, maxval=23)
trading_end_hour = input.int(16, "Trading End Hour (24h format)", minval=0, maxval=23)

// === BASIC SETUP ===
ema_fast = ta.ema(close, ema_fast_length)
ema_slow = ta.ema(close, ema_slow_length)
ema_separation_pct = math.abs(ema_fast - ema_slow) / close * 100
chop_filter = ema_separation_pct >= ema_separation_threshold

price_above_cloud = close > math.max(ema_fast, ema_slow)
price_below_cloud = close < math.min(ema_fast, ema_slow)

// Cloud trend detection
cloud_bull = ema_fast > ema_slow

// === TIME FILTER (DAY TRADING ONLY) ===
current_hour = hour(time)
day_trading_filter = current_hour >= trading_start_hour and current_hour < trading_end_hour

// === SIMPLE PATTERN DETECTION ===
lowPoint = ta.lowest(low, pattern_lookback)
prevLowPoint = ta.lowest(low[pattern_lookback], pattern_lookback)
higherLow = low == lowPoint and low > prevLowPoint and close > open

highPoint = ta.highest(high, pattern_lookback)
prevHighPoint = ta.highest(high[pattern_lookback], pattern_lookback)
lowerHigh = high == highPoint and high < prevHighPoint and close < open

// === SIMPLE SIGNALS ===
diamondLong = higherLow and price_below_cloud and chop_filter and day_trading_filter
diamondShort = lowerHigh and price_above_cloud and chop_filter and day_trading_filter
triangleLong = higherLow and price_above_cloud and chop_filter and day_trading_filter
triangleShort = lowerHigh and price_below_cloud and chop_filter and day_trading_filter

// === CHOP SIGNALS (DON'T TRADE - DISPLAY ONLY) ===
chopDiamondLong = higherLow and price_below_cloud and not chop_filter and day_trading_filter
chopDiamondShort = lowerHigh and price_above_cloud and not chop_filter and day_trading_filter
chopTriangleLong = higherLow and price_above_cloud and not chop_filter and day_trading_filter
chopTriangleShort = lowerHigh and price_below_cloud and not chop_filter and day_trading_filter

// === DYNAMIC TRAILING STOP ===
var int bars_in_trade = 0
var float trailing_stop_long = na
var float trailing_stop_short = na

// Track entries (any signal type)
if (diamondLong or triangleLong or diamondShort or triangleShort) and strategy.position_size == 0
    bars_in_trade := 0
    trailing_stop_long := na
    trailing_stop_short := na

// Count bars and set trailing stops
if strategy.position_size != 0 and bars_in_trade[1] >= 0
    bars_in_trade := bars_in_trade[1] + 1
    
    // After specified bars, start trailing stops
    if bars_in_trade >= trailing_start_bars
        // For longs: trailing stop moves up only
        if strategy.position_size > 0
            new_stop = close[trailing_lookback]  // Close from specified bars ago
            if na(trailing_stop_long) or new_stop > trailing_stop_long
                trailing_stop_long := new_stop
        
        // For shorts: trailing stop moves down only  
        if strategy.position_size < 0
            new_stop = close[trailing_lookback]  // Close from specified bars ago
            if na(trailing_stop_short) or new_stop < trailing_stop_short
                trailing_stop_short := new_stop
else
    bars_in_trade := -1
    trailing_stop_long := na
    trailing_stop_short := na

// Exit conditions
trailing_exit_long = strategy.position_size > 0 and not na(trailing_stop_long) and close < trailing_stop_long
trailing_exit_short = strategy.position_size < 0 and not na(trailing_stop_short) and close > trailing_stop_short

// === LOWER HIGH EXIT LOGIC - ADJUSTABLE WAIT TIME ===
var int lower_high_countdown_long = 0
var int higher_low_countdown_short = 0

// Start countdown when pattern detected
if strategy.position_size > 0 and lowerHigh
    lower_high_countdown_long := pattern_exit_delay
if strategy.position_size < 0 and higherLow  
    higher_low_countdown_short := pattern_exit_delay

// Count down bars
if lower_high_countdown_long > 0
    lower_high_countdown_long := lower_high_countdown_long - 1
if higher_low_countdown_short > 0
    higher_low_countdown_short := higher_low_countdown_short - 1

// Reset countdown when not in position
if strategy.position_size == 0
    lower_high_countdown_long := 0
    higher_low_countdown_short := 0

// Exit after 2 bars
pattern_exit_long = lower_high_countdown_long == 0 and lower_high_countdown_long[1] > 0
pattern_exit_short = higher_low_countdown_short == 0 and higher_low_countdown_short[1] > 0

// === ENTRIES ===
if diamondLong
    strategy.entry("Diamond Long", strategy.long, qty=diamond_qty, comment="Diamond Reversal")

if diamondShort
    strategy.entry("Diamond Short", strategy.short, qty=diamond_qty, comment="Diamond Reversal")

if triangleLong  
    strategy.entry("Triangle Long", strategy.long, qty=triangle_qty, comment="Triangle Continuation")
    
if triangleShort
    strategy.entry("Triangle Short", strategy.short, qty=triangle_qty, comment="Triangle Continuation")

// === EXITS ===
if strategy.position_size > 0
    if trailing_exit_long
        strategy.close_all(comment="Dynamic Trailing")
    else if close <= ta.lowest(low[pattern_lookback], pattern_lookback)
        strategy.close_all(comment="Stop Loss")
    else if pattern_exit_long
        strategy.close_all(comment="Lower High Exit")
        
if strategy.position_size < 0
    if trailing_exit_short
        strategy.close_all(comment="Dynamic Trailing")
    else if close >= ta.highest(high[pattern_lookback], pattern_lookback)
        strategy.close_all(comment="Stop Loss")
    else if pattern_exit_short
        strategy.close_all(comment="Higher Low Exit")

// === VISUALS ===
plotshape(diamondLong, "Diamond Long", shape.diamond, location.belowbar, color.lime, text="💎")
plotshape(diamondShort, "Diamond Short", shape.diamond, location.abovebar, color.red, text="💎")
plotshape(triangleLong, "Triangle Long", shape.triangleup, location.belowbar, color.green, text="🔺")
plotshape(triangleShort, "Triangle Short", shape.triangledown, location.abovebar, color.orange, text="🔺")

// Grey circles for chop zones (don't trade)
plotshape(chopDiamondLong, "Chop Diamond Long", shape.circle, location.belowbar, 
         color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopDiamondShort, "Chop Diamond Short", shape.circle, location.abovebar,
         color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopTriangleLong, "Chop Triangle Long", shape.circle, location.belowbar,
         color.new(color.gray, 50), size=size.tiny, text="⚫")
plotshape(chopTriangleShort, "Chop Triangle Short", shape.circle, location.abovebar,
         color.new(color.gray, 50), size=size.tiny, text="⚫")

// Show trailing stop levels
plot(strategy.position_size > 0 and not na(trailing_stop_long) ? trailing_stop_long : na, 
     "Long Trailing Stop", color.purple, linewidth=3)
plot(strategy.position_size < 0 and not na(trailing_stop_short) ? trailing_stop_short : na, 
     "Short Trailing Stop", color.purple, linewidth=3)

// EMA Cloud
ema1 = plot(ema_fast, "Fast", color.new(color.blue, 60), linewidth=1)
ema2 = plot(ema_slow, "Slow", color.new(color.blue, 60), linewidth=1)
fill(ema1, ema2, color=cloud_bull ? color.new(color.green, 85) : color.new(color.red, 85), title="Cloud")

// Background coloring for chop zones
bgcolor(not chop_filter ? color.new(color.yellow, 95) : na, title="Chop Zone")

// === COMPREHENSIVE DASHBOARD ===
rsi = ta.rsi(close, rsi_length)



// === ALERTS ===
alertcondition(diamondLong, title="Diamond Long Signal", message="💎 DIAMOND REVERSAL LONG - {{ticker}} at {{close}}")
alertcondition(triangleLong, title="Triangle Long Signal", message="🔺 TRIANGLE CONTINUATION LONG - {{ticker}} at {{close}}")
alertcondition(strategy.position_size == 0 and strategy.position_size[1] != 0, title="Position Closed", message="💰 POSITION CLOSED - {{ticker}} at {{close}}")