El tamaño de la posición devuelve un valor negativo - página 3

 
JD4:

Lo anterior fue una respuesta específica a tu post específico"MathRound devuelve un doble; número infinito de decimales."

Una vez más, según la página de documentación

"Valordevuelto

Valor redondeado hasta el entero más cercano."

Ahora, una respuesta concreta a esta parte de tu post.

"Lo que dice la página, es lo que hace. Redondea. Nada que ver con la cuestión de los decimales múltiples."

De nuevo, relee la cita, dice que devuelve "Valor redondeado hasta el entero más cercano". Un entero, por definición, es un número entero, sin decimales. Y de nuevo, si esto no es lo que realmente hace, entonces el código o la descripción están rotos, y uno o el otro o ambos necesitan ser arreglados por MQ, o bien una etiqueta de advertencia indicando que estas funciones no funcionan como se anuncia.

Si realmente devuelve el tipo que se le da, pero en el equivalente matemático al valor del entero más cercano (como en devuelve 1,00000 de un 1,23456, y 1 == 1,00000) pero no devuelve un tipo de entero real, entonces la página de referencia necesita especificar algo como "no cambia el tipo de datos subyacente" o alguna otra forma que se indique claramente. Creo que esto fue una traducción plana de la página original en ruso, y como tal, no es tan claro en inglés como debería ser.

La documentación de MetaQuotes es débil en el mejor de los casos.

Sin embargo, dicho esto, MathRound() devuelve un doble por definición:

Si el valor devuelto dijera: "Valor dividido por 2" seguiría siendo un doble.

De la misma manera que "Valor redondeado hasta el entero más cercano" sigue siendo un doble.

Espero que eso ayude

 
honest_knave:

La documentación de MetaQuotes es débil en el mejor de los casos.

Sin embargo, dicho esto, MathRound() devuelve un doble por definición:

Si el valor devuelto dijera "Valor dividido por 2" seguiría siendo un doble.

De la misma manera que "Valor redondeado hasta el entero más cercano" sigue siendo un doble.

Espero que esto ayude

Para mí, "Valor redondeado hasta el entero más cercano" no está claro que devuelva otra cosa que no sea un entero debido a la definición de entero. Entiendo que en realidad es como funciona, pero eso enfatizó mi punto de que el código y/o la redacción de la página oficial están rotos y necesitan ser arreglados. O el código necesita ser ajustado para que devuelva un tipo int, o la redacción de la página necesita ser cambiada. Nosotros como usuarios no tenemos forma de hacerlo.El valor que está obteniendo el número a redondear no cambia, a menos que lo asigne de nuevo a esa variable. Como si usted está redondeando y con un valor de 1,3, y colocándolo en x, utilizando la redacción anterior, después de que la función se hace, se espera que y todavía contenga 1.3, y que x contenga 1, no 1.0. En mi mente, y como lo estoy leyendo, redondear significa que se redondea al elemento más cercano al que se intenta redondear, no a un valor equivalente a ese elemento. Quizás la frase "algo se pierde en la traducción" es muy apropiada aquí.
 
JD4:
Para mí, "Valor redondeado hasta el entero más cercano" no está claro que devuelva otra cosa que no sea un entero debido a la definición de entero. Entiendo que en realidad es como funciona, pero eso enfatizó mi punto de que el código y/o la redacción de la página oficial están rotos y necesitan ser arreglados. O el código necesita ser ajustado para que devuelva un tipo int, o la redacción de la página necesita ser cambiada. Nosotros como usuarios no tenemos forma de hacerlo.El valor que está obteniendo el número a redondear no cambia, a menos que lo asigne de nuevo a esa variable. Como si usted está redondeando y con un valor de 1,3, y colocándolo en x, utilizando la redacción anterior, después de que la función se hace, se espera que y todavía contenga 1.3, y que x contenga 1, no 1.0. En mi mente, y como lo estoy leyendo, redondear significa que se redondea al elemento más cercano al que se intenta redondear, no a un valor equivalente a ese elemento. Quizás la frase "algo se pierde en la traducción" es muy apropiada aquí.

No soy un fan de la documentación, pero tengo que decir que creo que han sido coherentes en este sentido. Toda la documentación enumera el tipo de datos devueltos (int, double, bool etc) en la parte superior de la página, la sección de valores devueltos más adelante nunca repite este tipo de datos. Además, en este caso están devolviendo exactamente el mismo tipo de datos que se pone.

En cualquier caso, si estás usando la directiva del compilador #property strict deberías recibir una advertencia:

 
honest_knave:

No soy un fan de la documentación, pero tengo que decir que creo que han sido coherentes en este sentido. Toda la documentación enumera el tipo de datos devueltos (int, double, bool etc) en la parte superior de la página, la sección de valores devueltos más adelante nunca repite este tipo de datos. Además, en este caso están devolviendo exactamente el mismo tipo de datos que se pone.

En cualquier caso, si usted está utilizando la directiva del compilador #property estricta debe estar recibiendo una advertencia:


He iniciado un hilo en el foro de MQL5.com en https://www.mql5.com/en/forum/61394 que espero que finalmente ayude a este problema de documentación. Tal vez si conseguimos suficiente gente detrás de la idea, MQ nos dejará a todos ayudar a arreglar lo que hasta ahora ha sido un problema para mucha gente. Espero que MQ se suba a la idea, porque nosotros como usuarios no podemos cambiar nada.

@ knave & WH - Estoy totalmente de acuerdo con tus ejemplos, pero sigo viendo un problema aquí, que o bien no estoy explicando claramente, o bien soy uno de los pocos que están viendo esto como un problema. Para mí, tus ejemplos están demostrando mi lado de este tema más de lo que crees que están demostrando tu lado.

knave, tu ejemplo devolverá un error porque no está devolviendo el tipo de datos que se supone que debe devolver, un int. El hecho de que estés fundiendo tu variable como un int sólo hace más fácil ver el problema de que la función no funciona correctamente.

WH, señalas esa línea (de la página del doc) y está diciendo básicamente lo mismo que la línea que estoy destacando. El ejemplo sólo utiliza un doble como el valor que se está enviando a la función. Ninguno de tus mensajes muestra que el estado 100% definitivamente claro que el tipo de datos devueltos por la función es un doble, sólo que el ejemplo está enviando un doble.

El redondeo es generalmente aceptado para cambiar el valor de un número específico a una precisión más baja. Creo que en esto todos podemos estar de acuerdo.

En este caso, no es diferente. La página especifica "redondeado al entero más cercano del valor numérico especificado". Se lee que redondeará a una precisión menor (int) de otro valor. En el ejemplo utilizado, se envía un double. Eso es todo lo que está 100% claro.

 

Lo siento JD4, me has perdido totalmente...

JD4:

En ninguno de tus posts se ve que se diga con claridad al 100% que el tipo de dato devuelto por la función es un doble, sólo que el ejemplo envía un doble.

Eso es exactamente lo que he marcado con una flecha. Devuelve un doble (flecha roja grande) y el parámetro pasado es también un doble (debajo de mi flecha). Echa un vistazo a cualquier función. OrderSend () devuelve un int... OrderClose () devuelve un bool.... y MathRound() devuelve un doble

JD4:

knave, tu ejemplo devolverá un error porque no está devolviendo el tipo de datos que se supone que debe devolver, un int. El hecho de que estés lanzando tu variable como un int sólo hace más fácil ver el problema de que la función no funciona correctamente.

La función funciona exactamente como se anuncia.

Si crees que es un int (erróneo), obtienes esto:

Si lo encasillas como un int, reconoces que estás usando el tipo de datos equivocado:

Si lo tratas como un double (que lo es), no tienes ninguna advertencia:

 
honest_knave:

Lo siento JD4, me has perdido totalmente...

Eso es exactamente lo que he marcado con una flecha. Devuelve un doble (flecha roja grande) y el parámetro pasado es también un doble (debajo de mi flecha). Echa un vistazo a cualquier función. OrderSend () devuelve un int... OrderClose () devuelve un bool.... y MathRound() devuelve un doble

La función funciona exactamente como se anuncia.

Si crees que es un int (erróneo), obtienes esto:


Si lo encasillas como un int, reconoces que estás usando el tipo de datos equivocado:


Si lo tratas como un double (que lo es), no tienes ninguna advertencia:

El ejemplo es typecasting para devolver un doble. En tu ejemplo de código de int RoundedNumber, estás type casting para devolver un int como tipo de retorno. Esto no debería ser necesario ya que se supone que devuelve un int, basado en lo que te dice la página. La línea en la parte superior y la de valor de retorno dice que redondea a un entero del valor especificado.Un entero, no importa cuántas veces digamos lo contrario, no tiene decimales, fracciones, o cualquier otra forma de representar los números entre los números enteros, el cero, y los números enteros negativos. Como el ejemplo que puse arriba, basado en los docs dados, enviando la función MathRound "1.3" debería devolver "1", no "1.0", ya que "1.0" no es un entero, pero "1" sí. (las comillas son sólo para clarificar)

El encasillamiento como un int muestra un error porque la función subyacente opera en contra de lo que la página dice que hace, no porque se suponga que devuelva otra cosa que no sea un int. Si lo tratas como un doble (que puede ser pero no se supone que lo sea), entonces eso es sólo dejar que la función incorrecta continúe operando en contra de lo que está documentado que haga, devolver un entero que fue redondeado del valor enviado a él, que es un doble.

