Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
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
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:
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.
Hay más.
Si quieres recuperar y multiplicar por números grandes algunas propiedades....
Este es el código
Y aquí está el resultado
las entradas son las mismas, pero el resultado es diferenteSHOOTER777:
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.
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:
Y así es como funciona el código original:
Compilación 314 (20 de agosto de 2010).
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
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...
¿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...