Variables Prédéfinies et Fonction RefreshRates

 

Il y a des variables avec des noms prédéfinis dans le langage MQL4.

Une variables prédéfinie est une variable avec un nom prédéfini dont la valeur est définie par le terminal client et ne peut être changée par des méthodes du programme. Les variables prédéfinies reflètent l’état actuel d’un graphique au moment du démarrage du programme (Expert Advisor, script ou indicateur) ou comme un résultat de la fonction  RefreshRates().

 

Liste des Variables Prédéfinies Simples

Ask dernier prix d’achat connu du produit financier actuel;

Bid dernier prix de vente connu du produit financier actuel;

Bars – nombre de barres du graphique courant;

Point – tailles en points du produit financier dans la devise choisie;

Digits – nombres de chiffres après la virgule dans le prix du produit financier actuel.

 

Liste des Variables Prédéfinies des Tableaux et Séries Temporelles

Time – heure d’ouverture de chaque barre du graphique courant;

Open – prix d’ouverture de chaque barre du graphique courant;

Close – prix de fermeture de chaque barre du graphique courant;

High – prix maximal de chaque barre du graphique courant;

Low – prix minimal de chaque barre du graphique courant;

Volume – volume des ticks de chaque barre du graphique courant.

(les concepts de “tableaux” et “séries temporelles” sont décrits dans la section “Tableaux”).

Propriétés des Variables Prédéfinies

Les noms des variables prédéfinies ne peuvent être utilisés pour identifier des variables définies par l’utilisateur. Les variables prédéfinies peuvent être utilisées dans les expressions de la même manière que les variables classiques mais la valeur d’une variable prédéfinie ne peut être changée. Lorsque l’on essaie de compiler un programme contenant un opérateur d’assignement, dans lequel une variable prédéfinie est placée à la droite du signe d’égalité, le MetaEditor montrera une erreur. En termes de visibilité, les variables prédéfinies sont de type “global”, c’est à dire qu’elle sont disponibles de n’importe quelle partie du programme (cf la section “Types de Variables).

La propriété la plus importante des variables prédéfinies est la suivante :

{xtypo_warning}Les valeurs de toutes les variables prédéfinies sont automatiquement mises à jour par le terminal client au moment où les fonctions spéciales  sont démarrées pour leur exécution. {/xtypo_warning}

 

Les valeurs précédentes et actuelles des variables prédéfinies peuvent être identiques, mais la valeur elle même sera mise à jour. Au moment du démarrage d’une fonction spéciale, les valeurs de ces variables sont déjà mises à jours et donc disponibles pour les toutes premières lignes du programme. Illustrons la mise à jour des variables prédéfinies dans l’exemple suivant (Expert Advisor predefined.mq4):

{xtypo_code}//————————————————————-
// predefined.mq4
// The code should be used for educational purpose only.
//————————————————————-
int start() // Special fonct. start
{
Alert(“Bid = “, Bid); // Prix actuel
return; // Sortie start()
}
//————————————————————–
{/xtypo_code}

 

En démarrant ce programme, il est facile de se rendre compte que les valeurs de la variable Bid montrée lors des alertes sera égale à chaque fois au prix courant. De la même manière, vous pouvez voire les valeurs des autres variables dépendant des conditions actuelles. Par exemple, la variable Ask dépends aussi du prix actuel. La valeur de la variable Bars changera aussi si le nombre de barres change. Ceci peut changer lors du tick où une nouvelle barre est formée sur le graphique. La valeur en points dépends de la configuration du produit. Par exemple, pour EUR/USD cette valeur est 0.0001, pour USD/JPY c’est 0.01. La valeur du nombre de chiffres après la virgule pour ces deux produits est respectivement égal à 4 et 2.

Voici une autre propriété importante des variables prédéfinies :

{xtypo_warning}Le terminal client crée un ensemble de copies locales des variables prédéfinies pour chaque programme en exécution. Chaque programme travaille donc avec ses propres ensembles copies de données. {/xtypo_warning}

 

Dans un terminal client, plusieurs applications (Expert Advisors, scripts, indicateurs) peuvent tourner en même temps et pour chacune le terminal client créera une copie séparée des valeurs des variables prédéfinies. Analysons en détail, les raisons de cette nécessité. Fig. 52 montre l’exécution possible d’Expert Advisors avec différentes longueurs d’exécution de la fonction spéciale start(). Par simplicité, assumons qu’il n’y ait pas d’autres fonctions spéciales dans les Expert Advisors opérant en même temps sur le même produit :

 


Fig. 52. La durée de l’exécution de la fonction start() peut être plus longue ou plus courte que l’intervalle entre les ticks.

Les Expert Advisors différent dans le temps d’exécution de leur fonction start(). Pour des Experts Advisors classiques, ce temps se situe approximativement entre 1 à 100 millisecondes. D’autres Experts Advisors peuvent s’exécuter dans un temps beaucoup plus long, par exemple plusieurs secondes ou des dizaines de secondes voir même des dizaines de minutes… Analysonssur l’exemple donné comment la fréquence des ticks influe sur l’opération de l’EA 1 et 2 qui ont des temps d’exécution différents.

Au moment t0, l’Expert Advisor 1est attaché au terminal client et passe dans le mode “attente de tick”. Au moment t1, un tick arrive et le terminal lance l’exécution de la fonction start(). Simultanément à cela, le programme a accès aux copies des valeurs mises à jour des variables prédéfinies.Durant l’exécution, le programme peut utiliser ces variables, elles resteront inchangées pendant toute la durée de l’exécution de la fonction start(). Après avoir fini ses opérations, le programme entrera dans un mode “attente de ticks”.

L’évènement le plus proche pour lequel les variables prédéfinies peuvent avoir une nouvelle valeur est un nouveau tick.Le temps d’exécution T1 de l’Expert Advisor 1  est considérablement plus court qu’un temps d’attente entre deux ticks,par exemple l’intervalle t1 -t2 ou t2 – t3, etc. Donc durant l’exécution de la fonction start() de l’EA 1 il n’y a pas la possibilité de se retrouver dans une situation pour laquelle les valeurs des variables prédéfinies deviennent différentes des valeurs courantes.

Dans l’opération de l’EA 2, on se retrouve dans une nouvelle situation, parce que la période d’exécution de sa fonction start() T2 excède quelque fois l’intervalle entre deux ticks. La fonction start() de l’EA 2 est aussi démarrée au moment t1. La Fig.52 montre que l’intervalle  t1 – t2 entre deux ticks est plus grand que le temps d’exécution de la fonction start() T2, ce qui explique pourquoi durant cette période d’exécution du programme, les variables prédéfinies ne soient pas mises à jour. (dans cette période les nouvelles valeurs ne viennent pas d’un serveur, donc leurs vraies valeurs devraient être considérées comme étant les valeurs ayant apparu à l’instant t1). 

La fois suivante,  l’EA 2 est démarré à l’instant t2 lorsque le second tick est reçu. Simultanément à cela, un ensemble de copies des variables prédéfinies est aussi mis à jour. Dans la Fig. 5, nous voyons que le moment t3 arrivant est situé à l’intèrieure de l’exécution de la fonction start(). Une question se pose: quelles seront les valeurs des variables prédéfinies disponibles dans l’EA 2durant la période allant de t3 lorsque le troisième tick arrive à t32 lorsque la fonction start() termine ses opérations? La réponse peut être trouvée dans le respect de cette règle :

{xtypo_warning}Les valeurs des variables prédéfinies sont sauvegardées durant toute l’exécution des fonctions spéciales. Ces valeurs peuvent être toutefois mises à jour de force en utilisant la fonction standard  RefreshRates().{/xtypo_warning}

 

Donc (si RefreshRates() n’a pas été exécutée) durant toute la période d’exécution de la fonction start(), l’EA 2 aura accès aux copies locales des variables prédéfinies crées lors de la réception du second tick. Bien que les Expert Advisors opèrent dans les même fenêtres, à partir de réception du tick 3, les deux EA n’auront pas les mêmes valeurs de variables prédéfinies. L’EA 1 travaillera avec ses propres données historiques définies à t3 tandis que l’EA conservera les valeurs définies à t2.

A partir du moment t4 lorsque le prochain tick arrive, les deux EA démarreront à nouveau avec cette fois ci les même valeurs des variables prédéfinies.

 

Fonction RefreshRates()

bool RefreshRates()

La fonction standard RefreshRates() permets de mettre à jour les valeurs locales des variables prédéfinies. En d’autres termes, cette fonction force la mise à jour des données actuelles du marché (Volume, horaire serveur de la dernière cotation, Bid, Ask, etc). Cette fonction peut être utilisée lorsqu’un programme réalise un calcule sur une longue durée et a besoin de valeurs mises à jour.

