Hull Fisher Adaptive stratégie intelligente à facteurs multiples

Auteur:ChaoZhang est là., Date: 2024-01-16 15:10:06 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie combine l'indicateur Hull Moving Average, l'indicateur Fisher Transform et l'indice des canaux de produits de base dans une stratégie multifactorielle adaptative.

La logique de la stratégie

La logique de base de cette stratégie est basée sur la croix dorée et la croix morte de l'indicateur Fisher Transform pour déterminer l'entrée et la sortie.

La stratégie calcule d'abord l'indicateur de la moyenne mobile de Hull et de la transformation de Fisher. Puis, à l'aide de l'indice du canal de marchandises, forme les conditions d'entrée. Lorsque l'indicateur de la transformation de Fisher traverse vers le haut depuis le bas de la ligne zéro ou traverse vers le haut depuis l'extérieur de la plage de paramètres définie, il est défini comme une condition de croix dorée pour former un signal long; lorsque la transformation de Fisher traverse vers le bas depuis le haut de la ligne zéro ou en dehors de la plage de paramètres, il est défini comme une condition de croix morte pour former un signal court.

Les conditions de sortie sont l'inverse, les ordres longs ouverts sur les croix dorées sont fermés sur les croix mortes; les ordres courts ouverts sur les croix mortes sont fermés sur les croix dorées.

Analyse des avantages

Le plus grand avantage de cette stratégie est le multi-facteur adaptatif. Elle tire parti des moyennes mobiles, des oscillateurs et des indicateurs de tendance pour bien performer à la fois sur les marchés en baisse et en hausse. Les paramètres peuvent également être ajustés en fonction de la variété et du cycle pour atteindre l'adaptabilité.

En outre, la stratégie intègre un mécanisme de stop loss automatique. Lorsque le prix dépasse la moyenne mobile de Hull, il arrêtera automatiquement la perte pour sortir. Cela réduit considérablement le risque de perte pour la stratégie.

Risques et solutions

Le plus grand risque de cette stratégie est les signaux d'erreur entre les indicateurs. Lorsque le prix se déplace latéralement, les indicateurs peuvent produire des croisements inutiles. Cela conduira à une entrée et un stop loss inutiles.

La solution consiste à ajuster les paramètres de l'indicateur de manière appropriée pour filtrer certains petits signaux. ou combiner plus d'indicateurs auxiliaires pour la confirmation. par exemple, ajouter un indicateur de volume pour déterminer les vrais signaux.

Directions d'optimisation

La stratégie peut être optimisée dans les directions suivantes:

  1. Ajoutez des algorithmes d'apprentissage automatique pour obtenir une optimisation automatique des paramètres.

  2. Ajouter plus d'indicateurs pour le score, adopter une stratégie de décision majoritaire et améliorer la précision des décisions.

  3. Ajouter un mécanisme de confirmation de rupture qui utilise des niveaux de prix et des canaux importants pour la confirmation à nouveau pour éviter les dysfonctionnements.

  4. Ajouter un module d'évaluation des risques qui peut ajuster automatiquement la taille de la position et la fourchette de stop loss en fonction des conditions du marché.

Conclusion

Dans l'ensemble, il s'agit d'un très bon cadre multifactoriel adaptatif. Il combine le jugement de tendance des moyennes mobiles, les jugements de surachat et de survente des oscillateurs, et l'application de croisements d'indicateurs, formant un mécanisme complet d'entrée et de sortie.


/*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)


Plus de