Stratégie d'arrêt des pertes à plusieurs délais

Auteur:ChaoZhang est là., Date: 2024-01-08 11h24 et 24h
Les étiquettes:

img

Résumé

Cette stratégie est une version multi-temporelle de ma précédente stratégie simple de trailing stop loss. La stratégie précédente n'utilisait que le trailing stop loss de base pour entrer dans les positions. Cela fonctionnait plutôt bien donc j'ai essayé de l'améliorer. Je me suis demandé ce qui se passerait si j'utilisais le même ATR trailing stop loss sur différents intervalles de temps et les combinai dans un seul signal.

Dans cette stratégie, vous ne pouvez utiliser que des arrêts ATR et choisir 3 autres délais supérieurs en plus de votre délais actuel. La perte de stop de trailing de tous ces délais sera tracée sur le graphique. Entrez une position longue si les 4 délais sont d'accord sur le signal long. Fermez des positions longues lorsque au moins 2 délais ne sont pas d'accord sur le signal long. La logique pour les positions courtes est la même.

La logique de la stratégie

Le noyau de cette stratégie réside dans le suivi du stop loss et de la tendance suivante. Le suivi du stop loss est utilisé pour définir le niveau de stop loss basé sur la valeur ATR, ce qui peut efficacement éviter que le stop loss ne soit touché.

Plus précisément, la stratégie calcule d'abord la valeur de l'ATR sur différents délais et définit la distance de stop loss. Elle génère ensuite des signaux longs / courts lorsque le prix franchit le niveau de stop loss. Si les signaux de plusieurs délais sont d'accord, la position sera prise. Après cela, continuez à suivre le niveau de stop loss par direction de tendance. Si les signaux d'un certain pourcentage de délais s'inversent, position fermée.

En combinant le jugement de tendance à travers différentes périodes, les fausses ruptures peuvent être filtrées efficacement.

Les avantages

  1. L'utilisation de plusieurs délais aide à filtrer le bruit et à identifier la direction de la tendance
  2. L'ATR arrête la traînée en réglant la distance d'arrêt de manière dynamique, ce qui réduit la probabilité d'être arrêté
  3. En combinant le suivi de la tendance et la gestion des pertes d'arrêt, vous pouvez suivre la tendance et arrêter à temps
  4. Peu de paramètres, facile à comprendre et à optimiser

Analyse des risques

  1. L'arrêt ATR peut être trop proche ou trop loin si les paramètres ne sont pas réglés correctement, susceptible d'être touché ou la distance d'arrêt trop grande
  2. La combinaison de plusieurs délais peut ne pas fonctionner efficacement ou juger mal si les paramètres ne sont pas réglés correctement
  3. Besoin de configurer correctement les paramètres stop loss et timeframe, sinon les meilleurs résultats peuvent ne pas être obtenus

Les solutions:

  1. Testez différents ensembles de paramètres et produits pour trouver l'optimum
  2. Optimiser le ratio et le nombre de délais pour assurer un jugement fiable de la tendance
  3. Ajustez le multiplicateur ATR pour équilibrer entre ne pas être touché et la distance appropriée

Directions d'optimisation

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

  1. Ajouter/réduire le nombre de délais pour trouver les meilleures combinaisons pour juger de la tendance
  2. Tester différents multiplicateurs ATR pour déterminer la distance d'arrêt optimale
  3. Ajouter un mécanisme de rentrée pour construire plus de positions à mesure que la tendance persiste
  4. Incorporer d'autres filtres sur les signaux d'entrée, par exemple les indicateurs de volume, etc.
  5. Paramétrage des paramètres pour différents produits

Conclusion

Cette stratégie combine le suivi des tendances et le contrôle des risques via des arrêts de trail ATR sur plusieurs délais. Par rapport à un seul arrêt, elle identifie plus clairement la direction de la tendance; par rapport à un seul délai, elle filtre beaucoup de bruit. Une configuration correcte des paramètres d'arrêt et des délais est essentielle pour obtenir les meilleurs résultats. Elle convient aux investisseurs qui peuvent tolérer certains retombées et fournit des rendements stables.


/*backtest
start: 2023-01-01 00:00:00
end: 2024-01-07 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="MTF Trailing SL Strategy [QuantNomad]", shorttitle = "MTF TrailingSL [QN]", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

////////////
// Inputs //

atr_length = input(14,    title = "ATR Length")
atr_mult   = input(2,     title = "ATR Mult",    type = input.float)

tf2 = input('120', title = "TF2", type = input.string)
tf3 = input('180', title = "TF3", type = input.string)
tf4 = input('240', title = "TF4", type = input.string)

// 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 //


tsl() => 
    // SL values
    sl_val = atr_mult * atr(atr_length)
     
    // 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]) 
    trailing_sl
    
    
trailing_sl1 = tsl()
trailing_sl2 = security(syminfo.tickerid, tf2, tsl())
trailing_sl3 = security(syminfo.tickerid, tf3, tsl())
trailing_sl4 = security(syminfo.tickerid, tf4, tsl())

pos1 = 0
pos1 := low <= trailing_sl1 ? -1 : high >= trailing_sl1 ? 1 : nz(pos1[1])

pos2 = 0
pos2 := low <= trailing_sl2 ? -1 : high >= trailing_sl2 ? 1 : nz(pos2[1])

pos3 = 0
pos3 := low <= trailing_sl3 ? -1 : high >= trailing_sl3 ? 1 : nz(pos3[1])

pos4 = 0
pos4 := low <= trailing_sl4 ? -1 : high >= trailing_sl4 ? 1 : nz(pos4[1])

total_pos = pos1 + pos2 + pos3 + pos4

//////////////
// PLOTINGS //

plot(trailing_sl1, linewidth = 2 , color = pos1 == 1 ? color.green : color.red, title = "TSL TF1")
plot(trailing_sl2, linewidth = 2 , color = pos2 == 1 ? color.green : color.red, title = "TSL TF2", transp = 25)
plot(trailing_sl3, linewidth = 2 , color = pos3 == 1 ? color.green : color.red, title = "TSL TF3", transp = 50)
plot(trailing_sl4, linewidth = 2 , color = pos4 == 1 ? color.green : color.red, title = "TSL TF4", transp = 75)

//////////////
// STRATEGY //

//strategy.entry("long",  true,  stop = trailing_sl1)
//strategy.entry("short", false, stop = trailing_sl1)

strategy.entry("long",    true, when = total_pos ==  4)
strategy.entry("short",  false, when = total_pos == -4)

strategy.close("long",  when = total_pos <= 0)
strategy.close("short", when = total_pos >= 0)


Plus de