Estratégia de acompanhamento da tendência da média móvel dupla de banda de Bollinger

Autora:ChaoZhang, Data: 2023-12-11 15:10:02
Tags:

img

Resumo

Esta estratégia determina a direção geral da tendência do mercado através do cálculo de duas médias móveis exponenciais (EMA) em diferentes prazos, e identifica oportunidades de sobrecompra e sobrevenda ao longo da direção da tendência utilizando Bandas de Bollinger adaptativas para implementar a negociação de tendência.

Estratégia lógica

  1. Se a EMA de 200 períodos e a EMA de 30 períodos forem maiores que a EMA de 30, a tendência a longo prazo é determinada como ascendente.

  2. Após a determinação da direção da tendência, a linha de base, a faixa superior e a faixa inferior das Bandas de Bollinger são calculadas. A linha de base adota a SMA em um período de tempo configurável (por exemplo, 8 períodos). A largura da faixa é um multiplicador configurável (por exemplo, 1,3 e 1.1) da amplitude dos preços mais altos e mais baixos no mesmo período que a linha de base.

  3. Quando a tendência de longo prazo é para cima, a quebra da faixa inferior sinaliza entrada longa; quando a tendência de longo prazo é para baixo, a quebra da faixa superior sinaliza entrada curta.

  4. Para filtrar falsas rupturas, verifica-se que a taxa de variação da última vela antes da ruptura esteja abaixo de um limiar configurável (por exemplo, 3%), e verifica-se que a largura da faixa seja superior a um nível configurável (por exemplo, 2,2% do preço de fechamento).

  5. Após a abertura de posições, são definidos para bloquear os lucros paralisantes configuráveis (por exemplo, -3%) e tomadas de lucro (por exemplo, 10%).

Forças da estratégia

  1. As EMA duplas definem a tendência principal e evitam a abertura desordenada de posições quando a tendência principal não é clara.

  2. As Bandas de Bollinger adaptativas definem pontos de entrada ao longo da tendência.

  3. A taxa de alteração e os requisitos de largura mínima filtram efetivamente as falhas.

  4. As configurações de stop loss e take profit bloqueiam razoavelmente os lucros, mantendo os riscos sob controlo.

Riscos estratégicos

  1. As EMAs duplas não conseguem localizar com precisão os pontos de inversão da tendência, perdendo oportunidades nos pontos de virada da tendência.

  2. A configuração incorreta dos parâmetros BB pode causar sinais falsos.

  3. O stop loss e o take profit fixos não se adaptam às flutuações do mercado.

Orientações de otimização

  1. Incorporar outros indicadores para determinar reversões de tendência importantes e secundárias.

  2. Adotar ajuste dinâmico dos parâmetros BB.

  3. Estabelecer ordens condicionais de stop loss e take profit com base em critérios específicos.

Conclusão

Esta estratégia implementa a negociação de tendências julgando a tendência principal usando EMAs duplas e identificando oportunidades com Bandas de Bollinger. Sua força reside em definir razoavelmente as condições de entrada, stop loss e take profit para bloquear os lucros da tendência.


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

//@version=3
//////////////////////////////////////////////////////////////////////
// Component Code Start
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2039, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop

strategy("Custom Band Strategy", overlay=true)
source = close //종가 기준

//추세 조건 설정
emaLong = ema(source, input(200, minval=0))
emaShort = ema(source, input(30, minval=0))
trend = if emaShort>=emaLong
    1
else
    -1
    
plot(emaLong, color=red, transp=0)
plot(emaShort, color=blue, transp=0)


//BB 계산(default 14/3.2)
length = input(8, minval=1)

basis = sma(source, length)
plot(basis, color=green, transp=0)
max=highest(abs(source-basis), length)

factor1 = input(1.3, minval=0.5)
factor2 = input(1.1, minval=0.5)

upper = if trend==1
    basis + max*factor1
else
    basis + max*factor2
lower = if trend==-1
    basis - max*factor1
else
    basis - max*factor2

plot1 = plot(upper)
plot2 = plot(lower)
fill(plot1, plot2, transp=80, color=green)

//밴드 이탈 후 재진입 조건 설정
cross_over = (low<=lower and close>=lower) or crossover(close,lower)
cross_under = (high>=upper and close<=upper) or crossunder(close,upper)

//변동율 계산
maxCandle=highest(abs(open-close), length)
    
roc = abs(open-close)/open*100
changerate = input(3, minval=0.0)

//수익률 계산
value = abs(strategy.position_size)*strategy.position_avg_price
roe = strategy.openprofit/value * 100
expRoeL = (upper-lower)/lower*100
expRoeS = (upper-lower)/upper*100
exp = input(2.2, minval=0.0)

target = input(10, minval=0.0)
stop = input(-3, minval=-10.0)

strategy.close_all(when=roc>=changerate and testPeriod())
strategy.close_all(when=roe>=target and testPeriod())
strategy.close_all(when=roe<=stop and testPeriod())

plotchar(crossover(close,lower) and crossunder(close,upper),color=blue, transp=0, text="cross")
plotchar(roc>=changerate,color=red, transp=0, text="roc")
plotchar(roe>=target,color=blue, transp=0, text="target")
plotchar(roe<=stop,color=green, transp=0, text="stop")

minroe = input(2, minval=0.0)

strategy.close_all(when=cross_under and roe>minroe and testPeriod())
strategy.entry("BBandLE", strategy.long, stop=source, oca_name="BollingerBands",  comment="BBandLE", when=(cross_over) and trend==1 and roc<changerate and expRoeL>exp and source>emaLong and strategy.position_size==0 and testPeriod()) //trend==1 and 
//else
strategy.close_all(when=cross_over and roe>minroe and testPeriod())
strategy.entry("BBandSE", strategy.short, stop=source, oca_name="BollingerBands",  comment="BBandSE", when=(cross_under) and trend==-1 and roc<changerate and expRoeS>exp and source<emaLong and strategy.position_size==0 and testPeriod()) //trend==-1 and 

Mais.