Estrategia de trading cuantitativo con stop loss dinámico en sesiones duales de Londres y Nueva York

ORB EMA SL TP RRR 交易会话 追踪止损 价格突破 风险管理
Fecha de creación: 2025-04-27 11:32:24 Última modificación: 2025-04-27 11:32:24
Copiar: 2 Número de Visitas: 334
2
Seguir
319
Seguidores

Estrategia de trading cuantitativo con stop loss dinámico en sesiones duales de Londres y Nueva York Estrategia de trading cuantitativo con stop loss dinámico en sesiones duales de Londres y Nueva York

Descripción general

La estrategia de breakout tracking stop loss quantitative trading es un sistema de breakout trading basado en el intervalo de precios de 15 minutos antes de la apertura de la hora de apertura de Londres y Nueva York. La estrategia capta el movimiento de los precios al comienzo de la apertura de los dos principales centros financieros y entra en la dirección correspondiente cuando los precios se forman en los primeros 15 minutos de la ruptura.

Principio de estrategia

El mecanismo de funcionamiento de la estrategia se desarrolla en torno a dos períodos de tiempo clave: la apertura del mercado en Londres (hora de Nueva York: 3:00-3:15) y la apertura del mercado en Nueva York (hora de Nueva York: 9:30-9:45). El proceso de trabajo de la estrategia es el siguiente:

  1. Los precios de Londres y Nueva York registraron los máximos y mínimos de los primeros 15 minutos de la apertura, formando un “intervalo de precios”
  2. Cuando se forma un rango de precios, la estrategia comprueba si el tamaño del rango cumple con los requisitos mínimos (default 2 puntos)
  3. Si el precio rompe el punto más alto de la franja desde abajo y cumple con las condiciones de filtro EMA (si está activado), se abre una posición adicional
  4. Si el precio rompe el intervalo de bajas desde arriba y cumple con las condiciones de filtro EMA (si está activado), se abre una posición a la baja
  5. Posicionamiento de la altura de un intervalo fuera de la frontera de la franja de precios en la dirección opuesta a la ruptura
  6. El objetivo de stop loss es el RRR (default 2.0) multiplicado por la altura del intervalo
  7. Al mismo tiempo, se establece un stop loss de seguimiento, con 8 unidades de cambio mínimo por defecto, que se ajusta a medida que el precio se mueve en la dirección favorable

La lógica clave de la estrategia consiste en capturar las rupturas direccionales de los precios al comienzo de la sesión, que suelen ser un indicador de la tendencia que puede seguir. Mediante el uso de un mecanismo de seguimiento de las pérdidas, la estrategia permite que las operaciones rentables continúen operando mientras se protegen los beneficios obtenidos.

Ventajas estratégicas

Después de un análisis en profundidad, la estrategia tiene las siguientes ventajas:

  1. Oportunidades de comercio en dos horariosLa estrategia capta la volatilidad de las dos principales horas de negociación, aumentando las oportunidades de negociación, al centrarse en las aperturas de Londres y Nueva York al mismo tiempo.
  2. Mecanismo de seguimiento de pérdidasEn comparación con los puntos de parada fijos, el seguimiento de los puntos de parada permite que las operaciones con ganancias sigan creciendo y, al mismo tiempo, protege las ganancias, lo que mejora el nivel promedio de ganancias.
  3. Control perfecto de riesgosLa estrategia adopta una configuración de stop loss dinámica basada en la volatilidad (el tamaño del intervalo) para que la gestión del riesgo se adapte mejor a las condiciones del mercado.
  4. Se puede personalizarEl usuario puede ajustar el RRR, el tamaño de los intervalos mínimos, el seguimiento de los puntos de parada y el uso de filtros EMA para adaptarse a diferentes tipos de operaciones y preferencias de riesgo personales.
  5. Filtrado de indicadores técnicosLas condiciones de filtración de EMA de 5 minutos son opcionales para evitar el comercio en contrapartida y mejorar la calidad de las operaciones.
  6. Limite a una transacción por período de tiempoLas señales de transacción integradas en la estrategia aseguran que se ejecute un máximo de una transacción por período de tiempo, evitando los costos y riesgos que conlleva el comercio frecuente.

Riesgo estratégico

