Variable double de solo dos decimales

Foro dedicado a todo lo relacionado con la versión 4 de la plataforma de Metaquotes.
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Variable double de solo dos decimales

Mensaje por Foréxitos »

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.
ImagenImagenImagenImagenImagen
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

ha, me olvide de decir que con StringFormat("%.2f", variable); tampoco me funciono.
ImagenImagenImagenImagenImagen
Avatar de Usuario
Gibranes
Mensajes: 234
Registrado: 22 Jun 2010 07:57

Re: Variable double de solo dos decimales

Mensaje por Gibranes »

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);
Avatar de Usuario
X-Trader
Administrador
Mensajes: 12798
Registrado: 06 Sep 2004 10:18
Contactar:

Re: Variable double de solo dos decimales

Mensaje por X-Trader »

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.
Coincido con Gibranes, con MathRound lo resuelves rápido. La función la tienes de serie en MQL4, te paso referencia:

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:
Please note that when output to Journal using the Print() function, a normalized number may contain a greater number of decimal places than you expect.
Con esto creo que ya lo tienes resuelto ;).


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."
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

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);
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.
ImagenImagenImagenImagenImagen

Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

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.
ImagenImagenImagenImagenImagen
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

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.
Adjuntos
Dos_Decimales_v1.00.mq4
(1.91 KiB) Descargado 28 veces
ImagenImagenImagenImagenImagen
Avatar de Usuario
Gibranes
Mensajes: 234
Registrado: 22 Jun 2010 07:57

Re: Variable double de solo dos decimales

Mensaje por Gibranes »

Al no tener la plataforma no puedo ver el archivo ni el error. Sí, pasas el código sin compilar igual veo algo. 
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

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);
  }
ImagenImagenImagenImagenImagen
Avatar de Usuario
Gibranes
Mensajes: 234
Registrado: 22 Jun 2010 07:57

Re: Variable double de solo dos decimales

Mensaje por Gibranes »

Pon un ejemplo con los números que pasas en esta cadena y lo pruebo en C#
OrderProfit()+OrderCommission()+OrderSwap();
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

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.
Acá me equivoqué... solo lo hace el StringFormat()
ImagenImagenImagenImagenImagen
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

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();
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).
te puedo hacer una lista pero no le veo el sentido.
ImagenImagenImagenImagenImagen
Avatar de Usuario
Gibranes
Mensajes: 234
Registrado: 22 Jun 2010 07:57

Re: Variable double de solo dos decimales

Mensaje por Gibranes »

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.
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

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
ImagenImagenImagenImagenImagen
Avatar de Usuario
Foréxitos
Mensajes: 684
Registrado: 12 Mar 2017 19:13

Re: Variable double de solo dos decimales

Mensaje por Foréxitos »

en el siguiente pip dio esto:
resultado con el ejemplo de Gibranes = 0.11
profit = 0.18
comisión = -0.07000000000000001
swap = 0
ImagenImagenImagenImagenImagen
Si te ha gustado este hilo del Foro, ¡compártelo en redes!


Responder

Volver a “Metatrader 4”