RefreshRates() retourne TRUE, si a un moment de son exécution il y a de l’information a propos des nouvelles données historiques dans le terminal (c’est à dire si un nouveau tick arrive durant l’exécution du programme). Dans de tels cas, les copies des valeurs seront mises à jour.

RefreshRates() retourne FALSE, si les données n’ont pas été mises à jour dans le terminal client. Dans un tel cas, lescopies locales ne sont pas changées.

{xtypo_warning}Notez que RefreshRates() a seulement une influence sur la programme sur lequel il est exécuté (pas tous les programmes exécutés par le terminal client) {/xtypo_warning}

 

Illustrons l’exécution de la fonction RefreshRates() avec un exemple.

 Problème 21. Comptez le nombre d’itération qu’un opérateur de cycle peut réaliser entre deux ticks (pour les 5 plus proches ticks).

Ce problème peut être résolut en utilisant la fonction RefreshRates() (script countiter.mq4 ):

{xtypo_code}//————————————————————-
// countiter.mq4
// The code should be used for educational purpose only.
//————————————————————–
int start() // Speciale fonct. start()
{
int i, Count; // Déclaration des variables
for (i=1; i<=5; i++) // Montre pour les 5 ticks
{
Count=0; // Reset le compteur
while(RefreshRates()==false) // Jusq’à…
{ //..un nouveau tick arrive
Count = Count+1; // Itération du compteur
}
Alert(“Tick “,i,”, loops “,Count); // Après chaque tick
}
return; // Sortie start()
}
//————————————————————-{/xtypo_code}

Selon les conditions du problème, les calculs devraient être réalisés seulement pour les cinq ticks les plus proches, c’est pourquoi on peut utiliser un script. Deux variables sont utilisées dans le programme. i pour le compteur du nombre de ticks et Count pour le compteur des itérations.Le cycle externe “for” est mis en place en accord avec le nombre de ticks pris en compte (de 1 à 5). Au commencement du cycle “for”, le compteur d’itérations (utilisés dans le cycle “while”) est mis à 0, à la fin une alerte avec le numéro du ticks et une quantité d’itérations est montrée.

Le cycle interne “while” fonctionne pendant que la valeur retournée par  RefreshRates() est égale à “False”, c’est à dire jusqu’à ce qu’un nouveau tick arrive. Durant l’opération du “while” (c’est à dire l’intervalle entre les ticks), la valeur de “Count” sera constamment augmentée, et par conséquent le nombre d’itérations cherchées du cycle “while” sera compté. Si au moment de la vérification de la condition du “while”, la fonction RefreshRates() est égale à “True”, cela signifie qu’il y a de nouvelles valeurs aux variables prédéfinies, c’est à dire qu’un nouveau tick est arrivé.Le contrôle est alors rendu à l’extérieure du “while” et le comptage des itérations est alors terminé.

Comme résultat de l’exécution du script countiter.mq4, un nombre d’alertes caractérisant les performances de MQL4 peut apparaitre dans une fenêtre :

 

Fig. 53. Résultats des opérations de countiter.mq4 dans la fenêtre  EUR/USD.

Il est facile de voire que pour 1 seconde (intervalle entre le quatrième et le cinquième tick) le script a réalisé 3 millions d’opérations. Des résultats analogues peuvent être obtenus par des calculs simples pour les autres ticks.

Retournons à l’exemple précédent (Expert Advisor predefined.mq4).Nous avons vu précédemment que si RefreshRates()n’est pas exécutée dans l’EA 2, les valeurs des copies locales des variables prédéfinies resteront inchangées durant la période entière de l’exécution de start(), c’est à dire par exemple durant t2- t32. Si après le troisième tick (qui arrive quand start() est en train de s’exécuter), la fonction RefreshRates() est exécutée, par exemple au moment t31, les valeurs des copies locales seront mises à jour. Donc, durant, le temps restant de t31 (exécution de RefreshRates()) à t32 (fin de l’exécution de start()), les nouvelles valeurs des copies locales des variables prédéfinies égales aux valeurs définies par le terminal client à t3 seront disponibles à l’EA 2.

Si dans l’EA 2 la fonction RefreshRates est exécutée à l’instant t11 ou t21 (c’est à dire dans la période pendant laquelle le dernier tick connu est celui qui a fait démarrer la fonction start()), les copies locales des variables prédéfinies ne seront pas modfiées.

Retour Sommaire

Traduction: Nicolas Vitale
Article Original: http://book.mql4.com/variables/predefined

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>