A pesar de la buena concepción de la estrategia, existen los siguientes riesgos potenciales:

  1. Riesgo de una falsa brecha: El precio puede retroceder inmediatamente después de una breve ruptura de la frontera de la zona, lo que lleva a una parada de pérdidas. Para contrarrestar este riesgo, se puede considerar agregar un mecanismo de confirmación, como exigir que el precio permanezca un cierto tiempo después de la ruptura o que alcance un cierto margen para abrir posiciones.
  2. Problemas de gestión de fondosEstrategia: Por defecto, se utiliza el número fijo de contratos para negociar, que puede no ser adecuado para todos los tamaños de fondos. Se recomienda ajustar el tamaño de la posición en función del tamaño de la cuenta y la capacidad de asumir el riesgo.
  3. Riesgos de la optimización de parámetros: Los parámetros de optimización excesiva pueden conducir a la adaptación de la curva, que no funcionará bien en el entorno de mercado futuro. Debe prestarse atención a las pruebas de robustez de los parámetros.
  4. Dependencia del entorno de mercado: La estrategia puede desencadenar pérdidas de parada con frecuencia en mercados con movimiento y sin tendencias evidentes. Se puede considerar agregar condiciones de filtración de entornos de mercado.
  5. Problemas con la configuración de la zona horariaEl código utiliza la zona horaria de Nueva York, y debe asegurarse de que la configuración de la zona horaria de la plataforma de negociación sea la misma, de lo contrario, puede ocasionar una señal de negociación errónea.
  6. El impacto de las fiestasLos días especiales de negociación y los días festivos pueden afectar el rendimiento de la estrategia, que no incluye la lógica de filtrado de días festivos.

Dirección de optimización de la estrategia

Basado en el análisis de estrategias, las siguientes son posibles direcciones de optimización:

  1. Mecanismo de confirmación añadidoSe puede considerar la posibilidad de agregar condiciones de confirmación adicionales después de la ruptura del precio, como la ruptura de la cantidad de transacción, el mantenimiento de varias líneas K consecutivas en la dirección de la ruptura, etc., para reducir los daños causados por la falsa ruptura.
  2. Gestión dinámica de fondos: Ajuste el tamaño de las posiciones en función de la volatilidad del mercado y la dinámica del tamaño de la cuenta para optimizar la relación de riesgo-rentabilidad.
  3. El filtro del entorno del mercadoIntroducción de indicadores de volatilidad o de intensidad de tendencia, para suspender el comercio en un entorno de mercado no adecuado para la estrategia de ruptura.
  4. Confirmación de varios períodos de tiempoEn la mayoría de los casos, las tendencias se encuentran en la dirección de un ciclo de tiempo más largo, por lo que solo se puede operar en la dirección que coincida con la tendencia general.
  5. Optimización del tiempo de entradaSe puede considerar la posibilidad de usar el retorno de precios para ingresar a puntos de soporte / resistencia clave, en lugar de ingresar directamente en los puntos de ruptura para obtener mejores precios de costo.
  6. Aumentar el tiempo de filtradoAnálisis del historial de desempeño de las diferentes fechas y períodos de tiempo, evitando los períodos de bajo desempeño.
  7. Análisis de correlación entre variedadesTenga en cuenta la correlación entre las diferentes variedades de transacciones y evite tener varias posiciones de alta correlación al mismo tiempo.

Resumir

La estrategia de trading de breakout tracking stop loss quantitative trading strategy es un sistema de trading de breakout diseñado para las horas de apertura de los dos centros financieros de Londres y Nueva York. Al capturar el movimiento y la dirección de los precios al comienzo de la apertura, combinado con el mecanismo de seguimiento de los stop loss, la estrategia puede maximizar el potencial de ganancias al tiempo que controla el riesgo. Aunque existen riesgos como falsos breakouts y dependencia del entorno del mercado, la estabilidad y la rentabilidad de la estrategia se pueden mejorar aún más con la configuración de parámetros razonables y condiciones de filtración adicionales.

