Problèmes avec Time()

 
Bonjour à la communauté MQL4 !

Ceci est mon premier message. Tout d'abord, veuillez noter que je ne suis pas un développeur MQL. Je suis un Trader, qui utilise un outil pour m'aider à construire des EAs. Cet outil permet l'utilisation de certaines structures MQL, mais il n'exécute pas de fonctions MQL explicites. Il prend simplement le code MQL, évalue si la condition basée sur le MQL est vraie ou fausse, puis exécute une fonction personnalisée telle que OpenBuy, OpenSell, CloseBuy, CloseSell, DeletePendingBuy, DeletePendingSell, etc. Mais, il n'exécute pas explicitement le code MQL. Par exemple, vous pouvez utiliser la fonction Print ou Comment pour faire apparaître quelque chose sur la fenêtre du graphique de MT4 (juste un exemple).

Je connais donc un tout petit peu le langage MQL, ce qui est juste suffisant pour me permettre d'utiliser l'outil de développement d'EA que j'utilise pour créer mes EA. Jusqu'à présent, j'ai construit 10 EA à l'aide de cet outil et j'en ai abandonné 7 pour cause de non rentabilité, ce qui est environ 30 % de mieux que le ratio de prototypes réussis que j'avais l'habitude d'obtenir en construisant des systèmes de trading dans Excel. Je m'attends généralement à ce que 7-8 idées sur 10 ne soient pas aussi rentables que prévu, ce qui laisse 2 ou 3 conceptions suffisamment rentables pour commencer le processus d'optimisation. Bon, assez parlé de moi et de ma façon de travailler.

Voici mon problème et j'espère que j'ai trouvé de l'aide au bon endroit !

J'exécute ce code [b]pour fermer les transactions :[/b]

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

Remarque : le problème est que toutes les transactions restent ouvertes du lundi au jeudi, jusqu'à 23:57. De même, toutes les transactions restent ouvertes le vendredi, jusqu'à 21:57.


J'exécute également ce code à travers un bloc MQL [b]pour ouvrir des transactions :[/b]

TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05

Remarque : La seule transaction qui s'ouvre entre 00:00 et 00:05 est la toute première transaction du back-test, lorsque vous cliquez sur le bouton Tester le démarrage. Cette position s'ouvre précisément à 00:00. En revanche, aucune des autres positions ne s'ouvre entre 00h00 et 00h05, plus tard dans la semaine.

En résumé :

- Une transaction s'ouvre après avoir cliqué sur le bouton Tester le démarrage à 00:00.
- Aucune transaction n'est ensuite fermée à 23:57 (Lu-Je) ou à 21:57 (Ve).
- Aucune transaction n'est ensuite ouverte entre 00:00 et 00:05.

Toutes les heures indiquées ci-dessus disposent d'un flux de ticks suffisant. Il n'y a donc aucun vide dans les données utilisées par Tester.

Toute aide serait la bienvenue. Pourquoi ces transactions ne sont-elles pas clôturées à l'heure codée ? Pourquoi aucune transaction n'est-elle exécutée alors qu'un signal de transaction est toujours disponible entre 00:00 et 00:05, du lundi au vendredi ?

Merci !
cfx
 

Quelles instructions d'impression de débogage avez-vous ajoutées à votre code pour savoir ce qui est exécuté et ce qui ne l'est pas ? Par exemple, est-ce que la fonction OrderClose() échoue ou est-ce que c'est le code qui conduit à la fonction OrderClose() ?

Que sont les valeurs de retour des fonctions ? Comment les utiliser ?

Day() fonctionne-t-il correctement dans le testeur de stratégie ? Avez-vous testé qu'il fonctionne ? Vous pouvez utiliser TimeDayOfWeek() à la place...

 

>J'exécute ce code [b]pour fermer des transactions :[/b]

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

>Note : Le problème est que toutes les transactions restent ouvertes du lundi au jeudi, jusqu'à 23:57. De même, toutes les transactions restent ouvertes le vendredi, jusqu'à 21:57.

Il s'agit d'une erreur très courante chez les débutants : essayer de faire tenir toute l'expression logique sur une seule ligne. C'est impossible à déboguer.

L'astuce consiste à décomposer le test en petits morceaux et à vérifier chaque partie (avec des instructions Print ou autres).

