Errores, fallos, preguntas - página 107

 
Yedelkin:
Simpleton, he seguido el mismo camino, pero he utilizado la conversión explícita a tipo int. He asumido que el tamaño máximo de lote posible estará limitado por el corredor/agente, o por el tamaño de mis propios fondos. Por lo tanto, el uso de int debería ser suficiente. ¿Crees que hay algún problema en este enfoque (redondear desde abajo usando int)?

Para el comercio real, probablemente, sí, int/uint es suficiente.

Pero si se ejecuta en un probador, puede no ser suficiente para algunos experimentos.

No hay inconvenientes, salvo posibles fallos de implementación de MQL5, al utilizar int, si podemos garantizar que el entero N de la fórmula caerá dentro del rango 0...INT_MAX y por tanto no nos desbordaremos. Es decir, sustituir el cheque

tmp < ULONG_MAX * stepvol

a

tmp < INT_MAX * stepvol

En realidad, el tipo int tiene signo y la mitad de sus posibles valores se encuentran en el rango de los números negativos, mientras que aquí siempre serán no negativos. Es irracional usar int cuando hay un unsigned uint que tiene el mismo tamaño pero el doble de rango en el área no negativa. Por lo tanto, si vamos a utilizar int/uint, es mejor utilizar uint y sustituir la comprobación por uint, respectivamente:

tmp < UINT_MAX * stepvol
 

gumgum:

#property script_show_inputs

Gracias por el consejo.
 
simpleton:

Para el comercio real, lo más probable es que sí, int/uint es suficiente.

... En realidad, el tipo int tiene signo, la mitad de sus posibles valores se encuentran en el área de los números negativos, y aquí siempre será no negativo. Es irracional usar int, cuando hay un uint sin signo que tiene el mismo tamaño pero el doble de rango en el área no negativa. Por lo tanto, si vamos a utilizar int/uint, es mejor utilizar uint y sustituir la comprobación por uint, respectivamente:

Sí, lo tengo, ¡gracias!
 

No es un error, sino una observación interesante sobre los tipos

¿Cuánto crees que es 2 por 2, es decir, 2*2?

¡crees que 4 tal vez tengas razón!

Bien, ¿qué tal esto?
doscientos mil veces doscientos mil

200000 * 200000

Cualquier escolar puede multiplicar dos y cuatro y sumar ceros y obtener...

40000000000.

Ahora vamos a escribir un código sencillo en el lenguaje de la máquina.

lotes largos = 200000*200000;

Obsérvese que el tipo de anfitrión de la variable es largo, es decir
El valor mínimo es -9 223 372 036 854 775 808; el valor máximo es 9 223 372 036 854 775 807.

Imprima el total y obtendrá

lotes = 1345294336
que está muy lejos de ser dos veces dos y tendrás dos.

Volví a leer la sección de ayuda sobre tipos y conversiones de tipo.
No he encontrado ninguna información de que los números regulares deban ser explícitamente lanzados al tipo correcto

así es como debería ser

lotes largos = (largo) 200000 * (largo) 200000;

alternativamente, puede utilizar variables auxiliares adicionales.

Документация по MQL5: Основы языка / Типы данных / Приведение типов
Документация по MQL5: Основы языка / Типы данных / Приведение типов
  • www.mql5.com
Основы языка / Типы данных / Приведение типов - Документация по MQL5
 

Hay más.

Si quieres recuperar y multiplicar por números grandes algunas propiedades....

Este es el código

long A = AccountInfoInteger(ACCOUNT_LOGIN);  // 661701
long B = A;
long C = 661701;
Print(" A=",A,"  B=",B,"  C=",C);
long X =10000;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print(" L1=",L1,"   L2=",L2,"   L3=",L3);

Y aquí está el resultado

L1=2322042704   L2=2322042704   L3=6617010000
A =661701        B =661701      C =661701
las entradas son las mismas, pero el resultado es diferente
Archivos adjuntos:
servis.mq5  2 kb
 

SHOOTER777:

Y ahora un simple código en lenguaje de máquina

lotes largos = 200000*200000;

Tenga en cuenta que el tipo de recepción de la variable long es long, es decir
El valor mínimo es -9 223 372 036 854 775 808, el valor máximo es 9 223 372 036 854 775 807.

Imprima el total y obtenga

lotes = 1345294336
que está muy lejos de ser dos veces dos y tendrás dos.

Volví a leer la sección de ayuda sobre tipos y conversiones de tipos.
No he encontrado ninguna información que indique que hay que lanzar explícitamente los números regulares a un tipo determinado.

así es como debe ser

lotes largos = (largo) 200000 * (largo) 200000;

Como alternativa, también puede utilizar variables auxiliares.

Los "números ordinarios" son expresiones constantes que también tienen un tipo. En este caso, se trata del tipo int.

La expresión que consiste en la multiplicación de dos subexpresiones, siendo cada una de ellas de tipo int, es también de tipo int. Aquí es donde se produce el desbordamiento.

Y sólo entonces se produce la conversión implícita del tipo de la expresión int al tipo long al inicializar una variable de tipo long.

Todo está claro aquí. Por cierto, cada uno de los operandos en este caso no necesita ser fundido al tipo long. Basta con lanzar una, y la segunda se lanzará implícitamente.

 
SHOOTER777:

Hay más.

Si quieres recuperar y multiplicar por números grandes algunas propiedades....

Este es el código

Y aquí está el resultado.

Los datos de origen son los mismos, pero el resultado es diferente.

Parece que el registro y el código están mezclados. El código anterior funciona de forma "limpia". Y, para conseguir dicho registro, tuve que hacer que las variables A y B fueran de tipo int o uint, y la variable X de tipo uint:

void OnStart()
{
int A = 661701;
int B = A;
long C = 661701;
Print(" A=",A,"  B=",B,"  C=",C);
uint X =10000;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print(" L1=",L1,"   L2=",L2,"   L3=",L3);
}

/* Вывод в лог (хронология - сверху вниз):
KO      0       1 (EURUSD,M15)  00:46:28         A=661701  B=661701  C=661701
OE      0       1 (EURUSD,M15)  00:46:28         L1=2322042704   L2=2322042704   L3=6617010000
*/

Y así es como funciona el código original:

void OnStart()
{
long A = 661701;
long B = A;
long C = 661701;
Print(" A=",A,"  B=",B,"  C=",C);
long X =10000;

long L1 = A*X;
long L2 = B*X;
long L3 = C*X;

Print(" L1=",L1,"   L2=",L2,"   L3=",L3);
}

/* Вывод в лог (хронология сверху вниз):
DL      0       1 (EURUSD,M15)  00:49:13         A=661701  B=661701  C=661701
HG      0       1 (EURUSD,M15)  00:49:13         L1=6617010000   L2=6617010000   L3=6617010000
*/

Compilación 314 (20 de agosto de 2010).

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 

Me pueden decir, por ejemplo, si quiero obtener el valor de algún indicador. Antes lo conseguía con precisión y garantía utilizando la función incorporada. Ahora tengo que escribirlo yo mismo usando un montón de código, buffers, handles, etc. Pero esa no es la cuestión. Lo más importante para mí es que el código se vuelve glitchy literalmente en cada línea, porque tengo que comprobar esto cada línea de código para asegurarse de que no se ha producido ningún error... En general, pensaba que todas estas complejidades, clases y cosas que eran elementales pero que se volvían engorrosas e incómodas se hacían para aumentar la velocidad, la fiabilidad, etc. Leí un artículo sobre 20 señales... dice:

"No se puede acceder a los datos del indicador justo después de su creación, ya que se tarda algún tiempo en calcular los valores del indicador, por lo tanto, es mejor crear los manejadores del indicador en OnInit()".

A continuación, hay comprobaciones para cada línea

