
Il s’agit d’une stratégie très simple. Elle ne comporte qu’un seul stop tracking. Lorsque le stop est déclenché, la position est inversée et un stop tracking est défini pour la nouvelle position.
La stratégie est basée sur l’un des trois types de stop loss: Stop Percentage, Stop ATR et Stop Absolut. Lorsque le stop loss est déclenché, la position est inversée et un stop tracking est défini pour la nouvelle position.
Plus précisément, la stratégie calcule d’abord le stop-loss en fonction du type de stop-loss choisi. Ensuite, elle détermine s’il y a un signal de placement, c’est-à-dire si le sommet est supérieur au prix de stop-loss précédent et le bas est inférieur au prix de stop-loss précédent.
Le plus grand avantage de cette stratégie est qu’elle est très simple, ne nécessite que le suivi d’un seul stop et ne nécessite pas de prise en compte de la sélection des points d’entrée et de la sélection des points de sortie. La configuration flexible des valeurs de stop rend également son application plus large.
Par rapport aux arrêts fixes, il utilise des arrêts de suivi qui permettent de verrouiller des gains plus importants, tout en réduisant la probabilité que les arrêts soient impactés. Chaque arrêt déclenché par un retour de position peut capturer des opportunités de retour de prix.
Les principaux risques que cette stratégie peut comporter sont les risques liés à la mise en place d’un prix d’arrêt inapproprié. Une valeur d’arrêt trop élevée peut entraîner une expansion des pertes; une valeur d’arrêt trop faible peut entraîner un déclenchement fréquent des pertes. Cela nécessite une optimisation ciblée en fonction des conditions du marché.
Un autre risque est que la direction de l’inversion de position après le déclenchement d’un stop loss ne soit pas précise, ce qui peut entraîner une perte d’opportunité de reprise ou une perte supplémentaire. Cela nécessite une combinaison de tendances et de résistances de soutien pour déterminer le meilleur moment de reprise.
Cette stratégie peut être optimisée dans les domaines suivants:
La stratégie est rentable grâce à un simple mécanisme de suivi des arrêts de perte, une stratégie de quantification adaptée aux débutants. Par rapport à la stratégie de stop loss traditionnelle, elle ajoute un mécanisme de refonte de la position après le déclenchement de la stop loss, ce qui permet d’obtenir des gains supplémentaires. Grâce à un test et une optimisation continus, la stratégie peut devenir un programme de quantification 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)