Errores, fallos, preguntas - página 1782

 
-Aleks-:

¿Cuáles funcionan?

La regla de perder los dígitos significativos y rellenarlos con obras al azar

El resultado es largo, pero en los cálculos intermedios del doble y ahí es donde se pierden los dígitos significativos

(Dígitos+1)*3-1=17

 
A100:

La regla de perder los dígitos significativos y rellenarlos con obras al azar

El resultado es largo, pero en los cálculos intermedios del doble y ahí es donde se pierden los dígitos significativos

(Dígitos+1)*3-1=17

Gracias por la información.

Sin embargo, la información es difícil de captar, es decir, el número puede ser así, pero no se pueden hacer cálculos con él...

Este es un ejemplo de código donde se convierte de cadena a número

long CalcY=StringToDouble("111111111111111111");
Print ("CalcY=",CalcY);

Imprime el número 11111111111104.

Es decir, no hay cálculos aquí o me equivoco?

¿Es posible manejar estos números o se trata de limitaciones lingüísticas?

 
-Aleks-:

Entonces no hay cálculos aquí, ¿o me equivoco?

Un cálculo es cualquier operación (en estecaso una conversión). Para el número especificado StringToDouble devuelve el doble con pérdida de precisión

StringToInteger devuelve long, pero otras funciones que operan con double no pueden utilizarse en los cálculos sin pérdida de precisión, como NormalizeDouble, MathPow

 
A100:

Cálculo - cualquier operación (en este caso una conversión). StringToDouble devuelve doble - hay una pérdida de precisión

StringToInteger devuelve long, pero otras funciones que operan con double no pueden utilizarse en los cálculos sin pérdida de precisión, como NormalizeDouble, MathPow,

StringToInteger funcionó para expresar el número, pero luego se pone peor, supongo que hay que descomponer el número en sus componentes para las operaciones matemáticas...

long CalcZ=StringToInteger("111111111111111111");
Print ("CalcZ=",CalcZ);

double Test=CalcZ;
Print ("Test=",Test);

Test=1.111111111111111e+17

 

De nuevo, está escrito en el servicio de ayuda

INT_MAX

Valor máximo que puede ser representado por el tipo int

2147483647

Entonces, ¿cómo StringToInteger realiza la conversión y la almacena en long si el número es mayor que el permitido?

 
-Aleks-:

Entonces, ¿cómo StringToInteger convierte y almacena en long si el número es mayor que el permitido?

StringToInteger devuelve originalmente long dentro deLONG_MINLONG_MAX(también podría llamarse StringToColobok)

 
A100:
StringToInteger devuelve originalmente long (también podría haberse llamado StringToBoob)

Esto es cierto, pero el archivo de ayuda es muy inteligente.

"

Convierte una cadena que contiene una representación de caracteres de un número en un número int(entero).

"

Eso es lo que me confundió.

Gracias por la información.

¿Supongo que la representación numérica anterior no cabrá en el búfer gráfico?

 
-Aleks-:

¿Supongo que el número anterior no cabrá en el búfer gráfico?

Se escriben como B'11111111111111111111111111111111'

 
A100:

Afirmo (y propongo que se compruebe) que cuando se cambia el timeframe de M5 a M15 no se envía el comando M5 Deinit al primer indicador (y sólo a él - en este caso M5) y no se descargará del gráfico hasta que el usuario borre el EA

Glory tiene razón y la descarga funciona correctamente.

Tenga en cuenta que en MT5, el núcleo de cálculo del indicador es un recurso compartido con un contador de uso en su propio gestor. Si diferentes programas o ventanas utilizan el indicador con los mismos parámetros, una copia de cálculo con el contador de uso funciona realmente. Esto ahorra mucho dinero cuando un operador utiliza los mismos indicadores en los gráficos y en un Asesor Experto.

El gestor de indicadores está diseñado para que elimine físicamente los indicadores de forma asíncrona y con un retraso. Y mientras tanto, se crea una nueva copia de trabajo con nuevos parámetros, que a menudo se inicializa antes de borrar físicamente la copia antigua.
 
Renat Fatkhullin:
El gestor de indicadores está diseñado para que elimine físicamente los indicadores de forma asíncrona y con un retraso. Y, mientras tanto, se crea una nueva copia de trabajo con nuevos parámetros, que suele inicializarse antes de borrar físicamente la copia antigua.

Simplifiquemos el indicador

//Test_i.mq5 //Индикатор
void Prn( string f, int i = -1 ) { Print( f, "->", StringSubstr( EnumToString( Period()), 7 ), (i == -1 ? "" : ":" + i )); }
void OnInit()                    { Prn( __FUNCTION__ );         }
void OnDeinit( const int reason ) { Prn( __FUNCTION__, reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }

Vamos a adjuntar el Test.mq5 al gráfico M5 y a continuación cambiar el periodo del gráfico de M5->M15

Resultado:

2017.02.06 00:54:20.897 OnInit->M5
2017.02.06 00:54:25.553 OnInit->M15

Pregunta: ¿Cuándo se llamará a OnDeinit->M5?

Mi respuesta: ¡Nunca!

Su respuesta anterior: de forma asíncrona y con retraso

Archivos adjuntos:
Test.mq5  1 kb
Razón de la queja: