Tendência das bandas de Bollinger seguindo a estratégia

Autora:ChaoZhang, Data: 2024-01-15 14:31:21
Tags:

img

Resumo

Esta estratégia é chamada de Bollinger Bands Trend Following Strategy. Ela usa o indicador Bollinger Bands para determinar as tendências de preços e entra em longo ou curto quando o preço sai do canal Bollinger Bands. Incorpora um filtro de média móvel para julgar a direção da tendência após a quebra, decidindo assim entre entradas longas e curtas.

Princípios

A estratégia baseia-se principalmente no indicador Bollinger Bands para determinar a tendência de preços e os pontos de entrada.

  1. Linha média: média móvel de n dias
  2. Linha superior: desvio padrão de n dias para cima
  3. Linha inferior: desvio padrão de n dias para baixo

Quando o preço rompe para cima da linha inferior através da linha superior, uma tendência de alta é identificada. Quando o preço rompe para baixo da linha superior através da linha inferior, uma tendência de baixa começou.

Especificamente, a lógica estratégica é:

  1. Entrar em longo quando o fechamento se rompe para cima da linha inferior das Bandas.
  2. Entrar em curto quando o fechamento quebra para baixo da linha superior das Bandas.

Para evitar falhas, um filtro de média móvel é adicionado.

Aqui, a média móvel exponencial é usada como indicador.

Em resumo, os critérios para determinar a ruptura da tendência são os seguintes:

  1. Signo longo: fechar quebra Bandas linha superior && fechar quebra média móvel
  2. Sinais curtos: fechar quebra Bandas linha inferior && fechar quebra média móvel

Após a entrada, o stop loss segue a linha do meio e sai quando o preço toca a linha do meio novamente.

Análise da força

Os principais pontos fortes desta estratégia incluem:

  1. O canal das bandas fornece espaço para flutuação de preços, os sinais de ruptura iniciam uma nova direção.
  2. Evitar falsas rupturas através do filtro da média móvel, assegura a entrada apenas na reversão da tendência real.
  3. Mecanismo de stop loss incorporado, através do rastreamento da linha do meio, controla eficazmente os riscos.
  4. Lógica simples e clara, fácil de entender e implementar, adequada para estratégias de negociação de algo.
  5. Utiliza o canal de bandas e os indicadores da média móvel, sem necessidade de prever preços, identifica tendências baseadas em evidências após os fatos.

Análise de riscos

Apesar das vantagens, a estratégia comporta também os seguintes riscos:

  1. Parâmetros de bandas inadequados podem aumentar a frequência e os riscos de negociação.
  2. A seleção inadequada de parâmetros da média móvel pode causar tendências reais em falta ou gerar sinais falsos.
  3. O stop loss depende da linha média, pode sair prematuramente ou permitir muito espaço de retracement.

Para controlar os riscos acima referidos, pode ser feita a seguinte otimização:

  1. Ajusta os parâmetros das bandas corretamente, aumenta a largura do canal para reduzir as probabilidades de falhas.
  2. Teste diferentes tipos e comprimentos de média móvel para encontrar combinações ideais.
  3. Tente outros métodos de stop loss, por exemplo, stop loss de trailing ou níveis progressivos de stop loss.

Orientações de otimização

Com base na análise dos riscos, podem ser realizadas melhorias nas seguintes áreas:

  1. Optimização de parâmetros: Usar métodos mais sistemáticos, como algoritmos genéticos, para encontrar combinações ótimas de parâmetros para Bandas e médias móveis, para tornar a estratégia mais estável e rentável.

  2. Optimização de perdas: Teste diferentes técnicas de stop loss como ATR stops, trailing stops etc, para determinar o melhor mecanismo de stop.

  3. Optimização de filtros: Tente adicionar outros indicadores como RSI, KD etc. como filtros adicionais, para reduzir as probabilidades de sinal falso e aumentar a taxa de rentabilidade.

  4. Optimização dos critérios de entrada: Adicionar outras considerações como condições de tendência, VOLUME anormal etc. para selecionar estritamente o tempo de entrada, evitar entradas desnecessárias.

  5. Aprendizagem de MáquinaRecolher mais dados históricos para construir LSTM, RNN e outros modelos de aprendizagem profunda, de modo a permitir o melhor tempo de entrada e saída com IA.

  6. Gestão dinâmica do risco-recompensa: Incorporar paradas de taxa fixa, aumento da meta de lucro após atingir certos níveis de lucro, etc., para controlar dinamicamente o risco-pagamento.

Através de otimizações nas áreas acima, métricas-chave como estabilidade, rentabilidade, capacidades de ajuste de risco podem ser melhoradas de forma abrangente, transformando a estratégia em um algoritmo de nível de produção adequado para negociação ao vivo.

Conclusão

Em conclusão, a Bollinger Bands Trend Following Strategy identifica tendências de preços usando o indicador de Bands e médias móveis, entrando em pontos de ruptura importantes.


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

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


Mais.