Tendencia de las bandas de Bollinger de la media móvil doble siguiendo la estrategia

El autor:¿ Qué pasa?, Fecha: 2023-11-01 14:15:11
Las etiquetas:

img

Resumen general

Esta estrategia toma decisiones comerciales basadas en dos bandas de Bollinger para seguir la tendencia. Utiliza la convergencia y divergencia de los rieles superior e inferior de las bandas de Bollinger para determinar los cambios de tendencia, comprando cerca del rieles inferior y vendiendo cerca del rieles superior, para lograr comprar bajo y vender alto.

Estrategia lógica

La estrategia se aplica tanto a bandas de Bollinger simples como a bandas de Bollinger mejoradas.

Las bandas de Bollinger simples utilizan SMA de precios cerrados para la banda media, mientras que las bandas de Bollinger mejoradas utilizan EMA de precios cerrados.

Las bandas superior e inferior se calcularán por las desviaciones estándar ± N de la banda media.

La estrategia juzga la fuerza de la tendencia en función del diferencial entre las bandas superior e inferior.

Específicamente, cuando el precio se acerca a la banda inferior, se anhela. Cuando el precio se acerca a la banda superior, cierra la posición. El método de stop loss es un porcentaje fijo. También se puede activar el stop de seguimiento.

Tome ganancias depende del cierre cerca de la banda media o banda superior.

La estrategia también puede optar por vender solo con ganancias para evitar pérdidas.

Análisis de ventajas

Las ventajas de esta estrategia:

  1. Las bandas de Bollinger dobles mejoran la eficiencia

Al comparar bandas de Bollinger simples y mejoradas, puede elegir la mejor versión para una mayor eficiencia.

  1. Los jueces del spread juzgan la fuerza de la tendencia

Cuando el spread se estrecha, indica una tendencia de fortalecimiento.

  1. Profit taking y stop loss flexibles

El porcentaje fijo de stop loss controla la pérdida de una sola operación.

  1. Mecanismo de protección contra pérdidas

Sólo vender con ganancias evita que las pérdidas se extiendan.

Análisis de riesgos

Los riesgos incluyen:

  1. Riesgo de utilización

La tendencia que sigue a sí misma conlleva riesgos de reducción.

  1. Riesgo de la sierra

Cuando las bandas son amplias, el mercado puede girar hacia los lados. La estrategia es menos efectiva. Necesita pausar la negociación hasta que la tendencia se reanude.

  1. El riesgo de pérdida por suspensión de operaciones

El porcentaje fijo de stop loss puede ser demasiado agresivo.

Direcciones de optimización

La estrategia puede optimizar:

  1. Parámetros de las bandas de Bollinger

Prueba diferentes longitudes de MA, múltiplos de desviación estándar para encontrar combinaciones óptimas para diferentes mercados.

  1. Añadir filtros

Agregue filtros como MACD, KD en la parte superior de la señal de Bollinger para reducir las operaciones durante los mercados de la sierra.

  1. Las pérdidas por pérdidas

Prueba diferentes métodos de parada de seguimiento o optimiza la parada de pérdida en función de la volatilidad, ATR, etc.

  1. Gestión del dinero

Optimice el tamaño de las posiciones por operación. Pruebe diferentes estrategias adicionales.

Conclusión

Esta estrategia combina los puntos fuertes de las bandas de Bollinger duales, juzgando la fuerza de la tendencia por el ancho de la banda y los retrocesos comerciales durante las tendencias. También establece el stop loss adecuado para controlar los riesgos. Se pueden hacer mejoras adicionales mediante la optimización de parámetros y la adición de filtros.


