Estratégia de bandas de Bollinger de média móvel múltipla

Autora:ChaoZhang, Data: 2024-02-06 15:08:26
Tags:

img

Resumo

Esta estratégia constrói Bandas de Bollinger com diferentes tipos de médias móveis como entrada para descobrir mais oportunidades de negociação.

Estratégia lógica

O núcleo desta estratégia consiste em usar os tipos de médias móveis selecionados pela entrada do usuário, incluindo SMA, EMA, WMA, DEMA, TMA, VAR, WWMA, ZLEMA, TSF, HULL, TILL, etc., 12 no total, combinados com Bandas de Bollinger para formar sinais de negociação. A faixa média das Bandas de Bollinger adota a média móvel selecionada, enquanto as bandas superior e inferior são um desvio padrão positivo / negativo distante da faixa média. Curto quando o preço quebra a faixa superior, longo quando o preço quebra a faixa inferior. Combinando diferentes tipos de médias móveis, os parâmetros podem ser otimizados para sinais de negociação mais estáveis e precisos.

Os principais componentes do código são:

  1. Funções de cálculo para 12 tipos de médias móveis, incluindo SMA, EMA, WMA, etc.
  2. A função getMA retorna a média móvel correspondente com base no parâmetro de entrada mav.
  3. Cálculo das faixas média, superior e inferior das Bandas de Bollinger.
  4. Planejamento de Bandas de Bollinger.
  5. Geração de sinais longos e curtos. Vá longo quando o preço quebra abaixo da faixa inferior, vá curto quando o preço quebra acima da faixa superior.

Análise das vantagens

A maior vantagem desta estratégia é fornecer vários tipos de médias móveis. Diferentes ambientes de mercado se adequam a diferentes médias móveis em termos de sensibilidade de reação. Adotar vários tipos de médias móveis aumenta muito a adaptabilidade da estratégia. Além disso, esta estratégia permite otimização de parâmetros para os comprimentos das médias móveis, a fim de encontrar combinações ideais e, portanto, obter sinais de negociação mais precisos.

Análise de riscos

O principal risco desta estratégia reside em sinais caóticos das próprias médias móveis, com possibilidades de múltiplas falhas. Além disso, o indicador Bollinger Bands é bastante sensível a oscilações de preços selvagens, dificultando a faixa média para rastrear o preço efetivamente. Isso exige que tipos mais estáveis de médias móveis sejam usados, juntamente com um ajuste adequado dos parâmetros.

Orientações de otimização

A estratégia pode ser otimizada a partir dos seguintes aspectos:

  1. Teste diferentes combinações de médias móveis para encontrar parâmetros ótimos para melhorar a estabilidade do sinal.
  2. Adicionar mecanismos de stop loss para limitar as perdas de sinais ruins ocasionais.
  3. Incorporar outros indicadores para filtragem de sinais, evitando excesso de negociação, por exemplo MACD, KD, etc.
  4. Otimizar a gestão do dinheiro, ajustar o tamanho das posições.

Conclusão

A estratégia é bastante inovadora em geral, enriquecendo o indicador de Bollinger Bands com aplicações mais sofisticadas. Ao ajustar as médias móveis combinadas, podem ser obtidos sinais mais precisos e estáveis. Também abre novas ideias para otimizar as estratégias de Bollinger Bands. Com ajuste e otimizações de parâmetros, essa estratégia pode se tornar uma ferramenta de negociação muito prática.


/*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)

Mais.