Variable double de solo dos decimales
Variable double de solo dos decimales
Hola a toda la comunidad foril, se me presentó un problema que a simple vista pareciera simple pero es realmente complejo y para que se entienda me gustaría que lean hasta el final.
Necesito que la variable double sea siempre de dos decimales, ejemplo:
double variable=1.682000000000123 sea siempre 1.68
Sí, seguro pensaste en NormalizeDouble() pero no funciona, y eso cómo.
Lo explico aquí: hago un simple EA que meta operaciones de compra cada tanto... a todas esas operaciones les sumo sus respectivos profit, comisión, swap y después lo comento, pero en crudo, con (string). Esta suma a veces es con dos decimales, sin decimales cuando el total es un entero y con varios decimales de vez en cuando o sea, más de dos. La idea es que el valor de la variable double siempre sea con dos decimales y NO en el comentario (en el comentario NormalizeDouble() funciona perfectamente).
Hice una prueba que no me funciono y la comento por lo menos para que se sepa:
Convertí la variable double a string DoubleToString() con dos decimales, esa variable ahora string la volví a convertir a double StringToDouble() y después a esa nueva variable le aplique NormalizeDouble() con dos decimales y tampoco me funciona... también probé con DoubleToStr() y StrToDouble() y nada.
Gracias por leer hasta acá, saludos.
Necesito que la variable double sea siempre de dos decimales, ejemplo:
double variable=1.682000000000123 sea siempre 1.68
Sí, seguro pensaste en NormalizeDouble() pero no funciona, y eso cómo.
Lo explico aquí: hago un simple EA que meta operaciones de compra cada tanto... a todas esas operaciones les sumo sus respectivos profit, comisión, swap y después lo comento, pero en crudo, con (string). Esta suma a veces es con dos decimales, sin decimales cuando el total es un entero y con varios decimales de vez en cuando o sea, más de dos. La idea es que el valor de la variable double siempre sea con dos decimales y NO en el comentario (en el comentario NormalizeDouble() funciona perfectamente).
Hice una prueba que no me funciono y la comento por lo menos para que se sepa:
Convertí la variable double a string DoubleToString() con dos decimales, esa variable ahora string la volví a convertir a double StringToDouble() y después a esa nueva variable le aplique NormalizeDouble() con dos decimales y tampoco me funciona... también probé con DoubleToStr() y StrToDouble() y nada.
Gracias por leer hasta acá, saludos.
Re: Variable double de solo dos decimales
ha, me olvide de decir que con StringFormat("%.2f", variable); tampoco me funciono.
Re: Variable double de solo dos decimales
No conozco metatrader, pero sí algo de C# para este caso que dices uso mathround, redondea un valor al entero más próximo o al número especificado de dígitos fraccionarios.
Chatgpt me da esta solución para tu sistema, desconozco si funciona, pero sí que utiliza mathround.
double numero = 1.68005;
double numeroRedondeado = NormalizeDouble(MathRound(numero * 100) / 100, 2);
Chatgpt me da esta solución para tu sistema, desconozco si funciona, pero sí que utiliza mathround.
double numero = 1.68005;
double numeroRedondeado = NormalizeDouble(MathRound(numero * 100) / 100, 2);
Re: Variable double de solo dos decimales
Coincido con Gibranes, con MathRound lo resuelves rápido. La función la tienes de serie en MQL4, te paso referencia:Foréxitos escribió: 09 May 2023 00:26 Hola a toda la comunidad foril, se me presentó un problema que a simple vista pareciera simple pero es realmente complejo y para que se entienda me gustaría que lean hasta el final.
Necesito que la variable double sea siempre de dos decimales, ejemplo:
double variable=1.682000000000123 sea siempre 1.68
Sí, seguro pensaste en NormalizeDouble() pero no funciona, y eso cómo.
Lo explico aquí: hago un simple EA que meta operaciones de compra cada tanto... a todas esas operaciones les sumo sus respectivos profit, comisión, swap y después lo comento, pero en crudo, con (string). Esta suma a veces es con dos decimales, sin decimales cuando el total es un entero y con varios decimales de vez en cuando o sea, más de dos. La idea es que el valor de la variable double siempre sea con dos decimales y NO en el comentario (en el comentario NormalizeDouble() funciona perfectamente).
Hice una prueba que no me funciono y la comento por lo menos para que se sepa:
Convertí la variable double a string DoubleToString() con dos decimales, esa variable ahora string la volví a convertir a double StringToDouble() y después a esa nueva variable le aplique NormalizeDouble() con dos decimales y tampoco me funciona... también probé con DoubleToStr() y StrToDouble() y nada.
Gracias por leer hasta acá, saludos.
https://docs.mql4.com/math/mathround
Observa que NormalizeDouble está pensado para armonizar decimales con los del producto que estés operando, no sirve exactamente para redondear. De hecho, el problema que te sucede ya lo avisan en la documentación:
https://docs.mql4.com/convert/normalizedouble
En concreto en este párrafo:
Con esto creo que ya lo tienes resueltoPlease note that when output to Journal using the Print() function, a normalized number may contain a greater number of decimal places than you expect.

Saludos,
X-Trader
"Los sistemas de trading pueden funcionar en ciertas condiciones de mercado todo el tiempo, en todas las condiciones de mercado en algún momento del tiempo, pero nunca en todas las condiciones de mercado todo el tiempo."
Re: Variable double de solo dos decimales
Excelente respuesta Gibranes a pesar de que no usas mql4 también es muy parecido a C+ pero me sigue sin funcionar, de vez en cuando me tira varios decimales también, tanto tu ejemplo como el de StringFormat lo único que han hecho es que no me escriba un entero cuando la suma de la variable da doble cero de decimales. Se me ocurre que quizás el problema esté más arriba cuando traigo las funciones OrderProfit()+OrderCommission()+OrderSwap(). Voy a probar si directamente modifico los resultados de estas funciones a ver qué pasa y después les cuento. Saludos y gracias por las respuestas.Gibranes escribió: 09 May 2023 08:20 No conozco metatrader, pero sí algo de C# para este caso que dices uso mathround, redondea un valor al entero más próximo o al número especificado de dígitos fraccionarios.
Chatgpt me da esta solución para tu sistema, desconozco si funciona, pero sí que utiliza mathround.
double numero = 1.68005;
double numeroRedondeado = NormalizeDouble(MathRound(numero * 100) / 100, 2);
Re: Variable double de solo dos decimales
Tampoco me funciono... voy a hacer un EA simple representando este caso a ver si viéndolo en vivo y en directo se ve el error y me puedan ayudar a resolverlo... ahí lo comparto.
Re: Variable double de solo dos decimales
Ahí puse dos ejemplos dentro del EA; uno común y el otro es el de Gibranes.
si ven con detalle el resultado que arroja de vez en cuando te da varios decimales.
si ven con detalle el resultado que arroja de vez en cuando te da varios decimales.
- Adjuntos
-
- Dos_Decimales_v1.00.mq4
- (1.91 KiB) Descargado 93 veces
Re: Variable double de solo dos decimales
Al no tener la plataforma no puedo ver el archivo ni el error. Sí, pasas el código sin compilar igual veo algo.
Re: Variable double de solo dos decimales
por decir, escrito está bien... el tema es el resultado que arroja pero ahí va
Código: Seleccionar todo
#property copyright "Dos decimales por Foréxitos"
#property link "https://www.forexitos.com"
#property version "1.00"
#property strict
datetime DiaActual;
double Variable[];
int start()
{
if(DiaActual!=iTime(NULL, PERIOD_D1,0)){int s=OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,0,NULL,0,0,clrNONE);DiaActual=iTime(NULL, PERIOD_D1, 0);}
//::::::::::::::::::::::::::::::::: TOTAL :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ArrayInitialize(Variable,0);ArrayResize(Variable,400);
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
{
Variable[i]+=OrderProfit()+OrderCommission()+OrderSwap();
// Este es un ejemplo comun.
//Comment(Variable[i]);
// Este es el ejemplo de Gibranes
Comment(NormalizeDouble(MathRound(Variable[i]*100)/100,2));
}
}
return(0);
}
Re: Variable double de solo dos decimales
Pon un ejemplo con los números que pasas en esta cadena y lo pruebo en C#
OrderProfit()+OrderCommission()+OrderSwap();
OrderProfit()+OrderCommission()+OrderSwap();
Re: Variable double de solo dos decimales
Acá me equivoqué... solo lo hace el StringFormat()Foréxitos escribió: 09 May 2023 14:45 tanto tu ejemplo como el de StringFormat lo único que han hecho es que no me escriba un entero cuando la suma de la variable da doble cero de decimales.
Re: Variable double de solo dos decimales
Lo que me pedís es aleatorio y dependen del movimiento del mercado por ende, en la fecha que arrancas el EA... el profit va a ser diferente, la comisión es fija pero con el swap pasa lo mismo (depende del broker y los días de la semana).Gibranes escribió: 09 May 2023 18:46 Pon un ejemplo con los números que pasas en esta cadena y lo pruebo en C#
OrderProfit()+OrderCommission()+OrderSwap();
te puedo hacer una lista pero no le veo el sentido.
Re: Variable double de solo dos decimales
Dame solo un número para las dos variables, tal como se crean de manera aleatoria.
Y la fija de la comisión.
Entiendo que todas son double, ya que si no, no te dejaría concatenar la cadena.
Y la fija de la comisión.
Entiendo que todas son double, ya que si no, no te dejaría concatenar la cadena.
Re: Variable double de solo dos decimales
Gibranes te paso un ejemplo de lo que queres ver... esto es con solo una operación ejecutada a mercado:
resultado con el ejemplo de Gibranes = 0.07000000000000001
profit = 0.14
comisión = -0.07000000000000001
swap = 0
resultado con el ejemplo de Gibranes = 0.07000000000000001
profit = 0.14
comisión = -0.07000000000000001
swap = 0
Re: Variable double de solo dos decimales
en el siguiente pip dio esto:
resultado con el ejemplo de Gibranes = 0.11
profit = 0.18
comisión = -0.07000000000000001
swap = 0
resultado con el ejemplo de Gibranes = 0.11
profit = 0.18
comisión = -0.07000000000000001
swap = 0
Si te ha gustado este hilo del Foro, ¡compártelo en redes!