En la carga de los recursos... Cargando...

Estrategia de negociación de volatilidad dinámica basada en bandas de Bollinger y patrones de candlestick

El autor:¿ Qué pasa?, Fecha: 2024-11-29 16:29:01
Las etiquetas:- ¿ Qué?La SMAEl ATRIndicador de riesgoLa ROCFFT más largo

img

Resumen general

Esta estrategia es un sistema de negociación basado en bandas de Bollinger y análisis de patrones de velas, diseñado para capturar las reversiones del mercado mediante el análisis de la volatilidad de los precios y las características de las velas en el marco de tiempo diario.

Principios de estrategia

La estrategia emplea bandas de Bollinger de 20 períodos como indicador técnico principal con un multiplicador de desviación estándar de 2.0. Al calcular la relación entre las sombras de las velas y los cuerpos, el sistema genera señales de negociación cuando esta relación excede un umbral establecido (por defecto 1.0) y el precio toca los límites de la banda de Bollinger.

Ventajas estratégicas

  1. Análisis multidimensional: combina indicadores técnicos y análisis de patrones de precios para mejorar la fiabilidad de la señal.
  2. Mecanismo de entrada flexible: ofrece múltiples opciones de tiempo de entrada para adaptarse a diferentes estilos comerciales.
  3. Gestión integral del riesgo: controla el riesgo mediante el dimensionamiento dinámico de las posiciones y el stop-loss automatizado.
  4. Compatibilidad con marcos de tiempo múltiples: permite operar en marcos de tiempo más pequeños mientras se mantiene el análisis diario.
  5. Alto nivel de automatización: automatiza todo, desde la identificación de señales hasta la gestión de la posición.

Riesgos estratégicos

  1. Riesgo de volatilidad del mercado: puede generar señales falsas en mercados altamente volátiles.
  2. Riesgo de retraso: el uso diario de datos puede dar lugar a respuestas retrasadas en mercados de rápido movimiento.
  3. Sensibilidad de parámetros: el rendimiento de la estrategia depende significativamente de los parámetros de la banda de Bollinger y de las opciones de umbral de ratio de sombra.
  4. Riesgo de liquidez: puede enfrentar dificultades de ejecución en mercados menos líquidos.

Direcciones para la optimización de la estrategia

  1. Incorporar análisis de volumen: integrar datos de volumen para validar las reversiones de precios.
  2. Añadir filtros de entorno de mercado: Incluir indicadores de fuerza de tendencia para filtrar las condiciones desfavorables del mercado.
  3. Optimizar la adaptación de parámetros: ajustar dinámicamente los parámetros de la banda de Bollinger y los umbrales de la relación de sombra en función de la volatilidad del mercado.
  4. Mejorar el control del riesgo: añadir mecanismos de control de la utilización y de seguimiento de la curva de renta variable.
  5. Fortalecer la confirmación de la señal: introducir indicadores técnicos adicionales como herramientas de confirmación.

Resumen de las actividades

Este es un sistema de negociación integral que combina bandas de Bollinger y análisis de velas para capturar oportunidades de reversión del mercado. Las fortalezas de la estrategia se encuentran en su marco analítico integral y sistema robusto de gestión de riesgos, mientras que se debe prestar atención a las condiciones del mercado y los impactos de selección de parámetros. A través de las direcciones de optimización sugeridas, la estabilidad y confiabilidad de la estrategia se pueden mejorar aún más.


/*backtest
start: 2023-11-29 00:00:00
end: 2024-11-28 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trade Entry Detector, based on Wick to Body Ratio when price tests Bollinger Bands", overlay=true, default_qty_type=strategy.fixed)

// Input for primary analysis time frame
timeFrame = "D"  // Daily time frame

// Bollinger Band settings
length = input.int(20, title="Bollinger Band Length", minval=1)
mult = input.float(2.0, title="Standard Deviation Multiplier", minval=0.1)
source = input(close, title="Source")

// Entry ratio settings
wickToBodyRatio = input.float(1.0, title="Minimum Wick-to-Body Ratio", minval=0)

// Order Fill Timing Option
fillOption = input.string("Daily Close", title="Order Fill Timing", options=["Daily Close", "Daily Open", "HOD", "LOD"])

// Account and risk settings
accountBalance = 100000  // Account balance in dollars
riskPercentage = 1.0     // Risk percentage per trade
riskAmount = (riskPercentage / 100) * accountBalance // Fixed 1% risk amount

// Request daily data for calculations
dailyHigh = request.security(syminfo.tickerid, timeFrame, high)
dailyLow = request.security(syminfo.tickerid, timeFrame, low)
dailyClose = request.security(syminfo.tickerid, timeFrame, close)
dailyOpen = request.security(syminfo.tickerid, timeFrame, open)

// Calculate Bollinger Bands on the daily time frame
dailyBasis = request.security(syminfo.tickerid, timeFrame, ta.sma(source, length))
dailyDev = mult * request.security(syminfo.tickerid, timeFrame, ta.stdev(source, length))
dailyUpperBand = dailyBasis + dailyDev
dailyLowerBand = dailyBasis - dailyDev

// Calculate the body and wick sizes on the daily time frame
dailyBodySize = math.abs(dailyOpen - dailyClose)
dailyUpperWickSize = dailyHigh - math.max(dailyOpen, dailyClose)
dailyLowerWickSize = math.min(dailyOpen, dailyClose) - dailyLow

// Conditions for a candle with an upper wick or lower wick that touches the Bollinger Bands
upperWickCondition = (dailyUpperWickSize / dailyBodySize >= wickToBodyRatio) and (dailyHigh > dailyUpperBand)
lowerWickCondition = (dailyLowerWickSize / dailyBodySize >= wickToBodyRatio) and (dailyLow < dailyLowerBand)

// Define the swing high and swing low for stop loss placement
var float swingLow = na
var float swingHigh = na

if (ta.pivothigh(dailyHigh, 5, 5))
    swingHigh := dailyHigh[5]

if (ta.pivotlow(dailyLow, 5, 5))
    swingLow := dailyLow[5]

// Determine entry price based on chosen fill option
var float longEntryPrice = na
var float shortEntryPrice = na

if lowerWickCondition
    longEntryPrice := fillOption == "Daily Close" ? dailyClose :
                      fillOption == "Daily Open" ? dailyOpen :
                      fillOption == "HOD" ? dailyHigh : dailyLow

if upperWickCondition
    shortEntryPrice := fillOption == "Daily Close" ? dailyClose :
                       fillOption == "Daily Open" ? dailyOpen :
                       fillOption == "HOD" ? dailyHigh : dailyLow

// Execute the long and short entries with expiration
var int longOrderExpiry = na
var int shortOrderExpiry = na

if not na(longEntryPrice)
    longOrderExpiry := bar_index + 2  // Order expires after 2 days

if not na(shortEntryPrice)
    shortOrderExpiry := bar_index + 2  // Order expires after 2 days

// Check expiration and execute orders
if (longEntryPrice and bar_index <= longOrderExpiry and high >= longEntryPrice)
    longStopDistance = close - nz(swingLow, close)
    longPositionSize = longStopDistance > 0 ? riskAmount / longStopDistance : na
    if (not na(longPositionSize))
        strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEntryPrice := na  // Reset after entry

if (shortEntryPrice and bar_index <= shortOrderExpiry and low <= shortEntryPrice)
    shortStopDistance = nz(swingHigh, close) - close
    shortPositionSize = shortStopDistance > 0 ? riskAmount / shortStopDistance : na
    if (not na(shortPositionSize))
        strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEntryPrice := na  // Reset after entry

// Exit logic: hit the opposing Bollinger Band
if (strategy.position_size > 0) // Long position
    strategy.exit("Exit Long", "Long", limit=dailyUpperBand)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Exit Short", "Short", limit=dailyLowerBand)

if (strategy.position_size > 0) // Long position
    strategy.exit("Stop Loss Long", "Long", stop=swingLow)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Stop Loss Short", "Short", stop=swingHigh)

// Plot daily Bollinger Bands and levels on the chosen time frame
plot(dailyUpperBand, color=color.blue, linewidth=1, title="Daily Upper Bollinger Band")
plot(dailyLowerBand, color=color.blue, linewidth=1, title="Daily Lower Bollinger Band")
plot(dailyBasis, color=color.gray, linewidth=1, title="Daily Middle Bollinger Band")


Relacionados

Más.