Il s'agit d'une stratégie très simple. Elle se compose d'un seul stop loss. Lorsque le stop loss est déclenché, la position est inversée et un stop loss est défini pour la nouvelle position.
La stratégie est basée sur l'un des trois types de stop loss: stop loss en pourcentage, stop loss ATR, stop loss absolu.
Plus précisément, la stratégie calcule d'abord la valeur du stop loss en fonction du type de stop loss choisi. Elle vérifie ensuite les signaux d'entrée, en allant long lorsque le haut est supérieur au prix du stop loss précédent et en allant court lorsque le bas est inférieur au prix du stop loss précédent. Après l'entrée, elle continue à mettre à jour le prix du stop loss pour suivre les changements de prix.
Le plus grand avantage de cette stratégie est sa simplicité, qui nécessite le suivi d'un seul stop loss sans avoir à considérer les sélections de points d'entrée et de sortie.
Comparé au stop loss fixe, le stop loss de trailing qu'il emploie peut générer des profits plus importants tout en réduisant la probabilité d'un stop loss.
Les principaux risques de cette stratégie peuvent provenir d'un paramètre de valeur de stop loss inapproprié. Une valeur de stop loss trop élevée peut entraîner des pertes accrues, tandis qu'une valeur trop faible peut entraîner un déclenchement fréquent de stop loss. Cela nécessite une optimisation adaptative basée sur les conditions du marché.
Un autre risque est un jugement directionnel inexact après le déclenchement d'un stop-loss lors de l'inversion des positions, ce qui entraîne une perte de chances d'inversion du prix ou une augmentation des pertes.
La stratégie peut être optimisée dans les aspects suivants:
La stratégie réalise des bénéfices grâce à un mécanisme de stop loss simple et est facile à comprendre pour les débutants. Par rapport aux stratégies traditionnelles de stop loss, elle ajoute des positions de renversement de déclenchement de post stop loss pour acquérir des gains supplémentaires. Avec des tests et une optimisation continus, elle peut devenir un programme quantitatif très pratique.
/*backtest start: 2022-11-24 00:00:00 end: 2023-11-30 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Trailing SL Strategy [QuantNomad]", shorttitle = "TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50) //////////// // Inputs // sl_type = input("%", options = ["%", "ATR", "Absolute"]) sl_perc = input(4, title = "% SL", type = input.float) atr_length = input(10, title = "ATR Length") atr_mult = input(2, title = "ATR Mult", type = input.float) sl_absol = input(10, title = "Absolute SL", type = input.float) // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2016, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2100, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = time >= startDate and time <= finishDate ////////////////// // CALCULATIONS // // SL values sl_val = sl_type == "ATR" ? atr_mult * atr(atr_length) : sl_type == "Absolute" ? sl_absol : close * sl_perc / 100 // Init Variables pos = 0 trailing_sl = 0.0 // Signals long_signal = nz(pos[1]) != 1 and high > nz(trailing_sl[1]) short_signal = nz(pos[1]) != -1 and low < nz(trailing_sl[1]) // Calculate SL trailing_sl := short_signal ? high + sl_val : long_signal ? low - sl_val : nz(pos[1]) == 1 ? max(low - sl_val, nz(trailing_sl[1])) : nz(pos[1]) == -1 ? min(high + sl_val, nz(trailing_sl[1])) : nz(trailing_sl[1]) // Position var pos := long_signal ? 1 : short_signal ? -1 : nz(pos[1]) ////////////// // PLOTINGS // plot(trailing_sl, linewidth = 2, color = pos == 1 ? color.green : color.red) ////////////// // STRATEGY // if (time_cond and pos != 1) strategy.entry("long", true, stop = trailing_sl) if (time_cond and pos != -1) strategy.entry("short", false, stop = trailing_sl)