Sistema de trading multiestrategia de ruptura, retroceso y reversión de rangos de precios dinámicos

FVG 5M 1M R:R RANGE TRADING SCALPING
Fecha de creación: 2025-08-22 09:55:06 Última modificación: 2025-08-22 09:55:06
Copiar: 0 Número de Visitas: 333
2
Seguir
319
Seguidores

Sistema de trading multiestrategia de ruptura, retroceso y reversión de rangos de precios dinámicos Sistema de trading multiestrategia de ruptura, retroceso y reversión de rangos de precios dinámicos

Descripción general

La estrategia integra tres diferentes modos de entrada: entrada de ruptura, entrada de trampa y entrada de reversión, para negociar mediante la identificación de brechas de valor justo (FVG) y la ruptura de la zona de precios. La estrategia se centra en la hora de alta volatilidad de la primera hora después de la apertura de los mercados de valores estadounidenses (09:30-10:30 EST), ejecutando operaciones en un gráfico de 1 minuto y utilizando una tabla de riesgo de retorno de riesgo de 2: 1 para administrar los estancamientos de pérdidas.

Principio de estrategia

El principio central de la estrategia se basa en el patrón de comportamiento de los precios después de la formación de un intervalo inicial en el reloj de la mañana. La operación concreta se divide en tres pasos:

  1. Marcado en el intervalo ((9:30 AM)):

    • Espere los primeros 5 minutos después de la apertura de la línea K ({9:30-9:35) para la clausura
    • Marque el punto más alto y el punto más bajo de la línea K como el intervalo de transacción
    • Cambiar a un gráfico de 1 minuto para el comercio real
  2. Buscar un punto de entrada (sólo una hora después de la apertura de la operación): La estrategia ofrece tres formas diferentes de acceso:

    • Entrar en el juego de forma ilegal:

      • Necesidad de cumplir con las condiciones de la brecha de valor justo (FVG)
      • Breakout de cualquier línea K en FVG
      • FVG es definido como un salto en el aire formado por tres líneas K (wick-gap)
    • Entradas en trampa:

      • Los precios son los primeros en romper las fronteras entre zonas
      • Y luego retrocedemos al intervalo.
      • Finalmente, se cerró de nuevo fuera de la zona.
    • Entradas reversales:

      • El precio después del fracaso de la ruptura en una dirección
      • El FVG que aparece en dirección contraria vuelve dentro de la zona
  3. Administración de operaciones:

    • Ajustes para detener la pérdida:
      • Estrategia de ruptura/trampa: utilizar el primer cerramiento en el punto más bajo/más alto de la línea K fuera de la zona
      • Estrategia inversa: el punto más bajo/más alto de la primera línea K en el modo FVG
    • Ajuste de la parada:
      • Siempre con una relación de riesgo-beneficio de 2:1
      • El riesgo es de 100 dólares y la ganancia es de 200 dólares.

El código de la estrategia implementa un marco lógico completo, que incluye la detección automática de intervalos de negociación, la identificación de diversos requisitos de entrada, la configuración de niveles de stop loss y el cálculo del tamaño de la posición adecuada. El sistema también incluye un filtro de tiempo para garantizar que se negocie solo en un período de tiempo específico, y puede activar o desactivar selectivamente diferentes estrategias de entrada.

Ventajas estratégicas

  1. Reglas claras y sencillasLas reglas de la estrategia son claras e intuitivas, no requieren un juicio subjetivo, y reducen la influencia de las emociones en las decisiones comerciales. La lógica condicional y el seguimiento de estados en el código aseguran la estricta aplicación de las reglas.

  2. Flexibilidad en el acceso a diferentes opciones de accesoEl código permite a los traders adaptarse a diferentes entornos de mercado.enableBreakenableTrapyenableReversalLos parámetros permiten esta flexibilidad.

  3. Concentrarse en los momentos de alta probabilidadLa estrategia consiste en negociar solo en la primera hora después de la apertura, aprovechando la alta volatilidad y liquidez que suele existir durante este período.inWindowLas condiciones aseguran que las transacciones solo se realicen entre las 9:30 y las 10:30.

  4. Estricta gestión de riesgos: Ratio de riesgo-retorno fijo de 2: 1 y configuración de stop loss basada en el comportamiento específico del precio, que proporciona un control claro del riesgo para cada transacción.riskPctLos parámetros permiten a los usuarios ajustar el porcentaje de riesgo de cada operación según sus preferencias de riesgo.

  5. No se requieren indicadores complejosLa estrategia no depende de indicadores técnicos complejos, sino que se basa puramente en el comportamiento y la estructura de los precios, lo que reduce el riesgo de sobreajuste.

  6. Evitación estacionalEl código incluye una lista negra de vacaciones (del 15 de diciembre al 15 de enero) para evitar períodos de posible inestabilidad o baja liquidez en el mercado.

  7. Administración de posiciones flexibleEl sistema ofrece dos formas de gestión de posiciones basadas en porcentajes de riesgo o en un número fijo de contratos, adaptadas a diferentes necesidades de gestión de fondos.

Riesgo estratégico

  1. Riesgo de una falsa brecha: El mercado puede producir falsas rupturas, lo que hace que los precios se inviertan rápidamente después de la activación de la operación. Para mitigar este riesgo, la estrategia integra la trampa y el modo de entrada inversa, pero aún debe ser cuidadosamente vigilada.

  2. Problemas de ancho de banda: Si el intervalo de la línea K es demasiado ancho o demasiado estrecho en los primeros 5 minutos después de la apertura, puede afectar la efectividad de la estrategia. Un intervalo demasiado estrecho puede causar una señal de disparo frecuente, mientras que un intervalo demasiado ancho puede causar un punto de parada demasiado lejos.

  3. El costo de oportunidad de las limitaciones de tiempoSin embargo, esta restricción también es una disciplina para evitar el exceso de comercio.

  4. Limitaciones de las tasas fijas de riesgo-beneficioAunque la relación de riesgo/rentabilidad de 2:1 proporciona consistencia, puede no ser la opción óptima en ciertos entornos de mercado. En mercados de fuerte tendencia, una relación de riesgo/rentabilidad más alta puede ser más adecuada.

  5. Las anomalías del mercado durante las fiestasA pesar de que la estrategia evita el comercio entre el 15 de diciembre y el 15 de enero, el comportamiento del mercado antes y después de otras vacaciones también puede ser anormal y afectar la estrategia.

  6. Dependencia del FVGLa estrategia depende del modelo FVG en las entradas de ruptura y reversión, pero en ciertas condiciones de mercado, el FVG puede no formarse o identificarse fácilmente.

  7. Las limitaciones de un único marco de tiempoLa dependencia total de los gráficos de un minuto puede hacer que las estrategias no tengan en cuenta la importante estructura del mercado en un marco de tiempo más amplio.

Dirección de optimización de la estrategia

  1. Adaptación de la anchura del espacioSe puede considerar ajustar la amplitud de los rangos en función de la dinámica de la volatilidad del mercado, por ejemplo, usar rangos más anchos en días de mayor volatilidad y rangos más estrechos en días de menor volatilidad. Esto se puede lograr calculando el rango de fluctuación real promedio de los últimos días (ATR) o un indicador similar.

  2. Optimización de la ventana de tiempoSe puede estudiar la ventana de tiempo de negociación óptima para diferentes mercados, en lugar de fijarse en 9:30-10:30. Algunos mercados pueden mostrar patrones de ruptura de intervalos más evidentes en diferentes períodos de tiempo.

  3. Ajustes dinámicos de riesgo y gananciasSe puede ajustar el riesgo-rendimiento en función de la situación del mercado y la dinámica de la volatilidad, por ejemplo, aumentando los objetivos cuando la tendencia es fuerte y reduciendo los objetivos en el mercado de liquidación.

  4. Integración de los indicadores de la emoción del mercadoSe puede considerar la inclusión de un indicador de amplitud de mercado o un indicador de volatilidad como filtro para evitar operaciones en un entorno de mercado desfavorable.

  5. Confirmación del marco temporal múltiple: Aunque la ejecución de la operación sigue en el gráfico de 1 minuto, se pueden agregar condiciones de confirmación para marcos de tiempo más altos, como la verificación de la consistencia de la dirección de la tendencia en el gráfico de 15 minutos o 1 hora.

  6. Optimización de la definición de FVG: La definición actual de FVG es relativamente simple, y se puede considerar una definición de zona de desequilibrio más compleja o más precisa, como considerar el cuerpo del cuerpo y no solo la línea de sombra.

  7. Añadir una confirmación de volumenLa inclusión de la confirmación de volumen de transacciones en las condiciones de entrada puede mejorar la calidad de la señal, especialmente para los entrantes de ruptura.

  8. Adaptación para detener el dañoLa adaptación del nivel de stop loss a la dinámica de la volatilidad del mercado puede mejorar la adaptabilidad de la estrategia en diferentes entornos de mercado.

Resumir

Un sistema de trading de múltiples estrategias de breakout-retracción-reversión de rangos de precios dinámicos es una estrategia de negociación diaria estructurada y con reglas claras, que busca oportunidades de negociación mediante la identificación de rangos de precios que se forman en el primer día de negociación y los siguientes patrones de breakout, trampa o reversión. Las principales ventajas de esta estrategia residen en su sencillez y flexibilidad en múltiples formas de entrada, mientras que los estrictos límites de tiempo y los principios de gestión de riesgos ayudan a mantener la disciplina de la negociación.

Sin embargo, la estrategia también se enfrenta a riesgos como falsos breaks, amplitud de intervalo inadecuada y dependencia de un modelo de precios específico. La solidez y adaptabilidad de la estrategia se pueden mejorar aún más mediante la optimización de la metodología de ajuste de intervalo, la adaptación de la ventana de tiempo, la configuración dinámica de la relación de riesgo-beneficio y la integración de análisis de múltiples marcos de tiempo.

Finalmente, esta estrategia proporciona un marco sistematizado para los operadores de corta línea, especialmente para los inversores que buscan operar de manera eficiente durante las horas de apertura diaria. Al igual que todas las estrategias de negociación, se debe realizar un buen seguimiento y una gestión de riesgos adecuada antes de su aplicación en la práctica.

Código Fuente de la Estrategia
/*backtest
start: 2025-07-22 00:00:00
end: 2025-08-21 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":500000}]
*/

//@version=5
strategy("Three-Step 9:30 Range Scalping (Backtest)", overlay=true, calc_on_every_tick=false, process_orders_on_close=true,
     initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=0)

// -------------------- Inputs
enableBreak    = input.bool(true,  "Enable Break Entry")
enableTrap     = input.bool(false, "Enable Trap Entry")
enableReversal = input.bool(true, "Enable Reversal Entry")
rr             = input.float(2.0,  "Take-Profit R Multiple", step=0.25, minval=0.25)
oneTradePerDay = input.bool(false,  "One Trade Per Day")
showRange      = input.bool(true,  "Show 9:30 5m Range")

// Risk management
riskPct        = input.float(1.0,  "Risk % of Equity per Trade", step=0.1, minval=0.1, maxval=100.0)
sizeMode       = input.string("Risk %", "Position Sizing Mode", options=["Risk %", "Fixed contracts"])
fixedContracts = input.int(1, "Fixed Contracts", minval=1)

// Optional: warn if not on 1-minute chart (execution timeframe per PRD)
onOneMinute = timeframe.isminutes and timeframe.multiplier == 1

// -------------------- Time helpers (chart is assumed New York time)
newDay   = ta.change(time("D")) != 0
// Trade the first hour only: 9:30:00 to 10:29:59
inWindow = (hour == 9 and minute >= 30) or (hour == 10 and minute <= 29)
// Holiday blackout window: Do not trade Dec 15 – Jan 15
inBlackout = (month == 12 and dayofmonth >= 15) or (month == 1 and dayofmonth <= 15)

// -------------------- First 5-min range (use the actual 9:30 5m candle via security())
var float rangeHi = na
var float rangeLo = na
var bool  haveRange = false

// -------------------- State for entries
var bool  breakUpFound           = false
var bool  breakDownFound         = false
var float initBreakUpLow         = na    // for Break/Trap long SL
var float initBreakDownHigh      = na    // for Break/Trap short SL
var bool  trapUpRetestedInside   = false
var bool  trapDownRetestedInside = false
var bool  tradedToday            = false

// Reset daily state at midnight (chart timezone)
if newDay
    rangeHi := na
    rangeLo := na
    haveRange := false
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// Pull the 5-minute bar that STARTS at 9:30 (value available on its close at 9:35)
sess0930Hi = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? high : na, barmerge.gaps_off, barmerge.lookahead_off)
sess0930Lo = request.security(syminfo.tickerid, "5", (hour == 9 and minute == 30) ? low  : na, barmerge.gaps_off, barmerge.lookahead_off)

