Erreurs, bugs, questions - page 1932

 
Slava:

Je vous suis en effet très reconnaissant d'avoir répondu de manière aussi détaillée. La normalisation est utilisée pour générer des demandes de commerce.

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

Dans cet exemple, il semblerait que des prix différents soient envoyés dans ces deux OrderSend.

On a toujours supposé que la multiplication d'un nombre entier par un point ne nécessite pas de normalisation supplémentaire (c'est ainsi que SL et TP ont été fixés, par exemple).

Laquelle de ces deux lignes provoquera une erreur ?

 
Stanislav Korotky:

Oui, son absence dans les logiciels qui fonctionnent avec les prix est pour le moins embarrassante depuis le début de l'existence de MT.

Il ne peut pas être que personne n'a écrit dans le SD
 
fxsaber:

Je vous suis en effet très reconnaissant d'avoir répondu de manière aussi détaillée. La normalisation est utilisée pour générer des demandes de commerce.

Dans cet exemple, il semblerait que des prix différents soient envoyés dans ces deux OrderSend.

On a toujours supposé que la multiplication d'un nombre entier par un point ne nécessite pas de normalisation supplémentaire (c'est ainsi que SL et TP ont été fixés, par exemple).

Laquelle de ces deux lignes provoquera l'erreur ?

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);
}

Résultat

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

Deux requêtes avec des prix différents, mais exécutées sans problèmes pour le même prix. Comment cela ?

 
fxsaber:

Cool

Résultat

Deux requêtes avec des prix différents, mais exécutées sans problèmes au même prix. Comment est-ce possible ?

Très simplement, du point de vue du double, ces nombres sont identiques, car le double stocke 52 bits de mantisse ou 15 décimales. Les différences de plus ou moins dans les bits suivants ne comptent pas. Voici un article sur le hubra.

 
Stanislav Korotky:

Très simplement, du point de vue du double, ces nombres sont les mêmes car le double stocke 52 bits de la mantisse ou 15 décimales. Les différences de plus ou moins dans les chiffres suivants ne comptent pas. Voici un article sur le 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
}

И ?

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Bugs, bugs, questions

fxsaber, 2017.07.17 21:49

Si vous cliquez sur "Stop" pendant une seule exécution, OnDeinit et les destructeurs ne sont pas appelés.

Est-ce un défaut ou un bug ?

Actuellement, appuyer sur le bouton "Stop" provoque une déconnexion brutale avec l'agent. Tellement difficile qu'il est impossible de voir le rapport sans attendre la fin d'une seule exécution.

Dans MT4, vous pouvez toujours voir l'historique des transactions d'une seule transaction incomplète. Mais dans MT5, il n'y a aucun moyen.

Est-il possible de ne pas mettre fin à la connexion de façon définitive, mais d'envoyer un drapeau à l'agent qui pourrait être attrapé et exécuter OnDeinit sur lui ?

 
Stanislav Korotky:

И ?

Stanislav Korotky:

Très simplement, du point de vue du double, ces nombres sont les mêmes car le double stocke 52 bits de mantisse ou 15 décimales. Les différences de plus ou moins dans les bits suivants ne comptent pas. Voici un article sur le hubra.

La différence est supérieure à 1e-15. De plus, Num != Norm. Ce sont des chiffres différents, pas les mêmes.
 
Stanislav Korotky:

И ?

En fait je suis d'accord, si nous définissons un littéral, il serait logique que sa représentation double soit normalisée par le nombre de chiffres dans le littéral

 
fxsaber:
La différence est supérieure à 1e-15. De plus, num != Norm. Ce sont des chiffres différents, pas les mêmes.

Mon MT4 sort true, true et différence 0. ;-)