mt5 strategie tester ticks - Seite 9

 
WhooDoo22:

Hallo MQL5-Gemeinschaft,

Ist noch jemand bei der Ausführung von Strategien im Tester auf Zahlen wie diese gestoßen? -1.000000000006551e-005 und 1.000000000006551e-005 (ja, das sind elf Nullen). Es muss sich um einen bestimmten Double-Format-Typ handeln, aber um welchen Double-Format-Typ, hmm?

Außerdem lese ich die MQL5-Dokumentation wie folgt: Ja, ok, ok, der Standard-Int-Datentyp hat einen Minimalwert von -2 147 483 648 und einen Maximalwert von 2 147 483 647, dann ja, natürlich gibt es den vorzeichenlosen Int-Datentyp mit einem Minimalwert von 0 und einem Maximalwert von 4 294 967 295 , ABER ;) es gibt keinen Int-Datentyp mit einem Minimalwert von -4 294 967 295 und einem Maximalwert von 0. Ich hätte gedacht, dass es einen Int-Datentyp mit diesen Minimal- und Maximalwerten geben würde, aber es ist, wie es ist. Die obige Aussage könnte auch auf weitere Datentypen zutreffen.

Ich danke Ihnen für Ihre Hilfe.

0.00001 ist dasselbe wie 1 e-5 ist ein Exponentenformat. Die zusätzlichen Ziffern am Ende, die 6551 sind äquivalent zu 0.00000000000000006551 und das ist der Grund, warum wir Probleme haben, Doubles zu vergleichen . . Sie müssen dies lesen und ggf. recherchieren, damit Sie verstehen, was hier vor sich geht:Kann Preis != Preis ?
Can price != price ? - MQL4 forum
  • www.mql5.com
Can price != price ? - MQL4 forum
 
RaptorUK:
0.00001 ist dasselbe wie 1 e-5 ist ein Exponentenformat. Die zusätzlichen Ziffern am Ende, die 6551, sind äquivalent zu 0.00000000000000006551 und das ist der Grund, warum wir Probleme beim Vergleich von Doubles haben . . Sie müssen dies lesen, und recherchieren, wenn Sie müssen, so dass Sie verstehen, was los ist:Kann Preis != Preis ?

Simon,

Vielen Dank, ich lese den Thread und glaube, dass die allgemeine Lösung der beteiligten mql4-Thread-Poster für den Doppelvergleich darin bestand, eine Methode zum Runden dieser Doppelwerte zu finden und zu verwenden, um korrekte Werte zurückzugeben. Was sagen Sie dazu?

Dankeschön

 
WhooDoo22:

Simon,

Vielen Dank, ich lese den Thread und glaube, dass die allgemeine Lösung der beteiligten mql4-Thread-Poster für den Doppelvergleich darin bestand, eine Methode zum Runden dieser Doppelwerte zu finden und zu verwenden, um korrekte Werte zurückzugeben. Was sagen Sie dazu?

Ich danke Ihnen

Im Kontext deines obigen Beitrags ist der Vergleich von Doubles nicht wichtig, wichtig ist das Verständnis, warum man nicht einfach Doubles vergleichen kann.
 
RaptorUK:
Im Zusammenhang mit Ihrem obigen Beitrag ist der Vergleich von Doppelzahlen nicht wichtig, wichtig ist, zu verstehen, warum man Doppelzahlen nicht einfach vergleichen kann.

Und warum? Weil ich glaube, dass die Kurswerte in einem vier- und fünfstelligen Format zurückgegeben werden (mit Ausnahmen wie USDJPY, der zwei- und dreistellige Kurswerte zurückgibt). Ich werde versuchen, das Ganze ein für alle Mal aufzuschlüsseln, weil ich das nicht länger als nötig hinauszögern möchte.

