Página 1 de 3

Variable double de solo dos decimales

Publicado: 09 May 2023 00:26
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.

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 01:33
por Foréxitos
ha, me olvide de decir que con StringFormat("%.2f", variable); tampoco me funciono.

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 08:20
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);

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 11:51
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

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 14:45
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.

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 16:06
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.

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 17:08
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.

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 18:06
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. 

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 18:25
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);
  }

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 18:46
por Gibranes
Pon un ejemplo con los números que pasas en esta cadena y lo pruebo en C#
OrderProfit()+OrderCommission()+OrderSwap();

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 18:49
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()

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 19:02
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.

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 19:21
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.

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 20:06
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

Re: Variable double de solo dos decimales

Publicado: 09 May 2023 20:10
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