// Lock the range when the 9:30 5m candle closes (value appears non-na exactly then)
if not haveRange and not na(sess0930Hi) and not na(sess0930Lo)
    rangeHi := sess0930Hi
    rangeLo := sess0930Lo
    haveRange := true
    // reset session-specific flags at start of trading window
    breakUpFound := false
    breakDownFound := false
    initBreakUpLow := na
    initBreakDownHigh := na
    trapUpRetestedInside := false
    trapDownRetestedInside := false
    tradedToday := false

// -------------------- Visuals
plot(showRange and haveRange ? rangeHi : na, "Range High", color=color.new(color.teal, 0), style=plot.style_linebr, linewidth=2)
plot(showRange and haveRange ? rangeLo : na, "Range Low",  color=color.new(color.orange, 0), style=plot.style_linebr, linewidth=2)

plotchar(not onOneMinute, title="Use 1-minute chart", char="⚠", location=location.top, color=color.new(color.red, 0), size=size.tiny)
plotchar(inBlackout, title="Holiday blackout (Dec 15–Jan 15)", char="⛔", location=location.top, color=color.new(color.red, 0), size=size.tiny)

// -------------------- Convenience conditions
closeAbove  = haveRange and close > rangeHi
closeBelow  = haveRange and close < rangeLo
closeInside = haveRange and close <= rangeHi and close >= rangeLo

// Track first body-close outside the range in each direction (initial break-close)
if haveRange and inWindow and not tradedToday
    if not breakUpFound and closeAbove
        breakUpFound := true
        initBreakUpLow := low
        trapUpRetestedInside := false
    if not breakDownFound and closeBelow
        breakDownFound := true
        initBreakDownHigh := high
        trapDownRetestedInside := false

// Trap retest flags (retest back inside after first break)
if haveRange and inWindow and not tradedToday
    if breakUpFound and not trapUpRetestedInside and closeInside
        trapUpRetestedInside := true
    if breakDownFound and not trapDownRetestedInside and closeInside
        trapDownRetestedInside := true

// -------------------- FVG detectors (three-candle imbalance)
// Simple wick-gap definition, preserved through the third candle
// Bullish: gap exists if Candle C low > Candle A high AND Candle B low > Candle A high
// Bearish: gap exists if Candle C high < Candle A low  AND Candle B high < Candle A low
bullFVG = not na(high[2]) and (low[1] > high[2]) and (low > high[2])
bearFVG = not na(low[2])  and (high[1] < low[2])  and (high < low[2])

// -------------------- Entry gating
allowEntry = haveRange and inWindow and not inBlackout and strategy.position_size == 0 and (not oneTradePerDay or not tradedToday)

