Stratégie de suivi des tendances sur plusieurs périodes de temps basée sur les supertendances

Auteur:ChaoZhang est là., Date: le 21 février 2024
Les étiquettes:

img

Résumé

L'idée de base de cette stratégie est de combiner plusieurs délais pour identifier les tendances du marché, en utilisant l'indicateur Supertrend à partir de délais plus élevés comme filtre et en générant des signaux d'achat et de vente à partir de délais plus bas.

La logique de la stratégie

La stratégie récupère les valeurs de l'indicateur de Supertrend à partir d'une période plus longue (défaut 4x de la période actuelle) en appelant la fonction de sécurité.

La direction de l'indicateur de Supertrend à partir de la période supérieure sert de condition de filtre. Les signaux de trading ne sont générés que lorsque les directions de la Supertrend à partir des deux périodes s'alignent. Cela signifie que les signaux ne sont déclenchés que lorsque les deux périodes donnent des signaux dans la même direction.

Cela permet d'éviter les interférences du bruit du marché dans des délais plus courts et d'améliorer la fiabilité du signal.

Les avantages

  • Filtre le bruit des délais inférieurs en utilisant des informations sur la structure du marché provenant des délais supérieurs
  • Des signaux plus fiables résultant de l'analyse combinée de plusieurs délais
  • Paramètres Supertrend personnalisables pour l'optimisation de la stratégie
  • Paramètres de plage de dates intégrés pour limiter la période de backtest

Analyse des risques

  • Les signaux retardés provenant de délais plus longs peuvent manquer des opportunités à court terme
  • Inaccuracies dans les jugements sur la structure du marché dans des délais plus longs
  • Les signaux potentiellement erronés de Supertrend lui-même
  • Les contraintes relatives à la date des tests antérieurs peuvent omettre des données importantes et affecter l'exactitude des résultats

Les solutions:

  • Ajuster les réglages de la plage de temps pour réduire le décalage du signal
  • Ajouter d'autres indicateurs pour confirmer les jugements sur des délais plus longs
  • Optimiser les paramètres de Supertrend pour améliorer la qualité du signal
  • Élargir progressivement la période de backtest pour tester la robustesse

Directions d'optimisation

Cette stratégie peut être améliorée dans plusieurs domaines:

  1. Optimiser les paramètres de Supertrend pour la meilleure combinaison de paramètres
  2. Ajouter d'autres indicateurs pour créer des modèles multifactoriels
  3. Testez différentes combinaisons d'intervalles de temps élevés et bas
  4. Incorporer des mécanismes d'arrêt des pertes pour contrôler les risques
  5. Utiliser l'apprentissage automatique pour ajuster dynamiquement les paramètres

Grâce à l'optimisation des paramètres, à la combinaison d'indicateurs, à l'amélioration des arrêts de perte et à l'introduction de l'apprentissage automatique, une amélioration significative des performances peut être obtenue pour cette stratégie de suivi des tendances sur plusieurs périodes.

Conclusion

Cette stratégie exploite intelligemment les jugements de tendance des délais plus élevés pour guider l'exécution des transactions dans des délais plus courts. Une telle conception multi-délais peut filtrer efficacement le bruit du marché et identifier des directions de tendance plus claires. Les paramètres de date intégrés rendent également le backtesting plus flexible. Dans l'ensemble, il s'agit d'une stratégie de suivi des tendances multi-délais bien conçue qui mérite d'être poursuivie et appliquée.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Higher TF - Repainting", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

HTFMultiplier = input(4, minval=1, step=1)

SupertrendMult = input(1)
SupertrendPd = input(4, minval=4, step=4)

backtestBars = input(title="Backtest from ", defval=10, minval=1, maxval=30)
backtestFrom = input(title="Timeframe", defval="years", options=["days", "months", "years"])

repaintOption = input(title="Repaint", defval="Yes", options=["Yes", "No - set lookahead false", "No - do not use security"])

f_multiple_resolution(HTFMultiplier) => 
    target_Res_In_Min = timeframe.multiplier * HTFMultiplier * (
      timeframe.isseconds   ? 1. / 60. :
      timeframe.isminutes   ? 1. :
      timeframe.isdaily     ? 1440. :
      timeframe.isweekly    ? 7. * 24. * 60. :
      timeframe.ismonthly   ? 30.417 * 24. * 60. : na)

    target_Res_In_Min     <= 0.0417       ? "1S"  :
      target_Res_In_Min   <= 0.167        ? "5S"  :
      target_Res_In_Min   <= 0.376        ? "15S" :
      target_Res_In_Min   <= 0.751        ? "30S" :
      target_Res_In_Min   <= 1440         ? tostring(round(target_Res_In_Min)) :
      tostring(round(min(target_Res_In_Min / 1440, 365))) + "D"

f_getBackTestTimeFrom(backtestFrom, backtestBars)=>
    byDate = backtestFrom == "days"
    byMonth = backtestFrom == "months"
    byYear = backtestFrom == "years"
    
    date = dayofmonth(timenow)
    mth = month(timenow)
    yr = year(timenow)
    
    leapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,29)
    nonleapYearDaysInMonth = array.new_int(12,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,28)
    
    restMonths = array.new_int(10,0)
    array.set(leapYearDaysInMonth,0,31)
    array.set(leapYearDaysInMonth,1,30)
    array.set(leapYearDaysInMonth,2,31)
    array.set(leapYearDaysInMonth,3,30)
    array.set(leapYearDaysInMonth,4,31)
    array.set(leapYearDaysInMonth,5,31)
    array.set(leapYearDaysInMonth,6,30)
    array.set(leapYearDaysInMonth,7,31)
    array.set(leapYearDaysInMonth,8,30)
    array.set(leapYearDaysInMonth,9,31)
    
    array.concat(leapYearDaysInMonth,restMonths)
    array.concat(nonleapYearDaysInMonth,restMonths)
    isLeapYear = yr % 4 == 0 and (year%100 != 0 or year%400 == 0)
    numberOfDaysInCurrentMonth = isLeapYear ? array.get(leapYearDaysInMonth, mth-2) : array.get(nonleapYearDaysInMonth, mth-2)
    if(byDate)
        mth := (date - backtestBars) < 0 ? mth - 1 : mth
        yr := mth < 1 ? yr - 1 : yr
        mth := mth < 1 ? 1 : mth
        date := (date - backtestBars) < 0 ? numberOfDaysInCurrentMonth - backtestBars + date + 1 : date - backtestBars + 1
    if(byMonth)
        date := 1
        yr := (mth - (backtestBars%12)) < 0 ? yr - int(backtestBars/12) - 1 : yr - int(backtestBars/12)
        mth := mth - (backtestBars%12) + 1
    if(byYear)
        date := 1
        mth := 1
        yr := yr - backtestBars
    [date, mth, yr]


repaint = repaintOption == "Yes"
useSecurityLookahead = repaintOption == "No - set lookahead false"

[SupertrendRepaint, DirRepaint] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = true, gaps=true)
[SupertrendNoLookahead, DirNoLookahead] = security(syminfo.tickerid, f_multiple_resolution(HTFMultiplier), supertrend(SupertrendMult, SupertrendPd), lookahead = false, gaps=false)

[SupertrendRegular, DirRegular] = supertrend(SupertrendMult, SupertrendPd)

[date, mth, yr] = f_getBackTestTimeFrom(backtestFrom, backtestBars)
inDateRange = time >= timestamp(syminfo.timezone, yr, mth, date, 0, 0)

longCondition = repaint ? DirRepaint == -1 : useSecurityLookahead? DirNoLookahead == -1 : DirRegular == -1
shortCondition = repaint ? DirRepaint == 1 : useSecurityLookahead? DirNoLookahead == 1 : DirRegular == 1
strategy.entry("Buy", strategy.long, when=longCondition and inDateRange)
strategy.entry("Sell", strategy.short, when=shortCondition and inDateRange)


Plus de