Arrondir les nombres dans MT4 via NormalizeDouble - page 3

 

Les mathématiques. En 6e année. Manuel. Nikolsky S.M., Potapov M.K. Moscou : 2012. - 256 с

Arrondissement.

Arrondir

 

Quel sujet passionnant que celui-ci. MT4 semble fonctionner correctement avec les arrondis.
Je voulais queNormalizeDouble(0.055,2) n'arrondisse pas le nombre"0.055" à "0.06", mais le réduise à "0.05".

J'ai du mal à comprendre ces fonctions MKL. Je ne comprends pas vraiment pourquoi les prix "1,0015223567" devraient être arrondis à l'aide de la fonction NormalizeDouble, si tout ce que vous voulez est de prendre le nombre DIRECT au chiffre de droite.
Autrement dit, NormalizeDouble(1.001526789, 5) donnerait "1.00152".
Iln'est pas nécessaire de l'arrondirà "1,00153". Il doit y avoir la fonction RoundDouble pour cela =)

Est-ce possible ? Ou est-il nécessaire de l'arrondir tout le temps et d'obtenir des chiffres erronés ?

 

Vous feriez mieux de vous décider. C'est un arrondi :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Arrondir les nombres dans MT4 via NormalizeDouble

Roman Starinskij, 2016.01.21 10:03

Bonjour. Pouvez-vous me dire quel est le problème ?

Pourquoi la fonction NormalizeDouble(0.055,2) arrondit le nombre "0.055" à "0.06" ?

Il ne s'agit pas d'une fonction d'arrondi de fraction.


Ce n'est pas le cas :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Arrondir les nombres dans MT4 via NormalizeDouble

Roman Starinskij, 2016.01.25 14:30

Quel sujet passionnant que celui-ci. MT4 semble fonctionner correctement avec les arrondis.
Je voulais direNormalizeDouble(0.055,2) non pas pour arrondir le nombre"0.055" à "0.06", mais pour le réduire à "0.05".

J'ai du mal à comprendre ces fonctions MKL. Je ne comprends pas vraiment pourquoi "1.0015223567" devrait être arrondi avec la fonction NormalizeDouble, si tout ce que vous voulez est d'amener le nombre BORROWN au bon endroit.
Autrement dit, NormalizeDouble(1.001526789, 5) donnerait "1.00152".
Iln'est pas nécessaire de l'arrondirà "1,00153". Il doit y avoir la fonction RoundDouble pour cela =)

Est-ce possible ? Ou est-il nécessaire de l'arrondir tout le temps et d'obtenir des chiffres que vous ne voulez pas ?


Et pour le bien de l'expérimentation :

//+------------------------------------------------------------------+
//|                                              NormalizeDouble.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property script_show_inputs
#property description "Проверка NormalizeDouble"
input double   value=0.055;      // нормализуемое число 
input int      digits=2;         // кол-во знаков после запятой 
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   Print("Число ",value," округлённое с точностью до ",digits," знаков = ",NormalizeDouble(value,digits));
  }
//+------------------------------------------------------------------+
Dossiers :
Test.mq5  2 kb
 
Roman Starinskij:

Quel sujet passionnant que celui-ci. MT4 semble fonctionner correctement avec les arrondis.
Je voulais queNormalizeDouble(0.055,2) n'arrondisse pas le nombre"0.055" à "0.06", mais le réduise à "0.05".

J'ai du mal à comprendre ces fonctions MKL. Je ne comprends pas vraiment pourquoi les prix "1,0015223567" devraient être arrondis à l'aide de la fonction NormalizeDouble, si tout ce que vous voulez est de prendre le nombre DIRECT au chiffre de droite.
Autrement dit, NormalizeDouble(1.001526789, 5) donnerait "1.00152".
Iln'est pas nécessaire de l'arrondirà "1,00153". Il doit y avoir la fonction RoundDouble pour cela =)

Est-ce possible ? Ou devez-vous l'arrondir tout le temps et obtenir des chiffres que vous ne voulez pas ?

Si vous devez couper, coupez ; si vous devez arrondir, arrondissez. La fonction NormalkizeDouble() fait le tour et c'est ce dont vous avez besoin le plus souvent.

Pourquoi pensez-vous que RoundDouble() devrait être utilisé au lieu de NormalizeDouble() ? Avez-vous créé ce monde ? Est-il normal qu'une balle roule et qu'un carré ait quatre coins ?

 
Roman Starinskij:

Quel sujet passionnant que celui-ci.


Tout cela est dû au fait que l'auteur du sujet ne lit pas la documentation sur le langage et n'écoute pas ce qu'on lui dit.
 
