Estratégia de acompanhamento de tendências baseada em Bandas de Bollinger


Data de criação: 2024-01-15 14:31:21 última modificação: 2024-01-15 14:31:21
cópia: 0 Cliques: 556
1
focar em
1617
Seguidores

Estratégia de acompanhamento de tendências baseada em Bandas de Bollinger

Visão geral

Esta estratégia é chamada de BollingerBands Trend Tracking Strategy, que usa o indicador BollingerBands para determinar a tendência dos preços e, quando os preços quebram o canal BollingerBands, entra em ação e faz mais curto. Combina filtros de linha uniforme para determinar a direção da tendência quando a ruptura ocorre, e, portanto, decide fazer mais curto.

Princípio da estratégia

A estratégia baseia-se principalmente no indicador BollingerBands para determinar a tendência de preços e posicionar pontos de entrada. BollingerBands contém três linhas:

  1. Linha central: média móvel de n dias
  2. Na linha superior, a distância de n dias de diferença padrão
  3. Linha inferior: Mover para baixo a distância de n dias de diferença padrão

Quando o preço da linha de baixo para a linha de cima, considere-se que está a formar uma tendência de alta; quando o preço da linha de cima para a linha de baixo, considere-se que está a formar uma tendência de baixa. A estratégia é fazer mais curto espaço quando ocorrem essas duas rupturas.

A lógica da estratégia é a seguinte:

  1. Quando o preço de fechamento da linha de baixo de Bands irrompe na linha de cima, faça uma entrada extra
  2. Quando o preço de fechamento da linha de cima da Bands quebra a linha de baixo, faça a entrada em curto prazo

Para filtrar brechas falsas, a estratégia inclui o julgamento da linha média. A entrada é acionada somente quando o preço de fechamento quebra as bandas e, ao mesmo tempo, quebra a linha média.

A média móvel exponencial é usada como indicador de linha média.

Em resumo, a estratégia para avaliar a ruptura da tendência é:

  1. Faça mais sinais: Preço de fechamento quebra a linha de Bands && Preço de fechamento quebra a linha média
  2. Sinal de fechamento: Preço de fechamento quebra da linha de baixa das bandas && Preço de fechamento quebra da linha média

Após a entrada, o modo de parada é seguir a linha média. Quando o preço toca a linha média novamente, sair da parada.

Análise de vantagens

A estratégia tem as seguintes vantagens:

  1. O canal de bandas tem espaço para a flutuação de preços, e o canal de ruptura representa o início da formação de novas direções.
  2. A combinação de filtragem uniforme evita o problema de falsas rupturas, garantindo a entrada apenas quando há uma verdadeira mudança de tendência.
  3. Com um mecanismo de stop loss interno, o stop loss ativo é ativado quando o preço retorna à linha central das bandas, controlando efetivamente o risco.
  4. A lógica da estratégia é simples e clara, fácil de entender e implementar, adequada para a quantificação de estratégias algorítmicas de negociação.
  5. Usando o canal de bandas e o indicador de linha média, não há necessidade de prever os preços, e é melhor avaliar a tendência com base em evidências posteriores.

Análise de Riscos

Embora tenha algumas vantagens, a estratégia também apresenta riscos:

  1. A configuração inadequada dos parâmetros das bandas pode aumentar a frequência de negociação e o risco de negociação. Se os parâmetros forem muito sensíveis, haverá uma grande quantidade de falsas brechas que causarão a abertura frequente do sistema.
  2. A escolha incorreta dos parâmetros da linha média também pode levar a perder a tendência real ou gerar um falso sinal. A configuração dos parâmetros requer teste e otimização repetidos.
  3. A parada de perda depende da linha do meio, que pode sair prematuramente ou dar ao preço muito espaço para reajustar. Isso pode levar a perder a maior parte do lucro ou aumentar o risco de perdas.

Para controlar os riscos acima mencionados, pode-se otimizar a partir dos seguintes aspectos:

  1. Ajuste adequadamente os parâmetros de Bands para aumentar a largura do canal e reduzir a probabilidade de falsa ruptura
  2. Teste diferentes tipos e comprimentos de linha média para encontrar a melhor combinação
  3. Tente outras formas de parar, como parar seguindo uma tendência ou mover o parar gradualmente

Direção de otimização

De acordo com a análise de risco acima, a estratégia pode ser melhorada em:

  1. Optimização de parâmetrosA estratégia é mais estável e lucrativa através de métodos mais sistemáticos, como algoritmos genéticos, que buscam a melhor combinação de bandas e parâmetros de linha média.

  2. Optimização de Stop LossTestar diferentes métodos de parada, como parada ATR, parada de rastreamento, etc., para determinar o melhor mecanismo de parada.

  3. Otimização de filtrosTente adicionar outros indicadores, como RSI, KD, etc., como condições de filtragem adicionais, reduzindo a probabilidade de falsos sinais e aumentando a taxa de lucro.

  4. Optimização das condições de entradaA partir de agora, o que você deve fazer é: adicionar outros fatores de consideração, como o julgamento de tendências, o volume de variação, selecionar rigorosamente o momento de entrada e reduzir a necessidade de abrir posições.

  5. Aprendizagem automáticaO objetivo é: coletar mais dados históricos, usar modelos de aprendizado profundo como LSTM, RNN e outros para modelar, e usar a IA para determinar os melhores pontos de entrada e saída.

  6. Gerenciamento de Dinâmicas de Risco e LucroA adição de um stop loss de proporção fixa, aumento do stop loss após a meta de lucro, etc., gerenciamento dinâmico de riscos e ganhos

Com a otimização dos aspectos acima mencionados, os indicadores de estabilidade, taxa de retorno e capacidade de regulação de risco da estratégia podem ser melhorados de forma abrangente, tornando-se uma estratégia de algoritmo para negociação virtual.

Resumir

Em geral, a estratégia de acompanhamento de tendências de BollingerBands utiliza o indicador de bandas e a tendência de julgamento de preços de linha média, que entra em jogo quando os pontos críticos são rompidos, e pertence ao tipo de estratégia de acompanhamento de tendências. Ela possui vantagens como clareza de julgamento, lógica concisa e fácil de implementar, além de algumas otimizações de parâmetros, como a parada de perdas. O espaço pode ser transformado em uma estratégia de quantificação confiável e estável, ajustando ainda mais a configuração de parâmetros, otimizando o mecanismo de parada de perdas e incorporando modelos de aprendizado de máquina.

Código-fonte da estratégia
/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//VERSION =================================================================================================================
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy is intended to study.
// It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen.
// As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter.
//Autor Credsonb (M4TR1X_BR)

//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//STRATEGY ================================================================================================================

strategy(title = 'BT-Bollinger Bands - Trend Following',
         shorttitle = 'BBTF',
         overlay = true )


//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// CONFIG =================================================================================================================

// TIME INPUTS
usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters")
initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ")
usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters")
finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange")

// TIME LOGIC 
inTradeWindow = true

// ENABLE LONG SHORT OPTIONS
string entrygroup ='Long/Short Options ==================================='
checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup)
checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup)


// BOLLINGER BANDS INPUTS ==================================================================================================
string bbgroup ='Bollinger Bands ======================================'
bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup)
bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup)

//BOLLINGER BANDS LOGIC
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev)


// MOVING AVERAGES INPUTS ================================================================================================
string magroup =  'Moving Average ======================================='
useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy')
emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup)
emaSource = input.source(defval=close,title="  Source",inline="", group= magroup)
emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup)

// MOVING AVERAGE LOGIC
float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength)

// BOT MESSAGES
string msgroup='Alert Message For Bot ================================'
messageEntry = input.string("", title="Strategy Entry Message",group=msgroup)
messageExit  =input.string("",title="Strategy Exit Message",group=msgroup)
messageClose = input.string("", title="Strategy Close Message",group=msgroup)




// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// POSITIONS =============================================================================================================

//VERIFY IF THE BUY FILTERS ARE ON OR OFF 
bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema)                      

//LONG / SHORT POSITIONS LOGIC
bool openLongPosition  = (close[1] < bbUpper) and (close > bbUpper)   and (emaFilterBuy)
bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy)
//bool closeLongPosition = (close > bbMiddle)
//bool closeShortPosition= (close < bbLower)


// CHEK OPEN POSITONS =====================================================================================================
// open signal when not already into a position
bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0

bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0

longEntryPoint = high
if (openLongPosition) and (inTradeWindow) and (checkboxLong)
    strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry)

if not (openLongPosition)
    strategy.cancel('Long Entry')

//submit exit orders for trailing take profit price 
if (longIsActive) and (inTradeWindow)
    strategy.exit(id = 'Long Exit',  stop=bbMiddle, alert_message=messageExit)

//if (closeLongPosition)
   // strategy.close(id = 'Long Entry', alert_message=messageClose)
      

shortEntryPoint = low 
if (openShortPosition) and (inTradeWindow) and (checkboxShort)
    strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry)

if not(openShortPosition)
    strategy.cancel('Short Entry')

if (shortIsActive)
    strategy.exit(id = 'Short Exit',  stop = bbMiddle, alert_message=messageExit)

//if (closeShortPosition)
    //strategy.close(id = 'Short Close', alert_message=messageClose)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// PLOTS ===============================================================================================================

// TRADE WINDOW ========================================================================================================
bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window')

// EMA/SMA 
var emafilterColor = color.new(color.white, 0)
plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line)

// BOLLINGER BANDS
plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none)
plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none)
plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none)

// PAINT BARS COLORS
bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper)
bool bears = (close[1] > bbLower [1]) and (close < bbLower)
neutral_color = color.new(color.black, 100)
barcolors = bulls ? color.green : bears ? color.red : neutral_color
barcolor(barcolors)

// ======================================================================================================================