Estratégia de negociação de breakout Bollinger Band

Autora:ChaoZhang, Data: 2023-10-07 09:59:11
Tags:

Resumo

Esta estratégia negocia breakouts de Bollinger Bands, tomando posições de contra-tendência quando o preço atravessa completamente a faixa superior ou inferior.

Princípio

A estratégia usa Bandas de Bollinger para definir a faixa de volatilidade atual. Quando o preço forma um candelabro completo acima da faixa superior ou abaixo da faixa inferior, ele indica um estado altamente volátil e uma reversão potencial em direção à média.

Especificamente, as faixas média, superior e inferior são calculadas usando preços de fechamento de 20 períodos. Um sinal longo é gerado quando o preço fecha abaixo da faixa inferior depois de abrir mais alto. Um sinal curto é desencadeado quando o preço fecha acima da faixa superior depois de abrir mais baixo. O ponto de ruptura serve como o stop loss e a faixa média é o alvo inicial de lucro.

Vantagens

As principais vantagens são:

  1. As bandas de Bollinger medem a volatilidade do mercado de forma eficaz para identificar anomalias.

  2. O ponto de ruptura é um nível de stop loss claro para controlar o risco.

  3. A faixa do meio oferece um alvo razoável para a reversão média.

  4. Os candelabros completos filtram falhas com maior confiabilidade do sinal.

  5. Parâmetros simples facilitam a implementação e otimização.

  6. Lógica limpa expressa de forma concisa no código.

Riscos

Alguns riscos incluem:

  1. Parâmetros de BB pobres podem invalidar a estratégia.

  2. As rupturas podem sinalizar o início da tendência, o risco de saída prematura.

  3. Os alvos da faixa média podem ser muito conservadores, limitando os ganhos.

  4. As rupturas largas podem não se preencher completamente, causando deslizamento.

  5. Os whipssaws podem induzir a trocas excessivas e inúteis em mercados variados.

Melhorias

Algumas considerações de melhoria:

  1. Medir a força da tendência para ajustar as definições ou a frequência.

  2. Adicionar outros indicadores para ajustar o tempo de entrada.

  3. Ajustar o stop loss com base na volatilidade.

  4. Otimizar os objetivos iniciais para lucros suaves.

  5. Implementar mecanismos de reentrada para ganhos compostos.

  6. Avaliar a validade da fuga para evitar trocas ruins.

Conclusão

A estratégia negocia breakouts BB para lucros de curto prazo adequados para os traders ativos.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 3h
basePeriod: 15m
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/
// © Bishnu103

//@version=4
strategy(title="Full Candle Outside BB [v1.0][Bishnu103]",shorttitle="OUTSIDE BB",overlay=true,calc_on_every_tick=true,backtest_fill_limits_assumption=2)

// ***********************************************************************************************************************
// input variables
buy_session         = input(title="Buy Session", type=input.session, defval="0915-1430")
exit_inraday        = input(title="Exit Intraday?", type=input.bool, defval=true)
entry_distance      = input(title="Entry distance from alert", minval=1, maxval=10, defval=3)
show_bb_switch      = input(title="Show BB", type=input.bool, defval=true)
//
bbLength            = input(title="BB Length", minval=1, defval=20)
bbStdDev            = input(title="BB StdDev", minval=1, defval=2)

// ***********************************************************************************************************************
// global variables
long_entry          = false
short_entry         = false
long_exit           = false
short_exit          = false

// variable values available across candles
var entry_price     = 0.0  
var sl_price        = 0.0
var exit_price      = 0.0
var candle_count    = 0

// ***********************************************************************************************************************
// function to return bollinger band values based on candle poition passed 
getBB(pos) => [mBB, uBB, lBB] = bb(close[pos], bbLength, bbStdDev)

// function returns true if current time is within intraday byuing session set in input
BarInSession(sess) => time(timeframe.period, sess) != 0

// ***********************************************************************************************************************
// strategy
//
// get current bb value
[mBB_0,uBB_0,lBB_0] = getBB(0)

// check if full candle outside upper BB
outside_uBB = low > uBB_0 and close <= open
outside_lBB = high < lBB_0 and close >= open

// ***********************************************************************************************************************
// entry conditions 
long_entry   := outside_lBB
short_entry  := outside_uBB

// keep candle count since the alert generated so that order can be cancelled after N number of candle calling it out as invalid alert
candle_count := candle_count + 1
if long_entry or short_entry
    candle_count    := 0

// ***********************************************************************************************************************
// risk management
//
// decide entry and sl price
if long_entry
    entry_price := high
    
if short_entry
    entry_price := low
    
if long_entry
    sl_price    := low
    
if short_entry
    sl_price    := high

// first exit is when price hits middle BB, gets updated for each candle based on it's middle BB value
exit_price  := mBB_0

// ***********************************************************************************************************************
// position sizing
price = if close[0] > 25000
    25000
else
    price = close[0]

qty = 25000/price

// ***********************************************************************************************************************
// entry
//if long_entry and strategy.position_size == 0
//    strategy.entry("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price)) 
if long_entry and strategy.position_size == 0
    strategy.order("BUY", strategy.long, qty, stop=entry_price, comment="BUY @ "+ tostring(entry_price))

//if short_entry and strategy.position_size == 0
//    strategy.entry("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))
if short_entry and strategy.position_size == 0
    strategy.order("SELL", strategy.short, qty, stop=entry_price, comment="SELL @ "+ tostring(entry_price))

// cancel an order if N number of candles are completed after alert candle
strategy.cancel_all(candle_count > entry_distance)

// if current time is outside byuing session then do not enter intraday trade
strategy.cancel_all(timeframe.isintraday and not BarInSession(buy_session))

// ***********************************************************************************************************************
// exit
if strategy.position_size > 0
    strategy.cancel("EXIT at MBB", true)
    strategy.cancel("EXIT at SL", true)
    strategy.order("EXIT at MBB", strategy.short, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
    strategy.order("EXIT at SL", strategy.short, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))

if strategy.position_size < 0
    strategy.cancel("EXIT at MBB", true)
    strategy.cancel("EXIT at SL", true)
    strategy.order("EXIT at MBB", strategy.long, abs(strategy.position_size), limit=exit_price, comment="EXIT TG @ "+ tostring(exit_price))
    strategy.order("EXIT at SL", strategy.long, abs(strategy.position_size), stop=sl_price, comment="EXIT SL @ "+ tostring(sl_price))

// if intraday trade, close the trade at open of 15:15 candle //!!!!!!!!!!!!!!!!!!!!! TO BE CORRECTED !!!!!!!!!!!!!!!!!!!!!!!
if timeframe.isintraday and exit_inraday and hour == 15 and minute == 00
    strategy.close("BUY",  when=strategy.position_size > 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))
    strategy.close("SELL", when=strategy.position_size < 0, qty=strategy.position_size, comment="EXIT @ "+ tostring(close))

// ***********************************************************************************************************************
// plots    
//
// plot BB
[mBBp,uBBp,lBBp] = getBB(0)
p_mBB = plot(show_bb_switch ? mBBp : na, color=color.teal)
p_uBB = plot(show_bb_switch ? uBBp : na, color=color.teal)
p_lBB = plot(show_bb_switch ? lBBp : na, color=color.teal)
fill(p_uBB,p_lBB,color=color.teal,transp=95)

Mais.