Enviar un doble para ser redondeado (la forma en que el código está documentado ahora) a un entero y luego fundir o almacenar el valor devuelto a un tipo doble no generará errores porque se supone que está devolviendo un int, y si almacena un int a un doble, no está perdiendo ninguna precisión en la conversión.Los errores están ahí para notificar al programador sobre la posible pérdida de precisión en los cálculos. Si almacena un doble en un int, esperará un error como el que está mostrando porque lo está forzando a otra forma con menos precisión de la que tenía antes.

Si la función MathRound no se supone que devuelva un int, entonces la redacción de la página necesita ser cambiada para que no diga que se supone que devuelva un int. Mi problema nunca ha sido que la función haga algo diferente a lo que hace, aparte de que es contrario a lo que la página dice que se supone que hace.Tienen que arreglar el código de la función para que devuelva un int como dice la página del documento, o editar la página del documento para reflejar que no necesariamente devuelve un int. "Redondeado al entero más cercano" es exactamente eso, un entero.

Edit: He investigado más a fondo tanto en referencias de C++ como de Java, ya que MQL está de alguna manera basado en C++, y es sintácticamente similar a Java y C++. C++ muestra en una parte del doc(http://www.cplusplus.com/reference/cmath/round/)"Round to nearest Devuelve el valor integral más cercano a x, con los casos intermedios redondeados a cero", pero más adelante en la página dice"Return Value El valor de x redondeado a la integral más cercana (como un valor de punto flotante)." Podrías decir que esto apoya tu punto de vista sobre esto, cuando en realidad no lo hace, porque el C++ especifica que devuelve un float. La documentación de Java en http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html muestra lo siguiente sobre los 2 métodos llamados round. Ambos (Java y C++) son funcionalmente equivalentes dentro de sus lenguajes a las funciones MathRound y/o round en MQL.

static long round(double a)
Devuelve el long más cercano al argumento, con empates redondeando hacia arriba.
static int round(float a)
Devuelve el int más cercano al argumento, con los empates redondeando hacia arriba.
 

MQL MathRound devuelve un valor entero en un tipo de datos float. Seguramente lo que hace C++, o Java funciones de redondeo es irrelevante. Es trivial escribir su propia función 'int round(double a)' en MQL si usted quiere uno.

(32bit)floats pueden contener (16 bit)enteros muy bien sin pérdida de precisión. El problema es OP quiere valor redondeado a dos lugares decimales y espera que sea exacta. No lo será.

 
ydrol:

MQL MathRound devuelve un valor entero en un tipo de datos float. Seguramente lo que hace C++, o Java funciones de redondeo es irrelevante. Es trivial escribir su propia función 'int round(double a)' en MQL si usted quiere uno.

(32bit)floats pueden contener (16 bit)enteros muy bien sin pérdida de precisión. El problema es OP quiere valor redondeado a dos lugares decimales y espera que sea exacta. No lo será.

Me salí del tema con mis mensajes específicamente sobre la función que opera de cierta manera, y he terminado de publicar esa discusión fuera del tema. Si esta discusión de la función termina moviéndose en otro lugar, estoy bien con eso.

Editar: Empecé un hilo para continuar la discusión de esta página de documentos en conflicto en https://www.mql5.com/en/forum/156174. Gum, he respondido a su puesto de abajo aquí en ese hilo.
 

JD4, parece que eres la única persona que está confundida con esto

HonestKnave ha señalado que la documentación muestra claramente que la función devuelve un doble. Un entero representado como un doble.

"redondeado al entero más cercano" no significa que se convierta en un entero

Si te digo que cortes un trozo de madera a la misma longitud que un trozo de cuerda. La madera sigue siendo madera, no se convierte de repente en un trozo de cuerda.

 
JD4:

La línea de arriba y la del valor de retorno dicen que redondea a un entero del valor especificado.

JD4:

Necesitas arreglar o bien el código de la función para que devuelva un int como dice la página doc, o bien editar la página doc para reflejar que no necesariamente devuelve un int. "Redondeado al entero más cercano" es exactamente eso, un entero.


Bueno, no estoy seguro de que te convenza JD4. La documentación dice claramente y al 100% que la función devuelve un doble. Estás leyendo otra cosa en la descripción del valor devuelto - nunca dice que devuelve un entero.

Cuando miras OrderSend() dice "Valor devuelto: Devuelve el número del ticket asignado a la orden por el servidor de comercio o -1 si falla. Para obtener información adicional sobre el error, hay que llamar a la función GetLastError()".

¿Qué significa el número? Es un poco vago, ¿no crees? ¿Se refiere a double? float? char? short? int? long? La respuesta se encuentra en la parte superior de la página, como esa gran flecha que he publicado antes. Ese es su formato estándar para ver el tipo de datos devueltos. (nota: no he dicho valor de datos devueltos). Realmente no puedo pensar en un solo ejemplo en la documentación donde la sección "valor devuelto" nunca menciona el tipo de datos.