Questions des débutants MQL5 MT5 MetaTrader 5 - page 495

 

Sur le premier cas est résolu - mettre entre parenthèses pour deux comparaisons et il ne jure pas - y avait-il une erreur logique - c'est-à-dire que les résultats de la comparaison pourraient être remplacés à cause du "ou" ?

Il reste une question ouverte avec la deuxième expression - qu'est-ce qui ne va pas ici - des idées ?

 
-Aleks-:

Le premier cas est résolu - mettre entre parenthèses deux comparaisons et cela ne jure pas - y a-t-il une erreur logique - c'est-à-dire que les résultats de la comparaison pourraient être remplacés à cause de "ou" ?

Il reste une question ouverte concernant la deuxième expression - qu'est-ce qui ne va pas ici - des idées ?

Rappelez-vous que la vérification d'une condition dans le nouveau mql4 n'est pas effectuée complètement. C'est-à-dire dans la condition

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

Si Low[x] n'est pas supérieur à PriceBuy, aucune autre vérification ne sera effectuée. C'est ce que nous apprend la description de l'erreur. De même, si la première paire est entre parenthèses, la deuxième paire de conditions sera vérifiée si elle échoue.

Deuxième question.

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

Quelle est la valeur de calc_day ? Peut-elle être inférieure à zéro ? Le compilateur ne sait pas ce qu'il y a dans la logique... C'est pourquoi il prévient d'une possible boucle inefficace.

 
Alexey Viktorov:

N'oubliez pas que la vérification des conditions dans la nouvelle mql4 n'est pas effectuée complètement. C'est-à-dire, dans la condition

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

Si Low[x] n'est pas supérieur à PriceBuy, aucune autre vérification ne sera effectuée. C'est ce que nous apprend la description de l'erreur. De même, si la première paire est entre parenthèses, la deuxième paire de conditions sera vérifiée si elle échoue.

Merci pour la réponse !

Surpris - comme visuellement la logique a toujours fonctionné correctement, hmmm....


Alexey Viktorov:

Deuxième question.

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

Quelle est la valeur de calc_day ? Peut-elle être inférieure à zéro ? Le compilateur ne sait pas ce qui est dans la logique... C'est pourquoi il prévient d'une possible boucle inefficace.

Le nombre calc_day est toujours supérieur à 0. Les autres valeurs n'appellent pas le code.
 
-Aleks-:

Merci pour la réponse !

Surpris - comme visuellement la logique a toujours fonctionné correctement, hmmm....

Avant les versions 6**, c'était comme ça, je vérifiais toute la chaîne des conditions et tout fonctionnait, mais maintenant tout a changé. Et dans les anciennes constructions, dans ce cas, la condition est ambiguë. Comment est-il conçu ?

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

Ou pas ?

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

Un cerveau humain peut le comprendre, mais que doit faire un compilateur ? Il n'a pas de cerveau.

-Aleks:

Le nombre calc_day est toujours supérieur à 0. Les autres valeurs ne provoquent pas l'appel de code.

Dites-le au compilateur...

 
Alexey Viktorov:

Jusqu'à la version 6**, c'était comme ça, toute la chaîne des conditions était vérifiée et tout fonctionnait, mais maintenant tout a changé. Et dans les anciennes constructions, la condition est également ambiguë dans ce cas. Comment est-il conçu ?

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

ou c'est ça ?

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

Un cerveau humain peut le comprendre, mais que doit faire un compilateur ? Il n'a pas de cerveau...


Dites-le au compilateur...

Convaincant - je serai plus vigilant.

Comment le dire au compilateur ? Écrivez-le, mais comprendra-t-il ?

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

 
Alexey Viktorov:

C'était comme ça avant les constructions 6**, toute la chaîne des conditions était vérifiée et tout fonctionnait, mais maintenant tout a changé. Oui et dans les anciennes constructions dans ce cas condition ambiguë. Comment est-il conçu ?

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

ou est-ce le cas ?

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

Un cerveau humain peut le comprendre, mais que doit faire un compilateur ? Il n'a pas de cerveau...


Dites-le au compilateur...

vérifiez la précédence des opérateurs pour détecter une éventuelle erreur ; utilisez les parenthèses pour clarifier la précédence - ce n'est pas une erreur. C'est un avertissement. Il se produit dans les anciens codes.

Ils l'ont ajouté pour l'utilisateur plutôt que pour le compilateur. Le compilateur est guidé par des priorités d'opération. Tout y est clair. La priorité de && est plus élevée que celle de ||. C'est pourquoi les parenthèses doivent être disposées de la manière suivante

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

Mise à jour : Dans ce cas, la priorité est la même pour MT4 et MT5.

 
-Aleks-:

Convaincant - je serai plus vigilant.

Comment le dire au compilateur ? Écrivez-le, mais comprendra-t-il ?

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

for( calc_day = 365; calc_day > 0; calc_day --)
Alors essayez.
 
Alexey Kozitsyn:

vérifiez la précédence des opérateurs pour détecter une éventuelle erreur ; utilisez les parenthèses pour clarifier la précédence - ce n'est pas une erreur. C'est un avertissement. Il se produit dans les anciens codes.

Nous l'avons ajouté pour l'utilisateur plutôt que pour le compilateur. Le compilateur est guidé par des priorités d'opération. Tout y est clair. La priorité de && est plus élevée que celle de ||. C'est pourquoi les parenthèses doivent être disposées de la manière suivante

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

Mise à jour : Dans ce cas, la priorité est la même pour MT4 et MT5.

Eh bien, en substance, oui, l'avertissement n'est pas une erreur. Mais comment va fonctionner la variante initiale if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy )? Ou est-ce un inconvénient de mettre quelques supports ?

 
-Aleks-:

Convaincant - je serai plus vigilant.

Comment le dire au compilateur ? Écrivez-le, mais comprendra-t-il ?

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

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

Eh bien, en substance, oui, l'avertissement n'est pas une erreur. Mais comment va fonctionner la variante initiale if( Low[X]>PriceBuy && High[X]>PriceBuy || Low[X]<PriceBuy && High[X]<PriceBuy )? Ou échouera-t-il à mettre un couple d'équerres ?

Cela fonctionnera comme je l'ai écrit ci-dessus.

Le compilateur avertit l'utilisateur de ne pas être paresseux et de mettre des parenthèses pour éviter d'éventuelles erreurs non évidentes.

Raison: