Problemi con Time() - pagina 7

 
onewithzachy:

Gli strumenti. Parlaci degli strumenti, non essere imbarazzante, ho imparato da RaptorUK, dabbler, e dai commenti di SDC l'altro giorno. Quindi, per favore, diteci .

:D

Sembra che la risposta alla tua domanda sia Molanis . . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450
 
RaptorUK:
Sembra che la risposta alla tua domanda sia Molanis . . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450

Interessante, come questo

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

Aiuta a conoscere il background di ciò di cui stiamo parlando!


Ho evitato questo thread perché c'è così tanto turbamento da tutte le parti. Sembra così inutile.


Forse l'OP dovrebbe iniziare un nuovo thread in modo che gli intervistati non debbano leggere 200 post con il 100% di precisione per capire cosa sta succedendo.

E forse tutti potrebbero smettere di chiamare le persone con dei nomi.

 

RaptorUK:

Day(), DayOfWeek(), TimeDay() e TimeDayOfWeek() sembrano tutti funzionare correttamente nello Straegy Tester (build 427). . . intendevi davvero usare Day() nel tuo codice o il tuo codice dovrebbe costruire qualcosa. . qualunque cosa tu usi per codificare per te, dovrebbe aver usato DayOfWeek()? il primo, Day() dà un valore 0 - 31, il secondo DayOfWeek() dà un valore di 0 - 6 domenica è 0

Dooh! Ho sorvolato su quel codice e non ho visto quel problema, e ho usato quelle esatte funzioni nel mio codice. Ben individuato :-)
 
dabbler:

Interessante, così come questo

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

Aiuta a conoscere il background di ciò di cui stiamo parlando!


Ho evitato questo thread perché c'è così tanto turbamento da tutte le parti. Sembra così inutile.

Lo è... alcune persone non possono essere aiutate però, hanno una fissazione nella loro testa che il loro codice è buono e MT4 è spazzatura... Ho cercato di aiutare l'OP, ovviamente sta confondendo Day() e DayOfWeek() e nonostante fosse ovvio dal suo primo post che era il caso, non voleva accettarlo . . . alcune persone non possono essere aiutate.
 
dabbler:
Dooh! Ho dato un'occhiata a quel codice e non ho visto quel problema, e ho usato quelle stesse funzioni nel mio codice. Ben individuato :-)
onewithzachy :l'ho notato anch'io... ma con tutta l'attività di questo thread ho perso il suo post.
 

Un'altra cosa che tutti noi non abbiamo notato, beh io l'ho notata ma nel mezzo di questo pazzo thread, non mi sono reso conto che nessuno l'aveva menzionata, l'OP ha postato questo:

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

Non puoi mettere insieme tutti quei || || || || || && && || && && come condizione senza usare delle parentesi per spezzare il tutto.

Guardando l'ultima parte

|| Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
Non credo che questo causerebbe mai che la condizione sia vera quando le parti precedenti sono false, a meno che non si usino delle parentesi per separarla dal resto della condizione.
 
SDC:

Un'altra cosa che tutti noi non abbiamo notato, beh io l'ho notata ma nel mezzo di questo pazzo thread, non mi sono reso conto che nessuno l'aveva menzionata, l'OP ha postato questo:

Non puoi mettere insieme tutti quei || || || || || && && || && && come condizione senza usare delle parentesi per spezzare il tutto.

Beh, è interessante notare che ho controllato e sembra tutto a posto. MQL4 e C (e ogni altro linguaggio informatico) ha una serie di regole di precedenza che danno un'esatta interpretazione di un'espressione logica. Tuttavia, lo strumento utilizzato diceva che tali "espressioni complesse" erano ambigue! (Per cui dovremmo leggere non correttamente implementate). WHR ha postato prima che le espressioni dovrebbero essere messe tra parentesi. Questa è ovviamente una buona pratica in ogni caso, poiché dover aprire il libro per capire quale regola di precedenza segue quale espressione significa che il codice è illeggibile.
 

OK Ho dovuto controllare questo ora perché non ho mai scritto codice come questo e l'ho fatto funzionare come pensavo, quindi ecco un semplice script per testarlo.

Ho sostituito ogni confronto nella condizione originale con corrispondenti confronti di interi per renderlo facile da leggere/test/debug. Tutto è falso tranne la parte dopo l'ultimo operatore ||.

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

Questo dà la condizione false che mi dice:

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

Così come è stato messo nel codice OP, non avrebbe mai fatto diventare vera la condizione anche se Day() fosse stato sostituito con DayOfWeek() ma se ci mettiamo qualche parentesi ....

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);
  }
Ora funziona e la condizione diventa vera.
 
SDC:

OK Ho dovuto controllare questo ora perché non ho mai scritto codice come quello e l'ho fatto funzionare come pensavo, quindi ecco un semplice script per testarlo.

Ottimo lavoro. Ho anche notato che le regole di precedenza MQL4 ...

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

hanno OR logico superiore a AND logico, in disaccordo con K & R (2nd ed)

Ma come te, non ho mai usato queste regole in grande misura, mi limito a mettere le parentesi attorno alle cose o a usare linee separate in modo da poter capire il mio codice!

 
SDC:
Ora funziona e la condizione diventa vera.

Ed ecco il mio contributo (script di prova) ...

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

Che fa questo ...


Mostrando chiaramente che i test OR logici sono fatti per primi (priorità più alta) e poi i test AND logici sono fatti ... proprio come dice la documentazione di MQL4 infatti :-)