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

Estrategia de negociación de tendencias avanzadas basada en bandas de Bollinger y patrones de candlestick

El autor:¿ Qué pasa?, Fecha: 2024-11-27 14:18:33
Las etiquetas:- ¿ Qué?El ATRRREl PSR- ¿Qué es?- ¿ Qué?El WBR

img

Resumen general

Esta es una estrategia de seguimiento de tendencias basada en las bandas de Bollinger y el análisis de patrones de velas. La estrategia identifica principalmente los puntos de reversión potenciales del mercado mediante la observación de patrones de velas cuando el precio toca las bandas de Bollinger, combinado con la relación de relación entre las mechas y el cuerpo. Además, la estrategia emplea un modelo de riesgo fijo para controlar la exposición por operación y utiliza análisis de marcos de tiempo múltiples para mejorar la precisión de la negociación.

Principios de estrategia

La lógica central de la estrategia se basa en varios elementos clave: primero, calcula las bandas de Bollinger durante 20 períodos para determinar el rango de volatilidad de precios; segundo, cuando el precio toca las bandas de Bollinger, analiza la relación entre las mechas superior/inferior y el cuerpo de la vela, considerando que es una señal de reversión potencial cuando la relación excede el umbral establecido; tercero, calcula los niveles clave de soporte y resistencia para la colocación de stop-loss; finalmente, calcula el tamaño de la posición para cada operación en función de un porcentaje fijo (1%) del saldo de la cuenta, implementando una gestión de riesgos dinámica.

Ventajas estratégicas

  1. Control preciso del riesgo: utiliza un modelo de gestión del riesgo de porcentaje fijo, garantizando una exposición al riesgo controlada por operación
  2. Puntos de entrada flexibles: ofrece múltiples opciones de precios de entrada para adaptarse a diferentes estilos de negociación
  3. Combinación de indicadores técnicos: combina bandas de Bollinger con análisis de patrones de velas para mejorar la fiabilidad de la señal
  4. Posicionamiento racional de stop-loss: establece stop-loss basados en los niveles clave de soporte y resistencia, alineados con la dinámica del mercado
  5. Gestión integral del comercio: incluye un mecanismo de vencimiento de órdenes para evitar señales falsas

Riesgos estratégicos

  1. Riesgo de fluctuaciones rápidas del mercado: los índices Wick pueden generar señales falsas en mercados volátiles
  2. Riesgo de gestión de capitales: el modelo de riesgo porcentaje fijo podría dar lugar a posiciones insuficientemente grandes después de pérdidas consecutivas
  3. El riesgo de colocación de pérdidas: los cálculos de soporte y resistencia pueden no ser exactos en determinadas condiciones de mercado.
  4. Dependencia de los plazos: una estrategia basada principalmente en el tiempo diario puede perder oportunidades en plazos más cortos

Direcciones para la optimización de la estrategia

  1. Incorporar indicadores de volumen: añadir análisis de volumen para la confirmación de la señal para mejorar la fiabilidad
  2. Optimizar el mecanismo de stop-loss: considerar la implementación de un stop-loss dinámico que se ajuste en función de la volatilidad del mercado
  3. Añadir filtros de entorno de mercado: incluir indicadores de fuerza de tendencia para ajustar los parámetros de la estrategia en diferentes condiciones de mercado
  4. Mejorar la gestión de las posiciones: considerar la posibilidad de aplicar un dimensionamiento dinámico de las posiciones basado en la volatilidad del mercado
  5. Añadir filtros de tiempo: Incluir filtros de tiempo para evitar la negociación durante las sesiones de mercado altamente volátiles

Resumen de las actividades

Esta estrategia combina herramientas clásicas de análisis técnico con métodos modernos de gestión de riesgos para construir un sistema de negociación relativamente completo. Las principales ventajas se encuentran en su estricto control de riesgos y mecanismos de entrada flexibles, mientras que se debe prestar atención a los cambios en el entorno del mercado y la verificación de la confiabilidad de la señal en aplicaciones prácticas. A través de las direcciones de optimización sugeridas, hay margen para una mayor mejora, particularmente en los aspectos de filtrado de señales y gestión de riesgos.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-11-26 00:00:00
period: 12h
basePeriod: 12h
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.