Stratégie de suivi de tendance de moyenne mobile dynamique auto-adaptative Kaufman

Auteur:ChaoZhang est là., Date: le 26 février 2024 à 16h36
Les étiquettes:

img

Résumé

Cette stratégie est conçue sur la base de la moyenne mobile adaptative de Kaufman (KAMA) pour ajuster dynamiquement les positions de négociation et suivre automatiquement les tendances du marché.

  1. Calcul dynamique de la taille de l'étape de négociation (en pips) et adaptation à la volatilité du marché
  2. Générer des signaux d'achat et de vente basés sur la direction du KAMA
  3. Mettre en place une distance stop-loss après le signal est déclenché, et ajuster en conséquence que les mouvements de prix
  4. Confirmation facultative de la barre proche pour filtrer les faux signaux

Grâce à l'application de ces fonctions, la stratégie tente d'obtenir des profits supplémentaires des tendances tout en contrôlant les risques.

La logique de la stratégie

La stratégie fonctionne sur la base de l'indicateur Kaufman Adaptive Moving Average.

Lorsque KAMA traverse au-dessus de la ligne de stop-loss à la baisse, il indique un renversement de tendance et déclenche un signal d'achat. Lorsque KAMA traverse au-dessous de la ligne de stop-loss à la hausse, il suggère un renversement de tendance et déclenche un signal de vente. Après avoir entré dans une position, la stratégie calcule une distance de stop-loss dynamique basée sur l'ATR et définit une ligne de stop-loss favorable.

De cette façon, la stratégie peut suivre la tendance, déplacer progressivement la ligne de stop loss jusqu'à ce qu'elle soit déclenchée ou qu'un signal inverse soit déclenché pour fermer la position.

Les avantages

Cette stratégie présente les avantages suivants par rapport aux stratégies de moyenne mobile traditionnelles:

  1. Le KAMA est très sensible et peut détecter plus rapidement les tendances des prix;
  2. La distance de stop-loss dynamique garantit plus de bénéfices à mesure qu'elle s'ajuste à la tendance;
  3. La barre de confirmation de fermeture en option filtre les faux signaux et réduit les entrées inutiles.

En général, la stratégie est réactive, contrôlable et un système de suivi des tendances typique.

Les risques

La stratégie comporte également certains risques:

  1. Le risque d'inversion de tendance: la KAMA peut s'adapter de manière flexible aux fluctuations des prix, mais peut ne pas répondre suffisamment rapidement à des inversions soudaines de tendance.
  2. Si la distance d'arrêt de perte dynamique est trop large, elle peut être trop agressive et échouer à verrouiller les bénéfices à temps.
  3. Le risque de faux signaux: l'utilisation d'une confirmation proche de barre aide à réduire les faux signaux, mais ne peut pas les éliminer complètement.

Pour gérer ces risques, des méthodes telles que l'optimisation de la distance de stop loss et la définition d'un pourcentage de stop loss maximum peuvent être utilisées.

Directions d'optimisation

Les orientations possibles pour optimiser la stratégie sont les suivantes:

  1. Optimiser les paramètres KAMA: ajuster les longueurs moyennes mobiles, affiner la douceur;
  2. Optimiser la perte de freinage dynamique: tester les distances optimales de freinage et les tailles de pas en fonction des différents produits;
  3. Ajouter des indicateurs de filtrage: incorporer d'autres indicateurs de tendance pour confirmer les signaux de négociation et améliorer la fiabilité.

Par exemple, le MACD peut être ajouté comme indicateur de confirmation auxiliaire, ce qui nécessite que le MACD Dif soit positif et se développe aux côtés de la croix dorée de KAMA.

Conclusion

En utilisant un stop loss dynamique pour suivre les tendances et maximiser les profits de tendance, couplé à l'adaptabilité de l'indicateur KAMA pour répondre rapidement aux changements rapides du marché, cette stratégie peut devenir un système de suivi de tendance efficace après une certaine optimisation, adapté pour le trading à moyen et long terme.


/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)

// Function to calculate pips with higher precision
getPips(price) =>
    difc = syminfo.mintick
    hlpips = price / difc
    math.round(hlpips / syminfo.mintick) * syminfo.mintick

// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )

tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)

// Function to calculate the TMA
gettma() =>
    mom = math.abs(ta.change(src, length))
    volatility = math.sum(math.abs(ta.change(src)), length)
    er = volatility != 0 ? mom / volatility : 0
    fastAlpha = 2 / (fastLength + 1)
    slowAlpha = 2 / (slowLength + 1)
    alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
    kama = 0.0
    kama := alpha * src + (1 - alpha) * nz(kama[1], src)
    await = awaitBarConfirmation ? barstate.isconfirmed : true
    maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
    thma = kama
    hma_dif = (thma - thma[2])/2
    colour = hma_dif > 0 ? color.green : color.red
    isGreen = hma_dif > 0
    [thma, isGreen, colour]

// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1

// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na

[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

plot(thma, title='KAMA', linewidth=2, color=colour)

if ta.crossover(thma, psl) and strategy.position_size < 0
    strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)

if ta.crossunder(thma, psl) and strategy.position_size > 0
    strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)

if isGreen and strategy.position_size <= 0
    if na(psl)
        psl := close + getPips(pips)
    strategy.entry("Buy", strategy.long, alert_message=buyMess)
    lastSignal := 1

if not isGreen and strategy.position_size >= 0
    if na(psl)
        psl := close - getPips(pips)
    strategy.entry("Sell", strategy.short, alert_message=sellMess)
    lastSignal := -1

if (thma >= lastPsl or na(lastPsl)) and thma > psl
    psl := psl + getPips(pips)
    lastPsl := psl

if (thma <= lastPsl or na(lastPsl)) and thma < psl
    psl := psl - getPips(pips)
    lastPsl := psl

plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)


Plus de