// Calculate contracts based on selected sizing mode
calcOrderQty(entryPrice, stopPrice) =>
    qty = 0
    if sizeMode == "Fixed contracts"
        qty := fixedContracts
    else
        riskCash = strategy.equity * riskPct / 100.0
        riskPerContract = math.abs(entryPrice - stopPrice) * syminfo.pointvalue
        qty := riskPerContract > 0 ? math.floor(riskCash / riskPerContract) : 0
    qty

// -------------------- BREAK Entries (needs FVG and ANY of the 3 bars closes outside)
if enableBreak and allowEntry
    // Long BREAK
    breakLongOk  = bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)
    if breakLongOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopL = na
        stopL := close[2] > rangeHi ? low[2] : stopL
        stopL := na(stopL) and close[1] > rangeHi ? low[1] : stopL
        stopL := na(stopL) and close > rangeHi ? low : stopL
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_BREAK", strategy.long, qty=qtyL)
                strategy.exit("LONG_BREAK_TP/SL", from_entry="LONG_BREAK", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short BREAK
    breakShortOk = bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)
    if breakShortOk
        // Stop at the FIRST candle that closed outside among the 3 FVG candles
        float stopS = na
        stopS := close[2] < rangeLo ? high[2] : stopS
        stopS := na(stopS) and close[1] < rangeLo ? high[1] : stopS
        stopS := na(stopS) and close < rangeLo ? high : stopS
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_BREAK", strategy.short, qty=qtyS)
                strategy.exit("SHORT_BREAK_TP/SL", from_entry="SHORT_BREAK", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- TRAP Entries (Break → Retest inside → Reclose outside; FVG not required)
if enableTrap and allowEntry
    // Long TRAP
    if breakUpFound and trapUpRetestedInside and closeAbove
        stopL  = na(initBreakUpLow) ? low : initBreakUpLow
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_TRAP", strategy.long, qty=qtyL)
                strategy.exit("LONG_TRAP_TP/SL", from_entry="LONG_TRAP", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // Short TRAP
    if breakDownFound and trapDownRetestedInside and closeBelow
        stopS  = na(initBreakDownHigh) ? high : initBreakDownHigh
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_TRAP", strategy.short, qty=qtyS)
                strategy.exit("SHORT_TRAP_TP/SL", from_entry="SHORT_TRAP", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- REVERSAL Entries (Failed break + opposite FVG back into range)
if enableReversal and allowEntry
    // After bearish break, bullish FVG back into range → LONG
    if breakDownFound and bullFVG and closeInside
        stopL  = low[2]  // first candle of the FVG
        entryL = close
        if entryL > stopL
            tpL = entryL + rr * (entryL - stopL)
            qtyL = calcOrderQty(entryL, stopL)
            if qtyL > 0
                strategy.entry("LONG_REV", strategy.long, qty=qtyL)
                strategy.exit("LONG_REV_TP/SL", from_entry="LONG_REV", stop=stopL, limit=tpL)
                tradedToday := oneTradePerDay ? true : tradedToday
    // After bullish break, bearish FVG back into range → SHORT
    if breakUpFound and bearFVG and closeInside
        stopS  = high[2] // first candle of the FVG
        entryS = close
        if entryS < stopS
            tpS = entryS - rr * (stopS - entryS)
            qtyS = calcOrderQty(entryS, stopS)
            if qtyS > 0
                strategy.entry("SHORT_REV", strategy.short, qty=qtyS)
                strategy.exit("SHORT_REV_TP/SL", from_entry="SHORT_REV", stop=stopS, limit=tpS)
                tradedToday := oneTradePerDay ? true : tradedToday

// -------------------- Markers
plotshape(enableBreak and (bullFVG and (close > rangeHi or close[1] > rangeHi or close[2] > rangeHi)) and allowEntry,  title="Break Long",  style=shape.triangleup,   color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Break")
plotshape(enableBreak and (bearFVG and (close < rangeLo or close[1] < rangeLo or close[2] < rangeLo)) and allowEntry,  title="Break Short", style=shape.triangledown, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Break")
plotshape(enableTrap  and breakUpFound   and trapUpRetestedInside   and closeAbove and allowEntry,  title="Trap Long",  style=shape.circle, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Trap")
plotshape(enableTrap  and breakDownFound and trapDownRetestedInside and closeBelow and allowEntry,  title="Trap Short", style=shape.circle, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Trap")
plotshape(enableReversal and breakDownFound and bullFVG and closeInside and allowEntry, title="Reversal Long",  style=shape.diamond, color=color.new(color.teal, 0),   size=size.tiny, location=location.belowbar, text="Rev")
plotshape(enableReversal and breakUpFound   and bearFVG and closeInside and allowEntry, title="Reversal Short", style=shape.diamond, color=color.new(color.orange, 0), size=size.tiny, location=location.abovebar, text="Rev")