Estratégia de negociação de porcentagem de bandas de Bollinger


Data de criação: 2023-12-11 11:14:53 última modificação: 2023-12-11 11:14:53
cópia: 0 Cliques: 750
1
focar em
1621
Seguidores

Estratégia de negociação de porcentagem de bandas de Bollinger

Visão geral

A estratégia baseia-se no indicador da faixa de Brin, combinado com a média móvel e o indicador técnico ATR, para realizar um sistema de ruptura de curto período. A estratégia determina o excesso de compra e venda de preços através da contagem da porcentagem de posição relativa dos preços dentro do canal da faixa de Brin para gerar um sinal de negociação combinado com novas rupturas de alta e baixa.

Princípio da estratégia

  1. Calcular o percentual de posicionamento do preço dentro do canal e da faixa de Brin
  2. As médias móveis são calculadas em relação ao preço de abertura, ao preço de fechamento, ao preço máximo e ao preço mínimo.
  3. Calcular o indicador ATR e, em combinação com o ATR, definir a linha de stop loss
  4. Determinar se o preço está perto de um novo máximo ou de um novo mínimo
  5. A partir de preços máximos e mínimos anuais, a avaliação dos preços em grande escala
  6. Aperfeiçoamento de sinais de negociação através da variação de percentual da faixa de Brin e de novos altos e baixos

A estratégia usa o canal de Brin para determinar a volatilidade do mercado, a largura do canal de Brin é determinada pelo desvio padrão. O preço é o ponto de compra quando o Brin se desvia do trajeto abaixo do trajeto e o preço é o ponto de venda quando o Brin se eleva. A média móvel pode suavizar a oscilação do Brin e reduzir as falsas rupturas. O indicador ATR é combinado com a linha de parada móvel e a paralisação fixa.

Vantagens estratégicas

  1. O rigoroso julgamento da brecha na faixa de Brin reduz os sinais falsos.
  2. As médias móveis suavizam os preços para identificar tendências reais
  3. ATR indicador de tracking de stop loss dinâmico, para limitar perdas individuais
  4. Novos altos e baixos e julgamentos anuais de altos e baixos tornam os sinais mais confiáveis
  5. Combinação eficaz de vários indicadores tecnológicos para melhorar a eficiência da estratégia

Riscos estratégicos e soluções

  1. A configuração inadequada dos parâmetros de passagem da faixa de Brin pode levar a um excesso de false breakouts, e diferentes combinações de parâmetros devem ser testadas para obter o melhor resultado.
  2. Os preços de fechamento podem ser usados como uma linha de referência para um retorno acima do limite de perda definido pelo ATR, e pode ser considerado o uso de um maior margem de variação para calcular a porcentagem de preços mais baixos
  3. A rigidez do Brin pode perder oportunidades de tendência em linhas mais longas, sendo apropriado relaxar as condições de filtragem e o tempo de detenção.
  4. Os indicadores ATR são mais lentos para acompanhar grandes flutuações de preços, e devem ser considerados os indicadores de taxa de flutuação de maior frequência, como a amplitude real
  5. Os novos altos e baixos são susceptíveis de serem perturbados pelo ruído de curto prazo, devendo ser avaliados a significância estatística e a sustentabilidade da tendência

Direção de otimização da estratégia

  1. Teste diferentes combinações de parâmetros para determinar o melhor parâmetro de faixa de Bryn e comprimento de média móvel
  2. Combinação de modelos combinados com diferentes parâmetros de banda de Bryn ou média móvel para julgar o sinal
  3. Teste de adaptabilidade a diferentes períodos de tempo e diferentes variedades de parâmetros, aumentando a robustez
  4. Combinação de mais critérios de grande escala, como o sinal de faixa de Brin em nível de linha solar ou fatores sazonais
  5. Avaliação de oportunidades de acompanhamento de tendências para expandir a cobertura estratégica e a margem de lucro

Resumir

A estratégia utiliza vários instrumentos técnicos, como percentual de Brin, média móvel, indicadores ATR, novos altos, novos baixos e altos e baixos anuais, para construir uma estratégia de negociação de ruptura relativamente rigorosa e eficiente em períodos curtos. Sua vantagem destacada é o uso de vários tipos de ferramentas para reduzir o ruído e identificar sinais de tendência reais.

Código-fonte da estratégia
/*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"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Bollinger %B Candles Strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

BBLength = input(100, minval=1, step=1)
StdDev = 10
useMovingAverage = input(true)
MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
lookbackPeriod = input(22, minval=10, step=10)
colorByPreviousClose = input(true)

AtrMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(10)
AtrMult = input(4)
wicks = input(false)

considerYearlyHighLow = input(false)
considerNewLongTermHighLows = input(false)
shortHighLowPeriod = 100
longHighLowPeriod = 200
tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])

backtestYears = input(10, minval=1, step=1)


//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
    newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
    newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
    [newHigh,newLow]

//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
    yhigh = security(syminfo.tickerid, '12M', high[1]) 
    ylow = security(syminfo.tickerid, '12M', low[1]) 
    yhighlast = yhigh[365]
    ylowlast = ylow[365]
    yhighllast = yhigh[2 * 365]
    ylowllast = ylow[2 * 365]
    
    yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
    yearlyHighCondition = (  (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
    yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
    yearlyLowCondition = (  (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
    
    label_x = time+(60*60*24*1000*1)
    [yearlyHighCondition,yearlyLowCondition]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

inDateRange = true
[yearlyHighCondition,yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHighS,newLowS] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)
[middleclose, upperclose, lowerclose] = bb(close, BBLength, StdDev)
[middleopen, upperopen, loweropen] = bb(open, BBLength, StdDev)
[middlehigh, upperhigh, lowerhigh] = bb(high, BBLength, StdDev)
[middlelow, upperlow, lowerlow] = bb(low, BBLength, StdDev)

percentBClose = (close - lowerclose)*100/(upperclose-lowerclose)
percentBOpen = (open - loweropen)*100/(upperopen-loweropen)
percentBHigh = (high - lowerhigh)*100/(upperhigh-lowerhigh)
percentBLow = (low - lowerlow)*100/(upperlow-lowerlow)

percentBMAClose = f_getMovingAverage(percentBClose, MAType, lookbackPeriod)
percentBMAOpen = f_getMovingAverage(percentBOpen, MAType, lookbackPeriod)
percentBMAHigh = f_getMovingAverage(percentBHigh, MAType, lookbackPeriod)
percentBMALow = f_getMovingAverage(percentBLow, MAType, lookbackPeriod)

newOpen = useMovingAverage? percentBMAOpen : percentBOpen
newClose = useMovingAverage? percentBMAClose : percentBClose
newHigh = useMovingAverage? percentBMAHigh : percentBHigh
newLow = useMovingAverage? percentBMALow : percentBLow

truerange = max(newHigh, newClose[1]) - min(newLow, newClose[1])

averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
atr = averagetruerange * AtrMult

longStop = newClose - atr
longStopPrev = nz(longStop[1], longStop)
longStop := (wicks ? newLow[1] : newClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = newClose + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := (wicks ? newHigh[1] : newClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and (wicks ? newHigh : newClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? newLow : newClose) < longStopPrev ? -1 : dir

trailingStop = dir == 1? longStop : shortStop

candleColor = colorByPreviousClose ?
                 (newClose[1] < newClose ? color.green : newClose[1] > newClose ? color.red : color.silver) : 
                 (newOpen < newClose ? color.green : newOpen > newClose ? color.red : color.silver)
plotcandle(newOpen, newHigh, newLow, newClose, title='PercentBCandle', color = candleColor, wickcolor=candleColor)
plot(trailingStop, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= dir == 1 ? color.green : color.red)

buyCondition = dir==1 and yearlyHighCondition and newHighS
exitBuyCondition = dir == -1
sellCondition = dir == -1 and yearlyLowCondition and newLowS
exitSellCondition = dir == 1
strategy.risk.allow_entry_in(tradeDirection)

barcolor(buyCondition? color.lime : sellCondition ? color.orange : color.silver)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=exitBuyCondition)

strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=exitSellCondition)