Tendencia de las bandas de Bollinger siguiendo la estrategia

El autor:¿ Qué pasa?, Fecha: 2024-01-15 14:31:21
Las etiquetas:

img

Resumen general

Esta estrategia se llama Bollinger Bands Trend Following Strategy. Utiliza el indicador de Bollinger Bands para determinar las tendencias de precios y entra en largo o corto cuando el precio sale del canal de Bollinger Bands. Incorpora un filtro promedio móvil para juzgar la dirección de la tendencia al romper, decidiendo así entre entradas largas y cortas.

Principios

La estrategia se basa principalmente en el indicador Bollinger Bands para determinar la tendencia de precios y los puntos de entrada.

  1. Línea media: media móvil de n días
  2. Línea superior: desviación estándar de n días hacia arriba
  3. Línea inferior: desviación estándar de n días hacia abajo

Cuando el precio rompe hacia arriba desde la línea inferior a través de la línea superior, se identifica una tendencia alcista. Cuando el precio rompe hacia abajo desde la línea superior a través de la línea inferior, se ha iniciado una tendencia bajista. La estrategia entra en largo o corto en la ocurrencia de estos dos tipos de roturas.

Específicamente, la lógica de la estrategia es:

  1. Entra largo cuando el cierre se rompe hacia arriba desde la línea inferior de las bandas.
  2. Entra corto cuando el cierre se rompe hacia abajo desde la línea superior de las bandas.

Para evitar errores, se añade un filtro de media móvil. La entrada solo ocurre cuando el cierre rompe las bandas junto con la ruptura de la media móvil.

Aquí el promedio móvil exponencial se utiliza como indicador.

En resumen, los criterios para determinar la ruptura de tendencia son:

  1. Signales largos: cierre se rompe banda superior && cierre se rompe media móvil
  2. Signo corto: cierre se rompe Bandas línea inferior && cierre se rompe promedio móvil

Después de entrar, el stop loss sigue la línea media y sale cuando el precio vuelve a tocar la línea media.

Análisis de la fuerza

Las principales fortalezas de esta estrategia incluyen:

  1. Captura de nuevas tendencias formadas por breakouts de línea media.
  2. Evitar falsas rupturas a través del filtro de media móvil, garantiza la entrada solo en la inversión de tendencia real.
  3. Mecanismo de stop loss incorporado mediante el seguimiento de la línea media, controla eficazmente los riesgos.
  4. Lógica simple y clara, fácil de entender e implementar, adecuada para estrategias de comercio de algo.
  5. Utiliza el canal de bandas y indicadores de promedio móvil, no es necesario predecir los precios, identifica tendencias basadas en evidencia después de los hechos.

Análisis de riesgos

A pesar de las ventajas, la estrategia también conlleva los siguientes riesgos:

  1. Los parámetros de bandas inadecuados pueden aumentar la frecuencia y los riesgos comerciales.
  2. La selección inadecuada de los parámetros de la media móvil puede causar tendencias reales que faltan o generar señales falsas.
  3. El stop loss se basa en la línea media, puede salir prematuramente o permite demasiado espacio de retroceso.

Para controlar los riesgos anteriores, se puede realizar la siguiente optimización:

  1. Ajusta los parámetros de las bandas correctamente, aumenta el ancho del canal para reducir las probabilidades de una falsa ruptura.
  2. Prueba diferentes tipos y longitudes de medias móviles para encontrar combinaciones óptimas.
  3. En el caso de las operaciones de liquidación de pérdidas, el valor de las pérdidas de liquidación de pérdidas de liquidación de pérdidas de liquidación de pérdidas de liquidación de pérdidas de liquidación de pérdidas de liquidación de pérdidas de liquidación de pérdidas de liquidación de pérdidas de liquidación de pérdidas de liquidación.

Direcciones de optimización

Sobre la base del análisis de riesgos, se pueden realizar nuevas optimizaciones en las siguientes áreas:

  1. Optimización de parámetros: utilizar métodos más sistemáticos como algoritmos genéticos para encontrar combinaciones óptimas de parámetros para bandas y promedios móviles, para hacer la estrategia más estable y rentable.

  2. Optimización de pérdidas: Prueba diferentes técnicas de stop loss como las paradas ATR, las paradas de trailing, etc., para determinar el mejor mecanismo de paradas.

  3. Optimización de filtros: Intente agregar otros indicadores como RSI, KD, etc. como filtros adicionales, para reducir las probabilidades de señal falsa y aumentar la tasa de rentabilidad.

  4. Optimización de los criterios de entrada: Añadir otras consideraciones como condiciones de tendencia, volumen anormal, etc. para seleccionar estrictamente el momento de entrada, evitar entradas innecesarias.

  5. Aprendizaje automático: Recopilar más datos históricos para construir LSTM, RNN y otros modelos de aprendizaje profundo, para permitir el mejor momento de entrada y salida impulsado por IA.

  6. Gestión dinámica del riesgo-recompensa: Incorporar paradas de ratio fijo, aumento de la meta de ganancias después de alcanzar ciertos niveles de ganancias, etc. para controlar dinámicamente el riesgo de pago.

A través de optimizaciones en las áreas anteriores, las métricas clave como la estabilidad, la rentabilidad, las capacidades de ajuste al riesgo se pueden mejorar de manera integral, transformando la estrategia en un algoritmo de grado de producción adecuado para el comercio en vivo.

Conclusión

En conclusión, la Bollinger Bands Trend Following Strategy identifica las tendencias de precios utilizando el indicador de Bandas y promedios móviles, entrando en puntos clave de ruptura. Tiene los pros de una lógica clara, simplicidad, facilidad de implementación, mientras que también tiene áreas para mejoras como ajuste de parámetros, mecanismos de stop loss.


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

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


Más.