Código Fuente de la Estrategia
/*backtest
start: 2024-04-27 00:00:00
end: 2025-04-25 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/

//@version=6
strategy("ORB-LD-NY-Trail Strategy", overlay=true,
     default_qty_type=strategy.fixed, default_qty_value=1,
     calc_on_order_fills=true, calc_on_every_tick=true)

// =========================
// USER INPUTS
// =========================
riskReward      = input.float(2.0, "Risk-Reward Ratio", minval=1.0)
minBoxSize      = input.float(2.0, "Minimum Box Size (points)")
trailStopTicks  = input.int(8, "Trailing Stop (ticks)", minval=1)
useEmaFilter    = input.bool(false, "Use 5-min EMA Filter?")

tickSize        = syminfo.mintick         // auto-detect min tick for symbol
trailStopOffset = trailStopTicks * tickSize
emaSource       = request.security(syminfo.tickerid, "5", ta.ema(close, 200))  // 5-min chart EMA

// =========================
// SESSION TIMES
// =========================
londonStart = timestamp("America/New_York", year, month, dayofmonth, 3, 0)
londonEnd   = timestamp("America/New_York", year, month, dayofmonth, 3, 15)
nyStart     = timestamp("America/New_York", year, month, dayofmonth, 9, 30)
nyEnd       = timestamp("America/New_York", year, month, dayofmonth, 9, 45)

inLondon = time >= londonStart and time <= londonEnd
inNY     = time >= nyStart and time <= nyEnd

// =========================
// ONE TRADE PER SESSION FLAGS
// =========================
var bool londonTraded = false
var bool nyTraded     = false

// =========================
// LONDON BOX
// =========================
var float londonHigh    = na
var float londonLow     = na
var float londonBoxHigh = na
var float londonBoxLow  = na

if inLondon
    if na(londonHigh)
        londonBoxHigh := na
        londonBoxLow  := na
        londonTraded  := false
    londonHigh := na(londonHigh) ? high : math.max(londonHigh, high)
    londonLow  := na(londonLow)  ? low  : math.min(londonLow,  low)

if not inLondon and na(londonBoxHigh) and not na(londonHigh) and not na(londonLow)
    londonBoxHigh := londonHigh
    londonBoxLow  := londonLow
    londonHigh    := na
    londonLow     := na

if time > londonEnd and not na(londonBoxHigh) and not londonTraded
    boxRange = londonBoxHigh - londonBoxLow
    if boxRange >= minBoxSize
        // Standard SL/TP logic
        longSL  = londonBoxHigh - boxRange
        longTP  = londonBoxHigh + boxRange * riskReward
        shortSL = londonBoxLow  + boxRange
        shortTP = londonBoxLow  - boxRange * riskReward

        // === LONDON LONG ===
        condLong1 = close[1] <= londonBoxHigh
        condLong2 = close > londonBoxHigh
        condLong3 = (not useEmaFilter) or (close > emaSource)

        if condLong1 and condLong2 and condLong3
            strategy.entry("London Long", strategy.long)
            strategy.exit("Exit London Long", from_entry="London Long",
                          stop=longSL, limit=longTP,
                          trail_points=trailStopOffset)
            londonTraded := true

        // === LONDON SHORT ===
        condShort1 = close[1] >= londonBoxLow
        condShort2 = close < londonBoxLow
        condShort3 = (not useEmaFilter) or (close < emaSource)

        if not londonTraded and condShort1 and condShort2 and condShort3
            strategy.entry("London Short", strategy.short)
            strategy.exit("Exit London Short", from_entry="London Short",
                          stop=shortSL, limit=shortTP,
                          trail_points=trailStopOffset)
            londonTraded := true

// =========================
// NY BOX
// =========================
var float nyHigh    = na
var float nyLow     = na
var float nyBoxHigh = na
var float nyBoxLow  = na

if inNY
    if na(nyHigh)
        nyBoxHigh := na
        nyBoxLow  := na
        nyTraded  := false
    nyHigh := na(nyHigh) ? high : math.max(nyHigh, high)
    nyLow  := na(nyLow)  ? low  : math.min(nyLow,  low)

if not inNY and na(nyBoxHigh) and not na(nyHigh) and not na(nyLow)
    nyBoxHigh := nyHigh
    nyBoxLow  := nyLow
    nyHigh    := na
    nyLow     := na

if time > nyEnd and not na(nyBoxHigh) and not nyTraded
    boxRange = nyBoxHigh - nyBoxLow
    if boxRange >= minBoxSize
        longSL  = nyBoxHigh - boxRange
        longTP  = nyBoxHigh + boxRange * riskReward
        shortSL = nyBoxLow  + boxRange
        shortTP = nyBoxLow  - boxRange * riskReward

        // === NY LONG ===
        condNYLong1 = close[1] <= nyBoxHigh
        condNYLong2 = close > nyBoxHigh
        condNYLong3 = (not useEmaFilter) or (close > emaSource)

        if condNYLong1 and condNYLong2 and condNYLong3
            strategy.entry("NY Long", strategy.long)
            strategy.exit("Exit NY Long", from_entry="NY Long",
                          stop=longSL, limit=longTP,
                          trail_points=trailStopOffset)
            nyTraded := true

        // === NY SHORT ===
        condNYShort1 = close[1] >= nyBoxLow
        condNYShort2 = close < nyBoxLow
        condNYShort3 = (not useEmaFilter) or (close < emaSource)

        if not nyTraded and condNYShort1 and condNYShort2 and condNYShort3
            strategy.entry("NY Short", strategy.short)
            strategy.exit("Exit NY Short", from_entry="NY Short",
                          stop=shortSL, limit=shortTP,
                          trail_points=trailStopOffset)
            nyTraded := true

// Visual session background
bgcolor(inLondon ? color.new(color.fuchsia, 85) : na)
bgcolor(inNY     ? color.new(color.green,   85) : na)