Stratégie d'inversion des pertes par arrêt de traîneau

Auteur:ChaoZhang est là., Date: 2023-12-01 13:41:41 Je vous en prie.
Les étiquettes:

img

Résumé

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 logique de la stratégie

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.

Analyse des avantages

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.

Analyse des risques

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.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Ajouter un jugement de tendance pour éviter de négocier contre tendance
  2. Optimiser le calcul de la valeur du stop loss pour le rendre plus dynamique pour suivre le marché
  3. Augmenter la validation de la rupture pour les signaux d'inversion à plus forte probabilité
  4. Incorporer des mesures de volatilité pour déterminer le meilleur moment d'inversion

Conclusion

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)

Plus de