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.
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 solutions:
La stratégie peut être optimisée dans les aspects suivants:
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)