lundi 20 janvier 2014

Le type Datetime de MQL4

Chaque langage de programmation a ses types de données, mais rares sont ceux qui ont le temps en type de données. ici le temps est très important, on le manipule tout le temps car nos données sont des valeurs de cours qui ont toutes une position dans le temps. Le type associé à ces positions est le type Datetime.

Le type Datetime


il s'agit en réalité d'un nombre entier codé sur 4 octets, soit environ 4 milliards de valeurs différentes possibles. Ce nombre entier représente le nombre de secondes écoulées depuis le 1er janvier 1970. C'est un horodatage du type EPOCH des systèmes d'exploitations UNIX (prononcez "épok", il s'agit de la transcription phonétique anglaise du mot français "époque"). Et actuellement en 2014, nous en sommes à environ 1,3 milliards de secondes écoulées, presque 1,4 milliards. Facile à estimer: 60 sec / min, soit 60 x 60 = 3 600 sec / h, soit 24 x 3 600 = 86 400 sec / jour, soit 86 400 x 365 = 31 536 000 sec / an, soit finalement pour 44 ans du 1er janvier 1970 au 1er janvier 2014: 31 536 000 x 44 = 1 387 584 000 secondes. On le déclare en MQL4 avec le mot-clé datetime.

Les constantes littérales Datetime


Mais ! C'est pas du tout pratique à manipuler, surtout si on veut créer une date précise ! Rassurez-vous, vous n'avez aucune conversion à faire, donc rien à calculer dans ce genre-là, et pour deux raisons:
  1. La plupart du temps vous n'avez pas de date à créer, vous utilisez les dates fournies par MetaTrader déjà sous forme de nombre entier à environ 1,4 milliard.
  2. Au cas où vous avez besoin de créer une date précise, vous utiliser une forme littérale dans laquelle vous exprimez la date sous forme courante et MetaTrader fait lui-même les conversions. C'est ce qu'on va voir de suite.
Pour écrire une date que vous décidez, il faut écrire du texte entre guillemets simples (obligatoirement, pas de doubles !) avec un D majuscule accolé devant. Et cette date est simplement écrite de façon lisible comme l'afficherait une horloge digitale. Attention les dates sont écrite dans l'ordre du poids le plus fort d'abord (année, mois puis jour). Si la fin de l'heure ou toute l'heure est omise, la fin ou toute l'heure est considérée comme égale à zéro, et si la date est omise, elle est considérée comme celle du jour de compilation (quand vous cliquez sur le bouton Compiler). Exemples:
  •  D'2014.01.17 13:29:47' pour le 17 janvier 2014 à 13h29min47sec.
  • D'1980.05.14 03:54' pour le 14 mai 1980 à 3h du matin 54 min et 0 seconde.
  • D'2000.02.01 08' pour le 1er février 2000 à 8 heures 0 min et 0 secondes.
  • D'2010.07.14' pour le 14 juillet 2010 à minuit pile.
  • D'18:40:34' pour la date du jour de compilation du programme à 18h40min34sec.
  • D'' pour la date du jour de compilation du programme à minuit.

Metatrader fournit les horodatages: Time[] et MarketInfo()


Comme je l'ai précisé, la plupart du temps (voire quasiment tout le temps), on ne créé pas d'horodatage, on prend ceux fournis par MetaTrader par deux moyens:
  • Time[] Ce tableau d'historique prédéfini par MetaTrader nous donne les horodatages des ouvertures de chaque période. Il suffit de mettre entre les crochets le numéro de la période désirée. 0 étant celle en cours, 1 celle qui vient de finir et 2 celle d'avant, etc. Je précise de suite qu'on a tendance à penser que ces horodatages sont ceux du début de chaque période, eh zou ! raté ! Ils correspondent aux horodatages des premiers ticks de chaque période, qui eux n'arrivent pas forcément à la première seconde de chaque période ! :D
  • MarketInfo() est une fonction qui peut donner plusieurs informations sur le marché. (d'où son nom). Il faut lui préciser en premier paramètre la paire voulue avec quelque chose comme "EURUSD" ou bien Symbol() qui donnera pareil sur l'euro-dollar, et le type d'information en deuxième paramètre. Le type d'information est une constante qui commence par MODE_. Vous commencez à la saisir et l'éditeur vous suggère avec l'auto-complétion les possibilités. Dans notre cas on termine de taper TIME pour écrire la constante MODE_TIME. Et là, la fonction nous donne le dernier temps connu du serveur. Celui que le serveur a donné dans le dernier tick reçu.

Du code exemple pour Time[] et MarketInfo()


Nous allons utiliser le tableau prédéfini Time[] pour lire dans l'historique le temps de début de la période en cours, et la fonction MarketInfo() pour obtenir l'horodatage du dernier tick reçu et étudier un peu les résultats obtenus. Nous allons placer ce code juste dans la fonction Init(), où nous déclarons deux variables du type datetime pour contenir les deux nombres.
int init()
  {
   datetime horodatageDebutPeriode = Time[0];
   datetime horodatageTickActuel = MarketInfo(Symbol(),MODE_TIME);
   datetime ecartEnSecondes = horodatageTickActuel - horodatageDebutPeriode;
   Print("horodatage début période: ", horodatageDebutPeriode);
   Print("horodatage tick actuel: ", horodatageTickActuel);
   Print("écart en secondes: ", ecartEnSecondes);
   return(0);
  }

Et le tutoriel en vidéo !


En application de cette initiation au type datetime, nous ferons des calculs arithmétiques sur le temps dans le prochain post, tout en commençant à faire des bibliothèques de fonctions utilisables dans les experts advisors et les indicateurs.

Aucun commentaire:

Enregistrer un commentaire