Redondear números en MT4 mediante NormalizeDouble - página 14

 

Hizo funciones para redondear el fondo y la parte superior alguna vez

Podría ayudar a alguien

//+------------------------------------------------------------------+
double RoundMax(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price+MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
double RoundMin(double price,double symbol_point,int symbol_digits)
  {
   return(NormalizeDouble(price-MyK(price,symbol_point,symbol_digits)*symbol_point, symbol_digits-1));
  }
//+------------------------------------------------------------------+
int MyK(double price,double symbol_point,int symbol_digits)
  {
   double tmp1=NormalizeDouble(price, symbol_digits);
   double tmp2=NormalizeDouble(price, symbol_digits-1);
   return((MathAbs(tmp1-tmp2)<symbol_point)?10:5);
  }
//+------------------------------------------------------------------+
 
Victor Nikolaev:

Hizo funciones para redondear el fondo y la parte superior alguna vez

Podría ayudar a alguien

Gracias, lo conseguiré para mi colección.
 
lilita bogachkova:

intenta obtener un resultado de0,9999999999999999999

X = 0.99999999999999999

10*X = 10*0.99999999999999999

10*X-X = 10*0,9999999999999-0,99999999999

9*X = 9*0.99999999999999999

obtenemos 9*X = 9 o X es igual a 1 (uno)

v1 = (1/3) = 0,33333333 | v2 = 3*(1/3) = 1,00000000

o 0,9999999999999 = 1,0

v1 (1.00000000) >= 1.0

En este caso, 0,99999999999999999999 representa 1,0. Pero la tarea es "descartar", por lo que el resultado debe incluir nueves.
 

Gracias a todos por este hilo tan útil.

He optado por la solución de redondear 1 dígito más medianteNormalizeDouble, y luego recortar el último dígito. Hasta ahora, es completamente adecuado.

 

De nuevo sobre el redondeo......

Por favor, asesórese sobre la situación (no tire tomates, soy humanitario),

existe dicha variable:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

El delta está originalmente normalizado,

Probablemente, OrderLots debería devolver dubs normalizados,

pero de alguna manera a veces en raras ocasiones obtengo números como 2.775557561562891e-17

Así que es casi cero pero no cero.......

primera pregunta: ¿es esto normal?

segunda pregunta - según entiendo me bastará con hacer la segunda normalización para evitar las colas?

Tercera pregunta (siento que no la entenderé de todos modos, pero lo preguntaré igualmente):

¿puede la suma de dos números normalizados dar números no normalizados?

P.D. Pido disculpas por volver a sacar el tema, pero es que no tengo fuerzas para releerlo todo de nuevo


 
transcendreamer:

De nuevo sobre el redondeo......

Por favor, asesórese sobre la situación (no tire tomates, soy humanitario),

existe dicha variable:

      double delta=NormalizeDouble(new_lot-sum_lots,Lots_Digits);

      if(delta>0) delta-=OrderLots();

      if(delta<0) delta+=OrderLots();

El delta está originalmente normalizado,

Probablemente, OrderLots debería devolver dubs normalizados,

pero de alguna manera a veces en raras ocasiones obtengo números como 2.775557561562891e-17

Así que es casi cero pero no cero.......

primera pregunta: ¿es esto normal?

segunda pregunta - según entiendo me bastará con hacer la segunda normalización para evitar las colas?

Tercera pregunta (siento que no la entenderé de todos modos, pero lo preguntaré igualmente):

¿puede la suma de dos números normalizados dar números no normalizados?

P.D. Perdonad que lo saque de nuevo, pero es que no tengo energía para releerlo todo

  1. Sí.
  2. Sí.
  3. Sí.
 
fxsaber:
  1. Sí.
  2. Sí.
  3. Sí.
Gracias
 
transcendreamer:

P.D. Pido disculpas por volver a sacar el tema, pero no tengo energía para volver a hablar de todo esto

Es mejor que lo compruebes tú mismo con diferentes ejemplos, te dará una idea.

Lo único es que lo estoy haciendo mal:

if(delta>0)

sino así.

if(delta>0.0)

Para los números dobles. No sé si realmente importa, pero nunca he encontrado un error con mi variante (intento comparar sólo los mismos tipos de variables).

 
Andrey Dik:

No sé si realmente importa, pero nunca he encontrado un error con mi versión (sólo intento comparar los mismos tipos de variables).

No lo hace.
 
Algunos números sólo pueden representarse como una fracción infinita, por ejemplo, 1/3 en el sistema decimal. Pero 1/3 no es una fracción infinita en el sistema terciario, allí es == 0,1. Es decir, los diferentes sistemas numéricos tienen sus propias fracciones infinitas. En consecuencia, una fracción no infinita en decimal puede ser uno en binario. Por ejemplo: 0,1, 0,2, 0,3, 0,4, ... no tienen una representación binaria exacta. Si llamas a NormalizeDouble diez veces, será o bien 0,199999999...1 o bien 0,200000...1. No sé, quizás esto sea una novedad.