Stratégie de l'indice de vigueur relative stochastique d' Ehlers Fisher

Auteur:ChaoZhang est là., Date: 2023-12-22 12:04:23 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie est basée sur l'indicateur d'indice de vigueur relative stochastique d'Ehlers Fisher proposé par John Ehlers dans son livre Analyse cybernétique pour les actions et les contrats à terme.

La logique de la stratégie

La stratégie calcule d'abord le prix de clôture - prix d'ouverture, qui est le corps du chandelier. Puis elle calcule le prix élevé - prix bas, qui est l'ombre du chandelier. En prenant respectivement la somme et la moyenne de ces deux parties, elle obtient l'élan du stock. Puis en divisant l'élan par la volatilité du stock, elle obtient l'indice de vigueur relative (RVI).

Ensuite, la formule d'Ehlers Fisher est appliquée sur le RVI pour obtenir la valeur du signal. Il va long lorsque le signal traverse au-dessus du déclencheur, et court lorsque le signal traverse en dessous du déclencheur.

Analyse des avantages

Cette stratégie intègre les caractéristiques de l'élan et l'indicateur stochastique des actions, qui peuvent déterminer efficacement la force relative du marché.

Comparée à l'utilisation d'un seul indicateur de dynamique ou d'un indicateur stochastique, cette stratégie combine organiquement des indicateurs et des modèles, ce qui peut améliorer la qualité des signaux.

Analyse des risques

Cette stratégie repose principalement sur l'indicateur Ehlers Fisher. Lorsqu'il y a des changements drastiques sur le marché, les paramètres de l'indicateur doivent être optimisés pour s'adapter au nouvel environnement.

En outre, il existe un certain degré de risque d'ajustement de la courbe intrinsèquement dans la stratégie elle-même. Si l'environnement du marché dans le backtesting et le trading en direct change considérablement, la performance de la stratégie peut largement dévier. Dans ce cas, les paramètres de la stratégie doivent être ajustés et les règles de trading nécessitent une optimisation pour s'adapter aux nouvelles conditions du marché.

Directions d'optimisation

Cette stratégie peut être encore optimisée dans les domaines suivants:

  1. Optimiser les paramètres de l'indicateur Ehlers Fisher pour une plus grande sensibilité ou un filtrage du bruit.

  2. Modélisez l'indicateur avec des algorithmes d'apprentissage automatique comme LSTM pour générer des signaux de trading plus fiables.

  3. L'indicateur de volatilité du marché, tel que l'ATR, doit être intégré afin d'ajuster dynamiquement la distance d'arrêt des pertes.

  4. Ajouter un soutien aux modèles multifactoriels, combinant d'autres indicateurs techniques et fondamentaux pour améliorer la qualité du signal.

  5. Optimiser la logique des positions ouvertes/fermées avec des critères d'entrée/sortie dynamiques.

Conclusion

Cette stratégie utilise l'indicateur RVI stochastique d'Ehlers Fisher pour déterminer la tendance et la force du marché, et définit des mécanismes de stop loss raisonnables pour contrôler les risques.


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

Plus de