Estrategia de seguimiento de tendencias basada en bandas de Bollinger


Fecha de creación: 2024-01-15 14:31:21 Última modificación: 2024-01-15 14:31:21
Copiar: 0 Número de Visitas: 556
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencias basada en bandas de Bollinger

Descripción general

Esta estrategia se llama la estrategia de seguimiento de tendencias de BollingerBands, que utiliza el indicador BollingerBands para determinar la tendencia de los precios y para entrar en una brecha adicional cuando el precio rompe el canal de BollingerBands. Combina un filtro de línea uniforme para determinar la dirección de la tendencia cuando se produce una ruptura y, por lo tanto, decidir hacer una brecha adicional.

Principio de estrategia

La estrategia se basa principalmente en los indicadores de BollingerBands para determinar la tendencia de los precios y ubicar puntos de entrada. Los BollingerBands contienen tres líneas:

  1. Línea central: promedio móvil de n días
  2. En la línea superior: desplazamiento hacia arriba por una diferencia estándar de n días
  3. Baja línea: Movimiento hacia abajo, distancia de diferencia estándar de n días

Cuando el precio rompe la línea de abajo hacia arriba, se considera que se está formando una tendencia alcista; cuando el precio rompe la línea de arriba hacia abajo, se considera que se está formando una tendencia bajista. La estrategia es hacer más cautela cuando se producen estas dos rupturas.

En concreto, la lógica de la estrategia es la siguiente:

  1. Cuando el precio de cierre de la línea de abajo de las bandas se rompa en línea, haga una entrada adicional
  2. Cuando el precio de cierre de la línea de arriba de las bandas se rompe la línea de abajo, la entrada de la brecha

Para filtrar las brechas falsas, la estrategia incluye el juicio de la línea media. La entrada se activa solo cuando el precio de cierre rompe las bandas al mismo tiempo que rompe la línea media.

El promedio móvil exponencial se utiliza como indicador de la línea media.

En resumen, la estrategia para evaluar las rupturas de tendencia es:

  1. Haga más señales: precio de cierre rompe la línea de Bandas en línea && precio de cierre rompe la línea media
  2. Señal de salida: precio de cierre rompe la línea de bajada de Bands && precio de cierre rompe la línea media

Después de la entrada, la forma de parar es seguir la línea media. Cuando el precio vuelva a tocar la línea media, salga de la parada.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. Las bandas tienen espacio para la fluctuación de los precios, y las brechas representan que los precios comienzan a formarse en una nueva dirección.
  2. La combinación de filtros uniformes evita el problema de las falsas rupturas y asegura que la entrada se realice cuando realmente se produzca un cambio de tendencia.
  3. Tiene un mecanismo de parada de pérdidas incorporado, que activa la parada de pérdidas cuando el precio vuelve a la línea media de las bandas, lo que controla el riesgo de manera efectiva.
  4. La lógica de la estrategia es simple y clara, fácil de entender e implementar, y es una estrategia algorítmica adecuada para la transacción cuantitativa.
  5. Utilizando el canal de bandas y el indicador de la línea media, no es necesario predecir el precio, y es mejor medir la tendencia basándose en la evidencia posterior.

Análisis de riesgos

A pesar de las ventajas de esta estrategia, también hay riesgos:

  1. La configuración incorrecta de los parámetros de las bandas puede aumentar la frecuencia de las operaciones y el riesgo de las operaciones. Si los parámetros son demasiado sensibles, se producen una gran cantidad de falsas brechas que provocan que el sistema abra posiciones con frecuencia.
  2. La elección incorrecta de los parámetros de la línea media también puede causar que se pierda una tendencia real o que se produzca una señal falsa. La configuración de los parámetros requiere pruebas y optimización repetidas.
  3. El stop loss depende de la línea media, lo que puede llevar a una salida prematura o dar demasiado espacio para que el precio se reajuste. Esto puede llevar a perder la mayor parte de los beneficios o aumentar el riesgo de pérdidas.

Para controlar los riesgos mencionados, se puede optimizar en los siguientes aspectos:

  1. Ajuste adecuado de los parámetros de las bandas para aumentar la anchura de los canales y reducir la probabilidad de falsas rupturas
  2. Prueba diferentes tipos y longitudes de líneas medias para encontrar la mejor combinación
  3. Intentar otras formas de detener el riesgo, como el seguimiento de la tendencia o el movimiento gradual del riesgo

Dirección de optimización

De acuerdo con el análisis de riesgos anterior, la estrategia puede optimizarse aún más en los siguientes aspectos:

  1. Optimización de parámetrosBuscar la mejor combinación de bandas y parámetros de la línea media para que las estrategias sean más estables y rentables a través de métodos más sistemáticos, como los algoritmos genéticos.

  2. Optimización de pérdidasTestar diferentes métodos de detención de pérdidas, como el ATR, el seguimiento de la detención, etc., para determinar el mecanismo de detención óptimo.

  3. Optimización de los filtros: Intentar agregar otros indicadores como RSI, KD, etc. como condiciones de filtración adicionales, reducir la probabilidad de falsas señales y mejorar la rentabilidad de las ganancias.

  4. Optimización de las condiciones de ingreso: añadir otros factores de consideración, como el juicio de tendencias, el VOLUME inalterable, seleccionar estrictamente el momento de entrada y reducir las posiciones innecesarias.

  5. Aprendizaje automático: Recopilar más datos históricos, modelar con modelos de aprendizaje profundo como LSTM, RNN, etc., y usar la IA para determinar los mejores puntos de entrada y salida.

  6. Gestión de las dinámicas de riesgo y gananciasEl objetivo de la estrategia es: agregar un stop loss de proporción fija, aumentar el stop loss después de un objetivo de ganancias, y administrar dinámicamente los riesgos y los beneficios.

A través de la optimización de los aspectos mencionados anteriormente, se puede mejorar la estabilidad de la estrategia, la rentabilidad y la capacidad de ajustar el riesgo, entre otros indicadores, para convertirla en una estrategia algorítmica para el comercio en el mercado real.

Resumir

En general, la estrategia de seguimiento de tendencias de BollingerBands utiliza el indicador de bandas y la línea media para determinar la tendencia de los precios, entra en juego cuando se rompe un punto clave, y pertenece a la estrategia de seguimiento de tendencias. Tiene ventajas como la claridad de los juicios, la concisión lógica, la facilidad de implementación, etc., y también hay algunos parámetros de optimización, paradas de pérdidas, etc.

Código Fuente de la Estrategia
/*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)

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