Caractéristiques du langage mql4, subtilités et techniques - page 30

 
Nauris Zukas:

Bonjour !
Quelle est la manière correcte d'utiliser "double" dans la boucle "for" ? Il ne semble pas y avoir d'interdiction d'utiliser "double" dans l'aide.

Quoi qu'il en soit, ma conclusion est que "double" n'est pas recommandé dans la boucle"for" en raison du manque de normalisation de ExpressionZ après chaque itération. Cela peut entraîner au moins deux problèmes :
1) un nombre d'itérations erroné ;
2) des résultats erronés si vous utilisez ExpressionZ pour calculer dans une instruction.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации. могут отсутствовать, однако разделяющие их точки с запятыми (;) опускать нельзя. Если опущено...
 
Nauris Zukas:

Merci, je comprends pourquoi cela arrive, c'est pourquoi j'ai essayé de normaliser. Ça n'a pas marché pour moi. L'option d'Alexey Viktorov n'a pas résolu le problème non plus, les valeurs restent non normalisées. La question demeure donc : peut-on utiliser "double" dans une boucle et obtenir toujours le nombre correct d'itérations ?

Multipliez par 10 au bon degré jusqu'à obtenir des nombres entiers. Au début, je me débattais aussi, mais maintenant, je peux même convertir les prix en nombres entiers et travailler avec des nombres entiers ou arrondir à des nombres entiers. J'ai moins d'erreurs, une meilleure lisibilité.

En général, comme l'a dit un programmeur après avoir reçu les résumés de la Bourse, je ne comprends pas pourquoi les nombres d'une certaine capacité numérique sont représentés par des nombres réels, plutôt que par des nombres entiers. Ce n'est pas logiquement correct. ))))

 
Valeriy Yastremskiy:

Multipliez par 10 au bon degré jusqu'à obtenir des nombres entiers. Au début, j'ai eu du mal moi aussi, mais maintenant je peux même convertir le prix en un nombre entier et travailler avec des nombres entiers ou arrondir à des nombres entiers. J'ai moins d'erreurs, une meilleure lisibilité.

En général, comme l'a dit un programmeur après avoir reçu les résumés de la Bourse, je ne comprends pas pourquoi les nombres d'une certaine capacité numérique sont représentés par des nombres réels, plutôt que par des nombres entiers. Ce n'est pas logiquement correct. ))))

Merci, je vais utiliser int à l'ancienne et ensuite diviser par double. ;)

 
Nauris Zukas:

Merci, mais votre exemple n'a pas donné le bon résultat non plus. Dans printf, vous pouvez voir qu'aucune normalisation n'a lieu :

Désolé, j'aurais dû vérifier. Et là, nous avons "Je voulais faire les choses bien, mais il s'est avéré que c'était la même chose que d'habitude".

Résultat

2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.0 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.2 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.4 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.6 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 1.8 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.0 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.2 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.4 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.6 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       i: 2.8 step: 0.2
2020.05.29 14:26:33.855 !00 (GBPUSD.m,M15)       MaxPass: 10 count: 10 i: 3.0

Code correct

/********************Script program start function*******************/
double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
int count=0;
void OnStart()
 {
  for(i=expr1; i<=expr2; i=NormalizeDouble(i+step, 1))
   {
    count++;
    Print(" i: ", DoubleToString(i, 1), " step: ", DoubleToString(step, 1));
   }
  int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step), 0)+1;
  Print(" MaxPass: ", MaxPass, " count: ", count, " i: ", i);
 }/*******************************************************************/
 
Alexey Viktorov:

Code correct

Attention à ne pas mettre step=0.04 ;)

 
Andrey Khatimlianskii:

Attention à ne pas mettre step=0.04 ;)

Ce ne sont que des conseils pour ceux qui ne savent pas utiliser leur cerveau.))))

 
Alexey Viktorov:

Désolé, j'aurais dû vérifier. C'est juste, "Je voulais bien faire, mais c'est toujours la même chose."

Résultat

Code correct.

i=NormalizeDouble(i+step, 1)

Ah, merci ! Je n'y ai pas pensé moi-même. C'est justement le genre de chose qui nous aide, nous les débutants en programmation ! ;)

 
Je cherche desméthodes pour trier un tableau de structures. Quelqu'un a-t-il des variantes qui fonctionnent ?
 
Vladimir Pastushak:
Je cherche desméthodes pour trier un tableau de structures. Quelqu'un a-t-il des variantes qui fonctionnent ?

https://www.mql5.com/ru/forum/170952/page134#comment_11532251

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.04.19
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
fxsaber:

https://www.mql5.com/ru/forum/170952/page134#comment_11532251

Ça ne marche pas...

Raison: