Problemas com o Tempo() - página 7

 
onewithzachy:

As ferramentas. Conte-nos sobre as ferramentas, não seja embaraçoso, aprendi com RaptorUK, dabbler, e os comentários da SDC no outro dia. Então, por favor, diga-nos .

:D

Parece que a resposta à sua pergunta é Molanis . . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450
 
RaptorUK:
Parece que a resposta à sua pergunta é Molanis . . . http://www.molanis.com/forum/viewtopic.php?f=2&t=1450

Interessante, como é isto

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

Ajuda a conhecer os antecedentes do que estamos falando!


Eu tenho evitado este fio porque há muita chatice de todos os lados. Parece tão desnecessário.


Talvez o OP deva iniciar um novo tópico para que os respondentes não tenham que ler 200 posts com 100% de precisão para descobrir o que está acontecendo.

E talvez todos pudessem parar de chamar nomes de pessoas.

 

RaptorUK:

Day(), DayOfWeek(), TimeDay() e TimeDayOfWeek() todos parecem funcionar corretamente no Straegy Tester (build 427) . . . você realmente quis usar Day() em seu código ou se seu código de construção de código . . o que quer que você use para codificar para você, caso tenha usado DayOfWeek() ? o primeiro, Day() dá um valor 0 - 31, o segundo DayOfWeek() dá um valor 0 - 6 Domingo é 0

Dooh! Eu lavei esse código e não vi esse problema, e usei exatamente essas funções em meu próprio código. Bem avistado :-)
 
dabbler:

Interessante, como é isto

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

Ajuda a conhecer os antecedentes do que estamos falando!


Eu tenho evitado este fio porque há muita chatice de todos os lados. Parece tão desnecessário.

Mas é . . . algumas pessoas não podem ser ajudadas, têm uma fixação na cabeça que seu código é bom e MT4 é lixo . . Eu tentei ajudar o OP, ele obviamente está misturando Day() e DayOfWeek() e apesar de ser óbvio desde seu primeiro posto que ele não aceitaria isso . . . algumas pessoas simplesmente não podem ser ajudadas.
 
dabbler:
Dooh! Eu lavei esse código e não vi esse problema, e usei exatamente essas funções em meu próprio código. Bem avistado :-)
onewithzachy :também o vi . . . mas com toda a atividade neste fio eu perdi seu posto.
 

Outra coisa que todos nós não notamos, bem, eu notei, mas no meio deste fio louco, eu não percebi que ninguém tinha mencionado isto, o OP publicou isto:

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

Você não pode amarrar todos aqueles ||| | | | || && && && || && && como uma condição sem usar alguns parênteses para quebrá-la.

Olhando para a última parte dela:

|| Day() == 5 && TimeHour(TimeCurrent()) >=21 && TimeMinute(TimeCurrent()) >=57
Eu não acredito que isso faria com que a condição fosse verdadeira quando as peças anteriores fossem falsas, a menos que se usassem alguns parênteses para separá-la do resto da condição.
 
SDC:

Outra coisa que todos nós não notamos, bem, eu notei, mas no meio deste fio louco, eu não percebi que ninguém tinha mencionado isto, o OP publicou isto:

Você não pode amarrar todos aqueles ||| | | | || && && && || && && como uma condição sem usar alguns parênteses para quebrá-la.

Bem, curiosamente, eu verifiquei isso e pareceu-me bem. MQL4 e C (e qualquer outra linguagem de computador) tem um conjunto de regras de precedência que dão uma interpretação exata de uma expressão lógica. Entretanto, a ferramenta utilizada dizia que tais "expressões complexas" eram ambíguas! (Para as quais não devemos ler corretamente). WHR postou anteriormente que as expressões deveriam ser colocadas dentro dos parênteses. Esta é obviamente uma boa prática de qualquer forma, pois ter que abrir o livro para descobrir qual regra de precedência segue qual expressão significa que o código é ilegível.
 

OK, eu tinha que verificar isto agora porque nunca escrevi um código assim e se funcionasse como eu pensava, então aqui está um script simples para testá-lo.

Eu substituí cada comparação na condição original por comparações correspondentes de inteiros para facilitar a leitura/teste/depuração. Tudo é falso, exceto a parte após o ú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);
  }

Isso dá uma condição falsa que me diz:

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

Como foi colocada no código OP, nunca teria feito com que a condição se tornasse verdadeira mesmo se o Day() tivesse sido substituído pelo DayOfWeek(), mas se colocássemos algum parêntese lá ....

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);
  }
Agora funciona e a condição se torna verdadeira.
 
SDC:

OK, eu tinha que verificar isto agora porque nunca escrevi um código assim e se funcionasse como eu pensava, então aqui está um roteiro simples para testá-lo.

Bom trabalho. Também percebi que as regras de precedência da MQL4 ...

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

têm lógica OU superior à lógica E, em desacordo com K & R (2ª ed)

Mas como você, eu nunca os uso em grande medida, eu apenas coloco parênteses em volta das coisas ou uso linhas separadas para que eu possa entender meu próprio código!

 
SDC:
Agora funciona e a condição se torna verdadeira.

E aqui está minha contribuição (roteiro de teste) ...

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 faz isto ...


Mostrando claramente que os testes OU lógicos são feitos primeiro (prioridade mais alta) e depois os testes E lógicos são feitos ... exatamente como diz na documentação MQL4 na realidade :-)