Der Geldkurs von USDCHF liegt derzeit bei 0,92909 und ich glaube, dass MetaTrader5 diese Kurswerte mit sechzehn Stellen hinter dem Komma berechnet. Wenn dies der Fall ist, dann gibt es elf Stellen nach der letzten Ziffer neun, die in die Berechnung des USDCHF-Kurses von 0,9290900000000000 einfließen. Ich denke, der Grund dafür, dass Doppelwerte nicht einfach verglichen werden können, liegt darin, dass der Rest der Stellen rechts vom Dezimalwert eines Preises (nicht die im Terminal lesbaren, sondern die nicht im Terminal lesbaren) Ungleichheitsprobleme verursachen.

Ich danke Ihnen

 
WhooDoo22:

Und warum? Weil ich glaube, dass die Kurswerte in einem vier- und fünfstelligen Format zurückgegeben werden (mit Ausnahmen wie USDJPY, der zwei- und dreistellige Kurswerte zurückgibt). Ich werde versuchen, das Problem ein für alle Mal zu lösen, denn ich möchte es nicht länger als nötig hinauszögern.

Der Geldkurs von USDCHF liegt derzeit bei 0,92909 und ich glaube, dass MetaTrader5 diese Kurswerte mit sechzehn Stellen hinter dem Komma berechnet. Wenn dies der Fall ist, dann gibt es elf Stellen nach der letzten Ziffer von neun, die in die Berechnung des USDCHF-Kurses von 0,9290900000000000 einfließen. Ich denke, der Grund dafür, dass Doppelstunden nicht einfach verglichen werden können, liegt darin, dass die restlichen Stellen rechts vom Dezimalwert eines Preises (nicht die im Terminal lesbaren, sondern die im Terminal nicht lesbaren) ein Problem der Ungleichheit verursachen.

Ich danke Ihnen

Das Problem mit Double liegt in ihrer binären Darstellung. Es gibt Double, die keine exakte binäre Darstellung haben, so dass man Dinge wie 1.000000000006551e-005 erhält. Ich gehe hier nicht auf eine ausführliche Erklärung ein, bei Interesse können Sie dies als Beispiel lesen.
Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:

Und warum?

Es ist alles auf der ersten Seite des Threads erklärt ich gab einen Link zu, im Wesentlichen; ein Wert von 1,57373 kann tatsächlich als Double-Wert von 1,5737300000000001 gehalten werden, während NormalizeDouble(1.57373, 5) könnte eine doppelte Wert von 1 produzieren.57372999999999 ergeben könnte, sind beide Werte, auf die nächste 5. Stelle gerundet, gleich, aber im direkten Vergleich sind sie nicht gleich ... das liegt daran, wie Double-Werte gespeichert werden, sie sind Fließkommazahlen (siehe Fließkommazahlen, lesen und verstehen) und oft ist der gespeicherte Wert nicht genau derselbe wie der Wert, von dem Sie glauben, dass er gespeichert wird.

Ihr Kommentar zeigt also eine Subtraktion zweier Doppelwerte und Sie sehen die Differenz als 1.0000000000xyz -e5, weil Doppelwerte so gespeichert werden - als Fließkommazahlen.

Articles - Understanding Floating Point Number Representation - Cprogramming.com
Articles - Understanding Floating Point Number Representation - Cprogramming.com
  • www.cprogramming.com
Floating point representations vary from machine to machine, as I've implied. Fortunately one is by far the most common these days: the IEEE-754 standard. This standard is prevalent enough that it's worthwhile to look at it in depth; chances are good you'd be able to use this information on your platform (look for ieee754.h). An IEEE-754...
 
angevoyageur:
Das Problem mit Double kommt von ihrer binären Darstellung. Es gibt Double, die keine exakte binäre Darstellung haben, so dass man Dinge wie 1.000000000006551e-005 erhält. Ich gehe hier nicht auf eine ausführliche Erklärung ein, bei Interesse können Sie dies als Beispiel lesen.

Die sechzehnte Stelle von 1,000000000006551e-005 rechts vom Dezimalwert ist e-005.

