Stratégie de stop suiveur sur plusieurs périodes de temps


Date de création: 2024-01-08 11:24:24 Dernière modification: 2024-01-08 11:24:24
Copier: 0 Nombre de clics: 644
1
Suivre
1617
Abonnés

Stratégie de stop suiveur sur plusieurs périodes de temps

Aperçu

Cette stratégie est une version multi-frame de la stratégie simple de suivi des arrêts que j’ai publiée précédemment. La stratégie précédente utilisait uniquement le suivi des arrêts de base pour entrer dans la position.

Dans cette stratégie, vous pouvez utiliser uniquement l’arrêt ATR et sélectionner 3 autres périodes plus élevées, ainsi que la période actuelle. Les arrêts de suivi sur ces périodes seront tracés sur le graphique.

Principe de stratégie

Le cœur de la stratégie est de suivre les arrêts et le suivi de la tendance. Les arrêts de suivi sont utilisés pour définir les arrêts, qui peuvent être efficacement évités en fonction du calcul de la valeur ATR. Le suivi de la tendance décide de l’entrée en jeu en observant la direction de la tendance sur différentes périodes.

Plus précisément, la stratégie commence par calculer les valeurs ATR sur différentes périodes et définit la distance de stop. Ensuite, elle émet un signal de plus ou de moins pour déterminer si le prix a franchi la limite de stop. Si les signaux sur plusieurs périodes sont identiques, elle entre.

En combinant les tendances de différents cycles, il est possible de filtrer efficacement les fausses ruptures. En même temps, le suivi des arrêts de perte permet de verrouiller les bénéfices et de contrôler efficacement les risques.

Avantages stratégiques

  1. Utilisez des jugements multi-temporels pour filtrer efficacement le bruit et identifier les tendances
  2. La méthode de suivi des arrêts ATR permet d’ajuster dynamiquement la distance des arrêts pour réduire la probabilité d’effet de levier
  3. La combinaison de suivi de la tendance et de gestion des pertes permet de suivre la tendance et de mettre fin à la perte en temps opportun
  4. Moins de paramètres, plus facile à comprendre et à régler

Analyse des risques

  1. Si les paramètres ne sont pas correctement configurés, les arrêts ATR peuvent être trop proches ou trop éloignés du prix, susceptibles d’être dépassés ou trop éloignés des arrêts.
  2. Les combinaisons de plusieurs temps-cadres peuvent ne pas fonctionner efficacement si les paramètres ne sont pas correctement définis ou peuvent être mal jugés.
  3. Il est nécessaire de configurer les paramètres d’arrêt et les paramètres de la période simultanément, sans quoi il est impossible d’obtenir des résultats optimaux

La solution est simple:

  1. Tests répétés de différentes combinaisons et variétés de paramètres pour trouver le meilleur
  2. Optimiser la proportion et la quantité des périodes afin de fournir une estimation fiable des tendances
  3. Ajustez le multiple des arrêts ATR pour trouver un équilibre entre le fait que le stop n’est pas franchi et le fait que la distance n’est pas trop grande

Direction d’optimisation

Les stratégies peuvent être optimisées dans les domaines suivants:

  1. Augmenter ou diminuer le nombre de périodes et trouver la combinaison de périodes qui détermine les meilleures tendances
  2. Test des multiples ATR différents pour déterminer la distance de rupture optimale
  3. Ajout d’un mécanisme de réintégration pour créer plus de positions si la tendance se poursuit
  4. En combinaison avec d’autres indicateurs de filtrage de l’heure d’entrée, tels que les indicateurs de quantité et de prix
  5. Optimisation pour différents paramètres de variété

Résumer

Cette stratégie permet une combinaison organique de suivi de la tendance et de contrôle du risque grâce à la manière dont l’ATR suit les arrêts sur plusieurs périodes. Comparé à un arrêt unique, il permet de juger plus clairement de la direction de la tendance. Comparé à un arrêt unique, il filtre beaucoup de bruit. La configuration rationnelle des paramètres d’arrêt et des périodes est la clé de l’effet optimal.

Code source de la stratégie
/*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)