Esta estrategia se basa en el indicador Squeeze Momentum de LazyBear, combinando bandas de Bollinger y canales de Keltner para identificar las rupturas de precios de la compresión y expansión del canal para determinar la dirección de tendencia potencial de los precios, y adopta un enfoque de tendencia para decidir la dirección de entrada.
Cálcule la banda media, la banda superior y la banda inferior de las bandas de Bollinger. La banda media es la media móvil simple de n días del precio de cierre, las bandas superior e inferior son la banda media más/menos m veces la desviación estándar de n días del precio de cierre.
Cálcule la línea media, la línea superior y la línea inferior de los canales de Keltner. La línea media es la media móvil simple de n días del precio de cierre, las líneas superior e inferior son la línea media más / menos m veces la media móvil simple de n días del rango verdadero.
Determine si el precio se rompe a través de la banda superior o inferior de las bandas de Bollinger y los canales de Keltner para formar patrones de compresión y expansión.
Calcular el valor de la curva de regresión lineal como indicador de impulso.
Combinar los patrones de compresión/expansión, dirección del impulso, filtración media y otras condiciones para determinar las señales comerciales finales.
Utilizando doble filtración de bandas de Bollinger y canales de Keltner para identificar patrones de compresión y expansión de calidad.
El indicador de impulso puede capturar oportunamente las inversiones de tendencia de los precios, complementando los indicadores de canal.
Permite una entrada temprana para aumentar las oportunidades de ganancia.
Adopt multiple condition judgement para evitar el exceso de trading durante los mercados variados.
Los parámetros de los indicadores técnicos son personalizables y se adaptan a diferentes productos y combinaciones de parámetros.
El marco de tiempo de las pruebas de retroceso se puede configurar para optimizar durante períodos específicos.
Las estrategias que siguen tendencias son propensas a pérdidas cuando la tendencia se invierte.
La configuración incorrecta de los parámetros puede dar lugar a un exceso de negociación o a una mala calidad de la señal.
La confianza en los datos históricos no puede garantizar rendimientos futuros estables.
Incapaz de manejar la turbulencia del mercado y las drásticas oscilaciones de precios causadas por los eventos del cisne negro.
La configuración incorrecta de la ventana de tiempo de backtest puede conducir a un sobreajuste.
Optimizar los parámetros de las bandas de Bollinger y los canales de Keltner para encontrar la mejor combinación.
Prueba de adición de pérdida de detención de seguimiento para controlar la pérdida máxima por operación.
Intentar nuevas optimizaciones para productos específicos y combinaciones de periodos/parámetros.
Explorar la integración de modelos de aprendizaje automático para determinar las reversiones de tendencias.
Prueba diferentes estrategias de secuenciación de entrada y dimensionamiento de posición.
Investigue cómo identificar las señales de inversión de tendencia y salir a tiempo.
Esta estrategia integra múltiples indicadores técnicos para juzgar la dirección de la tendencia del precio y seguir la tendencia, teniendo una adaptabilidad relativamente fuerte. By customizing parameters and using multiple condition filters, it can effectively control trading frequency and improve signal quality. But reversal trades and black swan events should still be watched out for.
/*backtest start: 2022-11-06 00:00:00 end: 2023-11-12 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //Strategy based on LazyBear Squeeze Momentum Indicator //I added some custom feature and filters // // @author LazyBear // List of all my indicators: // https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing // v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears] // strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD) length = input(14, title="BB Length") mult = input(2.0,title="BB MultFactor") lengthKC=input(16, title="KC Length") multKC = input(1.5, title="KC MultFactor") useTrueRange = input(true, title="Use TrueRange (KC)", type=bool) //FILTERS useExtremeOrders = input(false, title="Early entry on momentum change", type=bool) useMomAverage = input(false, title="Filter for Momenutum value", type=bool) MomentumMin = input(20, title="Min for momentum") // Calculate BB src = close basis = sma(src, length) dev = mult * stdev(src, length) upperBB = basis + dev lowerBB = basis - dev // Calculate KC ma = sma(src, 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(src - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0) bcolor = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon)) scolor = noSqz ? blue : sqzOn ? black : aqua plot(val, color=bcolor, style=histogram, linewidth=4) plot(0, color=scolor, style=cross, linewidth=2) //LOGIC //momentum filter filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true //standard condition longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom exitLongCondition = bcolor==green and not useExtremeOrders shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom exitShortCondition = bcolor==maroon and not useExtremeOrders //early entry extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom exitExtLong = scolor==black or bcolor==red extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom exitExtShort = scolor==black or bcolor==lime //STRATEGY strategy.entry("SQ_Long", strategy.long, when = longCondition) strategy.close("SQ_Long",when = exitLongCondition ) strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong) strategy.close("SQ_Long_Ext",when = exitExtLong) //strategy.exit("exit Long", "SQ_Long", when = exitLongCondition) strategy.entry("SQ_Short", strategy.short, when = shortCondition) strategy.close("SQ_Short",when = exitShortCondition) strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort) strategy.close("SQ_Short_Ext",when = exitExtShort) //strategy.exit("exit Short", "SQ_Short", when = exitShortCondition) // // === Backtesting Dates === thanks to Trost // testPeriodSwitch = input(true, "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(23, "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()