La stratégie est basée sur l’indicateur ATR (Average True Range) pour définir une ligne de stop dynamique, suivre les variations du prix des actions et maximiser les profits tout en réalisant une protection contre les pertes.
La stratégie est principalement réalisée par les étapes suivantes:
Pour calculer l’indicateur ATR, le cycle ATR est défini par le paramètre nATRPeriod, par défaut 5;
La marge de stop est définie par le paramètre nATRMultip, qui est 3,5 fois l’ATR par défaut;
Lorsque le cours d’une action augmente, le seuil de stop-loss est relevé au cours de l’action moins le seuil de stop-loss, s’il est supérieur au seuil de stop-loss précédent; lorsqu’il baisse, le seuil de stop-loss est abaissé au cours de l’action plus le seuil de stop-loss, s’il est inférieur au seuil de stop-loss précédent;
Déterminer si le cours d’une action a franchi le seuil de rupture, ce qui émet un signal d’achat ou de vente;
En fonction du signal de rupture de la ligne d’arrêt, entrez dans une position de survente ou de vide, et vide la position en touchant à nouveau la ligne d’arrêt.
Lorsque le cours d’une action augmente, le stop-loss est constamment ajusté à la hausse, afin de bloquer les bénéfices; lorsque le cours d’une action baisse, le stop-loss est constamment ajusté à la baisse, afin de bloquer les pertes. L’indicateur ATR peut refléter plus précisément la volatilité du cours de l’action et ajuster le stop-loss en fonction de la dynamique de l’ATR.
Il est possible d’optimiser les paramètres, d’ajuster les paramètres du cycle ATR et de l’amplitude de stop, de trouver la meilleure combinaison de paramètres pour équilibrer le stop et le suivi. Il peut également être combiné avec d’autres indicateurs techniques pour filtrer le timing de la mise sur le marché et réduire les stop inutiles.
La stratégie permet de bloquer les pertes et les bénéfices dans le processus de détention en ajustant dynamiquement la ligne de stop ATR. Par rapport à la position de stop fixe, la stratégie est mieux adaptée aux fluctuations du cours des actions et évite les pertes trop radicales ou conservatrices. L’indicateur ATR rend l’ajustement de la ligne de stop plus ciblé. Cependant, la stratégie de paramétrage et de réentrée doit être encore optimisée pour réduire les pertes inutiles et élargir l’espace de profit.
/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
//@okadoke
////////////////////////////////////////////////////////////
// Based on Average True Range Trailing Stops Strategy by HPotter
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort
// The related article is copyrighted material from Stocks & Commodities Jun 2009
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true,
initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0)
nATRPeriod = input(5, "ATR Period")
nATRMultip = input(3.5, "ATR Multiplier")
useShorts = input(false, "Test w/Shorts?")
daysBackMax = input(defval = 360, title = "Max Days Back to Test", minval = 0)
daysBackMin = input(defval = 0, title = "Min Days Back to Test", minval = 0)
msBackMax = 1000 * 60 * 60 * 24 * daysBackMax
msBackMin = 1000 * 60 * 60 * 24 * daysBackMin
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop = na
xATRTrailingStop :=
iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss),
iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss)))
pos = na
pos :=
iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), 1,
iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0)))
color = pos == -1 ? red: pos == 1 ? green : blue
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop")
isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin)))
buy = crossover(close, xATRTrailingStop)
sell = crossunder(close, xATRTrailingStop)
strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds)
strategy.close("LONG", when=sell and isWithinTimeBounds)
strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds)
strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)