Errores, fallos, preguntas - página 2820

 
Kira27:

El certificado me confundió)))

La referencia dice sin comillas. Así que te pones ahí.

 
Una pregunta con barba. Pero no entiendo este resultado.
void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:
Pregunta de la barba. Pero no entiendo este resultado.

Se ha dicho 100 veces: "no utilices la comparación exacta del dub, utiliza el épsilon". Incluido en nuestra documentación.

Ni siquiera el 0,3 o el 0,7 se compara con sus percepciones. Acéptalo y supéralo. O ir a aprender (en MTI, por ejemplo)

 
Slava:

Se ha dicho 100 veces: "no utilices la comparación exacta del dub, utiliza el épsilon". Incluido en nuestra documentación.

Sé cómo hacer una comparación de doblaje, por supuesto.

Ni siquiera el 0,3 o el 0,7 se comparan con sus percepciones. Acéptalo y supéralo. O ir a aprender (en MTI, por ejemplo).

Print(NormalizeDouble(0.3, 5) == 0.3); // true
Print(NormalizeDouble(0.7, 5) == 0.7); // true

Print(NormalizeDouble(0.12345, 5) == 0.12345); // true

No entiendes la pregunta.

 
decimal lo haría más fácil, pero es lento(
 
fxsaber:

Puedo hacer una comparación de doblaje, por supuesto.

No entiendes la pregunta.

Hay otras sutilezas.

Un número real multiplicado por 0,5 no puede compararse con el mismo número dividido por 2,0

 
Slava:

Hay otras sutilezas.

Un número real multiplicado por 0,5 puede no ser igual al mismo número dividido por 2,0

Es cierto. Pero la pregunta era: ¿por qué el número 1,79435 no está normalizado con 5 decimales?


ZS Los antecedentes de esta pregunta.

El SL en el probador se disparó. DEAL_PRICE = 1,79435, ORDER_PRICE_OPEN = 0(como en MT5), DEAL_COMMENT = "sl 1,79435".

Quería saber si hubo un deslizamiento al ejecutar SL o no? Así que simplemente comparé DEAL_PRICE y el precio del comentario. Con mis ojos veo que los precios son los mismos pero MQL muestra que no lo son. Por fin he llegado al fondo de la comparación original.

Foro sobre trading, sistemas de trading automatizados y comprobación de estrategias

Errores, fallos, preguntas

fxsaber, 2020.08.10 09:04

void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:

Todo es cierto. Pero la pregunta era: ¿por qué el número 1,79435 no está normalizado al 5º decimal?


ZS Antecedentes de la pregunta.

El SL en el probador se activó. DEAL_PRICE = 1,79435, ORDER_PRICE_OPEN = 0(como en MT5), DEAL_COMMENT = "sl 1,79435".

Quería saber si hubo un deslizamiento al ejecutar SL o no? Así que simplemente comparé DEAL_PRICE y el precio del comentario. Con mis ojos veo que los precios son los mismos pero MQL muestra que no lo son. Terminó llegando a la comparación original.

Lo siento, pero es un poco extraño oírte decir eso.


 
Alexey Viktorov:

Lo siento, pero es un poco extraño oírte decir eso.

Repito mi pregunta.

fxsaber:

¿por qué el número 1,79435 no está normalizado al 5º decimal?

void OnStart()
{
  const double Norm = NormalizeDouble(1.79435, 5);
  
  Print((double)(string)Norm == Norm);    // false
  Print((double)(string)Norm == 1.79435); // true
}
 
fxsaber:

Todo es cierto. Pero la pregunta era ¿por qué el número 1,79435 no está normalizado con el 5º decimal?

La normalización no es un redondeo.

@Slava escribe que la representación interna del doble es diferente:

#define  PRINT(EX) Print(#EX," = ",EX)
//+------------------------------------------------------------------+
void OnStart()
{
   union ULONG_DOUBLE
   {
      double d_value;
      ulong ul_value;
   }tmp;
   double NORM_DOUBLE   = NormalizeDouble(1.79435, 5);
   double CONST_DOUBLE  = 1.79435;
   
   PRINT(NORM_DOUBLE);
   tmp.d_value = NORM_DOUBLE;
   PRINT(LongToHex(tmp.ul_value));
   
   tmp.d_value = CONST_DOUBLE;
   PRINT(CONST_DOUBLE);
   PRINT(LongToHex(tmp.ul_value));
}
//+------------------------------------------------------------------+
string LongToHex(const ulong value)
{
   return(StringFormat("%llX", value));
}
//+------------------------------------------------------------------+

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) NORM_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DDA

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) CONST_DOUBLE = 1.79435

2020.08.10 13:33:37.737 tst_normalize (EURUSD,H1) LongToHex(tmp.ul_value) = 3FFCB5A858793DD9


SZS: Había un buen post de @Nikolai Semko en alguna parte, describía muy bien el trabajo con el doble, quizá encuentre el enlace.

UPD:https://www.mql5.com/ru/forum/1111/page2623#comment_14473837