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

 
Vladimir Karputov:

L'heure est-elle la même dans la fenêtre dedonnées?

Oui.

 
Andrey Khatimlianskii:

Oui.

Je vois. Alors c'est vraiment l'heure du bar. J'ai juste eu un doute sur le paramètre"Chronologie précise".

Настройки платформы - Начало работы - Справка по MetaTrader 5
Настройки платформы - Начало работы - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая платформа обладает множеством настроек, что позволяет организовать работу в ней так, как это удобно именно вам. Выполните команду " Настройки" меню "Сервис" или нажмите "Ctrl+O". Графики — общая настройка отображения ценовых графиков, а также настройка параметров управления объектами: выделение объектов после их создания, немедленная...
 

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. Je comprends que je doive normaliser le " i ", mais cela ne fonctionne pas pour moi.

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

Si "expr2=2.6" est toujours ok pour 9 itérations, mais quand "expr2=2.8" montre déjà 9 itérations incorrectes (la valeur correcte est 10).

 
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. Je comprends que je doive normaliser le " i ", mais cela ne fonctionne pas pour moi.

Si "expr2=2.6" est toujours correct pour 9 itérations, mais lorsque "expr2=2.8" montre déjà 9 itérations incorrectes (la valeur correcte est 10).

J'ai probablement besoin de normaliser les valeurs.

 
Alexey Viktorov:

Il faut probablement normaliser les valeurs.

Si tu voulais dire ça, ça n'a pas aidé non plus :

double expr1=1.0;
double expr2=2.8;
double step=0.2;
double i;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int count=0;
   for(i=NormalizeDouble(expr1,1); i<=NormalizeDouble(expr2,1); i+=NormalizeDouble(step,1))
     {
      NormalizeDouble(i,1);
      count++;
      Print(" i: ",DoubleToStr(i,8)," step: ",DoubleToStr(step,8));
     }
   int MaxPass=(int)NormalizeDouble(((expr2-expr1)/step),0)+1;
   Print(" MaxPass: ",MaxPass," count: ",count," i: ",i);
  }
 
Nauris Zukas:

Si tu voulais dire ça, ça n'a pas aidé non plus :

Non. Vous devez au moins l'optimiser.

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

parce que c'est ce qui vous donne la mauvaise valeur. Et les autres n'auront peut-être pas à le faire.

 
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. Je comprends que je doive normaliser le " i ", mais cela ne fonctionne pas pour moi.

Si "expr2=2.6", alors tout est normal 9 itérations, mais quand "expr2=2.8" montre pas correct 9 itérations (correctement 10).

Vous trouverez ici, en lisant le post de Nikolay, une description très détaillée et très qualitative du doublehttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837.

Si vous ne pouvez pas assimiler le matériel dès la première fois, essayez de remplacer Print() par printf() dans votre code avec une sortie de double au moins jusqu'au 15ème chiffrehttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Peut-être qu'alors vous verrez pourquoi il en est ainsi

 
Alexey Viktorov:

Non. Au minimum, vous devez optimiser cela.

parce que c'est ce qui vous donne la mauvaise valeur. Et les autres n'auront peut-être pas à le faire.

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

0 10:29:31.595 Test_Double_For EURCHF,H4 : i = 1.00000000000000000000000000000000000000000000
0 10:29:31.595 Test_Double_For EURCHF,H4 : i = 1.199999999999999999995559107901499373838305473327636718750000
0 10:29:31.595 Test_Double_For EURCHF,H4 : i = 1.399999999999991111182158029987476766109466552734375000000000
0 10:29:31.595 Test_Double_For EURCHF,H4 : i = 1.599999999999999999999866773237044981212151491164199829101562500000000
0 10:29:31595 Test_Double_For EURCHF,H4 : i = 1.79999999999999999999982236431605997495353221893310546875000000
0 10:29:31.595 Test_Double_For EURCHF,H4 : i = 1.99999999999999977795539507496869192736638618359375000000
0 10:29:31.595 Test_Double_For EURCHF,H4 : i = 2.1999999999999997335464740899624302983283996582031250000000
0 10:29:31.595 Test_Double_For EURCHF,H4 : i = 2.399999999999999999999999119182158029987476766109466552734375000000000
0 10:29:31595 Test_Double_For EURCHF,H4 : i = 2.6000000000000088817841970012523233890533447265625000000000
0 10:29:31595 Test_Double_For EURCHF,H4 : MaxPass : 10 count : 9
0 10:29:31.595 Test_Double_For EURCHF,H4 : Last i = 2.800000000002664535259100375697016716003417968750000000

 
Igor Makanu:

ici vous pouvez trouver, lire le post de Nikolay, il a décrit le travail avec le double d'une manière très détaillée et très qualitativehttps://www.mql5.com/ru/forum/1111/page2623#comment_14473837.

Si vous ne pouvez pas assimiler le matériel dès la première fois, essayez de remplacer Print() par printf() avec une sortie de double au moins jusqu'au 15ème chiffrehttps://www.mql5.com/ru/forum/1111/page2623#comment_14474138.

Peut-être qu'alors vous comprendrez pourquoi il en est ainsi.

Merci, je comprends pourquoi ça arrive, c'est pourquoi j'ai essayé de le normaliser. Cela n'a pas fonctionné 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 ?

 
Nauris Zukas:

Donc la question demeure, "double" peut être utilisé dans la boucle

peut

Nauris Zukas:

et obtenir toujours le nombre correct d'itérations ?

la valeur de double est toujours correcte, mais elle ne correspond pas au système décimal positionnel que vous souhaiteriez voir ou obtenir

Nauris Zukas:

Merci, je comprends pourquoi cela se produit, c'est pourquoi j'ai essayé de normaliser. Cela n'a pas fonctionné pour moi. L'option d'Alexey Viktorov ne l'a pas corrigé non plus, les valeurs restent non-normalisées

Toute manipulation avec la double conversion aura toujours des limites, je doute que ce problème puisse être résolu de la même manière que dans vos exemples.

Faites une solution fiable : utilisez int dans la boucle et la formule pour calculer la valeur du résultat du double et n'utilisez pas l'addition du double comme résultat pendant les itérations dans la boucle - regardez encore une fois mon exemple dans le dialogue avec Nikolaev.

Raison: