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
Ojalá tuvieras razón y fuera así de sencillo. No estaría aquí si fuera tan fácil y definitivamente no perdería tantas horas de trabajo en esto.
Es cierto que necesito
1. controlar el número de dígitos después del punto decimal
2. ajustar dinámicamente el número de dígitos y hacerlo lo más corto posible
Mis dobles vienen de
Tickvalue -> SYMBOL_TRADE_TICK_VALUE
TickSize -> SYMBOL_TRADE_TICK_SIZE
y
LotValue = ((TickValue / TickSize) * lote);
Nada extraño, valores estándar, todo bien, pero LotValue parece ser difícil de formatear y mostrar en pantalla.
El GRAN problema es que mis dobles muestran como 1.000000000 pero en realidad son 1.000000001
(Sé cómo funcionan los dobles, y entiendo que es normal)
Print(), DoubleToString(), NormalizeDoubles() y StringFormat() básicamente redondean el número y el número resultante es terriblemente erróneo; nada funcionó, la precisión deseada simplemente no se pudo conseguir con las funciones MQL4 porque redondean el número, y 1.000000000 acabó siendo igual a 1.1
(no se me ocurre ninguna circunstancia en la que sea conveniente para una aplicación que muestra constantemente Precios ver un número 'falseado' transformado de 1.04966 a 1.0497 pero esa es una discusión para otro día)
Por eso al principio utilizaba una fórmula sencilla para conseguir la precisión deseada
Pero la cosa se complica cuando en vez de Forex, es Crypto donde necesito una precisión mayor de 9-10, y por encima de eso no era capaz de eliminar ceros finales, así que llegué a tus funciones.
Y todo este problema porque necesito dar al usuario la mayor información posible y el espacio en pantalla es limitado, por eso necesito apretar el número en un espacio fijo.
Tu función Trunc() hace el truco para el 99,9% de los números, pero hay algunos que no cooperan y necesitan un tratamiento especial.
Esperaba que pudieras darme una fórmula reducida para hacerlo.
Y ahora añadiendo a mis problemas la función Round(double, int) detiene la ejecución de MT4 con algunos dobles. No puedo entender por qué, el doble no es tan grande, siendo 100000.0000000000
Es un número común que representa el valor de 1 Lote para EURUSD, y si escribo a mano el valor todo está bien, pero si viene de las matemáticas LotValue = ((TickValue / TickSize) * lote); MT4 se bloquea.
Una tarea tan sencilla y ya me he pasado más de 40 horas en esto. ¡Me está matando!
Es cierto que lo necesito:
1. controlar el número de dígitos después del punto decimal
2. ajustar dinámicamente el número de dígitos y hacerlo lo más corto posible
Parece que después de 4 mensajes no fui capaz de hacerte entender mi problema, y me siento terriblemente decepcionado de mi fracaso.
Y el estilizador de este sitio está completamente estropeado, por lo que lleva mucho tiempo escribir correctamente un mensaje aquí
No puedo explicar por qué, pero hay que suponer que 1.000000000; tiene un decimal distinto de 0 en alguna parte, aunque gráficamente no he sido capaz de mostrarlo.
Pero los resultados son esos
para números como 19.65400
funciona perfectamente. Y si introduzco manualmente 1.0000000; sigue funcionando perfectamente.
Para que me entiendas, uso la función sobre más de 400 parámetros diferentes y cada uno de ellos tiene un valor diferente en cada tick y Trunc() funciona perfectamente.
Pero para:
double lotValue = ((_TickValue / _TickSize) * lot);no lo hace, y por eso incluí también la función Round(number, digits); y solía hacer el truco, y decidí simplemente preguntarte si había una fórmula para combinar mi función Normalize_Double_ToString() en un código más simple y optimizado.
Y me respondiste algo muy muy diferente (asumo que es enteramente culpa mía por no explicarme bien)
Pero desde ayer Round() bloquea MT4, y sin Round no puedo contar correctamente los Dígitos Significativos en el lado de los decimales.
El problema parece ser el typecasting a long. Si lo quito de Round(double, int); MT4 ejecuta sin problema, pero entonces no puedo entender cómo un doble con 6 dígitos enteros, multiplicado por 10000, alcanza los límites de long.
Supongo que llegados a este punto mi pregunta es
¿Dónde está la salida?
De todas formas tendré que dejar pasar esto, volveré a ello en unas semanas.
Prueba esto:
sin embargo, no lo hará mucho mejor que los 3 métodos más cortos en el post anterior.
Nota,
Yo uso Round() de mi librería, no el incorrecto que posteaste antes, o en su lugar uso:
n = NormalizarDoble(n, d);
Pero, dudo de lo que has dicho que Round() tiene errores.Parece que después de 4 mensajes no he sido capaz de hacerte entender mi problema, y me siento terriblemente decepcionado de mi fracaso.
Y el estilizador en este sitio es completamente bugged, por lo que es muy desperdiciador de tiempo para escribir correctamente un mensaje aquí
No puedo explicar por qué, pero debemos suponer que 1.000000000; tiene un decimal distinto de 0 en alguna parte, aunque gráficamente no fui capaz de mostrarlo.
Estoy seguro de que entiendo la causa de sus problemas en MT4.
La razón principal por la que no puede obtener los resultados esperados es un error con string(dbl) de MQL4 que aún no se ha solucionado en MT4.
Error en la función string() de MQL4. Conversión incorrecta de doble -> cadena.
El error fue corregido en MT5, pero no en MT4. ver aquí: https: //www.mql5.com/en/forum/367839/page3#comment_27477157 y la solución aquí: https: //www.mql5.com/en/forum/367839/page5#comment_27613205
Mi recomendación:
si quieres profundizar o depurar tus dobles como string en MT4, entonces fuerza siempre el cast explícito a string mediante la función Repr() de math_utils.mqh