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.
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
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.
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.
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.
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 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.
Siempre existe el riesgo de que el precio pueda retroceder después de romper el punto seleccionado por esta estrategia, causando una pérdida.
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.
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.
Establezca paradas móviles u oscilantes para reducir rápidamente las pérdidas cuando los precios se invierten.
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.
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.
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")