Estrategia de ruptura de impulso de compresión

El autor:¿ Qué pasa?, Fecha: 2024-01-30 17:33:49
Las etiquetas:

img

Resumen general

Se trata de una estrategia de negociación cuantitativa desarrollada sobre la base del indicador Momentum Squeeze de LazyBear. La estrategia integra bandas de Bollinger, canales de Keltner e indicadores de impulso para lograr una alta tasa de ganancia en el momento de negociación de ruptura a través de la combinación de múltiples indicadores técnicos.

Estrategia lógica

El indicador principal de esta estrategia es el indicador Momentum Squeeze de LazyBear. Este indicador determina si las bandas de Bollinger están siendo "exprimiendo" por los canales de Keltner. Cuando ocurre la compresión, representa que el mercado ha entrado en un punto de ruptura potencial. Al combinar la dirección del indicador de impulso, se pueden realizar operaciones cuando se libera la compresión para capturar el brote del mercado.

Específicamente, la estrategia primero calcula las bandas de Bollinger de 21 períodos, con un ancho de 2 desviaciones estándar del precio. Al mismo tiempo, calcula los canales de Keltner de 20 períodos, con un ancho de 1.5 veces la amplitud del precio. Cuando las bandas de Bollinger son aplastadas por los canales de Keltner, se activa una señal de compresión. Además, la estrategia también calcula el impulso del precio en relación con el punto medio de su propio canal de precios durante un período de tiempo. Cuando ocurre un apretón, combinado con la direccionalidad del indicador de impulso, determina si comprar o vender.

Para las salidas, cuando el color del indicador de impulso cambia a gris, representa que el estado de compresión ha terminado y la tendencia puede invertirse.

Ventajas

  1. Integra múltiples indicadores técnicos para mejorar la precisión

Al juzgar la relación general entre estos indicadores, se puede mejorar la exactitud de las decisiones de negociación y reducir la probabilidad de operaciones erróneas.

  1. Puntos de presión de impulso precisos con un gran potencial de ganancia

La estrategia de compresión de impulso puede capturar puntos clave donde es probable que el mercado estalle. Estos puntos son a menudo puntos de inflexión donde el mercado hace juicios direccionales importantes. Si se juzga correctamente, el movimiento posterior del mercado será relativamente largo, por lo que el espacio de ganancia potencial de la estrategia es grande.

  1. Obtener un alto índice de éxito en las operaciones de ruptura

En comparación con el comercio aleatorio de ruptura, el punto de entrada seleccionado por esta estrategia se encuentra en el punto de compresión entre las bandas de Bollinger y los canales de Keltner.

Los riesgos

  1. Riesgo de ajustes incorrectos de los parámetros

Los parámetros del ciclo y los parámetros del ancho de banda de las bandas de Bollinger y los canales de Keltner tienen un gran impacto en los resultados comerciales. Si los parámetros se establecen de manera inapropiada, pueden ocurrir juicios erróneos. Esto requiere encontrar los parámetros óptimos a través de muchas pruebas de retroceso.

  1. Riesgo de falla de la ruptura

Siempre existe el riesgo de que el precio pueda retroceder después de romper el punto seleccionado por esta estrategia, causando una pérdida.

  1. Riesgo de reversión de la tendencia

Cuando el estado de compresión termina, esta estrategia cerrará todas las posiciones. Sin embargo, a veces la tendencia del precio aún puede continuar, lo que plantea el riesgo de una salida prematura.

Direcciones de optimización

  1. Optimiza las configuraciones de parámetros

A través de más pruebas de datos de backtesting, se pueden encontrar mejores configuraciones de parámetros de ciclo y ancho de banda para mejorar el rendimiento de la estrategia.

  1. Añadir una estrategia de stop loss

Establezca paradas móviles u oscilantes para reducir rápidamente las pérdidas cuando los precios se invierten.

  1. Añadir condiciones de reingreso

Cuando la estrategia sale de las posiciones, se pueden establecer ciertas condiciones de reingreso para volver a entrar en el mercado si la tendencia continúa.

  1. Incorporar más indicadores

Intentar incorporar más indicadores de diferentes tipos, como otros indicadores de volatilidad, indicadores de volumen, etc., para establecer una estrategia compuesta de integración de indicadores, a fin de mejorar la precisión de las decisiones.

Resumen de las actividades

La estrategia integra bandas de Bollinger, canales de Keltner e indicadores de impulso. Al juzgar las relaciones entre estos indicadores, entra en puntos de ruptura de alta tasa de éxito. Hay espacios de optimización en muchos aspectos como optimización de parámetros, estrategias de stop loss, condiciones de reentrada e integración de indicadores compuestos para mejorar aún más el rendimiento de la estrategia.


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

//@version=4
//All credits to LazyBear. All I did was turn it into a strategy!

strategy(title = "SQZMOM STRAT", overlay=false)

// --- GENERAL INPUTS ---
FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2020, title = "From Year", minval = 2012)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
FromDay   = 1
ToDay     = 1
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision)
trade_leverage = input(1, title = "Trade - Leverage", step = 0.25)
trade_risk     = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
tradeType   = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"])

// --- SQZMOM CODE

length = input(21, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = color.gray
if (val > 0 and val > nz(val[1]))
    bcolor := color.green
if (val < 0 and val < nz(val[1]))
    bcolor := color.red

scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray 
plot(val, color=bcolor, style=plot.style_histogram, linewidth=4)
plot(0, color=scolor, style=plot.style_cross, linewidth=2)

// --- VWMA CODE ---
useVWMA        = input(false, title = "Use VWMA to selectively long/short?", type = input.bool)
lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1)
useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?")
nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA)
medianSrc=close

calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares)

m=calc_evwma(medianSrc, lengthVWMA, nbfs)


// ---STRATEGY---
if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false))
    longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (longCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("LONG", strategy.long, qty = contracts, when = window())
        
if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false))
    shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (shortCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("SHORT", strategy.short, qty = contracts, when = window())

if (bcolor == color.gray)
    strategy.close("LONG")
    strategy.close("SHORT")

Más.