Fehler, Irrtümer, Fragen - Seite 2820

 
Kira27:

Die Bescheinigung hat mich verwirrt)))

In der Referenz heißt es ohne Anführungsstriche. Also stellen Sie sich selbst dort hinein.

 
Eine bärtige Frage. Aber ich verstehe dieses Ergebnis nicht.
void OnStart()
{
  Print(NormalizeDouble(1.79435, 5) == 1.79435); // false  
}
 
fxsaber:
Bärtige Frage. Aber ich verstehe dieses Ergebnis nicht.

Es wurde schon 100 Mal gesagt: "Verwende nicht den exakten Dub-Vergleich, verwende Epsilon". Auch in unserer Dokumentation.

Nicht einmal 0,3 oder 0,7 werden mit Ihren Wahrnehmungen vergleichbar sein. Akzeptieren Sie es und kommen Sie darüber hinweg. Oder gehen Sie und lernen Sie (z. B. bei MTI)

 
Slava:

Es wurde schon 100 Mal gesagt: "Verwende nicht den exakten Dub-Vergleich, verwende Epsilon". Auch in unserer Dokumentation.

Ich weiß natürlich, wie man einen Synchronisationsvergleich durchführt.

Nicht einmal 0,3 oder 0,7 werden mit Ihren Wahrnehmungen vergleichbar sein. Akzeptieren Sie es und kommen Sie darüber hinweg. Oder gehen Sie hin und lernen Sie (z. B. bei MTI).

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

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

Du verstehst die Frage nicht.

 
decimal würde es einfacher machen, aber es ist langsam(
 
fxsaber:

Ich kann natürlich einen Synchronisationsvergleich machen.

Du verstehst die Frage nicht.

Es gibt noch weitere Feinheiten.

Eine reelle Zahl, die mit 0,5 multipliziert wird, kann nicht mit der gleichen Zahl geteilt durch 2,0 verglichen werden.

 
Slava:

Es gibt noch weitere Feinheiten.

Eine reelle Zahl, die mit 0,5 multipliziert wird, entspricht nicht unbedingt der gleichen Zahl, die durch 2,0 geteilt wird.

Das ist wahr. Aber die Frage war, warum ist die Zahl 1,79435 nicht auf 5 Dezimalstellen normalisiert?


ZS Der Hintergrund dieser Frage.

Der SL im Tester ging aus. DEAL_PRICE = 1.79435, ORDER_PRICE_OPEN = 0(wie in MT5), DEAL_COMMENT = "sl 1.79435".

Ich wollte wissen, ob es bei der Ausführung von SL einen Fehler gab oder nicht? Also habe ich einfach DEAL_PRICE und den Preis aus dem Kommentar verglichen. Mit meinen Augen sehe ich, dass die Preise gleich sind, aber MQL zeigt, dass sie es nicht sind. Endlich bin ich dem ursprünglichen Vergleich auf den Grund gegangen.

Forum für Handel, automatisierte Handelssysteme und Strategietests

Fehler, Irrtümer, Fragen

fxsaber, 2020.08.10 09:04

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

Alles wahr. Die Frage war jedoch, warum die Zahl 1,79435 nicht auf die 5. Dezimalstelle normiert ist.


ZS Hintergrund zur Frage.

Der SL im Tester wurde ausgelöst. DEAL_PRICE = 1.79435, ORDER_PRICE_OPEN = 0(wie in MT5), DEAL_COMMENT = "sl 1.79435".

Ich wollte wissen, ob es bei der Ausführung von SL einen Fehler gab oder nicht? Also habe ich einfach DEAL_PRICE und den Preis aus dem Kommentar verglichen. Mit meinen Augen sehe ich, dass die Preise gleich sind, aber MQL zeigt, dass sie es nicht sind. Ich bin schließlich zum ursprünglichen Vergleich gekommen.

Es tut mir leid, aber es ist irgendwie seltsam, Sie das sagen zu hören.


 
Alexey Viktorov:

Es tut mir leid, aber es ist irgendwie seltsam, Sie das sagen zu hören.

Ich wiederhole meine Frage.

fxsaber:

Warum ist die Zahl 1,79435 nicht auf die 5. Nachkommastelle normiert?

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

Alles wahr. Die Frage war jedoch, warum die Zahl 1,79435 nicht auf die 5. Nachkommastelle normiert ist.

Die Normalisierung ist keine Rundung.

@Slava schreibt, dass die interne Darstellung von double unterschiedlich ist:

#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: Es gab einen guten Beitrag@Nikolai Semko irgendwo, er gab eine sehr gute Beschreibung, wie man mit Double arbeiten, vielleicht werde ich den Link zu finden.

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