mt5 strategy tester ticks - page 9

 
WhooDoo22:

Bonjour la communauté MQL5,

Quelqu'un d'autre a-t-il rencontré des chiffres comme ceux-ci lors de l'exécution de stratégies dans le testeur ? -1.000000000006551e-005 et 1.000000000006551e-005 (oui, c'est onze zéros). Il doit s'agir d'un type de double format spécifique mais quel type de double format, hmm ?

De plus, je lis la documentation de MQL5 comme suit : oui, ok, ok, le type de données int standard a une valeur minimale de -2 147 483 648 et une valeur maximale de 2 147 483 647 alors oui, bien sûr il y a le type de données int non signé avec une valeur minimale de 0 et une valeur maximale de 4 294 967 295 MAIS ;) il n'y a pas de type de données int avec une valeur minimale de -4 294 967 295 et une valeur maximale de 0. J' aurais pensé qu'il y aurait un type de données int ayant ces valeurs minimale et maximale mais c'est ce que c'est. La déclaration précédente pourrait également s'appliquer à d'autres types de données.

Je vous remercie.

0.00001 est la même chose que 1 e-5 est un format d'exposant. Les chiffres supplémentaires à la fin, les 6551 sont équivalents à 0.00000000000000006551 et c'est pourquoi nous avons des problèmes pour comparer les doubles . ... vous devez lire ceci, et faire quelques recherches si nécessaire, afin de comprendre ce qui se passe :Can price != price ?
Can price != price ? - MQL4 forum
  • www.mql5.com
Can price != price ? - MQL4 forum
 
RaptorUK:
0.00001 est la même chose que 1 e-5 est un format d'exposant. Les chiffres supplémentaires à la fin, les 6551 sont équivalents à 0.00000000000000006551 et c'est pourquoi nous avons des problèmes pour comparer les doubles . ... vous devez lire ceci, et faire quelques recherches si nécessaire, afin de comprendre ce qui se passe :Can price != price ?

Simon,

Je suis en train de lire le fil de discussion et je crois que la solution générale des posteurs de mql4 pour la comparaison de doubles était de découvrir et d'utiliser une méthode pour arrondir ces doubles de manière appropriée pour retourner des valeurs correctes. Que dites-vous de cela ?

Merci de votre compréhension.

 
WhooDoo22:

Simon,

Je suis en train de lire le fil de discussion et je crois que la solution générale des posteurs de mql4 pour la comparaison de doubles était de découvrir et d'utiliser une méthode pour arrondir ces doubles de manière appropriée afin de retourner des valeurs correctes. Qu'en pensez-vous ?

Je vous remercie.

Dans le contexte de votre message ci-dessus, la comparaison de doubles n'est pas importante, ce qui est important c'est de comprendre pourquoi vous ne pouvez pas simplement comparer des doubles.
 
RaptorUK:
Dans le contexte de votre message ci-dessus, la comparaison de doubles n'est pas importante, ce qui est important c'est de comprendre pourquoi vous ne pouvez pas simplement comparer des doubles.

Pourquoi ? Parce que je pense que les valeurs de prix sont retournées dans un format de quatre et cinq chiffres (avec des exceptions comme USDJPY qui retourne des valeurs de prix de deux et trois chiffres). Je vais essayer d'expliquer tout cela une fois pour toutes, car je ne souhaite pas que cela dure plus longtemps que nécessaire.

Le cours acheteur de l'USDCHF est actuellement de 0,92909 et je crois que MetaTrader5 calcule ces valeurs de prix au plus loin, à seize places à droite de la décimale, si c'est le cas, il y a onze places après le dernier chiffre neuf qui sont jetées dans les calculs du prix de l'USDCHF de 0,9290900000000000. Je pense que la raison pour laquelle les doubles ne peuvent pas être simplement comparés est que le reste des places à droite de la décimale d'un prix (pas celles qui sont lisibles dans le terminal mais celles qui ne le sont pas) pose des problèmes d'inégalité.

Je vous remercie.

 
WhooDoo22:

Pourquoi ? Parce que je pense que les valeurs de prix sont retournées dans un format de quatre et cinq chiffres (avec des exceptions comme USDJPY qui retourne des valeurs de prix de deux et trois chiffres). Je vais essayer d'expliquer tout cela une fois pour toutes, car je ne souhaite pas que cela dure plus longtemps que nécessaire.

Le cours acheteur de l'USDCHF est actuellement de 0,92909 et je crois que MetaTrader5 calcule ces valeurs de prix au plus loin, à seize places à droite de la décimale, si c'est le cas, il y a onze places après le dernier chiffre de neuf qui sont jetées dans les calculs du prix de l'USDCHF de 0,9290900000000000. Je pense que la raison pour laquelle les doubles ne peuvent pas être simplement comparés est que le reste des positions à droite de la décimale d'un prix (pas celles qui sont lisibles dans le terminal mais celles qui ne le sont pas) pose un problème d'inégalité.

Je vous remercie.

Le problème des doubles vient de leur représentation binaire. Il y a des doubles qui n'ont pas une représentation binaire exacte, ce qui donne des choses comme 1,000000000006551e-005. Je n'entre pas ici dans une explication détaillée, si cela vous intéresse vous pouvez lire ceci par exemple.
Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:

