Estrategia de negociación de porcentajes con bandas de Bollinger


Fecha de creación: 2023-12-11 11:14:53 Última modificación: 2023-12-11 11:14:53
Copiar: 0 Número de Visitas: 750
1
Seguir
1621
Seguidores

Estrategia de negociación de porcentajes con bandas de Bollinger

Descripción general

La estrategia se basa en el indicador de la banda de Brin, combinado con los promedios móviles y los indicadores técnicos ATR, para lograr un sistema de rupturas de corto período. La estrategia determina la situación de sobrecompra y sobreventa de los precios mediante el cálculo del porcentaje de posición relativa de los precios dentro del canal de la banda de Brin, combinado con nuevas rupturas de los puntos altos y bajos para generar señales de negociación.

Principio de estrategia

  1. Cálculo del canal de la franja de Brin y el porcentaje de ubicación relativa de los precios dentro del canal
  2. Las medias móviles se calculan para los precios de apertura, cierre, máximo y mínimo.
  3. Calcular el indicador ATR y combinarlo con el ATR para establecer una línea de stop loss
  4. Determinar si el precio está cerca de un nuevo máximo o mínimo
  5. La combinación de los precios más altos y más bajos del año para determinar la situación a gran escala
  6. Indicar si se emite una señal de negociación a través de cambios en el porcentaje de la banda de Brin y nuevos altos y bajos

La estrategia utiliza el canal de Brin para determinar la volatilidad del mercado, y el ancho del canal de Brin se determina a través de la diferencia estándar. El precio es el punto de compra cuando se rompe la banda de Brin hacia abajo y el precio es el punto de venta cuando se rompe la banda de Brin hacia arriba.

Ventajas estratégicas

  1. El rigor en el juicio de brechas en la banda de Brin reduce las señales falsas
  2. Los promedios móviles suavizan los precios para identificar las tendencias reales
  3. El indicador ATR tiene un seguimiento dinámico de la pérdida para limitar la pérdida individual
  4. Los nuevos altos y bajos y las decisiones anuales de altos y bajos hacen que la señal sea más confiable.
  5. Combinación de varios indicadores técnicos para mejorar la eficiencia de las estrategias

Riesgos estratégicos y soluciones

  1. La configuración incorrecta de los parámetros de la ruta de la banda de Brin puede causar demasiadas falsas rupturas, y se debe probar una combinación diferente de parámetros para obtener el mejor resultado
  2. El precio de cierre puede ser un punto de referencia para retroceder más allá del límite de pérdidas establecido por ATR, se puede considerar el porcentaje de precios máximos y mínimos con un margen de fluctuación mayor.
  3. El estricto filtrado de los binarios puede perder oportunidades de tendencia en líneas más largas, por lo que es conveniente flexibilizar las condiciones de filtrado y el tiempo de tenencia de las posiciones.
  4. Los indicadores ATR son más lentos para rastrear las fluctuaciones de precios importantes, por lo que se deben considerar los indicadores de fluctuación de mayor frecuencia, como la amplitud real.
  5. Los nuevos altibajos son susceptibles a la interferencia del ruido a corto plazo, por lo que se debe evaluar la significación estadística y la sostenibilidad de la tendencia

Dirección de optimización de la estrategia

  1. Prueba diferentes combinaciones de parámetros para determinar el mejor parámetro de la banda de Bryn y la longitud de la media móvil
  2. La combinación de modelos combinados con diferentes parámetros de la banda de Bryn o medias móviles determina la señal
  3. Prueba de adaptabilidad a diferentes períodos de tiempo y diferentes parámetros de variedad para mejorar la robustez
  4. Combinación de más criterios a gran escala, como la señal de banda de Brin a nivel de línea de sol o factores estacionales
  5. Evaluar las oportunidades de seguimiento de tendencias para ampliar la cobertura de la estrategia y el espacio para obtener ganancias

Resumir

La estrategia utiliza un conjunto de herramientas técnicas, como el porcentaje de la banda de Brin, las medias móviles, el indicador ATR, los nuevos altos y bajos y los altos y bajos anuales, para construir una estrategia de negociación de ruptura relativamente rigurosa y eficiente en períodos cortos. Su ventaja destacada consiste en utilizar todos los tipos de herramientas para reducir el ruido y identificar las señales de tendencia reales.

