Estrategia de tendencia de oscilación inversa de bandas de Bollinger

El autor:¿ Qué pasa?, Fecha: 2023-10-31 14:30:45
Las etiquetas:

img

Resumen general

Esta es una estrategia de tendencia de oscilación de reversión basada en el canal de Bollinger Bands. Utiliza el canal superior e inferior de Bollinger Bands para determinar la tendencia, y busca oportunidades de reversión cuando el precio se acerca a los límites del canal.

Estrategia lógica

La estrategia utiliza las bandas de Bollinger como el principal indicador técnico. Las bandas de Bollinger consisten en promedio móvil de n períodos y desviación de bandas superiores / inferiores. Banda superior = MA de n períodos + m * desviación estándar de n períodos, banda inferior = MA de n períodos - m * desviación estándar de n períodos. n y m son parámetros.

Cuando el precio se acerca a la banda superior, indica una tendencia alcista, pero puede revertirse en el pico. Cuando el precio se acerca a la banda inferior, indica una tendencia bajista, pero puede revertirse en la parte inferior.

Las reglas específicas para el comercio son:

  1. Ir largo cuando se cierra > banda superior, ir corto cuando se cierra < banda inferior.

  2. Utilice la media móvil de n períodos como señal de toma de ganancias y stop loss. Cierre largo cuando el cierre se rompe por debajo de MA, cierre corto cuando se cierra por encima de MA.

  3. Utilice una cantidad fija para cada operación.

  4. Utilice el tamaño de la posición fraccionaria fija. Aumente el tamaño de la posición en un monto fijo cuando se cumpla con la relación de ganancias fija, disminuya el tamaño cuando se pierda.

Análisis de ventajas

Las ventajas de esta estrategia:

  1. Usar el canal de bandas de Bollinger para determinar la dirección de la tendencia y las reversiones comerciales, evita la mayoría de los golpes y mejora la tasa de ganancia.

  2. El promedio móvil es una señal confiable de toma de ganancias / stop loss, bloquea la mayoría de las ganancias.

  3. La cantidad fija es simple y fácil de implementar, sin necesidad de un cálculo complejo.

  4. El tamaño de posición fraccionado fijo expande las ganancias mientras controla el riesgo mediante el ajuste de posición.

Análisis de riesgos

Los riesgos de esta estrategia:

  1. Las bandas de Bollinger pueden generar señales incorrectas, causando pérdidas al operar contra la tendencia.

  2. El retraso de la media móvil puede dar lugar a una obtención de beneficios insuficiente.

  3. La cantidad fija no puede adaptarse a las condiciones del mercado, los riesgos de sobre/bajo dimensionamiento de la posición.

  4. El ajuste agresivo del tamaño de la posición en el método fraccionario fijo puede aumentar las pérdidas.

Soluciones: Optimizar los parámetros de las bandas de Bollinger para mejorar la precisión de la señal. Agregar otros indicadores para determinar la tendencia. Reducir el tamaño de la cantidad fija. Bajar la proporción de ajuste de tamaño de posición en el método de tamaño de posición fraccionario.

Direcciones de mejora

La estrategia puede mejorarse en los siguientes aspectos:

  1. Optimice los parámetros de Bollinger Bands como n y m para aumentar la precisión.

  2. Añadir otros indicadores como MACD, KD para evitar señales erróneas.

  3. Cambiar la cantidad fija a un posicionamiento dinámico en función de las condiciones del mercado.

  4. Relación de ajuste de tamaño de posición más baja en el dimensionamiento de posición fraccionario a la curva de equidad suave.

  5. Agregue estrategias de stop loss como movimiento de stop loss, breakout stop loss para controlar el riesgo.

  6. Optimización de parámetros para encontrar combinaciones óptimas de parámetros.

Resumen de las actividades

En resumen, esta es una estrategia típica de reversión de Bollinger Bands. Identifica puntos de reversión por Bollinger Bands, establece la toma de ganancias / parada de pérdidas por promedio móvil, controla el riesgo por cantidad fija y tamaño de posición fraccionario. Como estrategia de reversión, teóricamente evita algunos problemas y mejora la rentabilidad en comparación con las estrategias tradicionales de Bollinger Bands. Sin embargo, los defectos en Bollinger Bands, los promedios móviles requieren una mayor optimización y gestión de riesgos para una aplicación práctica robusta.


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
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/
// © gsanson66


//This strategy uses the well-known Bollinger Bands Indicator
//@version=5
strategy("BOLLINGER BANDS BACKTESTING", shorttitle="BB BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//----------------------------------------FUNCTIONS---------------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//---------------------------------------USER INPUTS--------------------------------------//

//Technical parameters
bbLength = input.int(defval=20, minval=1, title="BB Length", group="Technical Parameters")
mult = input.float(defval=2, minval=0.1, title="Standard Deviation Multipler", group="Technical Parameters")
smaLength = input.int(defval=20, minval=1, title="SMA Exit Signal Length", group="Technical Parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//----------------------------------VARIABLES INITIALISATION-----------------------------//
strategy.initial_capital = 50000
//Exit SMA
smaExit = ta.sma(close, smaLength)
//BB Calculation
basis = ta.sma(close, bbLength)
dev = mult * ta.stdev(close, bbLength)
upperBB = basis + dev
lowerBB = basis - dev
//Money management
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//Backtesting period
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    strategy.close_all()
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))


//-----------------------------------EXIT SIGNAL------------------------------//

if strategy.position_size > 0 and close < smaExit
    strategy.close("Long")
if strategy.position_size < 0 and close > smaExit
    strategy.close("Short")


//----------------------------------LONG/SHORT CONDITION---------------------------//

//Long Condition
if close > upperBB and inRange
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
//Short Condition
if close < lowerBB and inRange
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)


//---------------------------------PLOTTING ELEMENT----------------------------------//

plot(smaExit, color=color.orange)
upperBBPlot = plot(upperBB, color=color.blue)
lowerBBPlot = plot(lowerBB, color=color.blue)
fill(upperBBPlot, lowerBBPlot, title = "Background", color=strategy.position_size>0 ? color.rgb(0, 255, 0, 90) : strategy.position_size<0 ? color.rgb(255, 0, 0, 90) : color.rgb(33, 150, 243, 95))


Más.