Stratégies de suivi des tendances basées sur des délais transcendants


Date de création: 2024-02-21 11:05:17 Dernière modification: 2024-02-21 11:05:17
Copier: 0 Nombre de clics: 690
1
Suivre
1617
Abonnés

Stratégies de suivi des tendances basées sur des délais transcendants

Aperçu

L’idée centrale de cette stratégie est d’identifier les tendances du marché en combinant plusieurs périodes de temps, en utilisant les indicateurs de dépassement des périodes de temps supérieures comme filtres et en émettant des signaux d’achat et de vente sur les périodes de temps inférieures. La stratégie vise à utiliser les informations sur la structure du marché fournies par les périodes de temps supérieures pour améliorer la qualité des décisions de négociation.

Principe de stratégie

La stratégie obtient la valeur de l’indicateur de dépassement pour le cadre de temps supérieur (le cadre de temps actuel est 4 fois supérieur par défaut) en appelant la fonction de sécurité. L’indicateur de dépassement comprend deux lignes: la ligne de dépassement et la ligne de tendance.

La stratégie utilise la direction de la tendance supérieure à la période supérieure comme condition de filtrage et envoie un signal de transaction uniquement lorsque la direction de la tendance supérieure à la période inférieure est en accord avec la tendance supérieure à la période supérieure. En d’autres termes, la stratégie ne fait plus ou moins que lorsque les indicateurs de tendance supérieure sur les deux périodes sont en phase.

Cela permet d’éviter d’être perturbé par le bruit du marché à basse fréquence et d’améliorer la fiabilité des signaux. En même temps, il est possible d’utiliser la structure du marché à haute fréquence pour faire un bon jugement global.

Avantages stratégiques

  • Utiliser les informations sur la structure du marché fournies par les périodes de temps élevées pour filtrer le bruit des périodes de temps faibles et améliorer la qualité des décisions de négociation
  • L’analyse de plusieurs périodes rend les signaux de trading plus fiables
  • Paramètres personnalisables pour l’indicateur de sur-tendance, optimisation des stratégies d’achat et de vente
  • Réglage de la plage de dates intégrée pour limiter la plage de temps de détection

Analyse des risques

  • Les signaux à haute fréquence sont retardés et risquent de manquer une occasion de raccourcir la ligne.
  • Une forte probabilité d’erreur dans le jugement de la structure du marché
  • L’indicateur hypertrend peut lui-même envoyer de faux signaux
  • Les limites de la plage de temps de détection peuvent omettre des données importantes et affecter l’exactitude des résultats des tests.

La solution est simple:

  • Ajustez les réglages de haute durée pour réduire le retard du signal
  • Détermination de la structure de la période de temps élevée en combinaison avec d’autres indicateurs
  • Optimiser les paramètres de l’indicateur de surtrend pour améliorer la qualité du signal
  • Élargissement progressif de la période de retour pour tester la robustesse des stratégies

Orientation de l’optimisation de la stratégie

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Optimiser les paramètres de l’indicateur hypertrend pour trouver la meilleure combinaison de paramètres
  2. Ajouter d’autres indicateurs pour les combiner et former un modèle multifacteur
  3. Test de différentes combinaisons de cadres de temps hauts et bas
  4. Augmentation des mécanismes de prévention des pertes pour contrôler les risques
  5. Adaptation dynamique des hyperparamètres avec un algorithme d’apprentissage automatique

L’efficacité de la stratégie de suivi des tendances sur plusieurs périodes peut être considérablement améliorée par des méthodes telles que l’optimisation des paramètres, la combinaison des indicateurs, l’amélioration des arrêts et l’introduction de l’apprentissage automatique.

Résumer

Cette stratégie utilise habilement le jugement de la tendance dans les périodes de temps élevées pour guider l’exécution des transactions dans les périodes de temps basses. Cette conception de plusieurs périodes permet de filtrer efficacement le bruit du marché et d’identifier plus clairement la direction de la tendance.

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