Código Fuente de la Estrategia
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Bollinger %B Candles Strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

BBLength = input(100, minval=1, step=1)
StdDev = 10
useMovingAverage = input(true)
MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
lookbackPeriod = input(22, minval=10, step=10)
colorByPreviousClose = input(true)

AtrMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(10)
AtrMult = input(4)
wicks = input(false)

considerYearlyHighLow = input(false)
considerNewLongTermHighLows = input(false)
shortHighLowPeriod = 100
longHighLowPeriod = 200
tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])

backtestYears = input(10, minval=1, step=1)


//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
    newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
    newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
    [newHigh,newLow]

//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
    yhigh = security(syminfo.tickerid, '12M', high[1]) 
    ylow = security(syminfo.tickerid, '12M', low[1]) 
    yhighlast = yhigh[365]
    ylowlast = ylow[365]
    yhighllast = yhigh[2 * 365]
    ylowllast = ylow[2 * 365]
    
    yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
    yearlyHighCondition = (  (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
    yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
    yearlyLowCondition = (  (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
    
    label_x = time+(60*60*24*1000*1)
    [yearlyHighCondition,yearlyLowCondition]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

inDateRange = true
[yearlyHighCondition,yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHighS,newLowS] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)
[middleclose, upperclose, lowerclose] = bb(close, BBLength, StdDev)
[middleopen, upperopen, loweropen] = bb(open, BBLength, StdDev)
[middlehigh, upperhigh, lowerhigh] = bb(high, BBLength, StdDev)
[middlelow, upperlow, lowerlow] = bb(low, BBLength, StdDev)

percentBClose = (close - lowerclose)*100/(upperclose-lowerclose)
percentBOpen = (open - loweropen)*100/(upperopen-loweropen)
percentBHigh = (high - lowerhigh)*100/(upperhigh-lowerhigh)
percentBLow = (low - lowerlow)*100/(upperlow-lowerlow)

percentBMAClose = f_getMovingAverage(percentBClose, MAType, lookbackPeriod)
percentBMAOpen = f_getMovingAverage(percentBOpen, MAType, lookbackPeriod)
percentBMAHigh = f_getMovingAverage(percentBHigh, MAType, lookbackPeriod)
percentBMALow = f_getMovingAverage(percentBLow, MAType, lookbackPeriod)

newOpen = useMovingAverage? percentBMAOpen : percentBOpen
newClose = useMovingAverage? percentBMAClose : percentBClose
newHigh = useMovingAverage? percentBMAHigh : percentBHigh
newLow = useMovingAverage? percentBMALow : percentBLow

truerange = max(newHigh, newClose[1]) - min(newLow, newClose[1])

averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
atr = averagetruerange * AtrMult

longStop = newClose - atr
longStopPrev = nz(longStop[1], longStop)
longStop := (wicks ? newLow[1] : newClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = newClose + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := (wicks ? newHigh[1] : newClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and (wicks ? newHigh : newClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? newLow : newClose) < longStopPrev ? -1 : dir

trailingStop = dir == 1? longStop : shortStop

candleColor = colorByPreviousClose ?
                 (newClose[1] < newClose ? color.green : newClose[1] > newClose ? color.red : color.silver) : 
                 (newOpen < newClose ? color.green : newOpen > newClose ? color.red : color.silver)
plotcandle(newOpen, newHigh, newLow, newClose, title='PercentBCandle', color = candleColor, wickcolor=candleColor)
plot(trailingStop, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= dir == 1 ? color.green : color.red)

buyCondition = dir==1 and yearlyHighCondition and newHighS
exitBuyCondition = dir == -1
sellCondition = dir == -1 and yearlyLowCondition and newLowS
exitSellCondition = dir == 1
strategy.risk.allow_entry_in(tradeDirection)

barcolor(buyCondition? color.lime : sellCondition ? color.orange : color.silver)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=exitBuyCondition)

strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=exitSellCondition)