Estrategia de trading de futuros con stop loss dinámico y múltiples indicadores técnicos

EMA ATR FVG BOS HTF ORDER BLOCK Liquidity Sweep
Fecha de creación: 2025-04-02 09:41:48 Última modificación: 2025-04-02 09:41:48
Copiar: 0 Número de Visitas: 381
2
Seguir
319
Seguidores

Estrategia de trading de futuros con stop loss dinámico y múltiples indicadores técnicos Estrategia de trading de futuros con stop loss dinámico y múltiples indicadores técnicos

Descripción general de la estrategia

La estrategia es un sistema de comercio de futuros avanzado que combina múltiples condiciones técnicas y análisis de marcos de tiempo más altos para identificar oportunidades de comercio de alta probabilidad. La estrategia utiliza un método basado en la combinación de múltiples condiciones, que requiere que se cumplan varias condiciones técnicas al mismo tiempo para entrar en un comercio.

Principio de estrategia

El núcleo de la estrategia es la combinación de varios métodos de análisis técnico para garantizar que los operadores solo entren en operaciones cuando varios indicadores dan señales al mismo tiempo. En concreto, la estrategia contiene los siguientes componentes clave:

  1. La brecha en el valor justo (FVG)- Se identifica cuando hay una diferencia significativa en el precio entre dos coches, lo que indica que puede haber un espacio no llenado en el mercado.
  2. Bloque de pedidos- Estas son las áreas clave en las que se produce una reversión de los precios, que suele manifestarse como fuertes picos de rechazo que se convierten en zonas de soporte o resistencia.
  3. Escaneo de fluidez- Identificar situaciones en las que el mercado rompe un punto alto o un punto bajo preliminar y luego se invierte, lo que generalmente indica que las grandes entidades están recolectando liquidez.
  4. Desarrollo estructural (BOS)- Se produce cuando el precio rompe la estructura anterior, formando un punto más alto o un punto más bajo.
  5. Confirmación de tendencias de alta frecuencia- Utiliza el EMA (media móvil del índice) en los períodos de 15 y 60 minutos para confirmar la dirección de la tendencia general.

La estrategia solo generará una señal de entrada si se suman al menos dos condiciones básicas (una en el modo de despliegue) más una señal de ruptura estructural, y al mismo tiempo coincide con una tendencia de ciclo de tiempo más alto.

En cuanto a la gestión de riesgos, la estrategia utiliza ATR (Average True Range) para establecer una posición de parada dinámica, con una distancia de parada que suele ser 1.5 veces el valor de ATR. Este método aumenta la distancia de parada cuando hay una alta volatilidad y disminuye la distancia cuando hay una baja volatilidad, lo que hace que la parada sea más inteligente.

La estrategia utiliza un método de ganancias por lotes para obtener ganancias del 50% de las posiciones cuando se obtiene una ganancia equivalente al riesgo ®, mientras que el resto de las posiciones se detienen y se trasladan a la posición de garantía, lo que crea la oportunidad de negociar sin riesgo. Además, hay un mecanismo de salida basado en el tiempo que se cierra automáticamente si la operación no se mueve a su favor dentro del tiempo especificado (los 30 minutos predeterminados).

Además, la estrategia también incluye la función de administración de cuentas, que automáticamente retira todas las posiciones cuando las ganancias de la cuenta alcanzan el objetivo predeterminado (de \( 3000) o desencadenan un cese de seguimiento (se inicia el seguimiento después de que las cuentas superan los \) 2500).

Ventajas estratégicas