Pourquoi ?

Tout est expliqué sur la première page du fil de discussion dont j'ai donné un lien, en substance ; une valeur de 1.57373 peut en fait être conservée comme une valeur double de 1.5737300000000001 alors que NormalizeDouble(1.57373, 5) pourrait produire une valeur double de 1.57372999999999 les deux valeurs arrondies au 5ème chiffre le plus proche sont égales mais comparées directement elles ne sont pas égales... c'est la façon dont les valeurs doubles sont stockées, ce sont des nombres à virgule flottante (recherchez les nombres à virgule flottante, lisez et comprenez) et souvent la valeur retenue n'est pas exactement la même que celle que vous pensez être retenue.

Ainsi, votre commentaire montre une soustraction de deux doubles et vous voyez la différence comme 1.0000000000xyz -e5, car c'est ainsi que les doubles sont stockés - des nombres à virgule flottante.

Articles - Understanding Floating Point Number Representation - Cprogramming.com
Articles - Understanding Floating Point Number Representation - Cprogramming.com
  • www.cprogramming.com
Floating point representations vary from machine to machine, as I've implied. Fortunately one is by far the most common these days: the IEEE-754 standard. This standard is prevalent enough that it's worthwhile to look at it in depth; chances are good you'd be able to use this information on your platform (look for ieee754.h). An IEEE-754...
 
angevoyageur:
Le problème avec les doubles vient de leur représentation binaire. Il y a des doubles qui n'ont pas une représentation binaire exacte, donc on obtient des choses comme 1,000000000006551e-005. Je n'entre pas ici dans une explication détaillée, si cela vous intéresse vous pouvez lire ceci par exemple.

La seizième place de 1,000000000006551e-005 à droite de la décimale est e-005.

Êtes-vous en train de dire que 1.000000000006551e-005 n'a pas une représentation binaire exacte parce que sa seizième place à droite de la décimale n'est pas un entier, mais e-005 ?


"Je n'entre pas ici dans une explication détaillée,"

Pourquoi pas ? Si vous souhaitez écrire une explication détaillée, faites-le.


"Si cela vous intéresse, vous pouvez lire ceci par exemple."

J'ai commencé à le lire.

Merci.

Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:


"Je n'entre pas ici dans une explication détaillée,"

Pourquoi pas ? Si vous souhaitez écrire une explication détaillée, faites-le.


Vous vous souvenez d'une discussion que nous avons eue sur les choses fondamentales que vous devez savoir si vous voulez être capable de coder correctement ? les nombres à virgule flottante sont l'un d'entre eux ...DYOR, il y a beaucoup d'informations là-bas, trouvez-les, lisez-les, comprenez-les et vous serez capable de coder un peu mieux.
DYOR
DYOR
  • acronyms.thefreedictionary.com
What does DYOR stand for?
 
WhooDoo22:

La seizième place de 1,000000000006551e-005 à droite de la décimale est e-005.

Voulez-vous dire que 1.000000000006551e-005 n'a pas une représentation binaire exacte parce que sa seizième place à droite de la décimale n'est pas un entier, mais e-005 ?


Non. Si tu lisais mon lien et/ou celui de RaptorUK, ce serait plus clair pour toi. Sinon, relisez :-D

1,000000000006551e-005 est simplement une autre notation pour 0,00001000000000006551.

 
RaptorUK:

Tout est expliqué sur la première page du fil de discussion dont j'ai donné un lien, en substance ; une valeur de 1.57373 peut en fait être maintenue comme une valeur double de 1.5737300000000001 alors que NormalizeDouble(1.57373, 5) pourrait produire une valeur double de 1.57372999999999 les deux valeurs arrondies au 5ème chiffre le plus proche sont égales mais comparées directement elles ne sont pas égales... c'est la façon dont les valeurs doubles sont stockées, ce sont des nombres à virgule flottante (recherchez les nombres à virgule flottante, lisez et comprenez) et souvent la valeur retenue n'est pas exactement la même que celle que vous pensez être retenue.

Ainsi, votre commentaire montre une soustraction de deux doubles et vous voyez la différence comme 1.0000000000xyz -e5, car c'est ainsi que les doubles sont stockés - des nombres à virgule flott ante.

1.57373 (ignorer)

1.5737300000000001

1.5737299999999999

"Les deux valeurs arrondies au 5ème chiffre le plus proche sont égales".

Les deux valeurs arrondies au 5ème chiffre le plus proche sont égales à 1,57373.


"mais comparées directement, elles ne sont pas égales"

Oui, car il y a une différence.


"c'est ainsi que les valeurs doubles sont stockées"

Les valeurs doubles telles que 1.5737300000000001 sont stockées sous la forme 1.57373 (si le double normalize est utilisé, je suppose). Si le double normalisé n'est pas utilisé, la valeur double 1.5737300000000001 conservera ce format de valeur, n'est-ce pas ?


"et souvent la valeur retenue n'est pas exactement la même que celle que vous pensez être retenue".

Ma dernière déclaration répond également à cette déclaration.


Je vais lire le lien que vous avez fourni, je vous en remercie.

Merci de votre compréhension.