/*backtest
start: 2023-10-01 00:00:00
end: 2023-10-31 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/
// © JCGMarkets 

//@version=4
strategy("B.Bands | Augmented | Intra-range | Long-Only", shorttitle = "BB|A|IR|L", initial_capital=5000, commission_value=0.075, slippage = 1, overlay = true)

//Technical Indicators Data
show_simp   = input(false, title="Trade on Simple Bollinger Bands ", type= input.bool, group="Select Strategy System")
show_augm   = input(true, title="Trade on Augmented Bollinger Bands", type= input.bool, group="Select Strategy System") 
periods     = input(20, title="Periods for Moving Average", type =input.integer, minval = 2, step = 1, group="Technical Inputs")
std         = input(2, title="Std", type = input.float, minval=0.1 , step = 0.1, group="Technical Inputs")

// Strategy data
max_spread_bb   = input(20000.0, title="Max Spread Tolerance Beetween Bands", type=input.float, step=0.1, group="Strategy Inputs")
entry_source    = input(close, title="Entry data source", type=input.source, group="Strategy Inputs")
exit_source     = input(high, title="Exit data source", type=input.source, group="Strategy Inputs")
take_profit     = input("middle", title = "Profit to band:", options = ["middle", "opposite"], group="Strategy Inputs")
stop_loss       = input(3.00, title="Stop Loss %", type=input.float, step=0.05, group="Strategy Inputs")
trailing        = input(false, title="Activate trailing stop?", type = input.bool, group="Strategy Inputs")
stop_perc       = input(6.00, title="Trailing %", type=input.float, step=0.125, group="Strategy Inputs") * 0.01
sell_profit     = input(false, title="Only sell in profit (Stop Loss still active) ", type= input.bool, group="Strategy Inputs")


var SL = 0.0
var SLT= 0.0


//Simple BB Calculation -> adapt if needed with different std for upper-lower, sma-ema, etc 
middle_sim = sma(close, periods)

//Augmented BB Calculation -> adapt if needed with different std for upper lower, etc
middle_augm  = ema(close, periods)
middle_upp = ema(high, periods)
middle_low = ema(low, periods)

//Multiplier
dev      = stdev(close, periods) * std

//Upper & Lower Bands
upper = (middle_sim + dev)
lower = (middle_sim - dev)

//Augmented Bands
upper_augm = (middle_upp + dev)
lower_augm = (middle_low - dev)

//Bands Spread
spread   = upper - lower
spread_augm   = upper_augm - lower_augm

//From date
filter_from    =   input(  true,    title="===> From", group="Date Control")
from_y         =   input(  2010,    title = "from year", group="Date Control")
from_m         =   input(     1,    title = "from month", minval =1, maxval=12, group="Date Control")
from_d         =   input(     1,    title = "from day",  minval=1, maxval=31, group="Date Control")

//To date
filter_to   =    input( true,   title="===> To", group="Date Control")
to_y        =    input( 2030,   title = "To year", group="Date Control")
to_m        =    input(    1,   title = "To month", minval =1, maxval=12, group="Date Control")
to_d        =    input(    1,  title = "To day",  minval=1, maxval=31, group="Date Control")

// Date Condition
In_date() =>  true

in_position = strategy.position_size > 0 

// Trailing stop 
SLT := if in_position and In_date()
    stop_inicial = entry_source * (1 - stop_perc)
    max(stop_inicial, SLT[1])
else
    0

slts = (low <= SLT) and (trailing == true)


//Essential Trade logics
entry_long = (entry_source <= lower) and (spread < max_spread_bb)
entry_long_augm = (entry_source <= lower_augm) and (spread_augm < max_spread_bb)

// Simple Bollinger Conditions

if (not in_position and show_simp and In_date())
    if entry_long
        // Trigger buy order
        position_size = round( strategy.equity / close ) // All available equity for this strategy example
        strategy.entry("Entry", strategy.long, qty = position_size )
        SL := close * (1 - (stop_loss / 100)) // You could determine wether or not implement stop loss with bool input and if condition here.


if in_position and show_simp and not sell_profit and In_date()
    //Exits if not sell in profit
    if take_profit == "middle" 
        strategy.exit("Target", "Entry", limit = middle_sim, stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry", limit = upper, stop = SL, comment="Exit")    

if in_position and show_simp and sell_profit and In_date()
    //Exits if sell in profit
    if take_profit == "middle" 
        strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? middle_sim: na), stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry", limit = (strategy.openprofit > 0 ? upper: na), stop = SL, comment="Exit")    



if in_position and show_simp and slts and In_date()
    //Trailing activation
    strategy.close("Entry", comment="SLT")

if not In_date()
    //Exit due out of date range
    strategy.close("Entry", comment="Out of date range")



// Augmented Bollinger Conditions

if (not in_position and show_augm and In_date()) 
    if entry_long_augm
        // Trigger buy order
        position_size = round( strategy.equity / close )
        strategy.entry("Entry_A", strategy.long, qty = position_size )
        SL := close * (1 - (stop_loss / 100) )

if in_position and show_augm and not sell_profit and In_date()
    //Exits and not sell in profit
    if take_profit == "middle"
        strategy.exit("Target", "Entry_A", limit = middle_augm, stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry_A", limit = upper_augm, stop = SL, comment="Exit")            
        

if in_position and show_augm and sell_profit and In_date() 
    //Exit only in profit
    if take_profit == "middle"
        strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? middle_augm:na), stop = SL, comment="Exit")
    if take_profit == "opposite"
        strategy.exit("Target", "Entry_A", limit = (strategy.openprofit > 0 ? upper_augm: na) , stop = SL, comment="Exit") 


if in_position  and show_augm and slts and In_date()
    //Trigger trailing
    strategy.close("Entry_A", comment="SLT")
    
if not In_date()
    //Out of date trigger
    strategy.close("Entry_A", comment= "Out of date range")




// Plotting

plot(in_position ? SL > 0 ? SL : na : na , style = plot.style_circles, color = color.red, title = "Stop Loss")
plot(in_position ? trailing ? SLT > 0 ? SLT : na : na : na , style = plot.style_circles, color = color.blue, title = "Trailing Stop" )

s = plot(show_simp ? upper : na , color = color.aqua)
plot(show_simp ? middle_sim : na , color=color.red)
i = plot(show_simp ? lower : na , color = color.aqua)
fill(s,i, color=color.new(color.aqua,90))


plot(show_augm ? middle_augm : na , color=color.blue)
s_a = plot( show_augm ? upper_augm : na, color=color.orange)
i_a = plot( show_augm ? lower_augm : na, color= color.orange)
fill(s_a,i_a, color=color.new(color.orange, 90))

Más.