Obtenir le nombre de décimales de n'importe quel nombre (pas seulement les guillemets) en contournant Digits() dans MQL4 et MQL5 - page 9

 
Mesaoria:

Ce n'est pas du tout ce dont je parlais. L'idée de convertir un double en une chaîne de caractères afin de pouvoir ensuite compter les caractères de cette chaîne est une absurdité totale. Peu importe ce que vous faites.

Quel est le problème ? Jusqu'à présent, cette option est la plus rapide, la plus fonctionnelle et la plus sûre. Quelles sont vos options ?

 
Alexandr Sokolov:
Oui, ma variante n'est probablement pas la meilleure, mais comme je n'ai jamais rien trouvé à ce sujet auparavant, c'est la meilleure que j'ai trouvée toute seule, j'ai commenté ci-dessus, alors que vous n'avez pas proposé votre propre variante.

J'ai comparé ces variantes :

int ds(double v){
   string s=(string)v;
   int l=StringLen(s);
   int n=l-StringFind(s,".",0)-1;
   if(StringSubstr(s,l-1,1)=="0")n--;
   return(n);
}

int d(double x){
   int n;
   for(n=0;n<8;n++){
      if(x==NormalizeDouble(x,n)){
         return(n);
      }
   }
   return(n-1);
}

La variante de la chaîne de caractères est légèrement plus rapide, et elle n'est pas limitée à 8 chiffres comme d(). Et la garantie d'exactitude est comptée par la façon dont le terminal affiche le numéro.

Je choisis la variante avec conversion en chaîne.

 
Dmitry Fedoseev:

Quel est le problème ? Jusqu'à présent, cette option est la plus rapide, la plus fonctionnelle et la plus sûre d'être la bonne. Quelles sont vos options ?

Pouvez-vous citer au moins un cas d'application de l'algorithme ci-dessus ?

 
Mesaoria:

Pouvez-vous citer au moins un cas d'application de l'algorithme ci-dessus ?

Dans un cas, le panneau de négociation affichait la taille du lot avec le nombre correct de décimales dans le champ de texte. C'est le seul cas.

 
Dmitry Fedoseev:

Dans un cas, le panneau de négociation affichait la taille du lot avec le nombre correct de décimales dans la zone de texte. C'est le seul cas.

C'est-à-dire qu'il sort "1" dans le cas d'un lot et "0.01" dans le cas de 0.01 lot ?

 
Mesaoria:

Il sort donc "1" dans le cas d'un lot et "0.01" dans le cas de 0.01 lot ?

Pas exactement. Cela dépend du lot minimum et de l'échelon du lot. Si le lot minimum est de 0,01, alors 1 est affiché comme 1,00.

 
Dmitry Fedoseev:

Pas vraiment. En fonction du lot minimum et de l'augmentation du lot. Si le lot minimum est de 0,01, alors 1 est affiché comme 1,00.

O.o.

Il s'avère donc que vous n'utilisez pas votre fonction, mais que vous affichez quand même quelque chose comme DoubleToString(LotSize, <certaine valeur constante>), non ?

 
Mesaoria:

O.o

Il s'avère donc que vous n'utilisez pas votre fonction, mais que vous produisez quand même quelque chose comme DoubleToString(LotSize, <certaine valeur constante>), non ?

Oui, mais vous devez savoir combien de décimales vous souhaitez afficher.

 
Dmitry Fedoseev:

Oui, mais vous devez savoir combien de décimales vous souhaitez afficher.

En d'autres termes, utilisez-vous le lot minimum (ou le pas de lot) saisi par l'utilisateur pour déterminer le nombre de décimales de cette valeur, puis enregistrez-la pour normaliser les valeurs futures ?

 
Mesaoria:

C'est-à-dire que vous déterminez, à partir du lot min. (ou de l'incrément de lot) saisi par l'utilisateur, combien de chiffres après la virgule il y a dans cette valeur, puis vous l'enregistrez pour normaliser les valeurs futures ?

Qu'est-ce que vous ne comprenez pas ? Le prix a Digits(), alors que le volume n'en a pas. Voici comment il est calculé.

Pourquoi avez-vous besoin de chiffres de volume ? La même raison pour laquelle nous avons besoin des chiffres des prix !