Estrategia de creador de mercado de banda de Bollinger

El autor:¿ Qué pasa?, Fecha: 2024-01-24 11:05:56
Las etiquetas:

img

Resumen general

Esta es una estrategia de creador de mercado que utiliza bandas de Bollinger como entradas, promedio móvil como cierre y stop loss porcentual simple. Fue extremadamente rentable en el contrato XBTUSD en junio de 2022.

Estrategia lógica

La estrategia utiliza las bandas superior e inferior de las bandas de Bollinger como áreas de oportunidad para entrar en posiciones.

Además, la estrategia también utiliza la media móvil como punto de referencia para el cierre de posiciones. Al mantener posiciones largas, si el precio está por encima del promedio móvil, optará por cerrar posiciones largas; de manera similar, al mantener posiciones cortas, si el precio está por debajo del promedio móvil, también optará por cerrar posiciones cortas.

Para el stop loss, utiliza un simple porcentaje de trailing stop loss basado en el precio de entrada.

Análisis de ventajas

Las principales ventajas de esta estrategia son las siguientes:

  1. El uso de bandas de Bollinger puede capturar efectivamente la volatilidad de los precios y obtener más oportunidades comerciales cuando la volatilidad aumenta.
  2. Las estrategias de creadores de mercado pueden beneficiarse del diferencial de oferta y demanda al operar en ambos lados.
  3. El porcentaje de stop loss puede controlar los riesgos de manera proactiva y evitar grandes pérdidas en los mercados de tendencia.

Análisis de riesgos

También hay algunos riesgos con esta estrategia:

  1. Las bandas de Bollinger no siempre son señales de entrada confiables y a veces pueden dar señales falsas.
  2. Las estrategias de los creadores de mercado son vulnerables a ser golpeadas en mercados variados.
  3. El porcentaje de pérdida de detención puede ser de fuerza bruta y incapaz de adaptarse a situaciones de mercado complejas.

Para mitigar estos riesgos, podemos considerar la adición de otros filtros, optimizar la configuración de stop loss o limitar adecuadamente los tamaños de las posiciones.

Direcciones de optimización

Hay espacio para una mayor optimización:

  1. Podemos probar diferentes combinaciones de parámetros para encontrar los parámetros óptimos.
  2. Podemos añadir más filtros para la verificación multifactor.
  3. Podemos usar métodos de aprendizaje automático para optimizar los parámetros.
  4. Podemos considerar métodos de stop loss más sofisticados como el SAR parabólico.

Conclusión

En general, esta es una estrategia de creación de mercado de alta frecuencia muy rentable. Se capitaliza en las bandas de Bollinger para señales de negociación y controla el riesgo. Pero también debemos ser conscientes de sus defectos y verificar cuidadosamente en el comercio en vivo. Con nuevas optimizaciones, esta estrategia tiene el potencial de generar rendimientos aún más estables y de gran tamaño.


/*backtest
start: 2023-12-24 00:00:00
end: 2024-01-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(shorttitle="BBL", title="BB limit", overlay = true)


length = input(200, minval=1)
src = input(hlc3, title="Source")
xmult = input(44, minval=0.001, maxval=5000, title = "bb mult (0.1%)")
s = input(title="Trend source", defval = "sma", options = ["ema", "sma", "rma", "wma"])
basis = s == "ema" ? ema(src, length) : s == "sma" ? sma(src, length) : s =="rma" ? rma(src, length) : wma(src, length)
sd = input(title="Dev source", defval = "stdev", options = ["stdev", "dev"])
mult = xmult / 10  
dev = sd == "stdev" ? mult * stdev(src, length) : mult * dev(src, length)
diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

pyr = input(1, title = "Pyramiding")
useStopLoss = input(true)
stoploss_xmult = input(15, minval=0.001, maxval=5000, title = "StopLoss 0.1%")
stopLoss_mult = sd == "simple" ? 1 + stoploss_xmult / 10 / 100 : stoploss_xmult / 10  
dev2 = sd == "stdev" ? stopLoss_mult * stdev(src, length) : sd == "dev" ? stopLoss_mult * dev(src, length) : (stopLoss_mult - 1) * basis
upper = basis + (1*dev)
lower = basis - (1*dev)
plot(basis, color=fuchsia, linewidth=2)
plot(upper, color=green, linewidth=2)
plot(lower, color=green, linewidth=2)


strategy.cancel_all()

if strategy.position_size > 0 and close <= basis + diff * 2
    strategy.order("Close long", strategy.short, strategy.position_size, limit = ShortPrice(basis))
else 
    if strategy.position_size < 0 and close >= basis - diff * 2
        strategy.order("Close short", strategy.long, -strategy.position_size, limit = LongPrice(basis))
            
stopLossPrice1 = na
stopLossPrice2 = na
add = na
openOrderCondition = close > lower - 2 * diff and (strategy.opentrades < pyr or (strategy.position_size < 0 and strategy.position_avg_price > lower * (1 + stopLoss_mult / 100)))
if openOrderCondition
    add := strategy.position_size > 0 ? -strategy.position_size : close >= basis - diff * 2 ? 0 : -strategy.position_size
    strategy.order("Open long", strategy.long, strategy.equity / pyr / lower + add, limit = LongPrice(lower))
if useStopLoss and (strategy.position_size > 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / lower : 0
    posPrice = strategy.position_size <= 0 ? lower : strategy.position_avg_price
    posSize = strategy.position_size <= 0 ? 0 : strategy.position_size
    stopLossPrice1 := posPrice * (1 - stopLoss_mult / 100)
    strategy.order("StopLoss open short ", strategy.short, posSize + add + strategy.equity / pyr / stopLossPrice1, stop = ShortPrice(stopLossPrice1))


openOrderCondition := close < upper + 2 * diff and (strategy.opentrades < pyr or (strategy.position_size > 0 and strategy.position_avg_price * (1 + stopLoss_mult / 100) < upper))
if openOrderCondition
    add := strategy.position_size < 0 ? strategy.position_size : close <= basis + diff * 2 ? 0 : strategy.position_size
    strategy.order("Open short", strategy.short, strategy.equity / pyr / upper + add, limit = ShortPrice(upper))
if useStopLoss and (strategy.position_size < 0 or openOrderCondition)
    add = openOrderCondition ? strategy.equity / pyr / upper : 0
    posPrice = strategy.position_size >= 0 ? upper : strategy.position_avg_price
    posSize = strategy.position_size >= 0 ? 0 : -strategy.position_size
    stopLossPrice2 := posPrice * (1 + stopLoss_mult / 100)
    strategy.order("StopLoss open long", strategy.long, posSize + add + strategy.equity / pyr / stopLossPrice2, stop = LongPrice(stopLossPrice2))

plot(not useStopLoss ? na : stopLossPrice1, color=red, linewidth=2)
plot(not useStopLoss ? na : stopLossPrice2, color=red, linewidth=2)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Más.