Estrategia de trading cuantitativo adaptativo con pivote de resistencia y soporte dinámico

ATR Pivot
Fecha de creación: 2025-01-10 15:08:24 Última modificación: 2025-01-10 15:08:24
Copiar: 3 Número de Visitas: 416
1
Seguir
1617
Seguidores

Estrategia de trading cuantitativo adaptativo con pivote de resistencia y soporte dinámico

Descripción general

Esta estrategia es un sistema de trading adaptativo que identifica dinámicamente los niveles de soporte y resistencia en función de los puntos pivote de precios. Determina niveles de precios clave calculando máximos y mínimos locales en tiempo real y ejecuta operaciones en función de ello. El núcleo de esta estrategia radica en su naturaleza dinámica, que puede ajustar los parámetros comerciales en el tiempo según los cambios en las condiciones del mercado y es adecuada para mercados con tendencias y volátiles.

Principio de estrategia

La lógica central de la estrategia se basa en los siguientes elementos clave:

  1. Cálculo del punto de pivote dinámico: utiliza un parámetro de longitud de pivote ajustable (el valor predeterminado es 2) para identificar máximos y mínimos locales
  2. Rango de soporte y resistencia: establezca un rango de porcentaje (predeterminado 0,4 %) basado en el punto pivote para definir el área de negociación efectiva
  3. Generación de señales comerciales: cuando el precio rompe el nivel de soporte desde abajo, se genera una señal larga, y cuando el precio rompe el nivel de resistencia desde arriba, se genera una señal corta.
  4. Control de riesgos: se adoptan configuraciones dinámicas de stop loss (10 %) y de beneficio (27 %), y el tamaño de la posición se ajusta automáticamente de acuerdo con el capital de la cuenta.

Ventajas estratégicas

  1. Fuerte adaptabilidad: la estrategia puede ajustar dinámicamente las posiciones de soporte y resistencia según el estado del mercado para evitar el retraso causado por los niveles estáticos.
  2. Riesgo controlable: a través de un stop loss porcentual estricto y una gestión dinámica de la posición, el riesgo de cada transacción se controla dentro de un rango razonable.
  3. Escalabilidad: admite múltiples períodos de tiempo y combinaciones de parámetros para facilitar la optimización según diferentes entornos de mercado.
  4. Alta transparencia: la lógica comercial es clara y todas las señales y niveles de precios se pueden mostrar intuitivamente en el gráfico.

Riesgo estratégico

  1. Riesgo de ruptura falsa: en un mercado volátil pueden producirse frecuentes señales de ruptura falsa, lo que debe reducirse ajustando los parámetros de los intervalos de soporte y resistencia.
  2. Impacto del deslizamiento: en un entorno de mercado con poca liquidez, el precio de transacción real puede desviarse en gran medida del precio de la señal.
  3. Dependencia de la tendencia: la estrategia funciona mejor en un mercado con una tendencia fuerte, pero puede generar demasiadas señales comerciales en una fase lateral.
  4. Sensibilidad de los parámetros: el rendimiento de la estrategia es sensible a la configuración de los parámetros, y se requieren pruebas retrospectivas para determinar la combinación óptima de parámetros.

Dirección de optimización de la estrategia

  1. Se agregó un módulo de reconocimiento del entorno del mercado para ajustar automáticamente los parámetros según la volatilidad.
  2. Introduzca el volumen y otros indicadores técnicos como señales de confirmación auxiliares.
  3. Optimice los algoritmos de gestión de posiciones y realice ajustes dinámicos en función de la volatilidad del mercado.
  4. Agregue un filtro de tiempo para evitar generar señales comerciales durante períodos desfavorables
  5. Desarrollar un algoritmo de stop loss adaptativo para ajustar dinámicamente la posición de stop loss según la volatilidad del mercado

Resumir