"Vamos a comprobarlos: si hay menos datos de los que necesitamos, significa que se ha producido un error de copia y un nuevo acceso a la matriz, donde deberían almacenarse los datos, dará lugar a un error. Para descartar esto, dejaremos la función".

Así que, en lugar de acelerar, tengo que hacer un bucle (¿cuántas veces?) a través de esta función para obtener un resultado al final... Y si necesito valores individuales de líneas separadas de diferentes indicadores periódicamente... Se trata de una función distinta para cada valor... Eso es un montón de variables y código extra...

En fin, por favor, explícame, dame un enlace, quiero entender el sentido de todo esto, por qué es tan y no tan fiable...

Y sería bueno que las respuestas a estas preguntas se colocaran en la sección de ayuda para la migración de µl4 a µl5 o que se creara una sección pertinente en el foro, sin ninguna discusión, concretamente una pregunta y una respuesta, con una explicación de por qué es así... por ejemplo, el período se explica aquí de manera muy accesible, por lo que sería bueno tener respuestas a las preguntas elementales de la misma manera

 
Dmitriy2:

Me pueden decir, por ejemplo, si quiero obtener el valor de algún indicador. Antes lo conseguía con precisión y garantía utilizando la función incorporada. Ahora tengo que escribirlo yo mismo usando un montón de código, buffers, handles, etc. Pero esa no es la cuestión. Lo más importante para mí es que el código se vuelve glitchy literalmente en cada línea, porque tengo que comprobar esto cada línea de código para asegurarse de que no se ha producido ningún error... En general, pensaba que todas estas complejidades, clases y cosas que eran elementales pero que se volvían engorrosas e incómodas se hacían para aumentar la velocidad, la fiabilidad, etc. Leí un artículo sobre 20 señales... dice:

"No se puede acceder a los datos del indicador justo después de su creación, ya que se tarda algún tiempo en calcular los valores del indicador, por lo tanto, es mejor crear los manejadores del indicador en OnInit()".

A continuación, hay comprobaciones para cada línea

"Vamos a comprobarlos: si hay menos datos de los que necesitamos, significa que se ha producido un error de copia y un nuevo acceso a la matriz, donde deberían almacenarse los datos, dará lugar a un error. Para descartar esto, dejaremos la función".

Así que, en lugar de acelerar, tengo que hacer un bucle (¿cuántas veces?) a través de esta función para obtener un resultado al final... Y si necesito valores individuales de líneas separadas de diferentes indicadores periódicamente... Se trata de una función distinta para cada valor... Eso es un montón de variables y código extra...

En fin, por favor, explícame, dame un enlace, quiero entender el sentido de todo esto, por qué es tan y no tan fiable...

Y sería bueno que las respuestas a estas preguntas se colocaran en la sección de ayuda para la migración de µl4 a µl5 o que se creara una sección pertinente en el foro, sin ninguna discusión, concretamente una pregunta y una respuesta, con una explicación de por qué es así... por ejemplo, el período se explica aquí de manera muy accesible, y de la misma manera nos gustaría tener respuestas a preguntas elementales

¿Es más fiable? ¿Por qué no es fiable la obtención de asas en la inicialización? ¿Por qué no es fiable comprobar la disponibilidad de los datos necesarios? Y además, ¿por qué no es fiable tener controles?

Puede que no sea tan fácil para los principiantes, pero con el tiempo quedará claro...

 
Interesting:

¿Más fiable? ¿Por qué no es fiable la obtención de asas en la inicialización? ¿Por qué no es fiable la comprobación de los datos necesarios? Y aún más, ¿por qué no es fiable tener controles?

Puede que no sea tan sencillo para los novatos, pero se aclarará con el tiempo...

La comprobación de los datos no degrada la velocidad del programa en su conjunto, tal vez sólo en un 0,01%, no he hecho esta comprobación, y el hecho de que los datos deben ser comprobados antes de usarlos es sólo para la estabilidad de todo el sistema, de lo contrario puede haber consecuencias impredecibles, hasta la caída de la terminal en su conjunto.