Slawa:
Cela est dû au fait que l'auteur ne lit pas la documentation linguistique et n'écoute pas ce qu'on lui dit.

Le comportement suivant de division et d'arrondi des fractions est un peu flou.

Il y a 2 équations :
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

En utilisant la fonction recommandée NormalizeDouble, nous obtenons ces résultats :
0.03999999999999999 = 0.04
0.036 = 0.04

Dans le premier exemple, nous devons vraiment obtenir la valeur 0,04, mais dans le second, nous avons besoin de 0,03 (c'est ainsi que fonctionne une calculatrice normale).
NormalizeDouble devrait être utilisé car les fractions renvoyées ne sont pas complètes, mais dans le second cas, la fonction renvoie des valeurs incorrectes, et vous ne pouvez pas non plus ne pas l'utiliser pour le premier exemple.

 
Roman Starinskij:

Le comportement suivant de division et d'arrondi des fractions est un peu flou.

Il y a deux équations :
0.06-0.02 = 0.03999999999999999
0.06-0.024 = 0.036

En utilisant la fonction recommandée NormalizeDouble, nous obtenons ces résultats :
0.03999999999999999 = 0.04
0.036 = 0.04

Dans le premier exemple, nous devons vraiment obtenir la valeur 0,04, mais dans le second, nous avons besoin de 0,03 (c'est ainsi que fonctionne une calculatrice normale).
NormalizeDouble devrait être utilisé car les fractions renvoyées ne sont pas complètes, mais dans le second cas, la fonction renvoie des valeurs incorrectes, et vous ne pouvez pas non plus ne pas l'utiliser pour le premier exemple.

Votre calculatrice normale ne calcule pas correctement, elle devrait :

 
Slawa:
Tout cela parce que le démarreur ne lit pas la documentation linguistique et n'écoute pas ce qu'on lui dit.

si le chiffre N+1 < 5, alors le Nième chiffre est conservé et N+1 et tous les chiffres suivants sont mis à zéro ;

si le chiffre N+1 est ≥ 5, le Nième chiffre est incrémenté de un et N+1 et tous les chiffres suivants sont mis à zéro ;

Désolé, mais je ne comprends toujours pas pourquoi l'arrondi par '2' ne permet pas immédiatement = 0.06000000

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,3);
   double v2 = NormalizeDouble(0.0549,3);

   v1=NormalizeDouble(v1,2);
   v2=NormalizeDouble(v2,2);
   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0,06000000, v2 = 0,06000000

void OnStart()
  {

   double v1 = NormalizeDouble(0.055,2);
   double v2 = NormalizeDouble(0.0549,2);

   Print("v1 = ",DoubleToString(v1),", v2 = ",DoubleToString(v2));

  }

v1 = 0,06000000, v2 = 0,05000000

void OnStart()
  {
   for(int i=7;i>=1;i--)
     {
      double v1 = 1.1234567;
      double v2 = NormalizeDouble(v1,i+1);

      v1=NormalizeDouble(v1,i);
      v2=NormalizeDouble(v2,i);
      Print("v1 = ",i," = ",DoubleToString(v1,7),", v2 = ",i," = ",DoubleToString(v2,7));
     }
     Print("---");
  }

---

v1 = 1 = 1.1000000, v2 = 1 = 1.1000000
v1 = 2 = 1.1200000, v2 = 2 = 1.1200000
v1 = 3 = 1,1230000, v2 = 3 = 1,1240000
v1 = 4 = 1.1235000, v2 = 4 = 1.1235000
v1 = 5 = 1.1234600, v2 = 5 = 1.1234600
v1 = 6 = 1.1234570, v2 = 6 = 1.1234570
v1 = 7 = 1.1234567, v2 = 7 = 1.1234567




 
lilita bogachkova:


Je suis désolé, mais je ne comprends toujours pas pourquoi l'arrondi par '2' ne permet pas d'obtenir = 0.06000000


Parce que c'est 0,6, donc 0,5 ne peut être obtenu qu'en trichant.
 
lilita bogachkova:

Je suis désolé, mais je ne comprends toujours pas pourquoi l'arrondi par '2' rend impossible l'obtention de = 0,06000000.


Lorsqu'un seul chiffre est normalisé, c'est simple : 0, 1, 2, 3, 4 -> 0, et 5, 6, 7, 8, 9 -> 1.

Lors de la normalisation, les nombres à deux chiffres sont pris en compte : 0 - 49 -> 0, et 50 - 99 -> 1. Après tout, si le nombre 1,49 doit être arrondi aux nombres entiers, devons-nous vraiment obtenir 2, qui représente 51 centièmes par rapport aux 49 centièmes de distance à 1 disponibles ?

Idem pour les chiffres à trois, quatre, etc.