Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 495

 

No primeiro caso é resolvido - colocado entre parênteses para duas comparações e não jura - houve um erro lógico - ou seja, os resultados da comparação poderiam ser substituídos por causa do "ou"?

Permanece uma questão em aberto com a segunda expressão - o que é que se passa aí - quaisquer ideias?

 
-Aleks-:

O primeiro caso é resolvido - colocar entre parênteses duas comparações e não jura - houve um erro lógico - ou seja, os resultados da comparação poderiam ser substituídos por causa do "ou"?

Há ainda uma questão em aberto relativamente à segunda expressão - o que é que está mal aí - algumas ideias?

Lembre-se de que a verificação de uma condição no novo mql4 não é realizada completamente. Isto é, no estado em que se encontram

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

Se Low[x] não for maior do que PriceBuy, então não será feita mais nenhuma verificação. É sobre isto que a descrição do erro nos diz. De forma correspondente, se o primeiro par estiver entre parênteses, o segundo par de condições será verificado se falhar.

Segunda pergunta.

for(calc_day;calc_day>0; calc_day--)

O que é o calc_day igual a? Poderá ser inferior a zero? O compilador não sabe o que está na lógica... É por isso que adverte sobre um possível ciclo ineficaz.

 
Alexey Viktorov:

Lembre-se de que a verificação da condição no novo mql4 não é realizada completamente. Isto é, no estado em que se encontram

if(Low[X]>PriceBuy && High[X]>PriceBuy ||
               Low[X]<PriceBuy && High[X]<PriceBuy)

Se Low[x] não for maior do que PriceBuy, não será feita mais nenhuma verificação. É sobre isto que a descrição do erro nos diz. De forma correspondente, se o primeiro par estiver entre parênteses, o segundo par de condições será verificado se falhar.

Obrigado pela resposta!

Surpreendido - como visualmente a lógica sempre funcionou correctamente, hmmm...


Alexey Viktorov:

Segunda pergunta.

for(calc_day;calc_day>0; calc_day--)

O que é o calc_day igual a? Poderá ser inferior a zero? O compilador não sabe o que está na lógica... É por isso que adverte sobre um loop possivelmente ineficiente.

O número calc_day é sempre superior a 0, o código não é chamado a outros valores.
 
-Aleks-:

Obrigado pela resposta!

Surpreendido - como visualmente a lógica sempre funcionou correctamente, hmmm...

Antes de 6** construir era assim, verificava toda a cadeia de condições e tudo funcionava, mas agora tudo mudou. E em construções antigas, neste caso, a condição é ambígua. Como é concebido?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

Ou foi isso?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Um cérebro humano pode descobrir isso, mas o que é um compilador a fazer? Não tem cérebro.

-Aleks-:

O número calc_day é sempre superior a 0. Outros valores não fazem com que o código seja chamado.

Diga isso ao compilador...

 
Alexey Viktorov:

Para construir 6** foi assim, toda a cadeia de condições foi verificada e tudo funcionou, mas agora tudo mudou. E, em construções antigas, a condição também é ambígua neste caso. Como é concebido?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

ou é isso?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Um cérebro humano pode descobrir isso, mas o que é um compilador a fazer? Ele não tem cérebro...


Diga isso ao compilador...

Convincente - Vou estar mais vigilante.

Como é que digo ao compilador? Escreva-o, mas será que ele vai compreender?

if (calc_day<0)  calc_day=calc_day*(-1);

 
Alexey Viktorov:

Era assim antes de 6** construir, toda a cadeia de condições era verificada e tudo funcionava, mas agora tudo mudou. Sim e em construções antigas, neste caso, a ambiguidade das condições. Como é concebido?

if( (Low[X]>PriceBuy && High[X]>PriceBuy) || (Low[X]<PriceBuy && High[X]<PriceBuy) )

ou será?

if(Low[X]>PriceBuy && ( High[X]>PriceBuy) || (Low[X]<PriceBuy ) && High[X]<PriceBuy)

Um cérebro humano pode descobrir isso, mas o que é um compilador a fazer? Ele não tem cérebro...


Diga isso ao compilador...

verificar a precedência do operador para possível erro; usar parênteses para esclarecer a precedência - isto não é um erro. É um aviso. Ocorre em códigos antigos.

Adicionaram-na para o utilizador e não para o compilador. O compilador é orientado pelas prioridades de operação. Lá tudo é claro. A prioridade do && é mais elevada do que a do |||. É por isso que os parênteses devem ser dispostos desta forma

if( (Baixo[X]>PriceBuy && Alto[X]>PriceBuy) ||| (Baixo[X]<PriceBuy && Alto[X]<PriceBuy) )

Actualização: Neste caso, tanto para MT4 como para MT5 a prioridade é a mesma.

 
-Aleks-:

Convincente - Vou estar mais vigilante.

Como é que digo ao compilador? Escreva-o, mas será que ele vai compreender?

if (calc_day<0)  calc_day=calc_day*(-1);

for( calc_day = 365; calc_day > 0; calc_day --)
Por isso, experimente.
 
Alexey Kozitsyn:

verificar a precedência do operador para possível erro; usar parênteses para esclarecer a precedência - isto não é um erro. É um aviso. Ocorre em códigos antigos.

Adicionámo-lo para o utilizador e não para o compilador. O compilador é orientado pelas prioridades de operação. Lá tudo é claro. A prioridade do && é mais elevada do que a do |||. É por isso que os parênteses devem ser dispostos desta forma

if( (Baixo[X]>PriceBuy && Alto[X]>PriceBuy) ||| (Baixo[X]<PriceBuy && Alto[X]<PriceBuy) )

Actualização: Neste caso, tanto para MT4 como para MT5 a prioridade é a mesma.

No fundo, sim, o aviso não é um erro. Mas como funcionará a variante inicial se( Low[X]>PriceBuy && High[X]>PriceBuy ||| Low[X]<PriceBuy && High[X]<PriceBuy )? Ou é uma chatice colocar um par de parênteses?

 
-Aleks-:

Convincente - Vou estar mais vigilante.

Como é que digo ao compilador? Escreva-o, mas será que ele vai compreender?

if (calc_day<0)  calc_day=calc_day*(-1);

for(int i=calc_day; i>0; i--) {}
 
Alexey Viktorov:

Bem, em essência, sim, o aviso não é um erro. Mas como é que o if( Baixo[X]>PriceBuy && Alto[X]>PriceBuy |||Baixo[X]<PriceBuy && Alto[X]<PriceBuy )? Ou falhará em colocar um par de parênteses?

Funcionará da forma como escrevi acima.

O compilador avisa o utilizador para não ser preguiçoso e coloca parênteses para evitar possíveis erros não óbvios.