Problemas con Time() - página 7

 
onewithzachy:

Las herramientas. Háblanos de las herramientas, no seas vergonzoso, aprendí de RaptorUK, dabbler, y los comentarios de SDC el otro día. Así que, por favor, cuéntanos .

:D

Parece que la respuesta a tu pregunta es Molanis . . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450
 
RaptorUK:
Parece que la respuesta a tu pregunta es Molanis . . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450

Interesante, al igual que esto

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

¡Ayuda a conocer el trasfondo de lo que estamos hablando!


He estado evitando este hilo porque hay mucho malestar en todos los lados. Me parece innecesario.


Tal vez el OP debe iniciar un nuevo hilo para que los encuestados no tienen que leer 200 mensajes con 100% de precisión para averiguar lo que está pasando.

Y tal vez todo el mundo podría dejar de insultar a la gente.

 

RaptorUK:

Day(), DayOfWeek(), TimeDay() y TimeDayOfWeek() parecen funcionar correctamente en el Straegy Tester (build 427) . . . ¿realmente querías usar Day() en tu código o deberías haber usado DayOfWeek() en tu código? el primero, Day() da un valor de 0 - 31, el segundo DayOfWeek() da un valor de 0 - 6 el domingo es 0

¡Dooh! He revisado ese código y no he visto ese problema, y he utilizado esas mismas funciones en mi propio código. Bien visto :-)
 
dabbler:

Interesante, al igual que esto

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

¡Ayuda a conocer el trasfondo de lo que estamos hablando!


He estado evitando este hilo porque hay mucho malestar en todos los lados. Parece tan innecesario.

Lo es. . . algunas personas no pueden ser ayudadas sin embargo, tienen una fijación en su cabeza que su código es bueno y MT4 es basura. . . Traté de ayudar a la OP, es evidente que está mezclando Day() y DayOfWeek() y a pesar de que era obvio desde su primer post que era el caso que no lo aceptaría ... algunas personas simplemente no se puede ayudar.
 
dabbler:
¡ Dooh! He revisado ese código y no he visto ese problema, y he utilizado esas mismas funciones en mi propio código. Bien visto :-)
onewithzachy :también lo he visto... pero con toda la actividad de este hilo me he perdido su post.
 

Otra cosa que todos no notamos, bueno yo si lo note pero en medio de este hilo loco, no me di cuenta que nadie lo había mencionado, el OP posteo esto:

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

No puedes encadenar todos esos || || || || && && || && como una condición sin usar algunos paréntesis para descomponerla.

Mirando la última parte:

|| Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
No creo que eso haga que la condición sea verdadera cuando las partes anteriores sean falsas, a menos que se usen algunos paréntesis para separarla del resto de la condición.
 
SDC:

Otra cosa que todos no notamos, bueno yo si lo noté pero en medio de este loco hilo, no me di cuenta que nadie lo había mencionado, el OP posteó esto:

No se puede encadenar todos esos || || || || && && || && como una condición sin usar algunos paréntesis para descomponerla.

Bueno, curiosamente lo comprobé y me pareció que estaba bien. MQL4 y C (y cualquier otro lenguaje informático) tiene un conjunto de reglas de precedencia que dan una interpretación exacta de una expresión lógica. ¡ Sin embargo, la herramienta que se utiliza dijo que tales "expresiones complejas" eran ambiguas! (Por lo que habría que leer no están correctamente implementadas). WHR ha publicado anteriormente que las expresiones deben ponerse dentro de paréntesis. Esto es obviamente una buena práctica, ya que tener que abrir el libro para averiguar qué regla de precedencia sigue a qué expresión significa que el código es ilegible.
 

Bien, tuve que comprobar esto ahora porque nunca escribí un código así y lo hice funcionar como pensaba, así que aquí hay un simple script para probarlo.

Reemplacé cada comparación en la condición original con las correspondientes comparaciones de enteros para facilitar la lectura/prueba/debug. Todo es falso excepto la parte después del último operador ||.

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

Eso da la condición false que me dice:

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

Tal y como estaba colocado en el código del OP, nunca habría hecho que la condición se convirtiera en verdadera aunque Day() hubiera sido sustituido por DayOfWeek() pero si ponemos unos paréntesis ahí ....

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);
  }
Ahora funciona y la condición se convierte en verdadera.
 
SDC:

Bien, tuve que comprobar esto ahora porque nunca escribí un código así y lo hice funcionar como pensaba, así que aquí hay un simple script para probarlo.

Buen trabajo. También me di cuenta de que las reglas de precedencia MQL4 ...

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

tienen OR lógico más alto que AND lógico, en desacuerdo con K & R (2ª ed)

¡Pero al igual que usted, yo nunca realmente utilizar estos en gran medida, yo sólo poner paréntesis alrededor de las cosas o el uso de líneas separadas para que pueda entender mi propio código!

 
SDC:
Ahora funciona y la condición se convierte en verdadera.

Y aquí está mi contribución (script de prueba) ...

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

Que hace esto ...


Mostrando claramente que las pruebas lógicas OR se hacen primero (mayor prioridad) y luego se hacen las pruebas lógicas AND ... tal como dice la documentación de MQL4 de hecho :-)