Estrategia de onda de Bollinger

El autor:¿ Qué pasa?, Fecha: 15 de enero de 2024 15:16:27
Las etiquetas:

img

Resumen general

La estrategia de onda de Bollinger es una estrategia de negociación cuantitativa que combina bandas de Bollinger y promedios móviles.

Estrategia lógica

La estrategia primero calcula una media móvil exponencial (EMA) durante un período especificado como la línea de base. La banda superior (EMA + n veces desviación estándar) y la banda inferior (EMA - n veces desviación estándar) se calculan luego en base a esta EMA. Una ruptura por encima de la banda superior indica una señal de sobrecompra, mientras que una ruptura por debajo de la banda inferior indica una señal de sobreventa.

Cuando los precios están entre las bandas superior e inferior, es el rango normal de fluctuación de precios de la acción. Además, la estrategia combina otros indicadores como RSI para filtrar las señales comerciales y reducir la frecuencia de negociación para minimizar las pérdidas innecesarias.

En concreto, las reglas de las señales de negociación son:

  1. Signo largo: Cerrar > Banda superior y RSI ((14) > 60
  2. Signo corto: cerrar < banda inferior y RSI ((14) < 40

Cuando aparezcan las señales de negociación anteriores, tome posiciones con cantidad fija o porcentaje de cuenta.

Ventajas

La estrategia combina la determinación de tendencias y el juicio de sobrecompra/sobreventa para evitar operaciones incorrectas en mercados de rango.

Las bandas de Bollinger reflejan mejor la volatilidad del mercado actual y los niveles de riesgo en comparación con las estrategias de promedio móvil simple. Cuando el ancho de banda es pequeño, las señales comerciales son más confiables. Cuando el ancho de banda es grande, la frecuencia de operaciones se reducirá automáticamente.

Además, la doble confirmación del RSI y otros indicadores ayuda a filtrar algunas señales falsas y evitar operaciones incorrectas alrededor de los puntos de inflexión de la tendencia.

Análisis de riesgos

Los principales riesgos de esta estrategia son:

  1. El riesgo de optimización de parámetros. Si los parámetros de media móvil o desviación estándar se establecen de manera inapropiada, puede generar operaciones más ruidosas o perder oportunidades comerciales. Estos parámetros necesitan pruebas y optimización iterativas.

  2. El riesgo de señal de ruptura falsa. Cuando los precios rompen brevemente por encima o por debajo de las bandas y luego se invierten rápidamente, puede generar señales incorrectas. Comerciar ciegamente con éstas aumentaría las pérdidas. Esto se puede controlar aumentando el período promedio móvil o estableciendo un stop loss.

  3. Si las bandas tienen brechas muy estrechas, puede aumentar el número de operaciones y las comisiones pagadas, lo que afecta a la rentabilidad final.

Direcciones de optimización

Hay margen para una mayor optimización de la estrategia:

  1. Añadir un mecanismo de stop loss. El uso de trailing stop loss o time stop loss ayuda a realizar pérdidas en el tiempo y controlar la cantidad de pérdida de una sola operación.

  2. Añadir reglas de tamaño de posición. Por ejemplo, piramidizar en operaciones ganadoras y reducir perdedores. Esto puede mejorar el retorno de la estrategia.

  3. Combinar con otros indicadores para el filtrado de señales. Indicadores como KDJ y MACD pueden servir como herramientas de juicio auxiliares. Esto ayuda a mejorar aún más la rentabilidad de la estrategia.

  4. Optimizar la configuración de parámetros. Se pueden utilizar métodos más sistemáticos como algoritmos genéticos para probar diferentes combinaciones de parámetros y encontrar mejores configuraciones.

Conclusión

La estrategia de onda de Bollinger integra la determinación de tendencias de los promedios móviles y el juicio de sobrecompra / sobreventa. Ajusta la frecuencia de las operaciones basándose en los cambios de ancho de banda para adaptarse a diferentes condiciones del mercado. Mientras tanto, el filtrado de señales por RSI y otros indicadores evita operaciones incorrectas. La estrategia considera tanto el seguimiento de las tendencias del mercado como el control de los riesgos. Con la optimización continua, puede convertirse en una estrategia de negociación cuantitativa rentable y constante.


/*backtest
start: 2023-01-08 00:00:00
end: 2024-01-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@FiboBuLL

strategy(shorttitle='FB Wave', title='FiboBuLL Wave', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

src = input(close, title='Source')
length = input.int(55, minval=1, title='EMA length')  // 20 for classis Bollinger Bands SMA line (basis)


mult = input.float(1., minval=0.236, maxval=2, title='Standard Deviation')  //2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk
basis = ta.sma(src, length)
dev = mult * ta.stdev(src, length)

Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type')
CC = input(true, 'Color Bars')

upper = basis + dev
lower = basis - dev

//Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc.

short = src < lower  // and rsi(close,14)<40
long = src > upper  // and rsi(close,14)>60

L1 = ta.barssince(long)
S1 = ta.barssince(short)

longSignal = L1 < S1 and not (L1 < S1)[1]
shortSignal = S1 < L1 and not (S1 < L1)[1]

//Plots and Fills


////Long/Short shapes with text
// plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true)
// plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true)  

// plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true)
// plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true)  


p1 = plot(upper, color=color.new(#ff0000, 75), display=display.all, title='Upper Band')
p2 = plot(lower, color=color.new(#008000, 75), display=display.all, title='Lower Band')

p = plot(basis, color=L1 < S1 ? #008000 : S1 < L1 ? #ff0000 : na, linewidth=2, editable=false, title='Basis')

fill(p, p1, color=color.new(color.teal, 85), title='Top Fill')  //fill for basis-upper
fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85)  //fill for basis-lower

//Barcolor

bcol = src > upper ? color.new(#8ceb07, 0) : src < lower ? color.new(#ff0000, 0) : src > basis ? color.green : src < basis ? color.red : na

barcolor(CC ? bcol : na, editable=false, title='Color Bars')


// //Alerts ----  // Use 'Once per bar close'

// alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close'
// alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}')  // Use 'Once per bar close'

Notestart1 = input(true, '╔═══ Time Range to BackTest ═══╗')

// === INPUT BACKTEST RANGE ===
FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
FromYear = input.int(defval=2018, title='From Year', minval=2015)
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12)
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31)
ToYear = input.int(defval=9999, title='To Year', minval=2010)

// === FUNCTION EXAMPLE === 
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() =>
    time >= start and time <= finish ? true : false

if window() and (Show == 'Longs Only' or Show == 'Both')
    strategy.entry('AL', direction=strategy.long, when=longSignal)
    strategy.close('LongAL', when=shortSignal, comment='AL KAPA')

if window() and (Show == 'Shorts Only' or Show == 'Both')
    strategy.entry('SAT', direction=strategy.short, when=shortSignal)
    strategy.close('SAT', when=longSignal, comment='SAT KAPA')














Más.