mt5 strategy tester ticks - página 9

 
WhooDoo22:

Hola comunidad MQL5,

¿Alguien más se ha encontrado con números como estos al ejecutar estrategias en el probador? -1.000000000006551e-005 y 1.000000000006551e-005 (sí, son once ceros). Debe ser un tipo de formato doble específico, pero ¿qué tipo de formato doble, hmm?

Además, estoy leyendo la documentación de MQL5 como si, ok, ok, el tipo de datos int estándar tiene un valor mínimo de -2 147 483 648 y un valor máximo de 2 147 483 647 entonces sí, por supuesto hay el tipo de datos int sin signo con un valor mínimo de 0 y un valor máximo de 4 294 967 295 PERO ;) no hay ningún tipo de datos int con un valor mínimo de menos -4 294 967 295 y un valor máximo de 0. Yo un pensamiento habría un tipo de datos int tener estos valores mínimos y máximos, pero es lo que es. La afirmación anterior podría aplicarse también a otros tipos de datos.

Gracias

0,00001 es lo mismo que un 1 e-5 es un formato de exponente. Los dígitos extra al final, los 6551 son equivalentes a 0,0000000000006551 y por eso tenemos problemas para comparar dobles . . tienes que leer esto, e investigar un poco si lo necesitas, para que entiendas lo que está pasando:¿Puede precio != precio ?
Can price != price ? - MQL4 forum
  • www.mql5.com
Can price != price ? - MQL4 forum
 
RaptorUK:
0.00001 es lo mismo que 1 e-5 es un formato de exponente. Los dígitos extra al final, los 6551 son equivalentes a 0.0000000000006551 y es por esto que tenemos problemas para comparar dobles . . tienes que leer esto, y hacer un poco de investigación si es necesario, para que entiendas lo que está pasando:¿Puede precio != precio ?

Simon,

Muy agradecido, estoy leyendo el hilo y creo que la solución general de los carteles del hilo mql4 involucrados para la comparación de dobles era descubrir y utilizar un método para redondear estos dobles adecuadamente para devolver valores correctos. ¿Qué dices de esto?

Gracias

 
WhooDoo22:

Simon,

Muy agradecido, estoy leyendo el hilo y creo que la solución general de los carteles del hilo mql4 involucrados para la comparación de dobles era descubrir y utilizar un método para redondear estos dobles adecuadamente para devolver valores correctos. ¿Qué dices de esto?

Gracias

En el contexto de tu post anterior la comparación de dobles no es importante, entender por qué no se puede simplemente comparar dobles es lo importante.
 
RaptorUK:
En el contexto de tu post anterior la comparación de dobles no es importante, entender por qué no se puede simplemente comparar dobles es lo importante.

¿Por qué? Porque creo que los valores de los precios se devuelven en un formato de cuatro y cinco dígitos (con excepciones como el USDJPY que devuelve valores de precios de dos y tres dígitos). Intentaré desglosarlo de una vez porque no quiero alargar esto más de lo necesario.

El precio de oferta de USDCHF es actualmente 0,92909 y creo que lo más lejos que MetaTrader5 calcula estos valores de precios es dieciséis lugares a la derecha del decimal, si este es el caso, entonces hay once lugares después del último dígito nueve que se lanza en los cálculos del precio de USDCHF de 0,9290900000000000. Creo que la razón por la que los dobles no pueden ser simplemente comparados es porque el resto de los lugares a la derecha del decimal de un precio (no los legibles en el terminal sino los no legibles en el terminal) causan problemas de desigualdad.

Gracias

 
WhooDoo22:

¿Por qué? Porque creo que los valores de los precios se devuelven en un formato de cuatro y cinco dígitos (con excepciones como el USDJPY que devuelve valores de precios de dos y tres dígitos). Intentaré desglosarlo de una vez porque no quiero alargar esto más de lo necesario.

El precio de oferta de USDCHF es actualmente 0,92909 y creo que lo más lejos que MetaTrader5 calcula estos valores de precios es dieciséis lugares a la derecha del decimal, si este es el caso, entonces hay once lugares después del último dígito de nueve que se lanza en los cálculos del precio de USDCHF de 0,9290900000000000. Creo que la razón por la que los dobles no pueden ser simplemente comparados es porque el resto de los lugares a la derecha del decimal de un precio (no los legibles en el terminal sino los no legibles en el terminal) causan un problema de desigualdad.

Gracias

