Errores, fallos, preguntas - página 2939

 
x572intraday:
Todos los precios se muestran con cinco decimales, y uno, por alguna razón, en la misma lista lo toma así: ¿Por qué? ¿Es un error o hay que ajustar mi salida para que se vea igual? Bueno, digamos que lo peino con PrintFormat o fprint, pero en principio no es una representación incorrecta del número?

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Nikolai Semko, 2020.01.05 21:41

Siempre tengo esta pregunta.
Constantemente todos hablan de la norma IEEE 754, pero la gente a menudo, cuando van a Wikipedia - ya sea por la complejidad, o por pereza dejar sin entender el significado de la norma.

Dedicaré un poco de tiempo a tratar de explicar esta norma lo más brevemente posible y con palabras sencillas, para que sirva de referencia a este post.


Así, el tipo doble consta de 8 bytes = 64 bits.(float 4 bytes = 32 bits)

Y la representación numérica dedouble y float consta de 3 componentes:signo, exponente y mantisa


DOBLE:


FLOTA:

Naturalmente, no hay representación decimal de los números en este formato, sólo binaria.

  • El signo es de 1 bit. Si es 0 es + (más), si es 1 es - (menos).
  • El exponente almacena el grado para el número 2. Puede estar en el rango -12610 a 12710 para float y -1022 10 a 102310 para double
  • La mantisa es la parte fraccionaria del propio número en forma binaria, reducida a una forma en la que la coma se sitúa después de la primera unidad sin tener en cuenta esa primera unidad y la coma


Un poco de comprensión de la representación binaria de los números y su relación con los números decimales:

2 4= 100002 = 1610

2 3= 10002 = 810

2 2= 1002 = 4

2 1=102= 2

2 0=12=110

2 -1= 0.12 =(1/2)10= 0.510

2 -2= 0.012 = (1/4)10= 0.2510

2 -3= 0.0012 = (1/8)10= 0.12510

2 -4= 0.00012 = (1/16)10= 0.062510

2 -5= 0.000012 = (1/32)10= 0.0312510

2 -6= 0.0000012 = (1/64)10= 0.01562510

2 -7= 0.00000012 = (1/128)10= 0.007812510

2 -8= 0.000000012 = (1/256)10= 0.0039062510

2 -9= 0.0000000012 = (1/512)10= 0.00195312510

2 - 10= 0.00000000012 = (1/1024)10= 0.000976562510

2 - 11= 0.000000000012 = (1/2048)10= 0.0004882812510

2 - 12= 0.0000000000012 = (1/4096)10= 0.00024414062510

2 - 13= 0.00000000000012 = (1/8192)10= 0.000122070312510

Repasemos los ejemplos por partida doble:

Ejemplo #1

Tenemos un número decimal: 891677.4025191

Este número puede representarse en forma binaria:

11011001101100011101.01100111000010110111111101100010000011111010001110
(quien quiera puede comprobarlo))

Extraemos la mantisa del número dado simplemente moviendo la coma 19 dígitos a la izquierda (en este caso) para que venga después de la primera unidad.

1.1011001101100011101011001110000101101111101111000101000001111101110001110* 2 19

Pero tenemos una mantisa de sólo 52 bits. Así que tomamos los primeros 52 bits significativos

Мантисса = 1011001101100011101011001110000101101111101111000101

Exponente = (19+1023)10 = 100000100102(como el exponente es un número con signo y el exponente puede ser negativo (por ejemplo si tenemos 0,0000042132), tenemos que sumar 1023 a 10(011111111112), 0111111112 es cero, todo lo que sea más es positivo, menos es negativo. En otras palabras, para obtener el valor inverso del exponente, tenemos que restar 1023 al valor de 11 bits del exponente.

En total, nuestro número 891677.4025191 tendrá el siguiente aspectoen tipo doble:

0100000100101011001101100011101011001110000101101111101111000101

Pero como se trata de una representación binaria, vamos a convertirla exactamente a decimal:

que sería891677.402519099996425211429595947265625


Ejemplo 2

Tenemos un número decimal: -0.00000145258556224114

Este número puede representarse en forma binaria:

-0.000000000000000000011000010111101100111010110111010011010101001111001110

Seleccione la mantisa de este número simplemente moviendo la coma 20 dígitos a la derecha, de modo que estuviera después de la primera unidad.

1.1000010111101100111010110111010011010101001111001110 * 2 -20

Мантисса = 1000010111101100111010110111010011010101001111001110

exponente = (-20+1023)10=011111010112

signo menos, por lo que el primer bit es 1.

Nuestro número total -0,00000145258556224114 tendrá el siguiente aspecto en el tipo doble:

1011111010111000010111101100111010110111010011010101001111001110

convertirlo exactamente en decimal:

это будет -0.00000145258556224113991124017968015191826225418481044471263885498046875



En tu caso, el problema se produce con el número 0,01, ya que en el tipo doble se representará de la forma

0 01111111000 0100011110101110000101000111101011100001010001111011

que convertido al sistema de notación decimal es igual a 0,01000000000000000020816681711721685132943093776702880937510

Mientras que con la representación

310 = 1.5*2 = 1.12*2 1

510 = 2.5*2 = 10.12*2 1

610 = 1.5*4 = 1.12*2 2

710 = 3.5*2 = 11.12*2 1

no hay problema.

¿Por qué el número doble 0,01 es realmente mayor que 0,01?

He aquí la razón:

0 01111111000 01000111101101110100001011110101001010001111011 - 0,010000000000000000000020816681711721685132943093776702880859375 error = 0,000 000 000 000 000 000 208166817...

0 01111111000 01000111101101011100001010001111010 - 0,009999999999999847344334114097569175064563751220703125 error = - 0,000 000 000 000 001 5265566...

Para entender este proceso químico puedes jugar con estas calculadoras:
https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html

https://baseconvert.com/ieee-754-floating-point


https://baseconvert.com/ieee-754-floating-point


 

Gracias, informativo. Bueno, básicamente, ¿deberían tener los MQ, pero subcorregidos o se dejó la decisión al usuario?

 

¿Existe una función o alguna otra funcionalidad adicional (biblioteca, código) para guardar los parámetros de EA?

La tarea es poner un código en ondeinit que cuando el EA se ejecute en un símbolo por ejemplo (la función adicional es también el análisis de periodo), guarde el archivo de configuración establecido.

Por ejemplo: nombre-símbolo-período de EA.

Archivo con posibilidad de sobrescribir - sólo los últimos ajustes del símbolo.

Por ejemplo, los ajustes estándar del comprobador se guardan para la última ejecución.

 
Buenos días. Problema en un ordenador remoto, no puedo acceder a la página web de MQL5, por lo que no puedo descargar el indicador que he comprado. No puedo entrar en el sitio MQL5, por lo tanto no puedo descargar el indicador que compré.
 
Slava Botalov:
Hola, tengo un problema en un ordenador remoto, no puedo acceder a la web de MQL5 y por tanto no puedo descargar el indicador que he comprado. no puedo descargar el indicador, por lo tanto no puedo usarlo.


sino un ordenador remoto en Zomro?

 
x572intraday:

Gracias, informativo. Bueno, básicamente, ¿deberían tener los MQ, pero subcorregidos, o se deja la decisión a juicio del usuario?

Así que no lo consiguieron.
No hay errores.
Todo es como debe ser.
 
Vladislav Andruschenko:


sino un ordenador remoto en Zomro?

 
Slava Botalov:
Buenos días. Problema en un ordenador remoto, no puedo acceder a la página web de MQL5, por lo que no puedo descargar el indicador que he comprado. No puedo descargar el indicador, por lo que no puedo instalarlo en el sitio MQL5.
Vladislav Andruschenko:


sino un ordenador remoto en Zomro?

Slava Botalov:


Este proveedor está vetado por una falta grave:

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

¿Por qué está bloqueado el acceso a www.mql4.com?

Renat Fatkhullin, 2020.11.17 12:16

***

Todo el proveedor de Zomro con subredes está bloqueado por actividades fraudulentas masivas desde sus subredes.

***
 
Nikolai Semko:
Por lo tanto, no lo entienden.
No hay ningún error.
Todo es como debe ser.

Esa no es la cuestión. La pregunta es: ¿dónde puede ser útil, especialmente para los comerciantes, no para los programadores? Nunca he visto esos números en el terminal ni en la escala de precios ni en la ventana de colocación de pedidos; allí todo es igual en todas partes (en algún lugar cinco dígitos, en otro).

 
Vladimir Karputov:


Este proveedor ha sido expulsado por una falta grave:

Lástima, tendremos que cambiar a otro. ¿Alguna sugerencia?