Obtener el número de decimales de cualquier número (no sólo las comillas) evitando Digits() en MQL4 y MQL5 - página 9

 
Mesaoria:

No me refería a eso en absoluto. La idea de convertir un duble en una cadena para luego poder contar los caracteres de la cadena es un completo disparate. No importa lo que hagas.

¿Cuál es el problema? Hasta ahora, esta opción es la más rápida, la más funcional y la que garantiza la corrección. ¿Cuáles son sus opciones?

 
Alexandr Sokolov:
Sí, mi variante no es probablemente la mejor, pero como nunca he encontrado nada al respecto, es la mejor que se me ocurrió por mi cuenta, lo comenté arriba, mientras que tú no sugeriste tu propia variante.

He comparado estas variantes:

int ds(double v){
   string s=(string)v;
   int l=StringLen(s);
   int n=l-StringFind(s,".",0)-1;
   if(StringSubstr(s,l-1,1)=="0")n--;
   return(n);
}

int d(double x){
   int n;
   for(n=0;n<8;n++){
      if(x==NormalizeDouble(x,n)){
         return(n);
      }
   }
   return(n-1);
}

La variante de cadena es ligeramente más rápida, y no está limitada a 8 dígitos como d(). Y la garantía de corrección se cuenta por la forma en que el terminal muestra el número.

Elijo la variante con conversión a cadena.

 
Dmitry Fedoseev:

¿Cuál es el problema? Hasta ahora, esta opción es la más rápida, la más funcional y la que garantiza ser la correcta. ¿Cuáles son sus opciones?

¿Puedes nombrar al menos un caso de aplicación del algoritmo anterior?

 
Mesaoria:

¿Puedes nombrar al menos un caso de aplicación del algoritmo anterior?

Hubo un caso en el que el panel de operaciones mostró el tamaño del lote con el número correcto de decimales en el campo de texto. Este es el único caso.

 
Dmitry Fedoseev:

Hubo un caso en el que el panel de operaciones mostró el tamaño del lote con el número correcto de decimales en el cuadro de texto. Este es el único caso.

Es decir, ¿se emite "1" en el caso de un lote y "0,01" en el caso de un lote de 0,01?

 
Mesaoria:

Entonces, ¿se emite "1" en el caso de 1 lote y "0,01" en el caso de 0,01 lotes?

No exactamente. Depende del lote mínimo y del paso del lote. Si el lote mínimo es 0,01, entonces 1 se muestra como 1,00

 
Dmitry Fedoseev:

La verdad es que no. Dependiendo del lote mínimo y del incremento del lote. Si el lote mínimo es 0,01, entonces 1 se muestra como 1,00

O.o.

Así que resulta que no estás usando tu función, sino que sigues mostrando algo como DoubleToString(LotSize, <algún valor constante>), ¿no?

 
Mesaoria:

O.o

Así que resulta que no usas tu función, pero sigues sacando algo como DoubleToString(LotSize, <algún valor constante>), ¿no?

Sí, pero hay que saber cuántos decimales hay que imprimir.

 
Dmitry Fedoseev:

Sí, pero hay que saber cuántos decimales hay que imprimir.

En otras palabras, ¿utiliza el lote mínimo (o el incremento de lote) introducido por el usuario para determinar cuántos decimales tiene este valor y luego lo guarda para normalizar los valores futuros?

 
Mesaoria:

Entonces, ¿determina a partir del lote mínimo (o incremento de lote) introducido por el usuario cuántos dígitos hay después del punto decimal, y luego lo guarda para normalizar futuros valores?

¿Qué es lo que no entiendes? El precio tiene Digits(), mientras que el volumen no. Así es como se calcula.

¿Por qué necesita dígitos de volumen? La misma razón por la que necesitamos los dígitos de los precios.

Razón de la queja: