Diese Strategie basiert auf dem von John Ehlers in seinem Buch
Die Strategie berechnet zunächst den Schlusskurs - den Eröffnungskurs, der der Körper des Kerzen ist. Dann berechnet sie den hohen Preis - den niedrigen Preis, der der Schatten des Kerzen ist. Durch die Summe und den Durchschnitt dieser beiden Teile erhält sie die Dynamik der Aktie. Dann durch Teilen der Dynamik mit der Volatilität der Aktie erhält sie den Relative Vigor Index (RVI).
Als nächstes wird die Ehlers-Fisher-Formel auf RVI angewendet, um den Signalwert zu erhalten. Es geht lang, wenn das Signal über den Trigger überschreitet, und kurz, wenn das Signal unter dem Trigger überschreitet. Darüber hinaus werden Fixed Stop Loss und Trailing Stop Loss implementiert, um Risiken zu kontrollieren.
Diese Strategie integriert die Dynamikmerkmale und den stochastischen Indikator von Aktien, die effektiv die relative Stärke auf dem Markt bestimmen können.
Im Vergleich zur Verwendung eines einzigen Impulsindikators oder stochastischen Indikators kombiniert diese Strategie Indikatoren und Modelle organisch, was die Qualität der Signale verbessern kann.
Diese Strategie basiert hauptsächlich auf dem Ehlers-Fisher-Indikator. Wenn sich der Markt drastisch verändert, müssen die Parameter des Indikators optimiert werden, um sich an die neue Umgebung anzupassen. Wenn die Parameter nicht richtig eingestellt sind, kann dies zu falschen Signalen oder Verzögerungssignalen führen.
Darüber hinaus besteht ein gewisses Maß an Kurvenanpassungsrisiko in der Strategie selbst. Wenn sich das Marktumfeld bei Backtesting und Live-Handel stark ändert, kann die Performance der Strategie stark abweichen. In diesem Fall müssen die Strategieparameter angepasst werden und die Handelsregeln müssen optimiert werden, um den neuen Marktbedingungen gerecht zu werden.
Diese Strategie kann in folgenden Bereichen weiter optimiert werden:
Optimierung der Parameter des Ehlers-Fisher-Indikators für eine höhere Empfindlichkeit oder Geräuschfilterung.
Modellieren Sie den Indikator mit Machine-Learning-Algorithmen wie LSTM, um zuverlässigere Handelssignale zu generieren.
Einbeziehung von Marktvolatilitätsindikatoren wie ATR zur dynamischen Anpassung der Stop-Loss-Distanz.
Unterstützung von Multifaktormodellen hinzufügen, die andere technische und grundlegende Indikatoren zur Verbesserung der Signalqualität kombinieren.
Optimierung der Logik der offenen/schließenden Positionen mit dynamischen Ein-/Ausgangskriterien. Einführung adaptiver Stop-Loss- und Take-Profit-Techniken.
Diese Strategie nutzt den Ehlers Fisher Stochastic RVI-Indikator, um Markttrend und -stärke zu bestimmen, und legt angemessene Stop-Loss-Mechanismen zur Risikokontrolle fest. Im Vergleich zu einzelnen Indikatoren kombiniert diese Strategie mehrere Indikatoren und Modelle organisch, die Lärm filtern und qualitativ hochwertige Signale liefern können. Es gibt noch Raum für eine weitere Verbesserung der Strategieleistung durch Parameteroptimierung, Modellfusion, adaptive Anpassung und andere Mittel.
/*backtest start: 2022-12-15 00:00:00 end: 2023-12-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Ehlers Fisher Stochastic Relative Vigor Index Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1) p = input(10, title = "Length") FisherStoch(src, len) => val1 = stoch(src, src, src, len) / 100 val2 = (4 * val1 + 3 * val1[1] + 2 * val1[2] + val1[3]) / 10 FisherStoch = 0.5 * log((1 + 1.98 * (val2 - 0.5)) / (1 - 1.98 * (val2 - 0.5))) / 2.64 CO = close - open HL = high - low value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6 value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6 num = sum(value1, p) denom = sum(value2, p) RVI = denom != 0 ? num / denom : 0 signal = FisherStoch(RVI, p) trigger = signal[1] oppositeTrade = input(true) barsSinceEntry = 0 barsSinceEntry := nz(barsSinceEntry[1]) + 1 if strategy.position_size == 0 barsSinceEntry := 0 if ((crossover(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossunder(signal, trigger))) and abs(signal) > 2 / 2.64 strategy.entry("Long", strategy.long) barsSinceEntry := 0 if ((crossunder(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossover(signal, trigger))) and abs(signal) > 2 / 2.64 strategy.entry("Short", strategy.short) barsSinceEntry := 0 if strategy.openprofit < 0 and barsSinceEntry > 8 strategy.close_all() barsSinceEntry := 0 hline(0, title="ZeroLine", color=gray) signalPlot = plot(signal, title = "Signal", color = blue) triggerPlot = plot(trigger, title = "Trigger", color = green) fill(signalPlot, triggerPlot, color = signal < trigger ? red : lime, transp = 50)