El problema de los dobles viene de su representación binaria. Hay dobles que no tienen una representación binaria exacta, por lo que se obtienen cosas como 1,000000000006551e-005. No entro aquí en la explicación detallada, si te interesa puedes leer esto por ejemplo.
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:

¿Por qué?

Está todo explicado en la primera página del hilo al que di un enlace, en esencia; un valor de 1,57373 puede en realidad mantenerse como un valor doble de 1,5737300000000001 mientras que NormalizeDouble(1,57373, 5) podría producir un valor doble de 1.57372999999999 ambos valores redondeados al 5º dígito más cercano son iguales pero comparados directamente no son iguales... así es como se almacenan los valores dobles, son números de punto flotante ( busque números de punto flotante, lea y entienda ) y a menudo el valor que se mantiene no es exactamente el mismo que el valor que usted cree que se mantiene.

Así que tu comentario muestra una resta de dos dobles y ves la diferencia como 1.0000000000xyz -e5 esto es porque así es como se almacenan los dobles - números de punto flotante.

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:
El problema con el doble viene de su representación binaria. Hay dobles que no tienen una representación binaria exacta, por lo que se obtienen cosas como 1,000000000006551e-005. No entro aquí en la explicación detallada, si te interesa puedes leer esto como ejemplo.

El decimosexto lugar de 1.000000000006551e-005 a la derecha del decimal es e-005.

¿Estás diciendo que 1.000000000006551e-005 no tiene una representación binaria exacta porque su decimosexto lugar a la derecha del decimal no es un número entero, su e-005?


"No entro aquí en la explicación detallada".

¿Por qué no? Si desea escribir una explicación detallada entonces por todos los medios, hágalo.


"si te interesa puedes leer esto por ejemplo".

He empezado a leerlo.

Gracias

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:


"No entro aquí en la explicación detallada,"

¿Por qué no? Si desea escribir una explicación detallada, entonces, por supuesto, hágalo.


¿Recuerdas una discusión que tuvimos sobre las cosas básicas fundamentales que debes conocer si quieres ser capaz de codificar correctamente? los números de punto flotante es uno de ellos...DYOR, hay mucha información por ahí, encuéntrala, léela, entiéndela y entonces serás capaz de codificar un poco mejor.
DYOR
DYOR
  • acronyms.thefreedictionary.com
What does DYOR stand for?
 
WhooDoo22:

El decimosexto lugar de 1.000000000006551e-005 a la derecha del decimal es e-005.

¿Estás diciendo que 1.000000000006551e-005 no tiene una representación binaria exacta porque su decimosexto lugar a la derecha del decimal no es un entero, es e-005?


No. Si leyeras mi enlace y/o el de RaptorUK, te quedaría más claro. Si no, lee de nuevo :-D

1,000000000006551e-005 es simplemente otra notación para 0,00001000000000006551.

 
RaptorUK:

Todo está explicado en la primera página del hilo al que di un enlace, en esencia; un valor de 1,57373 puede en realidad mantenerse como un valor doble de 1,5737300000000001 mientras que NormalizeDouble(1,57373, 5) podría producir un valor doble de 1.57372999999999 ambos valores redondeados al 5º dígito más cercano son iguales pero comparados directamente no son iguales... así es como se almacenan los valores dobles, son números de punto flotante ( busque números de punto flotante, lea y entienda ) y a menudo el valor mantenido no es exactamente el mismo que el valor que usted cree que se mantiene.

Así que tu comentario muestra una resta de dos dobles y ves la diferencia como 1.0000000000xyz -e5 esto es porque así es como se almacenan los dobles - números de punto flotante.

1,57373 (ignorar)

1.5737300000000001

1.5737299999999999

"ambos valores redondeados al 5º dígito más cercano son iguales"

Ambos valores redondeados a la 5ª cifra más cercana son iguales a 1,57373.


"pero comparados directamente no son iguales"

Sí, porque hay una diferencia.


"así es como se almacenan los valores dobles"

Los valores dobles como 1,5737300000000001 se almacenan como 1,57373 (si se usa normalizar doble, supongo). Si no se utiliza normalizar doble, el valor doble 1.5737300000000001 mantendría este formato de valor, ¿correcto?


"y a menudo el valor que se guarda no es exactamente el mismo que el valor que se cree que se guarda"

Mi última afirmación responde también a esta afirmación.


Voy a leer el enlace que me has proporcionado, gracias por ello.

Gracias

Razón de la queja: