Probleme mit Time() - Seite 7

 
onewithzachy:

Die Werkzeuge. Erzählen Sie uns von den Werkzeugen, seien Sie nicht peinlich, das habe ich von RaptorUK, dabbler und SDCs Kommentaren neulich gelernt. Also, bitte, erzähl es uns.

:D

Es scheint, dass die Antwort auf Ihre Frage Molanis lautet . . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450
 
RaptorUK:
Es scheint, dass die Antwort auf Ihre Frage Molanis lautet. . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450

Interessant, ebenso wie dies

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

Es ist hilfreich, den Hintergrund dessen zu kennen, worüber wir sprechen!


Ich habe diesen Thread gemieden, weil es auf allen Seiten so viel Aufregung gibt. Es scheint einfach so unnötig.


Vielleicht sollte der Auftraggeber einen neuen Thread eröffnen, damit die Befragten nicht 200 Beiträge mit 100-prozentiger Genauigkeit lesen müssen, um herauszufinden, worum es geht.

Und vielleicht könnte jeder aufhören, Leute zu beschimpfen.

 

RaptorUK:

Day(), DayOfWeek(), TimeDay() und TimeDayOfWeek() scheinen im Straegy-Tester (Build 427) alle korrekt zu funktionieren ... Wollten Sie wirklich Day() in Ihrem Code verwenden oder sollte Ihr Code etwas aufbauen ... was auch immer es ist, das Sie verwenden, um für Sie zu coden, sollte es DayOfWeek() verwendet haben? das erste, Day() gibt einen Wert von 0 - 31, das zweite DayOfWeek() gibt einen Wert von 0 - 6 Sunday ist 0

Puh! Ich habe diesen Code überflogen und das Problem nicht gesehen, und ich habe genau diese Funktionen in meinem eigenen Code verwendet. Gut erkannt :-)
 
dabbler:

Interessant, ebenso wie dies

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

Es ist hilfreich, den Hintergrund dessen zu kennen, worüber wir sprechen!


Ich habe diesen Thread gemieden, weil es auf allen Seiten so viel Aufregung gibt. Es scheint einfach so unnötig.

Ist es auch ... einigen Leuten kann man nicht helfen, sie haben eine Fixierung in ihrem Kopf, dass ihr Code gut ist und MT4 Müll ist ... Ich habe versucht, dem OP zu helfen, er hat offensichtlich Day() und DayOfWeek() verwechselt, und obwohl es in seinem ersten Posting offensichtlich war, dass dies der Fall war, wollte er es nicht akzeptieren... manchen Leuten kann einfach nicht geholfen werden.
 
dabbler:
Puh! Ich habe diesen Code überflogen und das Problem nicht gesehen, und ich habe genau diese Funktionen in meinem eigenen Code verwendet. Gut erkannt :-)
onewithzachy : hates auch bemerkt ... aber bei all der Aktivität in diesem Thread habe ich seinen Beitrag übersehen.
 

Eine andere Sache, die wir alle nicht bemerkt haben, nun, ich habe es bemerkt, aber in der Mitte dieses verrückten Threads habe ich nicht bemerkt, dass niemand es erwähnt hat, der OP hat dies gepostet:

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

Man kann nicht all diese || || || || || && && || && && als eine Bedingung aneinanderreihen, ohne einige Klammern zu verwenden, um sie aufzuschlüsseln.

Betrachten Sie den letzten Teil davon:

|| Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
Ich glaube nicht, dass dies jemals dazu führen würde, dass die Bedingung wahr ist, wenn die vorherigen Teile falsch waren, es sei denn, Sie verwenden einige Klammern, um sie vom Rest der Bedingung zu trennen.
 
SDC:

Eine andere Sache, die wir alle nicht bemerkt haben, nun, ich habe es bemerkt, aber in der Mitte dieses verrückten Threads habe ich nicht bemerkt, dass niemand es erwähnt hat, der OP hat dies gepostet:

Man kann nicht all diese || || || || || && && || && && als eine Bedingung aneinanderreihen, ohne einige Klammern zu verwenden, um sie aufzuschlüsseln.

Nun, interessanterweise habe ich das überprüft und es schien in Ordnung zu sein. MQL4 und C (und jede andere Computersprache) haben eine Reihe von Präzedenzregeln, die eine genaue Interpretation eines logischen Ausdrucks ermöglichen. Das verwendete Tool sagte jedoch, solche "komplexen Ausdrücke" seien mehrdeutig! (Wobei wir lesen sollten: nicht korrekt implementiert). WHR hat vorhin geschrieben, dass die Ausdrücke in Klammern gesetzt werden sollten. Das ist offensichtlich ohnehin eine gute Praxis, denn wenn man das Buch aufschlagen muss, um herauszufinden, welche Vorrangregel auf welchen Ausdruck folgt, ist der Code unlesbar.
 

OK, ich musste das jetzt überprüfen, weil ich noch nie einen solchen Code geschrieben habe und es so funktioniert hat, wie ich es mir vorgestellt habe, also hier ist ein einfaches Skript, um es zu testen.

Ich habe jeden Vergleich in der ursprünglichen Bedingung durch entsprechende Vergleiche von Ganzzahlen ersetzt, um es einfach zu lesen/prüfen/debuggen. Alles ist falsch, außer dem Teil nach dem letzten || Operator.

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);
  }

Das ergibt die Bedingung false, was mir sagt:

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

So wie sie im OP-Code platziert war, hätte die Bedingung niemals wahr werden können, selbst wenn Day() durch DayOfWeek() ersetzt worden wäre, aber wenn wir dort einige Klammern einfügen ....

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);
  }
Jetzt funktioniert es und die Bedingung wird erfüllt.
 
SDC:

OK, ich musste das jetzt überprüfen, weil ich noch nie so einen Code geschrieben habe und es so funktioniert hat, wie ich dachte, dass es funktionieren würde.

Gute Arbeit. Mir ist auch aufgefallen, dass die MQL4 Präzedenzregeln ...

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

das logische ODER über das logische UND stellen, was im Widerspruch zu K & R (2. Auflage) steht

Aber wie Sie verwende ich diese Regeln nie in großem Umfang, ich setze nur Klammern um Dinge oder verwende separate Zeilen, damit ich meinen eigenen Code verstehen kann!

 
SDC:
Jetzt funktioniert es und die Bedingung wird wahr.

Und hier ist mein Beitrag (Testskript) ...

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);
}

der dies tut ...


Das zeigt deutlich, dass die logischen ODER-Tests zuerst durchgeführt werden (höhere Priorität) und dann die logischen UND-Tests ... genau wie es in der MQL4-Dokumentation steht :-)