Problèmes avec Time() - page 7

 
onewithzachy:

Les outils. Parlez-nous des outils, ne soyez pas gênés, j'ai appris de RaptorUK, dabbler, et des commentaires de SDC l'autre jour. Alors, s'il vous plaît, dites-nous.

:D

Il semble que la réponse à votre question soit Molanis. . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450
 
RaptorUK:
Il semble que la réponse à votre question soit Molanis. . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450

Intéressant, tout comme ceci

https://www.mql5.com/en/forum/126224

Il est utile de connaître le contexte de ce dont nous parlons !


J'ai évité ce fil de discussion parce qu'il y a tellement de colère de tous les côtés. Cela semble tellement inutile.


Peut-être que le PO devrait commencer un nouveau fil de discussion afin que les répondants n'aient pas à lire 200 messages avec une précision de 100% pour comprendre ce qui se passe.

Et peut-être que tout le monde pourrait arrêter d'insulter les gens.

 

RaptorUK:

Day(), DayOfWeek(), TimeDay() et TimeDayOfWeek() semblent tous fonctionner correctement dans le Straegy Tester (build 427) ... vouliez-vous vraiment utiliser Day() dans votre code ou votre code de construction devrait-il utiliser DayOfWeek() ? le premier, Day() donne une valeur de 0 à 31, le second DayOfWeek() donne une valeur de 0 à 6 le dimanche est 0.

Dooh! J'ai survolé ce code et n'ai pas vu ce problème, et j'ai utilisé ces fonctions exactes dans mon propre code. Bien vu :-)
 
dabbler:

Intéressant, tout comme ceci

https://www.mql5.com/en/forum/126224

Il est utile de connaître le contexte de ce dont nous parlons !


J'ai évité ce fil de discussion parce qu'il y a tellement de colère de tous les côtés. Cela semble tellement inutile.

C'est vrai... Mais certaines personnes ne peuvent pas être aidées, elles ont une fixation dans leur tête que leur code est bon et que MT4 est de la merde.... J'ai essayé d'aider l'OP, il est évident qu'il mélange Day() et DayOfWeek() et malgré le fait qu'il était évident dès son premier message que c'était le cas, il ne voulait pas l'accepter... Certaines personnes ne peuvent pas être aidées.
 
dabbler:
Dooh! J'ai survolé ce code et n'ai pas vu ce problème, et j'ai utilisé ces mêmes fonctions dans mon propre code. Bien vu :-)
onewithzachy :je l'ai repéré aussi ... mais avec toute l'activité dans ce fil, j'ai manqué son message.
 

Une autre chose que nous n'avons pas remarquée, enfin j'ai remarqué mais au milieu de ce fil fou, je n'ai pas réalisé que personne ne l'avait mentionné, le PO a posté ceci :

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

Vous ne pouvez pas enchaîner tous ces || || || || || && && || && && comme une condition sans utiliser des parenthèses pour la décomposer.

En regardant la dernière partie :

|| Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
Je ne pense pas que cela puisse faire en sorte que la condition soit vraie alors que les parties précédentes sont fausses, à moins d'utiliser des parenthèses pour la séparer du reste de la condition.
 
SDC:

Une autre chose que nous n'avons pas remarquée, enfin j'ai remarqué mais au milieu de ce fil fou, je n'ai pas réalisé que personne ne l'avait mentionné, le PO a posté ceci :

Vous ne pouvez pas enchaîner tous ces || || || || || && && || && && comme une condition sans utiliser des parenthèses pour la décomposer.

Il est intéressant de noter que j'ai vérifié et que cela semblait correct. MQL4 et C (et tout autre langage informatique) ont un ensemble de règles de précédence qui donnent une interprétation exacte d'une expression logique. Cependant, l'outil utilisé disait que de telles "expressions complexes" étaient ambiguës ! (Pour lequel nous devrions lire " pas correctement implémenté"). WHR a indiqué précédemment que les expressions devaient être mises entre parenthèses. C'est évidemment une bonne pratique de toute façon, car le fait de devoir ouvrir le livre pour comprendre quelle règle de précédence suit quelle expression rend le code illisible.
 

OK, je devais vérifier cela maintenant parce que je n'ai jamais écrit de code comme ça et que ça n'a jamais fonctionné comme je le pensais, donc voici un script simple pour le tester.

J'ai remplacé chaque comparaison dans la condition originale par des comparaisons correspondantes d'entiers pour faciliter la lecture/test/débogage. Tout est faux sauf la partie après le dernier opérateur ||.

int start()
  {
//----
   int a,b,c,d,e; 
   a=1;
   b=2;
   c=3;
   d=4;
   e=1;
//----
   if( a==b || b==c || c==d || d==e && a>=b && c>=d || a==e && b>=a && c>=a )
   Alert("condition true");
   else
   Alert("condition false");
//----
   return(0);
  }

Cela donne la condition false qui m'indique :

|| Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57

Tel qu'il était placé dans le code OP, il n'aurait jamais fait en sorte que la condition devienne vraie même si Day() avait été remplacé par DayOfWeek() mais si nous mettons des parenthèses là-dedans .....

int start()
  {
//----
   int a,b,c,d,e; 
   a=1;
   b=2;
   c=3;
   d=4;
   e=1;
//----
   if( (a==b || b==c || c==d || d==e && a>=b && c>=d) || (a==e && b>=a && c>=a) )
   Alert("condition true");
   else
   Alert("condition false");
//----
   return(0);
  }
Maintenant, cela fonctionne et la condition devient vraie.
 
SDC:

OK, j'ai dû vérifier cela maintenant parce que je n'ai jamais écrit de code comme ça et que ça n'a jamais fonctionné comme je le pensais, alors voici un script simple pour le tester.

Bon travail. J'ai également remarqué que les règles de précédence du MQL4 ...

https://docs.mql4.com/basis/operations/rules

placent l'OU logique au-dessus de l'ET logique, en désaccord avec K & R (2e édition).

Mais comme vous, je n'utilise jamais vraiment ces règles, je me contente de mettre des crochets autour des choses ou d'utiliser des lignes séparées pour pouvoir comprendre mon propre code !

 
SDC:
Maintenant ça marche et la condition devient vraie.

Et voici ma contribution (script de test) ...

int start(){
   string str = "LOGIC";
   for( int N=0; N<2; N++ ){
      bool bN= (N==1);
      string strN= "false AND ";
      if( bN )
         strN = "true AND ";
      
      for( int M=0; M<2; M++ ){
         bool bM= (M==1);
         string strM= "false OR ";
         if( bM )
            strM = "true OR ";

         for( int P=0; P<2; P++ ){
            bool bP = (P==1);
            string strP= "false = ";
            if( bP )
               strP = "true = ";
            
            str = str + "\n" + strN + strM + strP;
            if( bN && bM || bP )
               str = str + "true";
            else
               str = str + "false";
         }
      }
   }
   
   Comment( str );

   return(0);
}

Qui fait ceci ...


Cela montre clairement que les tests logiques OR sont effectués en premier (priorité plus élevée) et ensuite les tests logiques AND sont effectués ... tout comme il est dit dans la documentation MQL4 en fait :-)