Estrategia de negociación de bandas de Bollinger con múltiples filtros

El autor:¿ Qué pasa?, Fecha: 2024-01-17 15:12:57
Las etiquetas:

img

Resumen general

La estrategia de negociación de banda de Bollinger de múltiples filtros es una estrategia de negociación cuantitativa que combina el indicador de banda de Bollinger, el indicador de media móvil, el indicador RSI y las características gráficas de línea K para la detección multicondicional para generar señales de negociación cuando se cumplen las condiciones.

Principio de la estrategia

Cálculo del indicador

La estrategia utiliza principalmente tres indicadores: Bandas de Bollinger, promedio móvil y RSI. Entre ellos, el carril medio de las Bandas de Bollinger es el promedio móvil simple de precio de n días, y los carril superior e inferior son los carril medio +2 desviaciones estándar y los carril medio -2 desviaciones estándar, respectivamente. El indicador RSI es un valor entre 0 y 100 calculado en función del rango de aumento / caída durante un cierto período de tiempo.

Señales comerciales

La estrategia genera señales comerciales a través de las siguientes tres condiciones principales:

(1) Breakout de la banda inferior de Bollinger y contradicción del cuerpo de la línea K. Cuando el precio de cierre rompe la banda inferior hacia arriba y el color del cuerpo de la línea K contradice la dirección de tendencia actual, vaya largo.

(2) Breakout de la banda superior de Bollinger y contradicción del cuerpo de la línea K. Cuando el precio de cierre rompe la banda superior hacia abajo y el color del cuerpo de la línea K contradice la dirección de la tendencia actual, vaya corto.

(3) Inversión del cuerpo en línea K. Si la dirección de la posición es consistente con la inversión del color del cuerpo en línea K, cierre la posición.

Además, la estrategia también establece filtros de media móvil, filtros de carrocería de línea K, filtros RSI y otras condiciones auxiliares para controlar estrictamente la entrada.

Análisis de ventajas

  • El control de múltiples condiciones estrictas puede reducir el riesgo de fallas
  • El método de seguimiento de tendencias reduce la frecuencia de las operaciones
  • El indicador RSI ayuda a evitar las trampas de reversión

Análisis de riesgos

  • Las configuraciones incorrectas del parámetro de Bollinger pueden dar lugar a pocas señales
  • Las fugas fallidas pueden causar mayores pérdidas.
  • Una menor frecuencia de negociación puede perder algunas oportunidades comerciales

Los riesgos pueden reducirse ajustando los parámetros de Bollinger y controlando estrictamente las paradas.

Direcciones de optimización

  • Prueba del rendimiento de la estrategia bajo diferentes parámetros para encontrar los parámetros óptimos
  • Añadir algoritmos de aprendizaje automático para optimizar automáticamente los parámetros
  • Añadir más factores y filtros para mejorar la estabilidad de la estrategia

Resumen de las actividades

En general, esta estrategia es una típica estrategia de seguimiento de tendencias a mediano y largo plazo. Mediante la detección multiconditional y el estricto control de los tiempos de entrada y salida con un enfoque de negociación de tendencias, puede reducir las operaciones innecesarias y capturar las tendencias del mercado a mediano y largo plazo. Todavía hay mucho espacio para optimizar esta estrategia ajustando parámetros, agregando más herramientas auxiliares y así sucesivamente, para mejorar aún más la estabilidad y la rentabilidad de la estrategia.


/*backtest
start: 2023-12-17 00:00:00
end: 2024-01-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy("Noro's Bollinger Strategy v1.4", shorttitle = "Bollinger str 1.4", overlay = true )

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")

length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length")
mult = input(1, defval = 1, minval = 0.001, maxval = 50, title = "Bollinger Mult")
source = input(ohlc4, defval = ohlc4, title = "Bollinger Source")

usebf = input(true, defval = true, title = "Use body-filter")
usecf = input(true, defval = true, title = "Use color-filter")
userf = input(true, defval = true, title = "Use RSI-filter")

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
showbands = input(true, defval = true, title = "Show Bollinger Bands")

//Bollinger Bands
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev

//Lines
col = showbands ? black : na 
plot(upper, linewidth = 1, color = col)
plot(basis, linewidth = 1, color = col)
plot(lower, linewidth = 1, color = col)

//Body filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebf == false

//Color filter
bar = close > open ? 1 : close < open ? -1 : 0 
gb = bar == 1 or usecf == false
rb = bar == -1 or usecf == false

//RSI Filter
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
rsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))
ursi = rsi > 70 or userf == false
drsi = rsi < 30 or userf == false

//Signals
up = close <= lower and rb and body and drsi and (close < strategy.position_avg_price or strategy.position_size == 0)
dn = close >= upper and gb and body and ursi and (close > strategy.position_avg_price or strategy.position_size == 0)
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
if up
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)

if dn
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)
    
if  exit
    strategy.close_all()

Más.