Hull Fisher Adaptive Intelligente Vielfaktorstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-16 15:10:06
Tags:

img

Übersicht

Diese Strategie kombiniert den Hull Moving Average, den Fisher Transform-Indikator und den Commodity Channel Index zu einer anpassungsfähigen Multifaktorstrategie, die Trends intelligent identifizieren, Parameter automatisch anpassen und sich an verschiedene Produkte und Zyklen anpassen kann.

Strategie Logik

Die Kernlogik dieser Strategie basiert auf dem goldenen Kreuz und dem toten Kreuz des Fisher Transform-Indikators, um Ein- und Ausstieg zu bestimmen.

Die Strategie berechnet zunächst den Hull Moving Average und den Fisher Transform Indikator. Dann bilden Sie mit Hilfe des Commodity Channel Index die Einstiegsbedingungen. Wenn der Fisher Transform Indikator von unterhalb der Nulllinie oder von außerhalb des eingestellten Parameterbereichs nach oben kreuzt, wird er als goldene Kreuzbedingung gesetzt, um ein langes Signal zu bilden; wenn die Fisher Transform von über der Nulllinie oder außerhalb des Parameterbereichs nach unten kreuzt, wird er als tote Kreuzbedingung gesetzt, um ein kurzes Signal zu bilden.

Die Ausgangszustände sind umgekehrt, lange Aufträge, die auf Goldkreuzen eröffnet wurden, werden bei Toten Kreuzen geschlossen; kurze Aufträge, die auf Toten Kreuzen eröffnet wurden, werden bei Goldkreuzen geschlossen.

Analyse der Vorteile

Der größte Vorteil dieser Strategie ist der adaptive Multifaktor. Sie nutzt gleitende Durchschnitte, Oszillatoren und Trendindikatoren, um sowohl in fallenden als auch aufstrebenden Märkten gut zu funktionieren. Die Parameter können auch je nach Sorte und Zyklus angepasst werden, um Anpassungsfähigkeit zu erzielen.

Darüber hinaus beinhaltet die Strategie einen automatischen Stop-Loss-Mechanismus. Wenn der Preis über den Hull Moving Average zurückbricht, wird er automatisch den Verlust stoppen, um auszusteigen. Dies reduziert das Verlustrisiko für die Strategie erheblich.

Risiken und Lösungen

Das größte Risiko dieser Strategie sind die Fehlersignale zwischen den Indikatoren. Wenn sich der Preis seitwärts bewegt, können die Indikatoren einige unnötige Kreuzungen erzeugen. Dies führt zu unnötigem Eintritt und Stop-Loss.

Die Lösung besteht darin, die Indikatorparameter angemessen anzupassen, um einige kleine Signale auszufiltern. Oder mehr Hilfsindikatoren zur Bestätigung zu kombinieren. Zum Beispiel fügen Sie einen Lautstärkenindikator hinzu, um wahre Signale zu bestimmen.

Optimierungsrichtlinien

Die Strategie kann in folgenden Richtungen optimiert werden:

  1. Fügen Sie maschinelle Lernalgorithmen hinzu, um eine automatische Parameteroptimierung zu erreichen.

  2. Mehr Indikatoren für die Bewertung hinzufügen, eine Mehrheitsentscheidungsstrategie verfolgen und die Entscheidungsgenauigkeit verbessern.

  3. Hinzufügen eines Breakout-Bestätigungsmechanismus, der wichtige Preisniveaus und Kanäle zur erneuten Bestätigung verwendet, um Fehlbetrieb zu vermeiden.

  4. Hinzufügen eines Risikobewertungsmoduls, das die Positionsgröße und den Stop-Loss-Bereich automatisch anhand der Marktbedingungen anpassen kann.

Schlussfolgerung

Insgesamt handelt es sich um ein sehr gutes anpassungsfähiges Multifaktor-Framework. Es kombiniert die Trendbeurteilung von gleitenden Durchschnitten, die Überkauf- und Überverkaufsbeurteilungen von Oszillatoren und die Anwendung von Indikatorkreuzungen und bildet einen vollständigen Ein- und Ausstiegsmechanismus. Kann es weiter optimiert und anpassungsfähige und intelligente Komponenten erhöht werden, wird es zu einem Strategieprodukt mit extrem hohem kommerziellem Wert.


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


Mehr