Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
C'est vrai. Merci. Je ne m'en souvenais pas. En fait, cela ne résout pas complètement le problème puisque j'ai besoin que les ordres soient exécutés presque immédiatement (et je pense qu'avec cette méthode je ne peux le vérifier que toutes les secondes, mais au moins pas à chaque tick), mais en effet je peux facilement construire une solution temporaire en l'utilisant.
Bien que le OnTimer ait la fréquence la plus rapide alignée sur l'horloge système, c'est-à-dire toutes les 15 ms, je préférerais boucler par intervalles de 1 ms (en utilisant le Sleep(1) dans la boucle).
Bien que le OnTimer ait la fréquence la plus rapide alignée sur l'horloge système, c'est-à-dire toutes les 15 ms, je préférerais boucler par intervalles de 1 ms (en utilisant le Sleep(1) dans la boucle).
Cela ne poserait-il pas un problème ? Je veux dire qu'il n'y a pas de processus internes dans MT4 qui peuvent avoir besoin que OnTick() soit exécuté pour éviter que des tampons internes ne finissent par déborder ou être surdimensionnés après des semaines de fonctionnement (de l'EA) sans s'arrêter et juste en boucle ?
Je demande cela par ignorance, je n'ai aucune idée si cela peut être un problème, je suppose simplement que MT4 n'a pas été conçu pour le faire.
Donc vous pensez(/avez essayé) que ce ne sera pas un problème ? (Si oui, ce sont d'excellentes nouvelles).
BTW : Comment faites-vous pour que OnTimer() soit exécuté en dessous de l'intervalle de 1 sec : ?
Il y a quelques années, j'avais l'habitude d'exécuter des EA dans une boucle démarrée dans init(), pour une raison similaire - lire des données externes avec un délai minimum. Cela durait des semaines sans aucun effet secondaire. Le Sleep(1) est satisfaisant pour rendre l'impact de la puissance de calcul très léger.
Les paramètres du timer acceptent millis.
Il y a quelques années, j'avais l'habitude d'exécuter des EA dans une boucle démarrée dans init(), pour une raison similaire - lire des données externes avec un délai minimum. Cela durait des semaines sans aucun effet secondaire. Le Sleep(1) est satisfaisant pour rendre l'impact de la puissance de calcul très léger.
Les paramètres du timer acceptent millis.
BTW : Comment faire pour que OnTimer() soit exécuté en dessous d'un intervalle de 1 sec : ?
EventSetMillisecondTimer
Cette fonction indique au terminal client que des événements de minuterie doivent être générés à des intervalles inférieurs à une seconde pour ce conseiller expert ou cet indicateur.
boolEventSetMillisecondTimer(
intmillisecondes// nombre de millisecondes
) ;
Paramètres
millisecondes
[in] Nombre de millisecondes définissant la fréquence des événements de la minuterie.
Valeur retournée
En cas d'exécution réussie, renvoie true, sinon - false. Pour recevoir un code d'erreur, la fonction GetLastError() doit être appelée.
Note
Cette fonction est conçue pour les cas où uneminuterie haute résolution est nécessaire. En d'autres termes, les événements de la minuterie doivent être reçus plus fréquemment qu'une fois par seconde. Si une minuterie conventionnelle avec une période de plusieurs secondes est suffisante pour vous, utilisez EventSetTimer().
En général, cette fonction doit être appelée à partir de la fonction OnInit() ou dans le constructeur de la classe. Pour gérer les événements provenant de la minuterie, un Expert Advisor ou un indicateur doit avoir la fonction OnTimer() .
Chaque Expert Advisor et chaque indicateur fonctionne avec sa propre minuterie et reçoit uniquement les événements de cette minuterie. Lors de l'arrêt de l'application mql4, le timer est détruit de force s'il a été créé mais n'a pas été désactivé par la fonction EventKillTimer().
Un seul timer peut être lancé pour chaque programme. Chaque application mql4 et chaque graphique ont leur propre file d'attente d'événements où sont placés tous les événements nouvellement arrivés. Si la file d'attente contient déjà l'événement Timer ou si cet événement est en cours de traitement, alors le nouvel événement Timer n'est pas ajouté à la file d'attente de l'application mql4.
EventSetMillisecondTimer
Cette fonction indique au terminal du client que des événements de minuterie doivent être générés à des intervalles inférieurs à une seconde pour ce conseiller expert ou cet indicateur.
boolEventSetMillisecondTimer(
intmilliseconds// nombre de millisecondes
) ;
Paramètres
millisecondes
[in] Nombre de millisecondes définissant la fréquence des événements de la minuterie.
Valeur retournée
En cas d'exécution réussie, renvoie true, sinon - false. Pour recevoir un code d'erreur, la fonction GetLastError() doit être appelée.
Note
Cette fonction est conçue pour les cas où une minuterie haute résolution est nécessaire. En d'autres termes, les événements de la minuterie doivent être reçus plus fréquemment qu'une fois par seconde. Si une minuterie conventionnelle avec une période de plusieurs secondes est suffisante pour vous, utilisez EventSetTimer().
En général, cette fonction doit être appelée à partir de la fonction OnInit() ou dans le constructeur de la classe. Pour gérer les événements provenant du minuteur, un Expert Advisor ou un indicateur doit avoir la fonction OnTimer() .
Lors de l'arrêt de l'application mql4, le timer est détruit de force s'il a été créé mais n'a pas été désactivé par la fonction EventKillTimer().
Un seul timer peut être lancé pour chaque programme. Chaque application mql4 et chaque graphique ont leur propre file d'attente d'événements où sont placés tous les événements nouvellement arrivés. Si la file d'attente contient déjà un événement Timer ou si cet événement est en cours de traitement, alors le nouvel événement Timer n'est pas ajouté à la file d'attente de l'application mql4.
Merci pour l'explication détaillée ; ma faute ; je l'ai lu trop rapidement en ligne. (Les liens ont interchangé le domaine docs.mql4.com avec forum.mql4.com. Juste au cas où quelqu'un d'autre vérifierait ce fil de discussion...)
EDIT : Je vais profiter de la présence d'un modérateur : Savez-vous s'il existe une différence entre exécuter OnTimer() tous les N millisecondes et faire la même boucle tous les N millisecondes comme décrit dans les posts précédents ?
Je ne vois pas pourquoi toute cette agitation autour du timing "ms". À moins qu'il ne s'agisse d'une sorte de "High Frequency News Scalper" sur une connexion de courtier à très faible latence, des intervalles d'une seconde sur OnTimer() devraient être plus que suffisants comme temps de réponse.
Si vous ajoutez tous les délais et la latence de l'exécution de l'application JAVA, de la communication IPC (LAN & WAN), de l'exécution de la gestion des ordres et de la latence du serveur du courtier, il n'y a pas de réel avantage à utiliser un timing en "ms" pour des stratégies normales.
Cependant, s'il s'agit d'une sorte de "High Frequency News Scalper", à utiliser sur un VPS avec une connexion à faible latence vers le courtier, alors vous ne devriez PAS vous embêter avec JAVA et IPC du tout, et devriez coder la stratégie directement en MQL très compact pour obtenir la latence la plus faible possible.
EDIT :
EDIT : Je vais profiter de la présence d'un modérateur : Savez-vous s'il existe une différence entre exécuter OnTimer() tous les N millisecs et faire la même boucle tous les N millisecs comme décrit dans les posts précédents ?
Ce n'est pas parce que je suis un modérateur que je suis plus compétent que les autres. En fait, les autres posteurs de ce fil ont manifestement plus de connaissances que moi sur le sujet. Je ne connais rien à Java.
Je ne comprends pas l'intérêt d'utiliser Sleep() dans un événement de timer car cela met l'EA en attente et cela pourrait signifier manquer beaucoup d'événements OnTick(). Bien sûr, selon l'EA, les événements OnTick peuvent être sans importance.
Il y a quelques années, j'avais l'habitude d'exécuter des EA dans une boucle démarrée dans init(), pour une raison similaire - lire des données externes avec un délai minimum. Cela durait des semaines sans aucun effet secondaire. Le Sleep(1) est satisfaisant pour rendre l'impact de la puissance de calcul très léger.
Pour s'amuser un peu... le script suivant accepte plusieurs connexions TCP/IP simultanées, et écrit les messages entrants délimités par CR dans le journal des experts. Par exemple, une fois que le script est exécuté, vous pouvez vous connecter via Telnet (au port 51234 par défaut), et chaque ligne de texte que vous tapez sera imprimée.
Pour s'amuser un peu... le script suivant accepte plusieurs connexions TCP/IP simultanées, et écrit les messages entrants délimités par CR dans le journal des experts.
... pour aller droit au but, si vous vouliez faire ce qui précède dans un EA plutôt que dans un script, il vous suffirait de le modifier comme suit :