Después de analizar el código en profundidad, podemos resumir las siguientes ventajas obvias:

  1. Sistema de confirmación múltiple- Se requiere que se cumplan varios requisitos técnicos para entrar, lo que reduce efectivamente las señales falsas y mejora la calidad de las transacciones.
  2. Gestión inteligente de riesgos- El uso de stop loss dinámico basado en el ATR, que se adapta mejor a los cambios en la volatilidad del mercado que el stop loss de puntos fijos o porcentajes.
  3. Filtración de tendencias de alta frecuencia- Utiliza la dirección de la tendencia en el ciclo de tiempo más alto, sólo en la dirección de la tendencia de comercio, evitar el comercio de contravalor.
  4. Estrategias para obtener ganancias por tramos- El bloqueo de una parte de las ganancias se garantiza y ofrece una oportunidad sin riesgo para las posiciones restantes mediante el bloqueo de ganancias y el movimiento de pérdidas a la posición de garantía.
  5. Mecanismo de salida basado en tiempo- Salir automáticamente de las transacciones no válidas para evitar que los fondos se queden atrapados en transacciones sin incentivos durante mucho tiempo.
  6. Administración de cuentas en general- Proteger la rentabilidad de la cuenta general y lograr una sólida administración de fondos mediante la fijación de objetivos de ganancias y el cierre de pérdidas.
  7. Altamente adaptable- Proporciona una alta flexibilidad a través de varios parámetros que pueden adaptarse a diferentes condiciones de mercado y estilos de negociación.
  8. Integración de los indicadores técnicos especializados- Combina una variedad de conceptos de análisis tecnológico avanzado que normalmente sólo son usados por operadores profesionales.

Riesgo estratégico

A pesar de la buena concepción de la estrategia, existen algunos riesgos potenciales, que incluyen:

  1. Riesgos de la optimización de parámetros- La estrategia depende de varios parámetros de configuración, y si la optimización excesiva puede conducir a un exceso de ajuste, no funcionará bien en las condiciones futuras del mercado. La solución es usar un ciclo de prueba lo suficientemente largo y realizar pruebas hacia adelante.
  2. Dependencia del entorno de mercado- La estrategia puede funcionar bien en mercados de tendencia, pero puede generar más falsas señales en mercados de oscilación intermedia. La solución es agregar filtros de entornos de mercado, ajustar la frecuencia de negociación o detener la negociación por completo cuando se identifica como un mercado de oscilación.
  3. Ejecutar el riesgo de deslizamiento- Durante períodos de alta volatilidad, los precios de entrada y salida pueden diferir mucho de lo esperado, lo que afecta el rendimiento de la estrategia. La solución es simular los puntos de deslizamiento reales en la retrospectiva y usar la lista de precios límite en lugar de la lista de precios de mercado en las operaciones reales.
  4. Riesgo de fallo técnico- Los sistemas automatizados de negociación pueden sufrir fallas técnicas o interrupciones de la red. La solución es crear sistemas de respaldo y mecanismos de intervención manual.
  5. Gestión de la complejidad- La complejidad de las estrategias puede hacer que sea difícil diagnosticar problemas o entender por qué algunas transacciones fallan. La solución es mantener un registro detallado de las transacciones y analizar periódicamente el rendimiento de las estrategias.
  6. Riesgo de liquidez en el mercado- En ciertas condiciones de mercado, como antes y después de las noticias importantes, la liquidez puede disminuir rápidamente, lo que puede provocar un mayor deslizamiento o la imposibilidad de salir de la posición. La solución es evitar el comercio durante la publicación de datos económicos importantes o reducir el tamaño de la posición en estos momentos.

Dirección de optimización de la estrategia

Basado en el análisis del código, las siguientes son algunas direcciones potenciales de optimización:

  1. Mejorar la identificación de tendencias- Las estrategias actuales utilizan un simple cruce de EMA para determinar la tendencia, se puede considerar la adición de otros indicadores de tendencia como el ADX (indice de dirección promedio) para confirmar la fuerza de la tendencia, ya que los mercados de fuerte tendencia suelen ofrecer mejores oportunidades de negociación.
  2. Adaptación al estado del mercado- La adición de un mecanismo de identificación del estado del mercado para ajustar automáticamente los parámetros de la estrategia en diferentes entornos del mercado (tendencias, intervalos, alta volatilidad, baja volatilidad). Esto permite que la estrategia sea más flexible y se adapte a diferentes condiciones del mercado.
  3. Optimizar el tiempo de ingreso- Considere agregar indicadores de dinámica como el RSI o los indicadores aleatorios para asegurarse de entrar en la dirección de la tendencia y evitar entrar en exceso de sobrecompra o sobreventa, lo que reduce el riesgo de reversión.
  4. Mejorar las estrategias de ganancias- La ganancia 1R fija en la actualidad puede ser demasiado conservadora o demasiado radical, se puede considerar ajustar dinámicamente los objetivos de ganancia en función de la volatilidad o los niveles de soporte / resistencia, y establecer objetivos más lejanos cuando la volatilidad es mayor.
  5. La gestión de riesgos se ha refinado.- Introducción de un mecanismo de ajuste dinámico del tamaño de la posición que ajuste automáticamente la brecha de riesgo según el rendimiento reciente de la estrategia y la volatilidad del mercado, aumentando el riesgo cuando la estrategia funciona bien y reduciendo el riesgo cuando funciona mal.
  6. Añadir un filtro de tiempo en el día- Los mercados de futuros tienen diferentes características en diferentes períodos de tiempo, y la adición de filtros de tiempo permite evitar períodos de poca liquidez o falta de dirección.
  7. Integración de los indicadores de la emoción del mercado- Añadir indicadores de sentimiento del mercado como el VIX, para ajustar los parámetros de la estrategia o suspender el comercio en caso de sentimiento extremo.
  8. Optimización de la eficiencia del código- Hay algunos ciclos en el código actual que pueden afectar la eficiencia de ejecución, especialmente en un marco de tiempo más pequeño. Optimizar estos ciclos puede mejorar la velocidad de respuesta de la estrategia.

Resumir

Se trata de una estrategia de comercio de futuros multi-indicadores bien diseñada, que integra una variedad de conceptos avanzados de análisis técnico y que cuenta con una gestión de riesgos y una gestión de fondos perfectas. Se reduce la falsa señal al exigir que se cumplan varias condiciones al mismo tiempo y la confirmación de tendencias de alto ciclo de tiempo, mientras que se utiliza una estrategia de pérdidas y ganancias por lotes dinámicas basada en ATR para optimizar la rentabilidad de riesgo.

La principal ventaja de la estrategia reside en su sistema de confirmación multicapa e inteligente gestión de riesgos, que le permite capturar oportunidades de comercio de alta probabilidad mientras se mantiene el riesgo bajo. Sin embargo, la complejidad de la estrategia también trae desafíos de optimización de parámetros y adaptabilidad al mercado, que requieren un monitoreo continuo y ajustes periódicos para mantener su eficacia.

La estrategia tiene el potencial de mantener un rendimiento estable en diferentes entornos de mercado mediante la implementación de medidas de optimización recomendadas, en particular, la mejora de la capacidad de adaptación al estado del mercado y la mejora del sistema de gestión de riesgos. En general, es una estrategia avanzada para el uso de los operadores experimentados que, con la debida supervisión y adaptación, puede convertirse en una herramienta poderosa en el sistema de negociación.

Código Fuente de la Estrategia
/*backtest
start: 2024-04-02 00:00:00
end: 2025-04-01 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

// @version=5
strategy("NQ Futures Trading Strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.cash, default_qty_value=5000)

// ==========================================
// Parameters
// ==========================================

// Account Parameters
accountSize = 50000
profitGoal = 3000
trailingThreshold = 2500
stopsTrailing = 52650

// Trading Parameters
atrLength = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for SL", minval=0.5, maxval=3.0, step=0.1)
timeoutPeriod = input.int(30, "Exit after X minutes if trade doesn't move favorably", minval=5, maxval=120)

// FVG (Fair Value Gap) Parameters
fvgLength = input.int(5, "FVG Look-back Period", minval=2, maxval=20)
fvgThreshold = input.float(0.1, "FVG Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Order Block Parameters
obLength = input.int(5, "Order Block Look-back Period", minval=2, maxval=20)
obThreshold = input.float(0.1, "Order Block Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Liquidity Sweep Parameters
sweepLength = input.int(5, "Liquidity Sweep Look-back Period", minval=2, maxval=20)
sweepThreshold = input.float(0.05, "Sweep Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Break of Structure Parameters
bosLength = input.int(5, "BOS Look-back Period", minval=2, maxval=20)
bosThreshold = input.float(0.05, "BOS Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Debug Mode
debugMode = input.bool(false, "Debug Mode (more signals)")

// Higher Timeframe Trend Parameters
htfPeriod1 = input.timeframe("15", "First Higher Timeframe")
htfPeriod2 = input.timeframe("60", "Second Higher Timeframe")

// ==========================================
// Indicators & Calculations
// ==========================================

// ATR Calculation
atr = ta.atr(atrLength)

// Higher Timeframe EMAs for Trend Determination
htf1_ema20 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf1_ema50 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema20 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema50 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)

// Higher Timeframe Trend
htf1_bullish = htf1_ema20 > htf1_ema50
htf1_bearish = htf1_ema20 < htf1_ema50
htf2_bullish = htf2_ema20 > htf2_ema50
htf2_bearish = htf2_ema20 < htf2_ema50

// ==========================================
// Entry Conditions
// ==========================================

// 1. Fair Value Gap (FVG)
bullishFVG = false
bearishFVG = false

for i = 1 to fvgLength
    if low[i] > high[i+2] and (low[i] - high[i+2]) / high[i+2] > fvgThreshold
        bullishFVG := true
    if high[i] < low[i+2] and (low[i+2] - high[i]) / high[i] > fvgThreshold
        bearishFVG := true

// 2. Inverse Fair Value Gap
inverseBullishFVG = false
inverseBearishFVG = false

for i = 1 to fvgLength
    if high[i+1] < low[i+2] and close[i] > open[i] and close[i] > high[i+1]
        inverseBullishFVG := true
    if low[i+1] > high[i+2] and close[i] < open[i] and close[i] < low[i+1]
        inverseBearishFVG := true

// 3. Order Block / Breaker Block
bullishOrderBlock = false
bearishOrderBlock = false

for i = 1 to obLength
    if close[i+1] < open[i+1] and (open[i+1] - close[i+1]) / close[i+1] > obThreshold and close[i] > open[i]
        bullishOrderBlock := true
    if close[i+1] > open[i+1] and (close[i+1] - open[i+1]) / open[i+1] > obThreshold and close[i] < open[i]
        bearishOrderBlock := true

// 4. Liquidity Sweep
bullishSweep = false
bearishSweep = false

lowestLow = ta.lowest(low, sweepLength+1)
highestHigh = ta.highest(high, sweepLength+1)

if low[1] < lowestLow[2] and close > open
    bullishSweep := true
if high[1] > highestHigh[2] and close < open
    bearishSweep := true

// 5. Break of Structure (BOS)
bullishBOS = false
bearishBOS = false

prevHigh = high[2]
prevLow = low[2]

if high > prevHigh and low[1] < low[2]
    bullishBOS := true
if low < prevLow and high[1] > high[2]
    bearishBOS := true

// Simpler version for debug mode
if debugMode
    bullishBOS := close > open and close > close[1]
    bearishBOS := close < open and close < close[1]

// ==========================================
// Signal Generation
// ==========================================

// Count valid entry conditions
bullishConditions = bullishFVG ? 1 : 0
bullishConditions := bullishConditions + (inverseBullishFVG ? 1 : 0)
bullishConditions := bullishConditions + (bullishOrderBlock ? 1 : 0)
bullishConditions := bullishConditions + (bullishSweep ? 1 : 0)

bearishConditions = bearishFVG ? 1 : 0
bearishConditions := bearishConditions + (inverseBearishFVG ? 1 : 0)
bearishConditions := bearishConditions + (bearishOrderBlock ? 1 : 0)
bearishConditions := bearishConditions + (bearishSweep ? 1 : 0)

// Entry signals (need at least 2 conditions + BOS confirmation)
// In debug mode, require only 1 condition
minConditions = debugMode ? 1 : 2
longSignal = bullishConditions >= minConditions and bullishBOS and (htf1_bullish or htf2_bullish)
shortSignal = bearishConditions >= minConditions and bearishBOS and (htf1_bearish or htf2_bearish)

// Debug mode override for testing
if debugMode
    longSignal := longSignal or (bullishBOS and htf1_bullish)
    shortSignal := shortSignal or (bearishBOS and htf1_bearish)

// ==========================================
// Risk Management
// ==========================================

// Calculate dynamic stop loss based on ATR
longStopDistance = atr * atrMultiplier
shortStopDistance = atr * atrMultiplier

// Default fixed values for testing
if debugMode
    longStopDistance := close * 0.01  // 1% stop
    shortStopDistance := close * 0.01  // 1% stop

// Calculate position size based on risk
nqPointValue = 20  // Each point is $20 for NQ
longPositionSize = math.floor(2000 / (longStopDistance * nqPointValue))
shortPositionSize = math.floor(2000 / (shortStopDistance * nqPointValue))

// Ensure at least 1 contract
longPositionSize := math.max(longPositionSize, 1)
shortPositionSize := math.max(shortPositionSize, 1)

// Variables to track entry time
var int entryTime = 0
var float equityCurve = accountSize

// ==========================================
// Strategy Execution
// ==========================================

// Make sure we don't get multiple signals on the same bar
var longEnteredThisBar = false
var shortEnteredThisBar = false

longEnteredThisBar := false
shortEnteredThisBar := false

// Entry conditions
if longSignal and not longEnteredThisBar and strategy.position_size <= 0
    strategy.close_all()
    strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEnteredThisBar := true
    entryTime := time

if shortSignal and not shortEnteredThisBar and strategy.position_size >= 0
    strategy.close_all()
    strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEnteredThisBar := true
    entryTime := time

// Take profit and stop loss orders
if strategy.position_size > 0
    stopPrice = strategy.position_avg_price - longStopDistance
    takeProfitPrice1 = strategy.position_avg_price + longStopDistance
    strategy.exit("Long TP1", "Long", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if high >= takeProfitPrice1
        strategy.exit("Long BE", "Long", stop=strategy.position_avg_price)

if strategy.position_size < 0
    stopPrice = strategy.position_avg_price + shortStopDistance
    takeProfitPrice1 = strategy.position_avg_price - shortStopDistance
    strategy.exit("Short TP1", "Short", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if low <= takeProfitPrice1
        strategy.exit("Short BE", "Short", stop=strategy.position_avg_price)

// Time-based exit
if strategy.position_size != 0
    currentTime = time
    if (currentTime - entryTime) >= timeoutPeriod * 60000  // Convert minutes to milliseconds
        strategy.close_all(comment="Time Exit")

// ==========================================
// Trailing Stop for Account Management
// ==========================================

// Update equity curve
equityCurve := strategy.equity

// Check if profit target is reached or trailing stop is hit
if strategy.equity >= accountSize + profitGoal
    strategy.close_all(comment="Profit Goal")

if strategy.equity >= accountSize + trailingThreshold
    trailingStop = math.max(accountSize, strategy.equity - trailingThreshold)
    if strategy.equity <= trailingStop
        strategy.close_all(comment="Trailing Stop")

// Stop trailing if account reaches the stop trailing threshold
if strategy.equity >= stopsTrailing
    strategy.close_all(comment="Stop Trailing")

// ==========================================
// Plotting
// ==========================================

// Plot entry conditions
plotshape(longSignal, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortSignal, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot current position
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)

// Alert conditions
alertcondition(longSignal, title="Long Entry Signal", message="NQ LONG ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(shortSignal, title="Short Entry Signal", message="NQ SHORT ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and high >= strategy.position_avg_price + longStopDistance, title="Long Take Profit", message="NQ LONG TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and low <= strategy.position_avg_price - shortStopDistance, title="Short Take Profit", message="NQ SHORT TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and low <= strategy.position_avg_price - longStopDistance, title="Long Stop Loss", message="NQ LONG SL: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and high >= strategy.position_avg_price + shortStopDistance, title="Short Stop Loss", message="NQ SHORT SL: {{ticker}}, Price: {{close}}")