Cette stratégie définit une ligne de stop loss dynamique basée sur l'indicateur Average True Range (ATR) pour suivre les changements de prix des actions, afin de protéger le stop loss tout en maximisant la prise de profit.
La mise en œuvre de la stratégie s'effectue principalement par les étapes suivantes:
Calcul de l'indicateur ATR, la période ATR est définie par le paramètre nATRPeriod, par défaut à 5;
Calculer la ligne d'arrêt des pertes sur la base de la valeur ATR, la magnitude de l'arrêt des pertes étant définie par le paramètre nATRMultip, par défaut à 3,5 fois l'ATR;
Lorsque le prix augmente, s'il est supérieur à la ligne de stop-loss précédente, ajuster la ligne de stop-loss jusqu'au prix moins l'ampleur du stop-loss; lorsque le prix chute, s'il est inférieur à la ligne de stop-loss précédente, ajuster la ligne de stop-loss jusqu'au prix plus l'ampleur du stop-loss;
Juge si le prix franchit la ligne de stop loss, si elle est franchie, envoie des signaux d'achat ou de vente;
Entrez des positions longues ou courtes en fonction des signaux de rupture de la ligne de stop-loss et fermez les positions lorsque le prix touche à nouveau la ligne de stop-loss.
Lorsque le prix augmente, la ligne de stop loss se déplace continuellement vers le haut pour verrouiller les profits. Lorsque le prix chute, la ligne de stop loss se déplace continuellement vers le bas pour arrêter les pertes. L'indicateur ATR peut refléter plus précisément la fluctuation des prix.
Les paramètres peuvent être optimisés en ajustant la période d'ATR et l'ampleur de la perte d'arrêt pour trouver l'équilibre optimal entre la perte d'arrêt et la perte de retard.
L'indicateur ATR rend l'ajustement de la ligne de stop loss plus ciblé. Mais les paramètres et les stratégies de réentrée ont besoin d'une optimisation supplémentaire pour réduire les arrêts inutiles et augmenter la marge bénéficiaire. Dans l'ensemble, il s'agit d'une bonne idée de stop loss dynamique qui vaut la peine d'être étudiée et appliquée.
/*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)