Estrategia de bandas de Bollinger de promedio móvil múltiple

El autor:¿ Qué pasa?, Fecha: 2024-02-06 15:08:26
Las etiquetas:

img

Resumen general

Esta estrategia construye bandas de Bollinger con diferentes tipos de promedios móviles como entrada para descubrir más oportunidades comerciales.

Estrategia lógica

El núcleo de esta estrategia radica en el uso de los tipos de promedios móviles seleccionados por la entrada del usuario, incluidos SMA, EMA, WMA, DEMA, TMA, VAR, WWMA, ZLEMA, TSF, HULL, TILL, etc., 12 en total, combinados con Bandas de Bollinger para formar señales comerciales. La banda media de las Bandas de Bollinger adopta el promedio móvil seleccionado, mientras que las bandas superior e inferior son una desviación estándar positiva / negativa lejos de la banda media. Corto cuando el precio rompe la banda superior, largo cuando el precio rompe la banda inferior. Al combinar diferentes tipos de promedios móviles, los parámetros se pueden optimizar para señales comerciales más estables y precisas.

Los principales componentes del código son:

  1. Funciones de cálculo para 12 tipos de medias móviles, incluidas SMA, EMA, WMA, etc.
  2. La función getMA devuelve la media móvil correspondiente basada en el parámetro de entrada mav.
  3. Cálculo de las bandas media, superior e inferior de las bandas de Bollinger.
  4. Trazado de bandas de Bollinger.
  5. Generación de señales largas y cortas. Ir largo cuando el precio rompe por debajo de la banda inferior, ir corto cuando el precio rompe por encima de la banda superior.

Análisis de ventajas

La mayor ventaja de esta estrategia es proporcionar múltiples tipos de promedios móviles. Diferentes entornos de mercado se adaptan a diferentes promedios móviles en términos de sensibilidad de reacción. La adopción de múltiples tipos de promedios móviles mejora enormemente la adaptabilidad de la estrategia. Además, esta estrategia permite la optimización de parámetros para las longitudes de los promedios móviles, con el fin de encontrar combinaciones óptimas y, por lo tanto, obtener señales comerciales más precisas.

Análisis de riesgos

El principal riesgo de esta estrategia radica en las señales caóticas de las medias móviles mismas, con posibilidades de múltiples roturas falsas. Además, el indicador Bollinger Bands es bastante sensible a los cambios salvajes de precios, lo que dificulta que la banda media pueda rastrear el precio de manera efectiva. Esto requiere que se utilicen tipos más estables de medias móviles, junto con un ajuste adecuado de parámetros.

Direcciones de optimización

La estrategia se puede optimizar a partir de los siguientes aspectos:

  1. Prueba diferentes combinaciones de medias móviles para encontrar parámetros óptimos para mejorar la estabilidad de la señal.
  2. Añadir mecanismos de stop loss para limitar las pérdidas por señales negativas ocasionales.
  3. Incorporar otros indicadores para filtrar las señales, evitando el exceso de negociación, por ejemplo, MACD, KD, etc.
  4. Optimizar la gestión del dinero, ajustar el tamaño de las posiciones.

Conclusión

La estrategia es bastante innovadora en general, enriqueciendo el indicador de Bollinger Bands con aplicaciones más sofisticadas. Al ajustar los promedios móviles combinados, se pueden obtener señales más precisas y estables. También abre nuevas ideas para optimizar las estrategias de Bollinger Bands.


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

//@version=4
strategy("Bollinger Bands Strategy (MA type)", overlay=true)
src = input(close, title="Source")
length = input(20,step=10, minval=1)
mult = input(1,type=input.float, minval=0.001, maxval=50, title="StdDev")

length1=input(26, "Long Moving Average Length", minval=1)
length2=input(9, "Trigger Length", minval=1)
T3a1 = input(0.7, "TILLSON T3 Volume Factor", step=0.1)
////////////
mav = input(title="Moving Average Type", defval="VAR", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL"])
Var_Func(src,length)=>
    valpha=2/(length+1)
    vud1=src>src[1] ? src-src[1] : 0
    vdd1=src<src[1] ? src[1]-src : 0
    vUD=sum(vud1,9)
    vDD=sum(vdd1,9)
    vCMO=nz((vUD-vDD)/(vUD+vDD))
    VAR=0.0
    VAR:=nz(valpha*abs(vCMO)*src)+(1-valpha*abs(vCMO))*nz(VAR[1])
VAR=Var_Func(src,length)
DEMA = ( 2 * ema(src,length)) - (ema(ema(src,length),length) )
Wwma_Func(src,length)=>
    wwalpha = 1/ length
    WWMA = 0.0
    WWMA := wwalpha*src + (1-wwalpha)*nz(WWMA[1])
WWMA=Wwma_Func(src,length)
Zlema_Func(src,length)=>
    zxLag = length/2==round(length/2) ? length/2 : (length - 1) / 2
    zxEMAData = (src + (src - src[zxLag]))
    ZLEMA = ema(zxEMAData, length)
ZLEMA=Zlema_Func(src,length)
Tsf_Func(src,length)=>
    lrc = linreg(src, length, 0)
    lrc1 = linreg(src,length,1)
    lrs = (lrc-lrc1)
    TSF = linreg(src, length, 0)+lrs
TSF=Tsf_Func(src,length)
HMA = wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length)))
T3e1=ema(src, length)
T3e2=ema(T3e1,length)
T3e3=ema(T3e2,length)
T3e4=ema(T3e3,length)
T3e5=ema(T3e4,length)
T3e6=ema(T3e5,length)
T3c1=-T3a1*T3a1*T3a1
T3c2=3*T3a1*T3a1+3*T3a1*T3a1*T3a1
T3c3=-6*T3a1*T3a1-3*T3a1-3*T3a1*T3a1*T3a1
T3c4=1+3*T3a1+T3a1*T3a1*T3a1+3*T3a1*T3a1
T3=T3c1*T3e6+T3c2*T3e5+T3c3*T3e4+T3c4*T3e3


getMA(src, length) =>
    ma = 0.0
    if mav == "SMA"
        ma := sma(src, length)
        ma

    if mav == "EMA"
        ma := ema(src, length)
        ma

    if mav == "WMA"
        ma := wma(src, length)
        ma

    if mav == "DEMA"
        ma := DEMA
        ma

    if mav == "TMA"
        ma := sma(sma(src, ceil(length / 2)), floor(length / 2) + 1)
        ma

    if mav == "VAR"
        ma := VAR
        ma

    if mav == "WWMA"
        ma := WWMA
        ma

    if mav == "ZLEMA"
        ma := ZLEMA
        ma

    if mav == "TSF"
        ma := TSF
        ma

    if mav == "HULL"
        ma := HMA
        ma

    if mav == "TILL"
        ma := T3
        ma
    ma
    
//////////
basis = getMA(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input(0, "Offset",minval = -500, maxval = 500)
plot(basis, "Basis",color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))
/////////
buyEntry = crossover(src, lower)
sellEntry = crossunder(src, upper)
if (crossover(src, lower))
	strategy.entry("BBandLE", strategy.long, stop=lower, oca_name="BollingerBands",  comment="BBandLE")
else
	strategy.cancel(id="BBandLE")
if (crossunder(src, upper))
	strategy.entry("BBandSE", strategy.short, stop=upper, oca_name="BollingerBands",  comment="BBandSE")
else
	strategy.cancel(id="BBandSE")
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Más.