La estrategia proporciona un marco sólido para el seguimiento de tendencias y el trading de reversión mediante la identificación dinámica de niveles de precios clave combinados con un estricto control de riesgos. Si bien existe un cierto grado de sensibilidad a los parámetros y dependencia del entorno del mercado, a través de la optimización y mejora continuas, puede mantener un rendimiento estable en diferentes entornos de mercado. El funcionamiento exitoso de la estrategia requiere que los operadores tengan una comprensión profunda de sus principios y realicen ajustes de parámetros apropiados en función de las condiciones específicas del mercado.

Código Fuente de la Estrategia
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © felipemiransan

//@version=6
strategy("Dynamic Support and Resistance Pivot Strategy ", overlay=true)

// Strategy parameters
pivot_length = input.int(2, title="Pivot Length", tooltip="Pivot size to identify peaks and troughs")
support_resistance_distance = input.float(0.4, title="Support/Resistance Distance %", tooltip="Distance to consider a support or resistance level in %")

// Stop Loss and Take Profit parameters
stop_loss_pct = input.float(10.0, title="Stop Loss %", tooltip="Stop loss percentage", minval=0.1) / 100
take_profit_pct = input.float(26.0, title="Take Profit %", tooltip="Take profit percentage", minval=0.1) / 100

// Functions to identify high and low pivots
pivot_high = ta.pivothigh(high, pivot_length, pivot_length)
pivot_low = ta.pivotlow(low, pivot_length, pivot_length)

// Storing support and resistance levels
var float resistance_level = na
var float support_level = na
var float last_pivot_high = na
var float last_pivot_low = na

// Updating support and resistance based on pivots
if (not na(pivot_high))
    resistance_level := high[pivot_length]
    last_pivot_high := high[pivot_length]

if (not na(pivot_low))
    support_level := low[pivot_length]
    last_pivot_low := low[pivot_length]

// Function to check if the current price is near a support or resistance level
is_near_resistance = (not na(resistance_level)) and (close >= resistance_level * (1 - support_resistance_distance / 100)) and (close <= resistance_level * (1 + support_resistance_distance / 100))
is_near_support = (not na(support_level)) and (close >= support_level * (1 - support_resistance_distance / 100)) and (close <= support_level * (1 + support_resistance_distance / 100))

// Cross conditions variables
long_cross = ta.crossover(close, support_level) and not na(support_level)
short_cross = ta.crossunder(close, resistance_level) and not na(resistance_level)

// Entry conditions
long_condition = is_near_support and long_cross  // Buy when crossing support from below
short_condition = is_near_resistance and short_cross  // Sell when crossing resistance from above

// Order execution
if (long_condition)
    strategy.entry("Long", strategy.long)

if (short_condition)
    strategy.entry("Short", strategy.short)

// Stop Loss and Take Profit
if (strategy.opentrades > 0)
    if (strategy.position_size > 0)  // For long position
        avg_price_long = strategy.position_avg_price
        long_stop_level = avg_price_long * (1 - stop_loss_pct)
        long_take_profit_level = avg_price_long * (1 + take_profit_pct)
        strategy.exit("Exit Long", from_entry="Long", stop=long_stop_level, limit=long_take_profit_level)

    if (strategy.position_size < 0)  // For short position
        avg_price_short = strategy.position_avg_price
        short_stop_level = avg_price_short * (1 + stop_loss_pct)
        short_take_profit_level = avg_price_short * (1 - take_profit_pct)
        strategy.exit("Exit Short", from_entry="Short", stop=short_stop_level, limit=short_take_profit_level)

// Plotting support and resistance levels on the chart
plot(support_level, title="Support", color=color.green, linewidth=2, style=plot.style_line)
plot(resistance_level, title="Resistance", color=color.red, linewidth=2, style=plot.style_line)

// Adding labels to show pivot values
if (long_condition and not na(support_level))
    label.new(bar_index, low[pivot_length], str.tostring(low[pivot_length]), style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small)

if (short_condition and not na(resistance_level))
    label.new(bar_index, high[pivot_length], str.tostring(high[pivot_length]), style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small)