
La estrategia es una estrategia multifactorial autoadaptativa que combina el promedio móvil de Hull, el indicador de conversión de pescadores y el índice de canales de mercancías. Es capaz de identificar tendencias de forma inteligente y ajustar automáticamente los parámetros para adaptarse a diferentes variedades y períodos.
La lógica central de esta estrategia se basa en la conversión de los pescadores al indicador de la horca de oro para juzgar las entradas y salidas. El indicador de la conversión de los pescadores combina las ventajas de los promedios móviles y el indicador de la oscilación para determinar con mayor precisión el punto de inflexión de la tendencia.
La estrategia primero calcula el promedio móvil de Hull y el indicador de giro de los pescadores. Luego, se combina con el criterio auxiliar del índice del canal de mercancías para formar las condiciones de entrada. Se establece como una condición de horquilla de oro cuando el indicador de giro de los pescadores se mueve por debajo del eje cero o por fuera del rango de parámetros establecido, formando una señal múltiple. Se establece como una condición de horquilla muerta cuando los pescadores se mueven por encima del eje cero o por debajo del rango de parámetros establecido, formando una señal de vacío.
Las condiciones de salida son las opuestas: el tenedor hace una oferta con el tenedor muerto; el tenedor muerto hace una oferta con el tenedor muerto. Así, se utiliza el cruce entre los indicadores para capturar el punto de cambio de tendencia.
La mayor ventaja de esta estrategia reside en la adaptabilidad de múltiples factores. Al mismo tiempo, utiliza las ventajas de las medias móviles, los indicadores de oscilación y los indicadores de tendencia, para obtener un buen rendimiento en los mercados de baja tensión. La configuración de los parámetros también se puede ajustar según la variedad y el período para lograr la adaptabilidad.
Además, la estrategia incluye un mecanismo de parada automática de pérdidas. Cuando el precio vuelve a romper la media móvil de Hull, se detiene automáticamente la salida. Esto reduce considerablemente el riesgo de pérdidas de la estrategia.
El mayor riesgo de esta estrategia es la generación de señales de error entre los indicadores. Cuando los precios se mueven en intervalos, los indicadores pueden generar algunos cruces innecesarios, lo que puede conducir a entradas y paradas innecesarias.
La solución es ajustar adecuadamente los parámetros del indicador, filtrar algunas señales menores. O combinar más indicadores auxiliares para confirmar. Por ejemplo, agregar un indicador de tráfico para determinar la señal verdadera.
La estrategia puede ser optimizada en las siguientes direcciones:
Se añade un algoritmo de aprendizaje automático para optimizar los parámetros. Se pueden ajustar los parámetros de los indicadores en tiempo real según el entrenamiento de datos históricos.
Aumentar el número de combinaciones de indicadores para la calificación, la mayoría de las estrategias de toma de decisiones y la precisión de las decisiones.
Incrementar el mecanismo de confirmación de ruptura, aprovechando los niveles y canales de precios importantes para volver a confirmar y evitar errores.
Se ha añadido un módulo de evaluación de riesgos que permite ajustar automáticamente el tamaño de las posiciones y el límite de pérdidas según el entorno del mercado.
La estrategia en su conjunto es un muy buen marco de adaptación multifactorial. Combina la determinación de tendencias de las medias móviles, la determinación de sobrecompras y sobreventa de los indicadores de oscilación y la aplicación cruzada de indicadores de tendencias, formando un conjunto completo de mecanismos de entrada y salida. Si se puede optimizar aún más y agregar componentes de adaptación e inteligencia, será un producto de estrategia de gran valor comercial.
/*backtest
start: 2023-01-09 00:00:00
end: 2024-01-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is free to copy/paste/use. no permission required. just do it!
// © @SeaSide420
//@version=4
strategy(title="Hull Fisher",currency="USD",default_qty_type=strategy.percent_of_equity,default_qty_value=100,commission_type=strategy.commission.percent,commission_value=0.25)
//=================================== Inputs =========================================================
period =input(title="HullMA Length", type=input.integer, defval=14, minval=2)
length =input(9, minval=1, title="Signal Length")
line1 = input(5, minval=2, title="Top Line")
line5 = input(-5, maxval=-2, title="Bottom Line")
price = input(open, type=input.source, title="Price data")
entry1 =input(true,type=input.bool, title="Open when HullFisher crossover outside Lines")
entry2 =input(true,type=input.bool, title="Open when HullFisher past zero")
useHMA =input(true,type=input.bool, title="Include Hull_moving_average")
useCCI =input(true,type=input.bool, title="Include Commodity_channel_index")
fishclose=input(true,type=input.bool, title="Close order when Fisher crossover")
HMAclose=input(true,type=input.bool, title="Close order when Hull crossover")
//================================ Calculations ======================================================
HMA = hma(price,period)
HMA2 = HMA[1]
high_ = highest(HMA, length)
low_ = lowest(HMA, length)
round_(val) => val > .99 ? .999 : val < -.99 ? -.999 : val
value = 0.0
value := round_(.66 * ((HMA - low_) / max(high_ - low_, .001) - .5) + .67 * nz(value[1]))
value1 = 0.0
value1 := .5 * log((1 + value) / max(1 - value, .001)) + .5 * nz(value1[1])
value2 = value1[1]
CCI1 = cci(price,period)
CCI2 = CCI1[1]
line2 = line1/2
line4 = line5/2
//================================ Draw Plots =======================================================
colorchange1 =CCI1>CCI2?color.lime:color.red
colorchange2 =value1>value2?color.lime:color.red
a =plot(line1,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Top Line")
b =plot(line2,style=plot.style_line,color=color.red,transp=50,linewidth=2,title="Upper Line")
c =plot(0,style=plot.style_line,color=color.black,transp=50,linewidth=2,title="Middle Line")
d =plot(line4,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Lower Line")
e =plot(line5,style=plot.style_line,color=color.lime,transp=50,linewidth=2,title="Bottom Line")
f =plot(value1, color=color.black,transp=50,linewidth=2, title="Value 1")
g =plot(value2, color=color.black,transp=50,linewidth=2, title="Value 2")
h =plot(CCI1/50,style=plot.style_area, color=colorchange1,transp=50,linewidth=2, title="CCI")
fill(f,g,color=colorchange2,transp=20,title="Color fill")
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.black, linewidth=10)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=color.white, linewidth=8)
plot(cross(value1, value2) ? value1 : na, style=plot.style_circles, color=colorchange2, linewidth=5)
//============================= Entry conditions ====================================================
// Outside Lines crossover or zero lines crossover
LongCondition1 = value1>value2 and value1<line5 and entry1 and not useCCI and not useHMA
ShortCondition1 = value1<value2 and value1>line1 and entry1 and not useCCI and not useHMA
LongCondition2 = value1>value2 and value1>0 and entry2 and not useCCI and not useHMA
ShortCondition2 = value1<value2 and value1<0 and entry2 and not useCCI and not useHMA
// Use CCI
LongCondition3 = value1>value2 and value1<line5 and CCI1>CCI2 and entry1 and useCCI and not useHMA
ShortCondition3 = value1<value2 and value1>line1 and CCI1<CCI2 and entry1 and useCCI and not useHMA
LongCondition4 = value1>value2 and value1>0 and CCI1>CCI2 and entry2 and useCCI and not useHMA
ShortCondition4 = value1<value2 and value1<0 and CCI1<CCI2 and entry2 and useCCI and not useHMA
// Use HMA
LongCondition5 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and not useCCI and useHMA
ShortCondition5 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and not useCCI and useHMA
LongCondition6 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and not useCCI and useHMA
ShortCondition6 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and not useCCI and useHMA
//Use CCI & HMA
LongCondition7 = value1>value2 and value1<line5 and CCI1>CCI2 and HMA>HMA2 and entry1 and useCCI and useHMA
ShortCondition7 = value1<value2 and value1>line1 and CCI1<CCI2 and HMA<HMA2 and entry1 and useCCI and useHMA
LongCondition8 = value1>value2 and value1>0 and CCI1>CCI2 and HMA>HMA2 and entry2 and useCCI and useHMA
ShortCondition8 = value1<value2 and value1<0 and CCI1<CCI2 and HMA<HMA2 and entry2 and useCCI and useHMA
//========================= Exit & Entry excecution =================================================
if HMAclose and fishclose and value1<value2 and HMA<HMA2
strategy.close("BUY")
if HMAclose and fishclose and value1>value2 and HMA>HMA2
strategy.close("SELL")
if HMAclose and HMA<HMA2
strategy.close("BUY")
if HMAclose and HMA>HMA2
strategy.close("SELL")
if fishclose and value1<value2
strategy.close("BUY")
if fishclose and value1>value2
strategy.close("SELL")
if LongCondition1 or LongCondition2 or LongCondition3 or LongCondition4 or LongCondition5 or LongCondition6 or LongCondition7 or LongCondition8
strategy.entry("BUY", strategy.long)
if ShortCondition1 or ShortCondition2 or ShortCondition3 or ShortCondition4 or ShortCondition5 or ShortCondition6 or ShortCondition7 or ShortCondition8
strategy.entry("SELL", strategy.short)