Sistema de trading dinámico con stop loss de soporte y resistencia filtrados en el tiempo

ATR EMA SMA TP SL TF
Fecha de creación: 2025-08-21 09:20:08 Última modificación: 2025-08-21 09:20:08
Copiar: 1 Número de Visitas: 203
2
Seguir
319
Seguidores

Sistema de trading dinámico con stop loss de soporte y resistencia filtrados en el tiempo Sistema de trading dinámico con stop loss de soporte y resistencia filtrados en el tiempo

Descripción general

El sistema de negociación de soporte de seguimiento de resistencia de soporte de filtro de tiempo dinámico es una estrategia de negociación de alta calidad que combina una señal de entrada precisa, un filtro de tiempo inteligente y una gestión de riesgo adaptativa. El sistema está diseñado para los operadores que buscan identificar oportunidades de negociación de alta probabilidad en una ventana de tiempo específica, mientras que adopta técnicas de seguimiento dinámico de soporte de pérdidas y administración de posiciones parciales para optimizar el rendimiento de las operaciones.

Principio de estrategia

El principio básico de esta estrategia se basa en la interacción de tres elementos centrales: la admisión precisa, el tiempo óptimo y la gestión del estado.

Sistema de admisión: La estrategia busca oportunidades de reversión mediante la identificación dinámica de los niveles de precios clave. Utiliza un período de retroceso configurable para calcular los niveles de soporte y resistencia y dispara una señal de entrada cuando el precio interactúa con estas áreas clave. Los requisitos de entrada incluyen la interacción del precio con los niveles de soporte / resistencia, la confirmación de la transacción y la confirmación de un filtro de tendencia opcional.

Sistema de filtrado de tiempo: La estrategia implementa un sistema de filtrado de tiempo completo que permite al comerciante definir las mejores horas de negociación. Esto incluye:

  • Configuración de la ventana de tiempo de transacción en formato de 12 horas
  • Es compatible con varias zonas horarias (UTC, EST, PST, CST)
  • Filtrar por días de la semana (sólo los días laborables, los fines de semana o ambos)
  • Evitar automáticamente el horario del almuerzo (generalmente entre las 12:00 y las 13:00)
  • Indicador de tiempo de visualización (Activa / no activa en el momento de la operación a través de un color de fondo)

Sistema de gestión de riesgos: La estrategia utiliza un método de gestión de riesgos en tres niveles:

  1. Sistema de frenado de varios nivelesSe establecen dos objetivos de detención (TP1 y TP2) y se puede optar por la liquidación en la parte TP1
  2. Tecnología de deterioro de seguimiento dinámicoEl mercado de divisas es un mercado de divisas que ofrece tres modos de operación (conservador, equilibrado y radical) que se ajustan automáticamente a la volatilidad del mercado actual.
  3. Gestión inteligente de almacenesPermite a los operadores configurar el número de entradas y el número de posiciones cerradas, y seguir claramente el estado de las posiciones y las pérdidas y ganancias

Ventajas estratégicas

A través de un análisis profundo del código, la estrategia tiene las siguientes ventajas:

  1. Señales de entrada integradasCombinación de comportamiento de precios, confirmación de volumen de transacción y consistencia de tendencias, mejora la fiabilidad de las señales de negociación. El sistema busca puntos de reversión de alta probabilidad cerca de los niveles de soporte y resistencia clave, reduciendo el riesgo de falsas rupturas.

  2. Sistema de filtración de tiempo flexible: Permite a los operadores enfocarse en los mejores momentos de negociación, evitando entornos de mercado de baja liquidez o alta volatilidad. Esto ayuda a aumentar la eficiencia de las operaciones y reduce la posibilidad de negociar en condiciones de mercado desfavorables.

  3. Funciones avanzadas de gestión de riesgos: El sistema de stop loss de seguimiento dinámico se ajusta automáticamente a las fluctuaciones del mercado, lo que ayuda a proteger los beneficios y mantener las posiciones ganadoras. Los objetivos de stop loss de varios niveles y la opción de posición cerrada parcial permiten bloquear los beneficios en diferentes niveles de precios.

  4. Comentarios visuales completosEl sistema proporciona elementos gráficos detallados y paneles de instrumentos en tiempo real para ayudar a los operadores a comprender de manera intuitiva el estado del mercado y el rendimiento de las estrategias. La visualización de la zona de entrada, la visualización de la línea de riesgo / retorno dinámico y el seguimiento del stop loss hacen que el proceso de toma de decisiones de negociación sea más transparente.

  5. Alta personalizaciónDesde los parámetros de la estrategia central hasta los controles de filtración de tiempo y las opciones de gestión de riesgos, la estrategia ofrece una amplia gama de capacidades de personalización para adaptarse a diferentes estilos de negociación y condiciones de mercado.

Riesgo estratégico

Aunque la estrategia tiene muchas ventajas, también tiene algunos riesgos potenciales:

  1. Riesgos de la optimización de parámetrosLa estrategia depende de varios parámetros, como el período de retroceso, el multiplicador ATR y el filtro de tendencia. Estos parámetros necesitan ser cuidadosamente optimizados y ajustados periódicamente para adaptarse a diferentes entornos de mercado. La optimización excesiva de los parámetros puede conducir a una sobreadaptación y un mal desempeño en condiciones de mercado futuras.

  2. Sensibilidad a las condiciones del mercadoEn un mercado de alta volatilidad o baja liquidez, los niveles de soporte y resistencia pueden no ser tan fiables como se espera. En condiciones extremas de mercado, los precios pueden romper rápidamente los niveles clave, lo que provoca que se activen los paros.

  3. Limitación del filtro de tiempoAunque el filtro de tiempo puede ayudar a evitar los momentos de negociación desfavorables, también puede causar la pérdida de algunas oportunidades de negociación de alta calidad. Los mercados no siempre siguen un patrón de tiempo predeterminado, especialmente durante eventos importantes o noticias inesperadas.

  4. Seguimiento de trampas de deterioroEn un mercado convulso, los tracking stop loss dinámicos pueden desencadenarse prematuramente, lo que lleva a que las operaciones que podrían haber sido rentables terminen antes de tiempo. Las diferentes configuraciones de tracking stop loss (conservadoras, equilibradas y radicales) se comportan de manera diferente en diferentes entornos de mercado.

  5. Conflicto de señalesCuando el precio se acerca a varios niveles de soporte y resistencia, o cuando el filtro de tiempo choca con la señal de entrada, puede producirse una señal mixta. Esto requiere un juicio adicional o reglas de decisión más complejas.

Dirección de optimización de la estrategia

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

  1. Ajuste de los parámetros de adaptaciónImplementación de un mecanismo para ajustar automáticamente los parámetros clave, como el período de retroceso y el multiplicador ATR, en función de la volatilidad del mercado y el rendimiento de las transacciones recientes. Esto puede ayudar a las estrategias a adaptarse mejor a diferentes entornos de mercado sin necesidad de intervención manual.

  2. Mejorar el análisis de la estructura del mercadoLa integración de métodos más complejos de identificación de la estructura de precios, como la identificación de áreas de soporte y resistencia a niveles más altos, la identificación de canales de tendencia o de formas de precios. Esto puede mejorar la calidad y la fiabilidad de la señal de entrada.

  3. Optimización de la lógica de filtro de tiempo: Identificar las mejores horas de negociación en un mercado específico a través del análisis de datos y ajustar automáticamente la ventana de horas de negociación en función del rendimiento histórico. Considerar la integración de filtros para patrones estacionales y eventos específicos del mercado (como la publicación de datos económicos).

  4. Mejorar el mecanismo de gestión de riesgosDiseñar un sistema de gestión de posiciones más inteligente que ajuste dinámicamente el tamaño de las posiciones en función de la volatilidad histórica, las condiciones actuales del mercado y el rendimiento de la estrategia.

  5. Modelos de aprendizaje automático integrados: El uso de algoritmos de aprendizaje automático para predecir la fiabilidad de los puntos de soporte y resistencia, o estimar la probabilidad de éxito de una señal de entrada en condiciones de mercado específicas. Esto puede ayudar a filtrar señales de comercio de baja calidad potenciales.

Resumir

El sistema de negociación de stop loss de seguimiento de resistencia de soporte de filtro de tiempo dinámico es una estrategia de negociación completa que combina una señal de entrada precisa, un filtro de tiempo inteligente y una gestión de riesgo adaptativa. Mejora la calidad de la negociación buscando oportunidades de reversión de alta probabilidad en los puntos clave de soporte y resistencia, al tiempo que utiliza el filtro de tiempo y la confirmación de la transacción.

Las principales ventajas de esta estrategia residen en su sistema completo de filtración de tiempo, su tecnología de seguimiento dinámico de stop loss y su interfaz de usuario altamente visual. En conjunto, estas funciones crean una herramienta de negociación poderosa y flexible que se adapta a una variedad de condiciones de mercado y estilos de negociación.

Sin embargo, para aprovechar al máximo el potencial de la estrategia, los comerciantes necesitan optimizar cuidadosamente los parámetros, comprender sus características de rendimiento en diferentes entornos de mercado y, posiblemente, hacer ajustes personalizados en función de los objetivos específicos del mercado y de las operaciones individuales. Mediante la implementación de las medidas de optimización recomendadas, se puede mejorar aún más el rendimiento y la robustez de la estrategia, proporcionando a los comerciantes herramientas de análisis de mercado y ejecución de operaciones más fiables.

Código Fuente de la Estrategia
/*backtest
start: 2025-08-13 00:00:00
end: 2025-08-20 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT","balance":5000}]
*/

//@version=5
strategy("FlowStateTrader", overlay=true)

// Input Parameters
lookbackPeriod = input.int(20, "Lookback Period for Key Levels", minval=5, maxval=100)
atrPeriod = input.int(14, "ATR Period", minval=5, maxval=50)
atrMultiplierSL = input.float(1.5, "SL ATR Multiplier", minval=0.5, maxval=5.0, step=0.1)
atrMultiplierTP1 = input.float(1.5, "TP1 ATR Multiplier", minval=0.5, maxval=5.0, step=0.1)
atrMultiplierTP2 = input.float(2.0, "TP2 ATR Multiplier", minval=0.5, maxval=5.0, step=0.1)
rewardToRisk = input.float(2.0, "Reward to Risk Ratio", minval=1.0, maxval=5.0, step=0.1)

// Trend Filter Settings
enableTrendFilter = input.bool(true, "Enable Trend Filter")
trendMAPeriod = input.int(20, "Trend MA Period", minval=5, maxval=200)
trendMAType = input.string("EMA", "Trend MA Type", options=["EMA", "SMA"])

// TIME FILTER SETTINGS
enableTimeFilter = input.bool(false, "Enable Time-Based Filter", tooltip="Filter trades based on specific time windows")

// 12-hour format time inputs
startHour12 = input.int(9, "Start Hour (1-12)", minval=1, maxval=12, tooltip="Trading start hour in 12-hour format")
startAMPM = input.string("AM", "Start AM/PM", options=["AM", "PM"])
endHour12 = input.int(4, "End Hour (1-12)", minval=1, maxval=12, tooltip="Trading end hour in 12-hour format") 
endAMPM = input.string("PM", "End AM/PM", options=["AM", "PM"])

// Timezone selection
timeZone = input.string("UTC", "Time Zone", options=["UTC", "EST", "PST", "CST"], tooltip="Time zone for trading hours")

// Additional controls
avoidLunchHour = input.bool(true, "Avoid Lunch Hour (12:00-1:00 PM)", tooltip="Skip trading during typical lunch break")
weekendsOnly = input.bool(false, "Weekends Only", tooltip="Only trade on weekends")
weekdaysOnly = input.bool(false, "Weekdays Only", tooltip="Only trade on weekdays")

// Strategy Settings
entryQty = input.int(10, "Entry Quantity (Contracts)", minval=1, maxval=1000)
enablePartialClose = input.bool(true, "Enable Partial Close at TP1")
partialCloseQty = input.int(1, "Contracts to Close at TP1", minval=1, maxval=100)
enableAlerts = input.bool(true, "Enable Strategy Alerts")

// Dashboard Settings
dashboardSize = input.string("Medium", "Dashboard Size", options=["Small", "Medium", "Large"], tooltip="Control the size of the information dashboard")
enableScorecard = input.bool(true, "Enable Performance Scorecard", tooltip="Show performance metrics in lower right corner")

// Trailing Stop Settings
enableTrailingStop = input.bool(true, "Enable Trailing Stop")
trailMode = input.string("Balanced", "Trailing Stop Mode", options=["Conservative", "Balanced", "Aggressive"], tooltip="Conservative: Protect more profit | Balanced: Good middle ground | Aggressive: Let winners run longer")

// Set trailing parameters based on mode
trailActivationMultiplier = trailMode == "Conservative" ? 0.8 : trailMode == "Balanced" ? 1.0 : 1.2
trailDistanceMultiplier = trailMode == "Conservative" ? 0.6 : trailMode == "Balanced" ? 0.8 : 1.0

// TIME FILTER FUNCTIONS
// Convert 12-hour format to 24-hour format
convertTo24Hour(hour12, ampm) =>
    var int hour24 = na
    if ampm == "AM"
        hour24 := hour12 == 12 ? 0 : hour12
    else // PM
        hour24 := hour12 == 12 ? 12 : hour12 + 12
    hour24

// Convert timezone to UTC offset
getUTCOffset(tz) =>
    var int offset = na
    if tz == "UTC"
        offset := 0
    else if tz == "EST"
        offset := -5  // EST is UTC-5
    else if tz == "CST" 
        offset := -6  // CST is UTC-6
    else if tz == "PST"
        offset := -8  // PST is UTC-8
    offset

getCurrentHour() =>
    hour(time, "UTC")

getCurrentDayOfWeek() =>
    dayofweek(time)

isWeekend() =>
    currentDay = getCurrentDayOfWeek()
    currentDay == dayofweek.saturday or currentDay == dayofweek.sunday

isWeekday() =>
    not isWeekend()

isInTradingWindow() =>
    if not enableTimeFilter
        true
    else
        // Convert 12-hour inputs to 24-hour UTC
        startHour24 = convertTo24Hour(startHour12, startAMPM)
        endHour24 = convertTo24Hour(endHour12, endAMPM)
        utcOffset = getUTCOffset(timeZone)
        
        // Convert local time to UTC
        startHourUTC = (startHour24 - utcOffset + 24) % 24
        endHourUTC = (endHour24 - utcOffset + 24) % 24
        
        currentHour = getCurrentHour()
        
        // Handle trading window logic
        var bool inWindow = false
        
        // Handle same-day window vs overnight window
        if startHourUTC <= endHourUTC
            // Same day window (e.g., 9 AM to 4 PM)
            inWindow := currentHour >= startHourUTC and currentHour <= endHourUTC
        else
            // Overnight window (e.g., 10 PM to 6 AM)
            inWindow := currentHour >= startHourUTC or currentHour <= endHourUTC
        
        // Apply day-of-week filters
        if weekendsOnly and not isWeekend()
            inWindow := false
        if weekdaysOnly and not isWeekday()
            inWindow := false
            
        // Apply lunch hour filter (12:00-1:00 PM in selected timezone)
        if avoidLunchHour and inWindow
            lunchStart24 = 12  // 12 PM
            lunchEnd24 = 13    // 1 PM
            lunchStartUTC = (lunchStart24 - utcOffset + 24) % 24
            lunchEndUTC = (lunchEnd24 - utcOffset + 24) % 24
            
            // Check if current hour falls in lunch period
            if lunchStartUTC <= lunchEndUTC
                // Normal case: lunch doesn't cross midnight
                if currentHour >= lunchStartUTC and currentHour < lunchEndUTC
                    inWindow := false
            else
                // Edge case: lunch period crosses midnight (shouldn't happen but safety check)
                if currentHour >= lunchStartUTC or currentHour < lunchEndUTC
                    inWindow := false
        
        inWindow

// Combined time filter
isGoodTradingTime() =>
    isInTradingWindow()

// ATR and Volume Calculation
atr = ta.atr(atrPeriod)
volumeSMA = ta.sma(volume, atrPeriod)

// Trend Filter
trendMA = enableTrendFilter ? (trendMAType == "EMA" ? ta.ema(close, trendMAPeriod) : ta.sma(close, trendMAPeriod)) : na
isBullishTrend = enableTrendFilter ? close > trendMA : true
isBearishTrend = enableTrendFilter ? close < trendMA : true

// Key Levels Identification (Support & Resistance Zones)
support = ta.lowest(low, lookbackPeriod)
resistance = ta.highest(high, lookbackPeriod)
supportBuffer = support - atr * 0.5
resistanceBuffer = resistance + atr * 0.5

// Define Entry Conditions (with time filter)
isBullishEntry = (close > supportBuffer) and (low <= support) and (volume > volumeSMA) and isBullishTrend and isGoodTradingTime()
isBearishEntry = (close < resistanceBuffer) and (high >= resistance) and (volume > volumeSMA) and isBearishTrend and isGoodTradingTime()

// Calculate Stop Loss and Take Profit Levels
bullishSL = support - atr * atrMultiplierSL
bullishTP1 = support + atr * rewardToRisk * atrMultiplierTP1
bullishTP2 = support + atr * rewardToRisk * atrMultiplierTP2

bearishSL = resistance + atr * atrMultiplierSL
bearishTP1 = resistance - atr * rewardToRisk * atrMultiplierTP1
bearishTP2 = resistance - atr * rewardToRisk * atrMultiplierTP2

// Strategy Position Management
var float longEntryPrice = na
var float shortEntryPrice = na
var bool tp1HitLong = false
var bool tp1HitShort = false

// Trailing Stop Variables
var float longTrailStop = na
var float shortTrailStop = na
var bool longTrailActive = false
var bool shortTrailActive = false

// Calculate position sizing
finalQty = entryQty

// Long Entry
if isBullishEntry and strategy.position_size == 0
    strategy.entry("Long", strategy.long, qty=finalQty)
    longEntryPrice := close
    tp1HitLong := false
    // Reset trailing stop variables
    longTrailStop := na
    longTrailActive := false
    if enableAlerts
        alert("Long Entry Signal at " + str.tostring(close) + " - Qty: " + str.tostring(finalQty), alert.freq_once_per_bar)

// Short Entry
if isBearishEntry and strategy.position_size == 0
    strategy.entry("Short", strategy.short, qty=finalQty)
    shortEntryPrice := close
    tp1HitShort := false
    // Reset trailing stop variables
    shortTrailStop := na
    shortTrailActive := false
    if enableAlerts
        alert("Short Entry Signal at " + str.tostring(close) + " - Qty: " + str.tostring(finalQty), alert.freq_once_per_bar)

// Long Position Management
if strategy.position_size > 0
    // Calculate current profit
    currentProfit = close - strategy.position_avg_price
    profitInATR = currentProfit / atr
    
    // Trailing Stop Logic
    if enableTrailingStop and profitInATR >= trailActivationMultiplier
        // Activate trailing stop
        if not longTrailActive
            longTrailActive := true
            longTrailStop := close - atr * trailDistanceMultiplier
        else
            // Update trailing stop (only move up, never down)
            newTrailStop = close - atr * trailDistanceMultiplier
            longTrailStop := math.max(longTrailStop, newTrailStop)
    
    // Determine which stop loss to use
    effectiveStopLoss = enableTrailingStop and longTrailActive ? longTrailStop : bullishSL
    
    // Stop Loss (either original or trailing)
    strategy.exit("Long SL", "Long", stop=effectiveStopLoss)
    
    // Take Profit 1 (Partial Close by Contracts)
    if enablePartialClose and not tp1HitLong and high >= bullishTP1 and strategy.position_size >= partialCloseQty
        strategy.close("Long", qty=partialCloseQty, comment="Long TP1", immediately=true)
        tp1HitLong := true
    
    // Take Profit 2 (Close Remaining Position) or Full Close if Partial is Disabled
    if (enablePartialClose and tp1HitLong and high >= bullishTP2) or (not enablePartialClose and high >= bullishTP1)
        strategy.close("Long", comment=enablePartialClose ? "Long TP2" : "Long TP1", immediately=true)

// Short Position Management
if strategy.position_size < 0
    // Calculate current profit (for shorts, profit when price goes down)
    currentProfit = strategy.position_avg_price - close
    profitInATR = currentProfit / atr
    
    // Trailing Stop Logic
    if enableTrailingStop and profitInATR >= trailActivationMultiplier
        // Activate trailing stop
        if not shortTrailActive
            shortTrailActive := true
            shortTrailStop := close + atr * trailDistanceMultiplier
        else
            // Update trailing stop (only move down, never up)
            newTrailStop = close + atr * trailDistanceMultiplier
            shortTrailStop := math.min(shortTrailStop, newTrailStop)
    
    // Determine which stop loss to use
    effectiveStopLoss = enableTrailingStop and shortTrailActive ? shortTrailStop : bearishSL
    
    // Stop Loss (either original or trailing)
    strategy.exit("Short SL", "Short", stop=effectiveStopLoss)
    
    // Take Profit 1 (Partial Close by Contracts)
    if enablePartialClose and not tp1HitShort and low <= bearishTP1 and math.abs(strategy.position_size) >= partialCloseQty
        strategy.close("Short", qty=partialCloseQty, comment="Short TP1", immediately=true)
        tp1HitShort := true
    
    // Take Profit 2 (Close Remaining Position) or Full Close if Partial is Disabled
    if (enablePartialClose and tp1HitShort and low <= bearishTP2) or (not enablePartialClose and low <= bearishTP1)
        strategy.close("Short", comment=enablePartialClose ? "Short TP2" : "Short TP1", immediately=true)

// Reset flags when position closes
if strategy.position_size == 0
    tp1HitLong := false
    tp1HitShort := false
    // Reset trailing stop variables
    longTrailStop := na
    shortTrailStop := na
    longTrailActive := false
    shortTrailActive := false

// Visualization - Entry Zones
var box bullishBox = na
var box bearishBox = na
var label bullishZoneLabel = na
var label bearishZoneLabel = na

// Bullish Entry Zone


// Bearish Entry Zone


// Visualization - Risk/Reward Lines for Active Positions
var line longTP1Line = na
var line longTP2Line = na
var line longSLLine = na
var line shortTP1Line = na
var line shortTP2Line = na
var line shortSLLine = na

// Labels for TP/SL Values


// Short Position Lines and Labels


// Support and Resistance Lines
plot(support, "Support", color=color.green, linewidth=1, style=plot.style_line)
plot(resistance, "Resistance", color=color.red, linewidth=1, style=plot.style_line)

// Plot Trend MA if enabled
plot(enableTrendFilter ? trendMA : na, "Trend MA", color=color.blue, linewidth=2)

// Plot Trailing Stops if active
plot(strategy.position_size > 0 and longTrailActive ? longTrailStop : na, "Long Trail Stop", color=color.orange, linewidth=2, style=plot.style_stepline)
plot(strategy.position_size < 0 and shortTrailActive ? shortTrailStop : na, "Short Trail Stop", color=color.orange, linewidth=2, style=plot.style_stepline)