La stratégie de tendance instantanée d' Ehlers

Auteur:ChaoZhang est là., Date: 2023-12-20 à 16h51:05
Les étiquettes:

img

Résumé

La stratégie Ehlers Instantaneous Trendline est proposée par John Ehlers dans son livre Cybernetic Analysis for Stocks and Futures. Elle utilise des indicateurs techniques pour identifier les tendances en temps réel des actions/futures et les positions ouvertes lorsque les tendances s'inversent.

La logique de la stratégie

Le noyau de cette stratégie est le calcul de la ligne de tendance instantanée (TI).

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

où src est le prix, a est un facteur de lissage, par défaut à 0,07. Cette formule est un filtre de deuxième ordre qui peut lisser le prix et générer des tendances.

Un autre indicateur clé est la ligne de décalage, calculée par:

lag = 2.0 * it - nz(it[2])

La ligne de retard est en retard de la ligne IT d'un bar. Lorsque le prix traverse au-dessus de la ligne de retard, il signale une rupture à la hausse, allez long. Lorsque le prix traverse en dessous de la ligne de retard, il signale une rupture à la baisse, allez court.

En outre, la stratégie établit des ordres de stop loss pour contrôler les risques.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. La ligne informatique filtre efficacement le bruit et améliore la qualité du signal
  2. Le filtre de deuxième ordre offre plus de souplesse et de robustesse de réglage
  3. La ligne de décalage évite les écarts inutiles dans les tendances
  4. L'exposé de risque à la valeur ajoutée
  5. Structure de code propre, facile à comprendre et à modifier

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Un réglage incorrect des paramètres de la ligne IT/décalage peut générer de faux signaux
  2. Une mauvaise configuration de stop-loss pourrait entraîner un stop-out prématuré ou une perte trop importante
  3. Une fréquence de négociation élevée entraîne des commissions accumulées
  4. Des temps de rétention plus longs augmentent le risque de grossissement des pertes

Ces risques peuvent être atténués par:

  1. Appliquer l'apprentissage automatique à l'optimisation des paramètres
  2. Définition des niveaux d'arrêt de perte adaptatif
  3. Réduction de la taille des positions pour réduire les fréquences de négociation
  4. En ce qui concerne les risques de dépréciation, la valeur de ces risques est la valeur de la valeur de la valeur de dépréciation.

Directions d'optimisation

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

  1. Effets d'essai de différents paramètres de filtre pour déterminer le paramètre optimal
  2. Essayez de combiner d' autres indicateurs pour filtrer les signaux
  3. Améliorer la logique d'entrée pour augmenter la taille pendant les phases d'accélération de la tendance
  4. Mise en place d'un stop loss adaptatif basé sur la volatilité du marché
  5. Effectuer une analyse des séries temporelles sur les sessions et les fréquences de négociation

Conclusion

Dans l'ensemble, la stratégie Ehlers Instantaneous Trendline utilise des indicateurs techniques pour identifier les tendances en temps réel dans les actions/futures et les positions ouvertes lorsque les tendances s'inversent. Elle présente les avantages d'un filtrage efficace du bruit, d'une haute réglabilité des paramètres, d'une logique de génération de signal claire et d'un contrôle des risques intégré. Avec une optimisation supplémentaire de la sélection des paramètres, du filtrage des signaux, du dimensionnement des positions et du réglage des pertes, cette stratégie peut obtenir des performances encore meilleures. La structure claire du code facilite également la compréhension et la modification. En résumé, il s'agit d'un système de suivi de tendance efficace qui mérite d'être testé et amélioré.


/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Plus de