Pouvez-vous le faire fermer après 23:57 n'importe quel jour ? Il n'est pas nécessaire de se préoccuper des jours de la semaine avec ce test. Une fois que vous avez réussi à faire fonctionner un test correctement, vous pouvez devenir plus aventureux. Mais utilisez plusieurs lignes si possible pour permettre l'insertion d'instructions d'impression pour le débogage. Lorsque le test fonctionne, supprimez les instructions d'impression mais laissez le code sur des lignes séparées. Le code est en fait plus efficace lorsqu'il est écrit sur plusieurs lignes (il s'exécute plus rapidement).

 
  1.  Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    de quoi s'agit-il ?
    Day() == 1 || Day() == 2 || Day() == 3 || ( Day() == 4 && TimeHour(TimeCurrent()) >=23) && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    ( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
    Toujours mettre les parenthèses complètement ou simplifier et s'auto documenter
    #define HR2157 79020 // 21 * 3600 + 57 * 60
    #define HR2357 86220
    datetime now = TimeCurrent();
    int      tod = now % 86400;
    bool     isFriday = TimeDayOfWeek(now) == 5;
    if (isFriday) int todClose = HR215700;
    else              todClose = HR235700
    if (now >= todClose) ...
    

  2. https://www.mql5.com/en/forum/127483 a signalé que DayOfWeek() renvoie toujours 5 dans le testeur, je n'utilise donc que les versions Timexxx().
 
WHRoeder:
  1. de quoi s'agit-il ?
Le PO veut manifestement dire OU tous les jours de la semaine sauf le vendredi. Il est clair qu'il essaie de forcer une clôture avant la fin de la journée de négociation, mais avec un vendredi plus court. Il n'a pas compris que le test consistant à utiliser le OU des quatre jours est redondant puisque nous pouvons toujours clôturer si l'heure est après 23:57. Le vendredi n'a pas besoin d'être exclu !
 
RaptorUK:

Quelles instructions d'impression de débogage avez-vous ajoutées à votre code pour savoir ce qui est exécuté et ce qui ne l'est pas ? Par exemple, est-ce que la fonction OrderClose() échoue ou est-ce le code qui conduit à la fonction OrderClose() ?

Que sont les valeurs de retour des fonctions ? Comment les utiliser ?

Day() fonctionne-t-il correctement dans le Strategy Tester ? Avez-vous testé qu'il fonctionne ? Vous pouvez utiliser TimeDayOfWeek() à la place...


Je n'ai pas utilisé d'instructions Print dans ce but. J'ai fait une faute de frappe dans mon message original. L'outil que j'utilise ne peut pas utiliser les fonctions MQL telles que Print ou Comment (j'avais initialement écrit "peut"). Je m'excuse donc pour la faute de frappe, qui a eu un impact sur votre réponse.

Cependant, je peux facilement regarder le journal du testeur et voir que l'EA ne prépare aucune transaction quand il le devrait (à 00:00), et qu'il n'instancie la clôture d'aucune transaction quand il le devrait (du lundi au jeudi à 23:59, ou le vendredi à 21:57). Essentiellement, je peux voir le chargement de l'EA au moment de l'exécution du testeur, les informations obligatoires sur le compte de démonstration, et enfin, je peux voir que toutes les tranches de temps pour le ou les indicateurs utilisés par l'EA sont chargés correctement et sans erreur. Je n'ai généralement pas d'erreurs d'aucune sorte avec mes EA, quelles qu'elles soient. Et je teste régulièrement des EA à cadres temporels multiples.

Il semble que je n'aie un problème qu'avec la fonction Time().

Puisque la seule position qui est ouverte est la toute première transaction que l'EA voit APRÈS avoir cliqué sur le bouton Tester le démarrage, je ne peux pas vous dire si Day() fonctionne ou non à partir de la sortie qui vient de Print ou de Comment. Cependant, à titre de test aléatoire, j'ai supprimé la ligne [b]TimeMinute(TimeCurrent()) <= 05[/b] du segment de code qui contrôle l'ouverture des positions à 00:00, du lundi au vendredi. Lorsque j'ai fait cela, le code suivant a commencé à fonctionner comme prévu :

Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4 && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

Cela m'indique qu'en fait, Day() fonctionne par déduction. En fait, tout ce segment de code qui ferme les positions fonctionne. Mais, pour une raison quelconque, pas lorsque [b]TimeMinute(TimeCurrent()) <= 05[/b] est utilisé dans le segment de code qui contrôle l'ouverture des positions. Cette ironie n'a aucun sens pour moi - je n'arrive pas à comprendre pourquoi ce serait le cas.

Merci !

cfx

 
dabbler:

>J'exécute ce code [b]pour fermer les transactions :[/b]

>Remarque : Le problème est que toutes les transactions restent ouvertes du lundi au jeudi, jusqu'à 23:57. De même, toutes les transactions restent ouvertes le vendredi, jusqu'à 21:57.

Il s'agit d'une erreur très courante chez les débutants : essayer de faire tenir toute l'expression logique sur une seule ligne. C'est impossible à déboguer.

L'astuce consiste à décomposer le test en petits morceaux et à vérifier chaque partie (avec des instructions Print ou autres).

Pouvez-vous faire en sorte qu'il se ferme après 23:57 n'importe quel jour ? Il n'est pas nécessaire de se préoccuper des jours de la semaine avec ce test. Une fois que vous avez réussi à faire fonctionner un test correctement, vous pouvez devenir plus aventureux. Mais utilisez plusieurs lignes si possible pour permettre l'insertion d'instructions d'impression pour le débogage. Lorsque le test fonctionne, supprimez les instructions d'impression mais laissez le code sur des lignes séparées. Le code est en fait plus efficace lorsqu'il est écrit sur plusieurs lignes (il s'exécute plus rapidement).


Au fait, merci à tous pour vos réponses !


Le contrôle de fermeture fonctionne. Lorsque j'ai supprimé le [b]TimeMinute(TimeCurrent()) <= 05[/b] du contrôle d'ouverture, il fonctionne effectivement. La toute première position qui a été exécutée APRÈS avoir cliqué sur le bouton de démarrage du testeur, est effectivement fermée à 23:57 (lundi-jeudi). Le problème est alors qu'aucune nouvelle position n'est ouverte à 00:00, comme l'exige le contrôle d'ouverture ([b]TimeHour(TimeCurrent()) == 00 && TimeMinute(TimeCurrent()) <= 05[/b]. Même si j'enlève la fonction [b]TimeMinute(TimeCurrent() <=5[/b] comme simple contrôle de bon sens.

Je pensais que rendre le code aussi compact que possible serait la meilleure alternative, mais je vais essayer de développer chaque fonction, segment, composant, etc. pour voir si cela aide.


Merci !

cfx

 
WHRoeder:
  1. lequel de ces éléments vouliez-vous dire ?
    Toujours mettre entre parenthèses complètement ou simplifier et auto-documenter
  2. https://www.mql5.com/en/forum/127483 a signalé que DayOfWeek() renvoie toujours 5 dans le testeur, donc je n'utilise que les versions Timexxx().

Je voulais dire :

( Day() == 1 || Day() == 2 || Day() == 3 || Day() == 4) && TimeHour(TimeCurrent()) >=23 && TimeMinute(TimeCurrent()) >=57 || Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57


Il semble qu'il manque une parenthèse dans ce segment de code. Si vous pouvez la corriger pour moi, je vous en serais reconnaissant. L'outil que j'utilise me permet de savoir quand il manque une parenthèse, mais il ne me dit pas où.


Merci !

 
dabbler:
Le PO souhaite manifestement fermer tous les jours de la semaine sauf le vendredi. Il est clair qu'il essaie de forcer une clôture avant la fin de la journée de négociation, mais avec un vendredi plus court. Il n'a pas compris que le test consistant à utiliser le OU des quatre jours est redondant puisque nous pouvons toujours clôturer si l'heure est postérieure à 23:57. Le vendredi n'a pas besoin d'être exclu !

Je dois isoler le vendredi, sinon il n'y aura aucune distinction entre les heures de fermeture du lundi au jeudi et celle du vendredi. Les deux heures de fermeture se distinguent par le jour de la semaine où elles se produisent et pas seulement par l'heure du jour où elles se produisent.

Ainsi, je dois fermer le lundi - jeudi à 23:57, et le vendredi à 21:57, respectivement. Si j'inclus la clôture du vendredi dans celle du lundi au jeudi, alors toutes les transactions seront clôturées à l'heure la plus proche vue par l'EA, qui sera 21:57, soit deux heures complètes avant les heures de clôture requises du lundi au jeudi.

Veuillez clarifier votre déclaration. Merci !

cfx

 

LOL !


Je commence à penser que la majorité des fonctions basées sur le "temps" dans MT4 sont sérieusement défectueuses.


Je veux dire, si je réinitialise toute ma logique de contrôle de position à quelque chose d'aussi banal que : TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59, et que je ne parviens pas à fermer une seule transaction (l'EA ignore tout simplement le code !), je dirais que MT4 a des problèmes qui doivent être corrigés en ce qui concerne ces types de fonctions.


J'ai également effectué une série de tests en utilisant ce qui suit : DayOfWeek() != 0 && DayOfWeek() !=, et pas une seule transaction ne s'est ouverte du lundi au vendredi ! En fait, pas une seule transaction ne s'est ouverte. Mais, à votre avis, qu'est-il arrivé à l'EA lorsque j'ai complètement supprimé toutes les fonctions basées sur le temps ? Bien sûr, il fonctionne comme prévu, sans erreur. Je ne suis pas un développeur MQL, mais je suis vraiment bon pour développer des constructions logiques et je peux détecter un problème systémique quand je le sens. Je sens que MetaQuotes a un problème avec ses fonctions Time(), point. Je ne peux pas être aussi ignorant sur quelque chose de si facile à coder et j'ai vu d'autres personnes qui codent en MQL, avoir des difficultés avec les fonctions basées sur le temps dans MT4.

Je ne sais pas exactement quel est le problème, mais lorsque je retire TimeMinute(TimeCurrent()) <= 05, de la logique de contrôle d'ouverture (ce morceau de code qui contrôle l'ouverture de tous les trades), et que je n'obtiens que le premier trade qui se ferme au bon moment, alors que TOUS les AUTRES trades pilotés par la même logique de contrôle d'ouverture sont sommairement ignorés par l'EA par la suite, alors je sais qu'il y a un problème systémique avec la fonction elle-même.

Le code ne peut pas être plus simple ! J'ordonne à l'EA d'ouvrir la transaction entre 00:00 et 00:05. Ce n'est pas une chose difficile à coder. Un enfant de six ans pourrait le faire. Le voici encore une fois : [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


Voilà. Je viens de le coder. Je dépose ensuite ce code dans l'outil que j'utilise et l'outil me dit que la syntaxe du code est correcte ! Ok, et maintenant ? Eh bien, je compile ce fichu fichier .ex4 pour la MILLIONIÈME fois et je lance le M4 Tester. Ok, et maintenant ? Eh bien, la toute première transaction est lancée à 00:00. Génial, non ? NOOOOOO ! Pourquoi ? Parce qu'à 23h59 un lundi, cette foutue position est encore ouverte. Et après ? Eh bien, à 00:00 de la prochaine session de trading (la prochaine barre D1), le bon vieux [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b] s'en sortira là où le contrôle de fermeture a échoué, n'est-ce pas ? Pas du tout ! Pourquoi ? Parce que, de 00:00 à 00:05, aucune transaction n'est jamais ouverte par l'EA ! !!

J'ai passé deux (2) jours sur ce simple code et personne n'a été capable de me dire pourquoi il ne fonctionne pas - pas même les experts de MQL ! Cela me dit que MetaQuotes a un problème.

Ok, j'ai fini de me défouler maintenant. C'était deux jours de frustration refoulée et je devais la laisser sortir.

Je n'ai JAMAIS eu de problème avec mes EA et j'ai été capable de mettre en place des conceptions assez sophistiquées en utilisant tous les cadres temporels sauf W1 et MN. Tous mes EAs utilisent des conceptions iCustom que j'ai construites et étudiées à partir de rien.

Tout d'un coup, après avoir fonctionné comme un moteur V8 bien huilé et bien réglé, je commence à utiliser les fonctions Time() et l'enfer se déchaîne ? Il y a quelque chose qui ne tourne pas rond dans tout ça. J'utilise ces fonctions basées sur le temps de la manière la plus simple possible, et elles ne fonctionnent toujours pas ? 48 heures sur quelque chose comme ça, c'était une énorme quantité de temps à perdre pour moi. Frustré et énervé, je vais essayer de vivre sans "Time", si c'est possible.

Je vais devoir apprendre à développer une logique commerciale autour des fonctions Time().

Irréel.

 

CFx 2012.05.31 03:41

LOL !


Je commence à penser qu'une majorité des fonctions basées sur le "temps" dans MT4 sont sérieusement défectueuses.


Je veux dire, si je réinitialise toute ma logique de contrôle de position à quelque chose d'aussi banal que : TimeHour(TimeCurrent()) == 23 && TimeHour(TimeCurrent()) == 59, et que je ne parviens pas à fermer une seule transaction (l'EA ignore tout simplement le code !), je dirais que MT4 a des problèmes qui doivent être corrigés en ce qui concerne ces types de fonctions.


J'ai également effectué une série de tests en utilisant ce qui suit : DayOfWeek() != 0 && DayOfWeek() !=, et pas une seule transaction ne s'est ouverte du lundi au vendredi ! En fait, pas une seule transaction ne s'est ouverte. Mais, à votre avis, qu'est-il arrivé à l'EA lorsque j'ai complètement supprimé toutes les fonctions basées sur le temps ? Bien sûr, il fonctionne comme prévu, sans erreur. Je ne suis pas un développeur MQL, mais je suis vraiment bon pour développer des constructions logiques et je peux détecter un problème systémique quand je le sens. Je sens que MetaQuotes a un problème avec ses fonctions Time(), point. Je ne peux pas être aussi ignorant sur quelque chose de si facile à coder et j'ai vu d'autres personnes qui codent en MQL, avoir des difficultés avec les fonctions basées sur le temps dans MT4.

Je ne sais pas exactement quel est le problème, mais lorsque je retire TimeMinute(TimeCurrent()) <= 05, de la logique de contrôle d'ouverture (ce morceau de code qui contrôle l'ouverture de tous les trades), et que je n'obtiens que le premier trade qui se ferme au bon moment, alors que TOUS les AUTRES trades pilotés par la même logique de contrôle d'ouverture sont sommairement ignorés par l'EA par la suite, alors je sais qu'il y a un problème systémique avec la fonction elle-même.

Le code ne peut pas être plus simple ! J'ordonne à l'EA d'ouvrir la transaction entre 00:00 et 00:05. Ce n'est pas une chose difficile à coder. Un enfant de six ans pourrait le faire. Le voici encore une fois : [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b].


Voilà. Je viens de le coder. Je dépose ensuite ce code dans l'outil que j'utilise et l'outil me dit que la syntaxe du code est correcte ! Ok, et maintenant ? Eh bien, je compile ce fichu fichier .ex4 pour la MILLIONIÈME fois et je lance le M4 Tester. Ok, et maintenant ? Eh bien, la toute première transaction est lancée à 00:00. Génial, non ? NOOOOOO ! Pourquoi ? Parce qu'à 23h59 un lundi, cette foutue position est encore ouverte. Et après ? Eh bien, à 00:00 de la prochaine session de trading (la prochaine barre D1), le bon vieux [b]TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05[/b] s'en sortira là où le contrôle de fermeture a échoué, n'est-ce pas ? Pas du tout ! Pourquoi ? Parce que, de 00:00 à 00:05, aucune transaction n'est jamais ouverte par l'EA ! !!

J'ai passé deux (2) jours sur ce simple code et personne n'a été capable de me dire pourquoi il ne fonctionne pas - pas même les experts de MQL ! Cela me dit que MetaQuotes a un problème.

Ok, j'ai fini de me défouler maintenant. C'était deux jours de frustration refoulée et je devais la laisser sortir.

Je n'ai JAMAIS eu de problème avec mes EA et j'ai été capable de mettre en place des conceptions assez sophistiquées en utilisant tous les cadres temporels sauf W1 et MN. Tous mes EAs utilisent des conceptions iCustom que j'ai construites et étudiées à partir de rien.

Tout d'un coup, après avoir fonctionné comme un moteur V8 bien huilé et bien réglé, je commence à utiliser les fonctions Time() et l'enfer se déchaîne ? Il y a quelque chose qui ne tourne pas rond dans tout ça. J'utilise ces fonctions basées sur le temps de la manière la plus simple possible, et elles ne fonctionnent toujours pas ? 48 heures sur quelque chose comme ça, c'était une énorme quantité de temps à perdre pour moi. Frustré et énervé, je vais essayer de vivre sans "Time", si c'est possible.

Je vais devoir apprendre à développer une logique commerciale autour des fonctions Time().

Irréel.

LOL. C'est toi qui est irréel. Ton code...

if (TimeHour(TimeCurrent()) == 00 && TimeHour(TimeCurrent()) <= 05)

... ne retournera jamais vrai.

Tu es celui qui a besoin de développer davantage "ta" construction logique.

Et cette construction...

if (TimeHour(TimeCurrent()) >= 00 && TimeHour(TimeCurrent()) <= 05)