Estrategia de negociación de la banda de Bollinger para la ruptura

El autor:¿ Qué pasa?, Fecha: 2023-10-07 09:59:11
Las etiquetas:

Resumen general

Esta estrategia opera con breakouts de Bollinger Bands, tomando posiciones contra tendencia cuando el precio atraviesa completamente la banda superior o inferior.

Principio

Cuando el precio forma una vela completa por encima de la banda superior o por debajo de la banda inferior, indica un estado altamente volátil y una posible inversión hacia la media.

Específicamente, las bandas media, superior e inferior se calculan utilizando precios de cierre de 20 períodos. Una señal larga se genera cuando el precio cierra por debajo de la banda inferior después de abrir más alto. Una señal corta se activa cuando el precio cierra por encima de la banda superior después de abrir más bajo. El punto de ruptura sirve como el stop loss y la banda media es el objetivo de ganancia inicial.

Ventajas

Las principales ventajas son:

  1. Las bandas de Bollinger miden la volatilidad del mercado de manera efectiva para identificar anomalías.

  2. El punto de ruptura es un nivel de stop loss claro para controlar el riesgo.

  3. La banda media ofrece un objetivo razonable para la reversión media.

  4. Los candelabros llenos filtran las roturas falsas con una mayor fiabilidad de la señal.

  5. Los parámetros simples hacen que la implementación y la optimización sean fáciles.

  6. Lógica limpia expresada concisamente en el código.

Los riesgos

Algunos riesgos incluyen:

  1. Los parámetros BB deficientes pueden invalidar la estrategia.

  2. Las rupturas podrían señalar el inicio de la tendencia, riesgos de salida prematura.

  3. Los objetivos de la banda media pueden ser demasiado conservadores, limitando las ganancias.

  4. Es posible que las roturas anchas no se llenen por completo, lo que causa deslizamiento.

  5. Los whipssaws pueden inducir a intercambios excesivos sin sentido en mercados variados.

Mejoras

Algunas consideraciones de mejora:

  1. Medir la fuerza de la tendencia para ajustar la configuración o la frecuencia.

  2. Añadir otros indicadores para ajustar el tiempo de entrada.

  3. Ajustar el stop loss en función de la volatilidad.

  4. Optimice los objetivos iniciales para obtener ganancias sin problemas.

  5. Implementar mecanismos de reingreso a las ganancias compuestas.

  6. Evaluar la validez de la ruptura para evitar malas operaciones.

Conclusión

La estrategia negocia breakouts BB para obtener ganancias a corto plazo adecuadas para los operadores activos. Los pros son un claro control de riesgos mientras que los contras son salidas tempranas y límites de ganancias.


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

Más.