Discussion sur la documentation de MQL4 - page 16

 
Yurixx:

Et j'apprécierais une déclaration claire quand la double normalisation est nécessaire.

Exactement, il y a un malentendu évident ici. L'aide pour cette fonction donne un exemple où cette fonction est complètement inutile :

double NormalizeDouble( double valeur, int chiffres)
Arrondit la valeur à virgule flottante à la précision donnée. Renvoie la valeur normalisée du type double.
Les valeurs calculées de StopLoss et TakeProfit, ainsi que le prix ouvert des ordres en attente doivent être normalisés avec une précision dont la valeur est stockée dans la variable prédéfinie de Chiffres.
Paramètres :
valeur - Valeur à virgule flottante.
chiffres - Format de précision, nombre de chiffres après le point décimal (0-8).
Un échantillon :
 double var1=0.123456789 ; Print(DoubleToStr(NormalizeDouble(var1,5),5)) ; // résultat : 0.12346

Cette double conversion m'a beaucoup dérouté la première fois que je l'ai vue. En fait, lorsqu'on l'affiche dans le journal du conseiller-expert, l'image de l'indicateur de l'état de santé de l'utilisateur.

Print( DoubleToStr( var1, 5 ) ; 
L'exemple avec une fonction commerciale serait peut-être beaucoup plus instructif, c'est-à-dire que c'est là que la normalisation est vraiment nécessaire. L'exemple avec la fonction CompareDoubles() de stdlib.mq4 serait également très instructif (c'est l'endroit où les débutants tombent dessus presque invariablement) :

// Функция корректного сравнения двух переменных типа double из библиотеки stdlib.mq4
bool CompareDoubles(double number1,double number2)
{
   if(NormalizeDouble(number1-number2,8)==0) return(true);
   else return(false); 
}
Renat, ce n'est pas une option ?
 
Maintenant que nous en parlons, j'aimerais poser une question qui me préoccupe depuis un certain temps. Voici un exemple de code :
int start()
  {
   double haOpen, haHigh, haLow, haClose;
   if(Bars<=10) return(0);
   ExtCountedBars=IndicatorCounted();
//---- check for possible errors
   if (ExtCountedBars<0) return(-1);
Quelle est la différence fondamentale entre le premier retour (0) et le second retour (-1) ?
Comment cela affecte-t-il l'exécution d'un indicateur (ou Expert Advisor) ?
Que se passe-t-il lorsqu'une valeur négative est renvoyée ?
Et je peux écrire quelque chose comme :
void start()
{
  //
  //...
  //
  return;
}
 
Il n'y a pas de différence de principe, car la valeur de retour n'est pas analysée par le terminal (pour le moment). En fait, il s'agit d'un style d'enregistrement qui aide le programmeur lui-même à comprendre que dans ce cas, il y a une terminaison non standard (valeur moins 1) de start().
 
PSmith:
Et puis-je écrire quelque chose comme :
void start()
{
  //
  //...
  //
  return;
}

C'est ainsi que j'ai écrit ces derniers temps, par exemple. :) D'ailleurs, je n'utilise pas du tout le retour final. Je pense qu'il a même été mentionné quelque part dans la documentation que le retour final n'est pas nécessaire dans les fonctions comme void.
 
Voici une autre question : pourquoi la fonction
double iVolume( string symbol, int timeframe, int shift)
renvoie une valeur de type double ?
 
À l'origine, il ne s'agissait pas d'un double, mais à un moment donné, il s'est avéré que le type int n'est pas toujours adapté au stockage des volumes (par exemple, prenez un délai mensuel pour un instrument très volatil). Dans ce cas, il est facile d'obtenir une erreur de dépassement de capacité.
 

Extrait de la documentation (Types de données) : Les constantes entières peuvent prendre des valeurs comprises entre -2147483648 et 2147483647. Juillet 2002, EURUSD : nombre maximum de ticks par mois dans l'historique, 670000. Il faudrait 3000 mois, soit 250 ans, pour obtenir un dépassement même avec ce volume maximal de tick. D'un autre côté, les volumes peuvent encore augmenter, donc le chiffre n'est pas si inatteignable en théorie...

 
Mathemat:

Extrait de la documentation (Types de données) : Les constantes entières peuvent prendre des valeurs comprises entre -2147483648 et 2147483647. Juillet 2002, EURUSD : nombre maximum de ticks par mois dans l'historique, 670000. Il faudrait 3000 mois, soit 250 ans, pour obtenir un dépassement même avec ce volume maximal de tick. D'un autre côté, les volumes peuvent encore augmenter, donc le chiffre n'est pas si inatteignable en théorie...


J'ai moi-même posé cette question et obtenu exactement cette réponse. Même si c'est difficile à croire. Mais si vous mettez des cotations du marché boursier dans MT4 ...
 
Même mois sur _DJI - 42228720 ! Ouais...
 

Rosh, si je comprends bien votre silence, il n'y a pas de déclaration claire pour quels cas et pour quelles expressions/variables la normalisation est nécessaire. Si c'est le cas, on peut peut-être répondre à une question plus simple : la normalisation des valeurs calculées est-elle de la forme

int StLs=25 ;
double prc = Demande + StLs*Point ;

Ou dois-je le découvrir par moi-même, dans le cadre d'une expérience ?

Raison: