Fehler, Irrtümer, Fragen - Seite 1932

 
Комбинатор:

Generell wäre die Dezimalzahl nützlich, sie ist sehr praktisch.

Ja, seine Abwesenheit in Software, die mit Preisen arbeitet, ist seit den Anfängen von MT, gelinde gesagt, verwirrend.

PS. Nun, da es die OOP-Sprache gibt, denkt MQ wahrscheinlich, dass diejenigen, die es wünschen, eine Klasse für sich selbst schreiben können. Nur kann man es danach nicht in eine einfache Struktur einfügen - man müsste es in etwas Einfaches wie ulong serialisieren/deserialisieren.
 
Slava:

Ich bin Ihnen wirklich sehr dankbar, dass Sie so ausführlich geantwortet haben. Die Normalisierung wird verwendet, um Handelsanfragen zu generieren.

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

In diesem Beispiel sieht es so aus, als ob in diesen beiden OrderSend unterschiedliche Preise gesendet werden.

Es wurde immer davon ausgegangen, dass die Multiplikation einer ganzen Zahl mit einem Punkt keine zusätzliche Normalisierung erfordert (so wurden z. B. SL und TP festgelegt).

Welche der beiden Zeilen wird also einen Fehler verursachen?

 
Stanislav Korotky:

Ja, sein Fehlen in Software, die mit Preisen arbeitet, war seit Beginn der Existenz von MT, gelinde gesagt, peinlich.

Es kann nicht sein, dass niemand im SD geschrieben hat
 
fxsaber:

Ich bin Ihnen wirklich sehr dankbar, dass Sie so ausführlich geantwortet haben. Die Normalisierung wird verwendet, um Handelsanfragen zu generieren.

In diesem Beispiel sieht es so aus, als ob in diesen beiden OrderSend unterschiedliche Preise gesendet werden.

Es wurde immer davon ausgegangen, dass die Multiplikation einer ganzen Zahl mit einem Punkt keine zusätzliche Normalisierung erfordert (so wurden z. B. SL und TP festgelegt).

Welche der beiden Zeilen wird also den Fehler verursachen?

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

Ergebnis

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

Beide Abfragen mit unterschiedlichen Preisen, aber ohne Probleme für den gleichen Preis ausgeführt. Wie das?

 
fxsaber:

Cool

Ergebnis

Beide Abfragen mit unterschiedlichen Preisen, aber ohne Probleme zum gleichen Preis ausgeführt. Wie kann das sein?

Ganz einfach: Aus der Sicht von double sind diese Zahlen identisch, denn double speichert 52 Bits der Mantisse oder 15 Dezimalstellen. Differenzen von plus oder minus in den nachfolgenden Bits zählen nicht. Hier ist ein Artikel über hubra.

 
Stanislav Korotky:

Ganz einfach: Aus der Sicht von double sind diese Zahlen gleich, weil double 52 Bits der Mantisse oder 15 Dezimalstellen speichert. Differenzen von Plus oder Minus in den nachfolgenden Ziffern zählen nicht mit. Hier ist ein Artikel über 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 zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2017.07.17 21:49

Wenn Sie während eines einzelnen Laufs auf "Stop" klicken, werden OnDeinit und Destruktoren nicht aufgerufen.

Ist dies ein Fehler oder eine Schwachstelle?

Im Moment führt das Drücken der Schaltfläche "Stopp" zu einer harten Trennung der Verbindung mit dem Agenten. So stark, dass es unmöglich ist, den Bericht zu sehen, ohne auf den Abschluss eines einzigen Laufs zu warten.

In MT4 können Sie jederzeit den Handelsverlauf eines unvollständigen Einzelgeschäfts einsehen. Aber in MT5 gibt es keine Möglichkeit.

Ist es möglich, die Verbindung nicht hart zu beenden, sondern ein Flag an den Agenten zu senden, das abgefangen und OnDeinit darauf ausgeführt werden kann?

 
Stanislav Korotky:

И?

Stanislav Korotky:

Ganz einfach: Aus der Sicht von double sind diese Zahlen gleich, weil double 52 Bits der Mantisse oder 15 Dezimalstellen speichert. Differenzen von plus oder minus in nachfolgenden Bits zählen nicht. Hier ist ein Artikel über hubra.

Der Unterschied ist größer als 1e-15. Außerdem gilt: Num != Norm. Es sind unterschiedliche Zahlen, nicht dieselben.
 
Stanislav Korotky:

И?

Eigentlich stimme ich zu, wenn wir ein Literal setzen, wäre es logisch, dass seine doppelte Darstellung durch die Anzahl der Ziffern im Literal normalisiert wird