Bonjour,
Merci beaucoup Al-vy pour cette très bonne explication technique. J’ai dû reformater un peu mon cerveau avec ces informations plus précises sur le MTF 😉.
Si je résume ce que j’ai compris :
En MULTITIMEFRAME, avec une unité de temps plus grande (10 MIN dans mon cas) et sans UPDATEONCLOSE, le bloc de code lié à la bougie active est actualisé selon l’unité de temps par défaut. C’est finalement assez logique sans UPDATEONCLOSE.
Concrètement, pour mon test de front montant, la condition est vraie uniquement pendant les 10 premières secondes (unité de temps par défaut), puis elle redevient fausse. De plus, il n’y a pas de persistance de la valeur de la variable tant que la bougie n’est pas clôturée, puisque son état ne se fige qu’à la clôture.
Je me suis un peu fait piéger lors de mes vérifications. Pour confirmer que AND NOT ...[1] faisait bien référence à la bougie 10 MIN clôturée précédant celle active, et qu’il y avait bien persistance de la valeur, j’ai utilisé des PRINTs sur BarIndex[1] ou OpenTime[1]. Ces valeurs correspondent bien à la bougie 10 MIN clôturée précédente avec persistance.
En revanche, je n’avais pas fait de PRINT directement sur "NOT ...[1]".
Sur l’image jointe (capture des résultats des PRINTs), on voit clairement le basculement de la condition "NOT ...[1]" au bout de 10 secondes.
Je m’étais donc arrêté à une vision simplifiée :
le bloc de code dans le timeframe 10 minutes se comporte comme l’indicateur affiché sur un graphique 10 min
en oubliant la particularité de la bougie active, qui n’a pas encore de persistance de valeur.
La détection du front montant reste vraie sur un graphique 10 minutes, contrairement à un graphique 10 s avec un TIMEFRAME 10 minutes.
Du coup, je suis un peu bloqué sur la méthode à adopter pour mon cas concret.
Cas d’usage
Je travaille sur le marché américain en horaires étendus, mais je souhaite initier certains calculs de variables uniquement sur des plages spécifiques, par exemple pendant la session officielle de 9 h 30 à 16 h (heure US).
J’ai créé mes indicateurs sur différents graphiques :
Je souhaiterais maintenant regrouper l’affichage de certaines variables dans le graphique 10 s.
Cependant, en reprenant simplement le code de chaque unité de temps supérieure dans un TimeFrame adapté au graphique 10 s, je n’obtiens pas les mêmes valeurs.
L’utilisation de UPDATEONCLOSE donne bien les bonnes valeurs, mais avec un décalage correspondant à l’unité de temps du TimeFrame (par exemple 10 minutes pour un TimeFrame 10 MIN). Or, entre 9 h 30 et 9 h 40, il peut se passer beaucoup de choses sur le marché américain.
Il me semble avoir lu que l’utilisation du backtest en temps réel permettait de regrouper des indicateurs de différentes unités de temps. Mais cela ne serait donc pas possible en dehors du backtest, sauf avec UPDATEONCLOSE ?
Bref, ma méthode initiale n’était pas la bonne.
Merci encore pour cette explication détaillée sur ce comportement en MULTITIMEFRAME.
Je vais continuer à chercher une solution et je reviendrai la partager ici si j’en trouve une.
Sachant que le code qui pose problème en gros est :
debutTradingPeriode = 93000
debutPostOuverture = 160000
/*---------------------------------------------------------------*/
// Activation et compteur de la période de Trading
estTradingPeriode = 0
IF OpenTime >= debutTradingPeriode AND OpenTime < debutPostOuverture THEN
estTradingPeriode = 1
compteurPeriodeTrading = compteurPeriodeTrading[1] + 1
ENDIF
/*---------------------------------------------------------------*/
// Compteur du nombre de bougie intraday
ONCE compteurOpenDay = 1
IF OpenDay <> OpenDay[1] THEN
ONCE est1erJourEntier = -2
est1erJourEntier = est1erJourEntier + 1
compteurOpenDay = 1
IF NOT estTradingPeriode THEN
compteurPeriodeTrading = 0
ELSE
compteurPeriodeTrading = 1
ENDIF
ELSE
compteurOpenDay = compteurOpenDay + 1
ENDIF
/*---------------------------------------------------------------*/
// Compteur du nombre de bougie depuis le début de la période : permet d'obtenir une valeur à la cloture de la période précédente par exemple
IF BarIndex > 0 THEN
compteurOpenTrading = 0
IF estTradingPeriode AND NOT estTradingPeriode[1] THEN // C'est ici que cela ne marche plus et du coup les calculs par la suite utilisant 'compteurOpenTrading' sont faux
compteurOpenTrading = 1
ELSE
compteurOpenTrading = compteurOpenTrading[1] + 1
ENDIF
ENDIF
/*---------------------------------------------------------------*/