
Die Strategie ist eine anpassungsfähige Multifaktor-Strategie, die den Hull Moving Average, den Fischerverlagerungsindikator und den Commodity Channel Index kombiniert. Sie ist in der Lage, Trends intelligent zu erkennen und die Parameter automatisch anzupassen, um sie an verschiedene Sorten und Perioden anzupassen.
Die Kernlogik der Strategie basiert auf dem Fischer-zu-Indikator, um die Ein- und Ausgänge zu bestimmen. Der Fischer-zu-Indikator kombiniert die Vorteile des Moving Averages und des Schwankungsindikators, um den Trendwendepunkt genauer zu bestimmen.
Die Strategie berechnet zunächst den Hull Moving Average und den Fischer-Wechsel-Indikator. Dann werden die Einstiegsbedingungen in Kombination mit dem Commodity Channel Index unterstützt. Wenn der Fischer-Wechsel-Indikator unterhalb der Null-Achse oder außerhalb des eingestellten Parameterbereichs als Goldfork-Bedingung eingestellt wird, wird ein Mehrsignal erzeugt.
Die Ausgangsbedingungen sind umgekehrt, Goldfork macht mehrere Aufträge mit Dead-Fork-Plainage; Dead-Fork macht offene Aufträge mit Goldfork-Plainage. So nutzt man die Kreuzung zwischen den Indikatoren, um Trendwendepunkte zu erfassen.
Der größte Vorteil dieser Strategie liegt in der Anpassung an mehrere Faktoren. Sie nutzt gleichzeitig die Vorteile von Moving Averages, Stagnationsindikatoren und Trendindikatoren und kann in schwächeren Märkten gut abschneiden. Die Parameter-Einstellungen können jedoch je nach Sorte und Periode angepasst werden, um Anpassung zu erreichen.
Zusätzlich wurde ein automatischer Stop-Loss-Mechanismus eingefügt, der automatisch den Verlust auslöst, wenn der Preis den Hull Moving Average erneut überschreitet. Dies reduziert das Verlustrisiko der Strategie erheblich.
Die größte Gefahr dieser Strategie besteht darin, dass es zu Fehlsignalen zwischen den Indikatoren kommt. Wenn der Preis in einer Zone schwankt, können die Indikatoren einige unnötige Kreuzungen erzeugen. Dies führt zu unnötigen Einstiegs- und Stop-Losses.
Die Lösung besteht darin, die Parameter der Indikatoren entsprechend anzupassen, einige kleine Signale zu filtern oder mehr Hilfsindikatoren zu kombinieren, um die Wahrheitsbestätigung zu bestätigen.
Die Strategie kann in folgenden Richtungen optimiert werden:
Die automatische Optimierung der Parameter durch das Hinzufügen von Machine-Learning-Algorithmen. Die Parameter der Indikatoren können in Echtzeit anhand von historischen Daten angepasst werden.
Mehr Indizes für die Bewertung, mehr Entscheidungsstrategien und höhere Entscheidungsgenauigkeit.
Erhöhung der Durchbruchbestätigungsmechanismen, die wichtige Preisniveaus und Kanäle für die Wiederbestätigung nutzen, um Fehlverhalten zu vermeiden.
Ein zusätzliches Modul zur Risikobewertung, das die Größe der Positionen und die Stop-Loss-Grenze automatisch an die Marktbedingungen anpasst.
Die Strategie als Ganzes ist ein sehr guter Multifaktor-Adaptionsrahmen. Sie kombiniert Trendbeurteilungen über bewegliche Durchschnitte, Überkauf-Überverkauf-Beschlüsse über Schokkelindikatoren und die Kreuzung von Trendindikatoren zu einem vollständigen Einstiegs- und Ausstiegsmechanismus. Wenn die Strategie weiter optimiert werden kann und die Komponenten Anpassung und Intelligenz hinzugefügt werden, wird dies ein sehr kommerziell wertvolles Strategieprodukt sein.
/*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)