
La stratégie est basée sur la conception de Kaufman Adaptive Moving Average (KAMA) qui permet d’ajuster dynamiquement les positions de négociation et de suivre automatiquement les tendances du marché. Les principales fonctions de la stratégie comprennent:
Par l’utilisation de ces fonctions, la stratégie tente de tirer des bénéfices supplémentaires de la tendance tout en contrôlant les risques.
La stratégie est basée sur le travail de Kaufman sur l’indicateur d’adaptation des moyennes mobiles. La KAMA modifie dynamiquement le poids et la douceur de la moyenne en calculant le rapport entre la dynamique et la volatilité des prix, afin de répondre plus rapidement aux variations des prix.
Une fois dans la position, la stratégie calcule une distance d’arrêt dynamique en fonction de l’ATR et établit une ligne d’arrêt. Lorsque la KAMA se déplace dans la direction favorable, la ligne d’arrêt s’ajuste également, déplaçant la ligne d’arrêt vers une position plus favorable pour bloquer plus de profit.
De cette façon, la stratégie peut suivre la tendance en déplaçant progressivement la ligne de stop-loss jusqu’à ce que la ligne de stop-loss soit déclenchée ou que le signal de renversement soit déclenché.
La stratégie présente les avantages suivants par rapport à la stratégie traditionnelle de la moyenne mobile:
Dans l’ensemble, la stratégie est rapide, maîtrisable et typique de la stratégie de suivi des tendances.
Cette stratégie comporte aussi des risques:
Ces risques peuvent être maîtrisés par des méthodes telles que l’optimisation de la distance d’arrêt et la définition d’un pourcentage d’arrêt maximal. Ils peuvent également être combinés avec d’autres indicateurs pour confirmer et éviter les transactions erronées.
Les axes d’optimisation de cette stratégie sont:
Par exemple, il est possible de tester l’ajout d’un MACD comme indicateur de confirmation auxiliaire, tout en demandant que MACDDif soit positif et étendu. Cela permet de filtrer certains faux signaux et d’éviter des ouvertures de position répétitives inutiles.
L’ensemble de la stratégie fonctionne sans heurts, en utilisant des arrêts de perte dynamiques pour suivre la tendance et en fixant au maximum les bénéfices de la tendance. L’adaptabilité de l’indicateur KAMA permet également à la stratégie de suivre les changements rapides du marché.
/*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)