En la carga de los recursos... Cargando...

Estrategia de seguimiento de tendencias de impulso de expansión

El autor:¿ Qué pasa?, Fecha: 2023-11-13 17:46:01
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

  1. 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.

  2. 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.

  3. 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.

  4. Calcular el valor de la curva de regresión lineal como indicador de impulso.

  5. 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.

Ventajas de la estrategia

  1. Utilizando doble filtración de bandas de Bollinger y canales de Keltner para identificar patrones de compresión y expansión de calidad.

  2. El indicador de impulso puede capturar oportunamente las inversiones de tendencia de los precios, complementando los indicadores de canal.

  3. Permite una entrada temprana para aumentar las oportunidades de ganancia.

  4. Adopt multiple condition judgement para evitar el exceso de trading durante los mercados variados.

  5. Los parámetros de los indicadores técnicos son personalizables y se adaptan a diferentes productos y combinaciones de parámetros.

  6. El marco de tiempo de las pruebas de retroceso se puede configurar para optimizar durante períodos específicos.

Riesgos de la estrategia

  1. Las estrategias que siguen tendencias son propensas a pérdidas cuando la tendencia se invierte.

  2. 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.

  3. La confianza en los datos históricos no puede garantizar rendimientos futuros estables.

  4. Incapaz de manejar la turbulencia del mercado y las drásticas oscilaciones de precios causadas por los eventos del cisne negro.

  5. La configuración incorrecta de la ventana de tiempo de backtest puede conducir a un sobreajuste.

Direcciones de optimización

  1. Optimizar los parámetros de las bandas de Bollinger y los canales de Keltner para encontrar la mejor combinación.

  2. Prueba de adición de pérdida de detención de seguimiento para controlar la pérdida máxima por operación.

  3. Intentar nuevas optimizaciones para productos específicos y combinaciones de periodos/parámetros.

  4. Explorar la integración de modelos de aprendizaje automático para determinar las reversiones de tendencias.

  5. Prueba diferentes estrategias de secuenciación de entrada y dimensionamiento de posición.

  6. Investigue cómo identificar las señales de inversión de tendencia y salir a tiempo.

Resumen de las actividades

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()
        



Más.