Esta estrategia combina el Hull Moving Average, el indicador Fisher Transform y el Commodity Channel Index en una estrategia multifactorial adaptativa. Puede identificar de manera inteligente las tendencias, ajustar automáticamente los parámetros y adaptarse a diferentes productos y ciclos.
La lógica central de esta estrategia se basa en la cruz de oro y la cruz muerta del indicador de Fisher Transform para determinar la entrada y salida.
La estrategia primero calcula el indicador de la media móvil de Hull y el indicador de la transformación de Fisher. Luego, con la ayuda del índice del canal de productos básicos, forma las condiciones de entrada. Cuando el indicador de la transformación de Fisher cruza hacia arriba desde debajo de la línea cero o cruza desde fuera del rango de parámetros establecidos, se establece como una condición de cruz dorada para formar una señal larga; cuando la transformación de Fisher cruza hacia abajo desde encima de la línea cero o fuera del rango de parámetros, se establece como una condición de cruz muerta para formar una señal corta.
Las condiciones de salida son opuestas, las órdenes largas abiertas en cruces doradas se cierran en cruces muertas; las órdenes cortas abiertas en cruces muertas se cierran en cruces doradas.
La mayor ventaja de esta estrategia es el multifactor adaptativo. Se aprovecha de los promedios móviles, osciladores e indicadores de tendencia para tener un buen desempeño tanto en mercados en caída como en crecimiento. Los parámetros también se pueden ajustar de acuerdo con la variedad y el ciclo para lograr adaptabilidad.
Además, la estrategia incorpora un mecanismo de stop loss automático. Cuando el precio se rompe por encima del promedio móvil de Hull, automáticamente detendrá la pérdida para salir. Esto reduce en gran medida el riesgo de pérdida para la estrategia.
El mayor riesgo de esta estrategia son las señales de error entre los indicadores. Cuando el precio se mueve hacia un lado, los indicadores pueden producir algunos cruces innecesarios. Esto llevará a una entrada innecesaria y a un stop loss.
La solución es ajustar adecuadamente los parámetros del indicador para filtrar algunas señales pequeñas. o combinar más indicadores auxiliares para la confirmación. por ejemplo, añadir un indicador de volumen para determinar las señales verdaderas.
La estrategia se puede optimizar en las siguientes direcciones:
Añadir algoritmos de aprendizaje automático para lograr la optimización automática de parámetros. Puede entrenar basado en datos históricos y ajustar parámetros de indicadores en tiempo real.
Añadir más indicadores para la puntuación, adoptar una estrategia de decisión por mayoría y mejorar la precisión de la decisión.
Añadir un mecanismo de confirmación de la ruptura que utiliza niveles de precios importantes y canales para la confirmación de nuevo para evitar mal funcionamiento.
Añadir un módulo de evaluación de riesgos que pueda ajustar automáticamente el tamaño de la posición y el rango de suspensión de pérdidas en función de las condiciones del mercado.
En general, se trata de un marco multifáctor muy bueno y adaptativo. Combina el juicio de tendencia de las medias móviles, los juicios de sobrecompra y sobreventa de los osciladores y la aplicación de cruces de indicadores, formando un mecanismo completo de entrada y salida. Si se puede optimizar aún más y aumentar los componentes adaptativos e inteligentes, se convertirá en un producto de estrategia con un valor comercial extremadamente alto.
/*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)