Wollen Sie damit sagen, dass 1.000000000006551e-005 keine exakte binäre Darstellung hat, weil die sechzehnte Stelle rechts vom Dezimalwert keine ganze Zahl ist, sondern e-005?


"Ich gehe hier nicht auf detaillierte Erklärungen ein ."

Warum nicht? Wenn Sie eine ausführliche Erklärung schreiben wollen, dann tun Sie das bitte.


"Wenn Sie Interesse haben, können Sie zum Beispiel das hier lesen."

Ich habe begonnen, es zu lesen.

Vielen Dank!

Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:


"Ich gebe hier keine detaillierten Erklärungen ab."

Warum nicht? Wenn Sie eine ausführliche Erklärung schreiben wollen, dann tun Sie das bitte.


Erinnern Sie sich an eine Diskussion, die wir über die grundlegenden Dinge hatten, die Sie wissen sollten, wenn Sie in der Lage sein wollen, richtig zu programmieren? Fließkommazahlen gehören dazu ...DYOR, es gibt viele Informationen da draußen, finden Sie sie, lesen Sie sie, verstehen Sie sie, dann werden Sie in der Lage sein, ein wenig besser zu programmieren.
DYOR
DYOR
  • acronyms.thefreedictionary.com
What does DYOR stand for?
 
WhooDoo22:

Die sechzehnte Stelle hinter dem Komma von 1,000000000006551e-005 ist e-005.

Wollen Sie damit sagen, dass 1.000000000006551e-005 keine exakte Binärdarstellung hat, weil die sechzehnte Stelle rechts vom Dezimalwert keine ganze Zahl ist, sondern e-005?


Nein. Wenn Sie meinen Link und/oder den von RaptorUK gelesen hätten, wäre Ihnen das klarer geworden. Wenn nicht, lesen Sie noch einmal :-D

1.000000000006551e-005 ist einfach eine andere Schreibweise für 0.00001000000000006551.

 
RaptorUK:

Es ist alles auf der ersten Seite des Threads erklärte ich einen Link zu, im Wesentlichen; ein Wert von 1,57373 kann tatsächlich als Double-Wert von 1,5737300000000001 gehalten werden, während NormalizeDouble(1.57373, 5) könnte ein Double-Wert von 1.57372999999999 ergeben könnte, sind beide Werte, auf die nächste 5. Stelle gerundet, gleich, aber im direkten Vergleich sind sie nicht gleich ... das liegt daran, wie Double-Werte gespeichert werden, sie sind Fließkommazahlen (siehe Fließkommazahlen, lesen und verstehen) und oft ist der gespeicherte Wert nicht genau derselbe wie der Wert, von dem Sie glauben, dass er gespeichert wird.

Ihr Kommentar zeigt also eine Subtraktion zweier Doppelwerte und Sie sehen die Differenz als 1.0000000000xyz -e5, weil Doppelwerte so gespeichert werden - als Fließkommazahlen.

1.57373 (ignorieren)

1.5737300000000001

1.5737299999999999

"beide Werte, auf die nächste 5. Stelle gerundet, sind gleich"

Beide Werte, gerundet auf die nächste 5. Stelle, sind gleich 1,57373.


"aber direkt verglichen sind sie nicht gleich"

Ja, weil es einen Unterschied gibt.


"so werden doppelte Werte gespeichert"

Double-Werte wie 1.5737300000000001 werden als 1.57373 gespeichert (wenn normalize double verwendet wird, nehme ich an). Wenn normalize double nicht verwendet wird, würde der Double-Wert 1.5737300000000001 dieses Wertformat behalten, richtig?


"und oft ist der gespeicherte Wert nicht genau derselbe wie der Wert, von dem man glaubt, dass er gespeichert wird."

Meine letzte Aussage bezieht sich auch auf diese Aussage.


Ich werde den von Ihnen angegebenen Link lesen, vielen Dank dafür.

Vielen Dank!

Grund der Beschwerde: