Marco de backtesting de indicadores de confirmación de múltiples fuentes: un sistema de prueba comercial cuantitativo que integra la gestión de riesgos y la detección de señales

SMA EMA MACD RSI TP/SL R/R ROI VWAP ATR
Fecha de creación: 2025-07-08 17:21:11 Última modificación: 2025-07-08 17:21:11
Copiar: 0 Número de Visitas: 256
2
Seguir
319
Seguidores

Marco de backtesting de indicadores de confirmación de múltiples fuentes: un sistema de prueba comercial cuantitativo que integra la gestión de riesgos y la detección de señales Marco de backtesting de indicadores de confirmación de múltiples fuentes: un sistema de prueba comercial cuantitativo que integra la gestión de riesgos y la detección de señales

Descripción general

El marco de retroalimentación de indicadores de confirmación de múltiples fuentes es un sistema de prueba de operaciones cuantitativas de nivel profesional diseñado específicamente para evaluar indicadores y señales de negociación personalizados. El marco integra una variedad de métodos de detección de señales, un sistema de filtración de confirmación avanzada y funciones de gestión de riesgos profesionales que permiten a los operadores probar sus estrategias de negociación de manera completa. La ventaja central del sistema radica en su flexibilidad, que permite a los usuarios conectar cualquier indicador personalizado o estudio integrado y detectar señales de varias maneras, incluidos los cambios de valor, los puntos cruzados y los disparos de valoración.

Principio de estrategia

El principio central de la estrategia es proporcionar un entorno de prueba completo que permita a los operadores evaluar la efectividad de los diversos indicadores. El código realiza las siguientes funciones clave:

  1. Métodos de detección de señales múltiplesLas funciones detectLongSignal () y detectShortSignal () permiten cinco métodos diferentes de detección de señales:

    • Cambio de valor: se activa cuando el valor del indicador cambia y es mayor que 0
    • Cruce hacia arriba: se activa cuando el indicador cruza el umbral hacia arriba
    • Cruce hacia abajo: se activa cuando el indicador cruza el umbral hacia abajo
    • Valor por encima del umbral: se activa cuando el valor del indicador pasa de ser por debajo del umbral a ser por encima de él
    • Valor por debajo del umbral: se activa cuando el valor del indicador pasa de ser por encima del umbral a ser por debajo del umbral
  2. Sistema de confirmación: Con las funciones longConfirmation ((() y shortConfirmation ((() se implementa un sistema de confirmación de múltiples fuentes, que requiere que las señales de transacción cumplan con condiciones adicionales para poder ejecutarse dentro de un período de retroceso especificado. Esta función reduce significativamente las señales falsas.

  3. Entradas y salidas lógicasLas entradas y salidas de las transacciones se administran mediante las funciones estrategia.entry y estrategia.exit. Las condiciones de entrada se determinan conjuntamente por el sistema de detección y confirmación de señales, mientras que las salidas se pueden lograr de varias maneras:

    • Detención fija / deterioro
    • Señales de salida personalizadas
    • Función de reserva
  4. La lógica de PopperLa estrategia automáticamente transfiere el stop loss al precio de entrada cuando la operación alcanza el número de puntos de ventaja especificado, protegiendo los beneficios obtenidos. Esto se realiza mediante la detección de la diferencia entre el precio actual y el precio de entrada y la modificación del nivel de stop loss cuando se alcanza el número de puntos establecido por el breakEvenTrigger.

  5. Visualización y vigilanciaLa estrategia utiliza la función plotshape para marcar todas las señales de entrada y salida en la gráfica y crear una tabla de estado en tiempo real a través de table.new, que muestra la configuración de la estrategia actual y el estado de la operación.

Ventajas estratégicas

  1. Alta flexibilidad: La estrategia permite conectar cualquier indicador como fuente de señal, lo que lo hace aplicable a una variedad de estilos de negociación y condiciones de mercado. El usuario puede probar diferentes combinaciones de indicadores simplemente cambiando la fuente de entrada.

  2. Sistemas de filtración de varias capasA través del filtro de confirmación, la estrategia puede requerir que se cumplan varias condiciones al mismo tiempo para ejecutar una operación, lo que reduce significativamente las señales de error. Este método de confirmación de múltiples fuentes simula la práctica de los comerciantes profesionales que buscan la consistencia de varios indicadores antes de tomar decisiones comerciales.

  3. Gestión integral de los riesgosLa estrategia incluye funciones de gestión de riesgos profesionales, que incluyen:

    • Punto de parada / parada de pérdida preestablecido
    • Función de seguridad dinámica
    • Señales de salida personalizadas Estas funciones aseguran que los operadores puedan simular las medidas de control de riesgo en un entorno de negociación real durante la prueba.
  4. Comentarios en tiempo real y monitoreoA través de señales y tablas de estado, el comerciante puede ver intuitivamente el estado de funcionamiento y el rendimiento de la estrategia, lo que facilita la puesta en marcha y la optimización.

  5. CompatibilidadLa estrategia es compatible con Pine Script v6, puede ejecutarse en cualquier plataforma de negociación que soporte esta versión, y admite la función de retroalimentación para que los operadores puedan evaluar el rendimiento histórico.

Riesgo estratégico

  1. Dependencia de detección de señalesLa eficacia de la estrategia depende en gran medida del método de detección de señales y la configuración de los umbrales elegidos. Una configuración inadecuada puede provocar demasiadas señales falsas o perder oportunidades de negociación importantes. Se recomienda a los operadores que prueben varias combinaciones de configuraciones en diferentes condiciones de mercado para encontrar el método de detección de señales que mejor se adapte a un indicador específico.

  2. Confirmación del riesgo de filtración: Aunque los sistemas de confirmación de múltiples fuentes pueden reducir las señales falsas, también pueden causar la pérdida de oportunidades de negociación rentables. Excesivamente estrictas exigencias de confirmación pueden hacer que la estrategia pierda el movimiento de mercado de rápido desarrollo. La solución es equilibrar el rigor de los sistemas de confirmación o diseñar diferentes criterios de confirmación para diferentes estados de mercado.

  3. Limitaciones de las paradas fijasEl uso de paradas/pérdidas de puntos fijos puede no ser adecuado para todas las condiciones del mercado, especialmente en mercados con gran variación de volatilidad. Se recomienda que los puntos de paradas/pérdidas estén vinculados a indicadores de volatilidad del mercado (como el ATR) para adaptarse a diferentes circunstancias del mercado.

  4. Diferencias entre la detección y el disco duroTodos los resultados de la retracción tienen el riesgo de diferencias con las operaciones reales, ya que la retracción no puede simular completamente los puntos de deslizamiento, los costos de las operaciones y los problemas de liquidez. El comerciante debe verificar el rendimiento de la estrategia en un entorno simulado antes de negociar en el entorno real.

  5. Complejidad del código: La complejidad de las políticas puede aumentar la dificultad de la puesta en marcha y el mantenimiento. Las notas detalladas y el diseño modular pueden ayudar a manejar esta complejidad y asegurar la mantenbilidad del código.

Dirección de optimización de la estrategia

  1. Gestión de riesgos dinámicosLas estrategias actuales utilizan paros/pérdidas de un número fijo de puntos, que pueden ser optimizados para un sistema de gestión de riesgos dinámico basado en la volatilidad del mercado. Por ejemplo, el parón de paros/pérdidas está vinculado al ATR (Average True Range), ampliando el rango de paros cuando aumenta la volatilidad y reduciendo el rango de paros cuando disminuye la volatilidad.

  2. Mejoras en el sistema de confirmación: El sistema de confirmación actual puede ampliarse para incluir más condiciones de filtración, como filtración de tiempo (para evitar el comercio en un momento específico del mercado), filtración de volatilidad (para evitar el comercio en un entorno de baja volatilidad) o filtración de tendencias (para negociar solo en la dirección que coincide con la tendencia principal). Esto reducirá aún más las falsas señales y aumentará la solidez de la estrategia.

  3. Administración de posiciones parciales: La estrategia puede agregar funciones de administración de posiciones parciales, permitiendo entradas y salidas por lotes, en lugar de abrir o cerrar toda la posición de una vez. Esta estrategia puede reducir el riesgo de entradas / salidas individuales y puede mejorar el rendimiento de la estrategia en general.

  4. Mejoras en el aprendizaje automáticoSe pueden introducir algoritmos de aprendizaje automático para optimizar los parámetros de la señal y los ajustes de riesgo, y ajustar automáticamente los parámetros de la estrategia según los datos históricos para adaptarse a diferentes entornos de mercado.

  5. Aumentar las mediciones de rendimientoAunque las estrategias ya ofrecen un monitoreo básico de estado, se pueden agregar más indicadores de rendimiento, como la proporción de Sharpe, el máximo retiro y el porcentaje de ganancias y pérdidas, para proporcionar una evaluación más completa de la estrategia. Estos indicadores se pueden mostrar en las tablas de estado para ayudar a los comerciantes a evaluar mejor el rendimiento de la estrategia.

Resumir

El Multi-Source Confirmation Indicator Feedback Framework es un sistema de prueba de transacciones cuantitativo completo que ofrece a los operadores una herramienta poderosa para evaluar y optimizar sus estrategias de negociación mediante la integración de múltiples métodos de detección de señales, un sistema de confirmación multicapa y funciones de gestión de riesgos profesionales. La principal ventaja del marco reside en su flexibilidad y personalización, que permite a los operadores probar casi cualquier tipo de combinación de indicadores y métodos de generación de señales.

A pesar de la existencia de algunos riesgos y limitaciones inherentes, como la dependencia de detección de señales y las limitaciones de los parámetros de riesgo fijos, estos problemas se pueden resolver mediante la dirección de optimización sugerida, como la implementación de gestión de riesgos dinámica, el aumento de los sistemas de confirmación y la introducción de la gestión de posiciones parciales. A través de estas optimizaciones, el marco puede mejorar aún más su eficacia y adaptabilidad, convirtiéndose en una herramienta valiosa en el arsenal de los comerciantes.

En resumen, el marco de retroalimentación de indicadores de confirmación de múltiples fuentes representa un enfoque profesional y sistemático para probar y evaluar estrategias de negociación que va más allá de la simple generación de señales, incorporando la gestión del riesgo y la confirmación de múltiples capas, que son componentes clave de un sistema de negociación exitoso. Para los operadores que buscan crear y probar estrategias de negociación personalizadas, el marco ofrece una solución integral.

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

//@version=6
strategy("FULLY FUNCTIONAL INDICATOR TESTER", overlay=true, margin_long=100, margin_short=100)

// Entry/Exit Signal Inputs
longEntry = input.source(close, 'Long Entry Trigger', 'Source for long signal (connect your indicator here)')
shortEntry = input.source(close, 'Short Entry Trigger', 'Source for short signal (connect your indicator here)')
activateLongExit = input.bool(false, 'Activate Long Exit Signals')
longExit = input.source(high, 'Long Exit Trigger', 'Source for long exit signal')
activateShortExit = input.bool(false, 'Activate Short Exit Signals')
shortExit = input.source(low, 'Short Exit Trigger', 'Source for short exit signal')

// Signal Detection Method
signalMethod = input.string('Value Change', 'Signal Detection Method', options=['Value Change', 'Crossover Above', 'Crossover Below', 'Value Above Threshold', 'Value Below Threshold'])
signalThreshold = input.float(0, 'Signal Threshold', tooltip='Threshold value for signal detection methods')

// Take Profit and Stop Loss
fixedTp = input.int(0, 'Static TP (in ticks)', 0, tooltip='0 = disabled')
initialSL = input.int(0, 'Initial SL (in ticks)', 0, tooltip='0 = disabled')

// Break Even Settings
breakEvenTrigger = input.int(0, 'Break Even Trigger (in ticks)', 0, tooltip='Move SL to break even after this many ticks profit. 0 = disabled')

// Confluence Settings
useConfluence = input.bool(false, 'Use Confluence Filter', 'Activate confluence filter for entries')
longConfluence = input.source(high, 'Long Signal Confluence', 'Source for long confluence filter')
longConfluenceTrigger = input.source(low, 'Long Confluence Trigger', 'Value that must be below confluence source for long entry')
shortConfluence = input.source(high, 'Short Signal Confluence', 'Source for short confluence filter')
shortConfluenceTrigger = input.source(low, 'Short Confluence Trigger', 'Value that must be above confluence source for short entry')
confluenceLookback = input.int(0, 'Confluence Lookback Period', 0, 10, 1, 'Number of candles to look back for confluence')

// Variables to track entry prices for break-even
var float longEntryPrice = na
var float shortEntryPrice = na

// Signal Detection Functions
detectLongSignal() =>
    switch signalMethod
        'Value Change' => longEntry != longEntry[1] and longEntry > 0
        'Crossover Above' => ta.crossover(longEntry, signalThreshold)
        'Crossover Below' => ta.crossunder(longEntry, signalThreshold)
        'Value Above Threshold' => longEntry > signalThreshold and longEntry[1] <= signalThreshold
        'Value Below Threshold' => longEntry < signalThreshold and longEntry[1] >= signalThreshold
        => false

detectShortSignal() =>
    switch signalMethod
        'Value Change' => shortEntry != shortEntry[1] and shortEntry > 0
        'Crossover Above' => ta.crossover(shortEntry, signalThreshold)
        'Crossover Below' => ta.crossunder(shortEntry, signalThreshold)
        'Value Above Threshold' => shortEntry > signalThreshold and shortEntry[1] <= signalThreshold
        'Value Below Threshold' => shortEntry < signalThreshold and shortEntry[1] >= signalThreshold
        => false

detectLongExit() =>
    switch signalMethod
        'Value Change' => longExit != longExit[1] and longExit > 0
        'Crossover Above' => ta.crossover(longExit, signalThreshold)
        'Crossover Below' => ta.crossunder(longExit, signalThreshold)
        'Value Above Threshold' => longExit > signalThreshold and longExit[1] <= signalThreshold
        'Value Below Threshold' => longExit < signalThreshold and longExit[1] >= signalThreshold
        => false

detectShortExit() =>
    switch signalMethod
        'Value Change' => shortExit != shortExit[1] and shortExit > 0
        'Crossover Above' => ta.crossover(shortExit, signalThreshold)
        'Crossover Below' => ta.crossunder(shortExit, signalThreshold)
        'Value Above Threshold' => shortExit > signalThreshold and shortExit[1] <= signalThreshold
        'Value Below Threshold' => shortExit < signalThreshold and shortExit[1] >= signalThreshold
        => false

// Confluence confirmation functions
longConfirmation() => 
    confirmation = false
    if confluenceLookback == 0
        confirmation := longConfluenceTrigger < longConfluence
    else
        for x = 0 to confluenceLookback
            if longConfluenceTrigger[x] < longConfluence[x]
                confirmation := true
                break
    confirmation

shortConfirmation() => 
    confirmation = false
    if confluenceLookback == 0
        confirmation := shortConfluenceTrigger > shortConfluence
    else
        for x = 0 to confluenceLookback
            if shortConfluenceTrigger[x] > shortConfluence[x]
                confirmation := true
                break
    confirmation

// Entry conditions
longConfirmed = useConfluence ? longConfirmation() : true
shortConfirmed = useConfluence ? shortConfirmation() : true

longCondition = detectLongSignal() and longConfirmed
shortCondition = detectShortSignal() and shortConfirmed

// Entry logic
if (longCondition and strategy.opentrades == 0)
    strategy.entry('Long', strategy.long)
    longEntryPrice := close
    // Set initial exit orders
    if fixedTp > 0 or initialSL > 0
        strategy.exit('Long Exit', 'Long', 
                     profit = fixedTp > 0 ? fixedTp : na, 
                     loss = initialSL > 0 ? initialSL : na, 
                     comment_profit = 'TP Hit', 
                     comment_loss = 'SL Hit')

if (shortCondition and strategy.opentrades == 0)
    strategy.entry('Short', strategy.short)
    shortEntryPrice := close
    // Set initial exit orders
    if fixedTp > 0 or initialSL > 0
        strategy.exit('Short Exit', 'Short', 
                     profit = fixedTp > 0 ? fixedTp : na, 
                     loss = initialSL > 0 ? initialSL : na, 
                     comment_profit = 'TP Hit', 
                     comment_loss = 'SL Hit')

// Custom exit signal logic
if (activateLongExit and detectLongExit() and strategy.position_size > 0)
    strategy.close('Long', 'Custom Long Exit')

if (activateShortExit and detectShortExit() and strategy.position_size < 0)
    strategy.close('Short', 'Custom Short Exit')

// Break-even logic
if (breakEvenTrigger > 0)
    // Long position break-even
    if (strategy.position_size > 0 and not na(longEntryPrice))
        ticksProfit = math.round((high - longEntryPrice) / syminfo.mintick)
        if (ticksProfit >= breakEvenTrigger)
            strategy.exit('Long Exit', 'Long', stop = longEntryPrice, comment_loss = 'Break Even')
    
    // Short position break-even  
    if (strategy.position_size < 0 and not na(shortEntryPrice))
        ticksProfit = math.round((shortEntryPrice - low) / syminfo.mintick)
        if (ticksProfit >= breakEvenTrigger)
            strategy.exit('Short Exit', 'Short', stop = shortEntryPrice, comment_loss = 'Break Even')

// Reset entry prices when no position
if (strategy.position_size == 0)
    longEntryPrice := na
    shortEntryPrice := na

// Plot signals for debugging
plotshape(longCondition, title='Long Signal', location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortCondition, title='Short Signal', location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)
plotshape(activateLongExit and detectLongExit() and strategy.position_size > 0, title='Long Exit', location=location.abovebar, color=color.orange, style=shape.xcross, size=size.small)
plotshape(activateShortExit and detectShortExit() and strategy.position_size < 0, title='Short Exit', location=location.belowbar, color=color.orange, style=shape.xcross, size=size.small)

// Display current settings in a table for easy reference
if barstate.islast
    var table infoTable = table.new(position.top_right, 2, 8, bgcolor=color.white, border_width=1)
    table.cell(infoTable, 0, 0, "Signal Method:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 0, signalMethod, text_color=color.black)
    table.cell(infoTable, 0, 1, "Threshold:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 1, str.tostring(signalThreshold), text_color=color.black)
    table.cell(infoTable, 0, 2, "TP (ticks):", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 2, str.tostring(fixedTp), text_color=color.black)
    table.cell(infoTable, 0, 3, "SL (ticks):", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 3, str.tostring(initialSL), text_color=color.black)
    table.cell(infoTable, 0, 4, "Break Even:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 4, str.tostring(breakEvenTrigger), text_color=color.black)
    table.cell(infoTable, 0, 5, "Confluence:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 5, useConfluence ? "ON" : "OFF", text_color=color.black)
    table.cell(infoTable, 0, 6, "Position:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 6, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT", text_color=color.black)
    table.cell(infoTable, 0, 7, "Status:", text_color=color.black, bgcolor=color.gray)
    table.cell(infoTable, 1, 7, "FULLY FUNCTIONAL", text_color=color.green)