Estrategia de seguimiento de tendencias basada en el indicador de impulso comprimido


Fecha de creación: 2023-11-13 17:46:01 Última modificación: 2023-11-13 17:46:01
Copiar: 0 Número de Visitas: 883
1
Seguir
1617
Seguidores

Estrategia de seguimiento de tendencias basada en el indicador de impulso comprimido

Descripción general

La estrategia se basa en el indicador de la dinámica de compresión de LazyBear, combinado con los canales Brin y Keltner, para identificar las formas de compresión y expansión que se forman en los canales de ruptura de precios, para determinar la dirección de la tendencia potencial de los precios de las acciones y para decidir la dirección de apertura de la posición mediante el seguimiento de la tendencia. La ventaja de la estrategia es que aprovecha al máximo la capacidad del indicador de la dinámica para identificar tendencias potenciales y establece varios filtros condicionales para controlar la calidad de las señales de negociación.

Principio de estrategia

  1. Calcula el promedio móvil simple del precio de cierre de n días en la banda de Brin, el promedio móvil simple del precio de cierre de n días en la banda de Brin, el promedio móvil simple del precio de cierre de n días en la banda de Brin y el promedio móvil estándar del precio de cierre de n días en la banda de Brin, el promedio móvil simple del precio de cierre de n días en la banda de Brin, el promedio móvil móvil de n días en la banda de Brin y el promedio móvil del precio de cierre de n días en la banda de Brin.

  2. Calcule la línea media, la línea superior y la línea inferior en el canal de Keltner. La línea media es el promedio móvil simple de los n días de cierre del precio, y la línea superior y la línea inferior es el promedio móvil simple de la amplitud real de los n días de m veces.

  3. La forma de compresión y expansión es cuando el precio rompe la vía descendente desde arriba y la forma de expansión es cuando el precio rompe la vía ascendente desde abajo.

  4. Calcula el valor de la curva de regresión lineal, como indicador de movimiento. Cuando la línea de movimiento pasa por 0 es una señal de compra, y cuando pasa por 0 es una señal de venta.

  5. La combinación de la forma de la expansión de la compresión, la dirección del indicador de la dinámica, el filtro de la media y otros múltiples requisitos para determinar la señal de negociación final. Sólo si se cumplen todos los requisitos, se generará una señal de negociación para evitar transacciones erróneas.

Ventajas estratégicas

  1. Se utiliza un doble filtrado de la banda de Bryn y el canal de Keltner para identificar formas de compresión y expansión de alta calidad.

  2. El indicador de movimiento es capaz de capturar el cambio de tendencia de los precios en el momento oportuno y se complementa con el indicador de canal.

  3. La entrada más anticipada permite una mayor oportunidad de ganar dinero.

  4. Utilice criterios de arbitraje múltiple para evitar la apertura frecuente de posiciones en situaciones de crisis.

  5. Los parámetros de los indicadores técnicos se pueden personalizar para adaptarse a diferentes variedades y combinaciones de parámetros.

  6. Se puede configurar un período de tiempo de retroalimentación para optimizar las pruebas para un período de tiempo específico.

Riesgo estratégico

  1. Las estrategias de seguimiento de tendencias son propensas a sufrir pérdidas cuando la tendencia se invierte.

  2. La configuración incorrecta de los parámetros puede causar una frecuencia de transacción excesiva o una mala calidad de la señal.

  3. Dependiendo de las pruebas de datos históricos, no se puede garantizar la estabilidad de las devoluciones futuras.

  4. La crisis económica de la región ha provocado un aumento de los precios de los alimentos y de los productos alimenticios, lo que ha llevado a la crisis económica mundial.

  5. La ventana de tiempo de detección está mal configurada, lo que puede causar una sobreconformidad.

Dirección de optimización de la estrategia

  1. Optimización de los parámetros de la banda de Bryn y el canal de Keltner para encontrar la combinación óptima.

  2. La prueba incluye el stop móvil para controlar la pérdida máxima en una sola operación.

  3. Intentar optimizar aún más bajo una combinación de parámetros específicos de variedad y ciclo.

  4. Explorar la inclusión de un modelo de aprendizaje automático para determinar la reversión de la tendencia.

  5. Prueba diferentes estrategias de gestión de entrada y posición.

  6. Estudiar cómo reconocer las señales de cambio de tendencia y detener el deterioro a tiempo.

Resumir

La estrategia combina varios indicadores técnicos para determinar la dirección de la tendencia de los precios y realizar un seguimiento de la tendencia, con una gran adaptabilidad. A través de la personalización de parámetros y el filtrado de múltiples condiciones, se puede controlar eficazmente la frecuencia de las transacciones y mejorar la calidad de la señal.

Código Fuente de la Estrategia
/*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()