Errores, fallos, preguntas - página 1932

 
Комбинатор:

En general, el tipo decimal sería útil, es algo práctico.

Sí, su ausencia en el software que trabaja con los precios ha sido, como mínimo, confusa desde el comienzo de la existencia de MT.

PS. Ahora, con la existencia del lenguaje OOP, MQ probablemente piense que aquellos que lo deseen pueden escribir una clase por sí mismos. Sólo que después no puedes ponerlo en una estructura simple - tendrías que serializarlo/deserializarlo en algo simple como ulong.
 
Slava:

Le agradezco mucho que haya respondido con tanto detalle. La normalización se utiliza para generar solicitudes de comercio.

// Point = 0.001, Digits = 3
OrderSend(8274 * Point);
OrderSend(NormalizeDouble(8274 * Point, Digits));

En este ejemplo parece que se envían precios diferentes en estos dos OrderSend.

Siempre se ha asumido que multiplicar un entero por un punto no requiere una normalización adicional (así es como se establecieron SL y TP, por ejemplo).

Entonces, ¿cuál de las dos líneas provocará un error?

 
Stanislav Korotky:

Sí, su ausencia en el software que trabaja con precios ha sido vergonzosa desde el comienzo de la existencia de MT, por decir algo.

No puede ser que nadie haya escrito en la SD
 
fxsaber:

Le agradezco mucho que haya respondido con tanto detalle. La normalización se utiliza para generar solicitudes de comercio.

En este ejemplo parece que se envían precios diferentes en estos dos OrderSend.

Siempre se ha asumido que multiplicar un entero por un punto no requiere una normalización adicional (así es como se establecieron SL y TP, por ejemplo).

Entonces, ¿cuál de las dos líneas provocará el error?

Cool

#include <MT4Orders.mqh>

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);  
   
  Print(Num);  // 8.273999999999999
  Print(Norm); // 8.274000000000001
  
  Print((double)DoubleToString(Num, 3) == Num);     // true - без нормализации все замечательно
  Print((double)DoubleToString(Norm, 3) == Norm);   // false - а после нормализации полный облом!
  
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Num, 0, 0, 0);
  OrderSend("USDSEK", OP_BUYLIMIT, 1, Norm, 0, 0, 0);
}

Resultado

script Test (EURUSD,M1) loaded successfully
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260308 buy limit 1.00 / 1.00 USDSEK at market done in 98.718 ms
'6185283': buy limit 1.00 USDSEK at 8.27400
'6185283': accepted buy limit 1.00 USDSEK at 8.27400
'6185283': order #158260309 buy limit 1.00 / 1.00 USDSEK at market done in 120.328 ms
script Test (EURUSD,M1) removed

Ambas consultas con precios diferentes, pero ejecutadas sin problemas por el mismo precio. ¿Cómo es eso?

 
fxsaber:

Cool

Resultado

Ambas consultas con precios diferentes, pero ejecutadas sin problemas al mismo precio. ¿Cómo es posible?

Muy sencillamente, desde el punto de vista de un doble, estos números son idénticos porque el doble almacena 52 bits de la mantisa o 15 decimales. Las diferencias de más o menos en los bits posteriores no cuentan. Aquí hay un artículo sobre hubra.

 
Stanislav Korotky:

Muy sencillamente, desde el punto de vista del doble, estos números son iguales porque el doble almacena 52 bits de la mantisa o 15 decimales. Las diferencias de más o menos en los dígitos siguientes no cuentan. Aquí hay un artículo sobre hubra.

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}
 

fxsaber, 2017.07.19 13:00

void OnStart()
{
  const double Num = 8.274;
  const double Norm = NormalizeDouble(Num, 3);
  
  Print((string)(Norm - Num)); // 1.77635683940025e-15
}

И?

 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

fxsaber, 2017.07.17 21:49

Si se hace clic en "Stop" durante una sola ejecución, no se llama a OnDeinit ni a los destructores.

¿Es un fallo o un error?

Ahora mismo, al pulsar el botón "Stop" se produce una desconexión brusca con el Agente. Tan duro que es imposible ver el informe sin esperar a que se complete una sola ejecución.

En MT4 siempre se puede ver el historial de operaciones de una sola operación incompleta. Pero en MT5 no hay manera.

¿Es posible no terminar la conexión de forma brusca, sino enviar una bandera al Agente que pueda ser capturada y ejecutar OnDeinit sobre ella?

 
Stanislav Korotky:

И?

Stanislav Korotky:

Muy sencillamente, desde el punto de vista del doble, estos números son iguales porque el doble almacena 52 bits de mantisa o 15 decimales. Las diferencias de más o menos en los bits posteriores no cuentan. Aquí hay un artículo sobre hubra.

La diferencia es superior a 1e-15. Además, Num != Norm. Son números diferentes, no el mismo.
 
Stanislav Korotky:

И?

En realidad estoy de acuerdo, si fijamos un literal, sería lógico que su representación doble se normalizara por el número de dígitos del literal