Double vs FLOAT - unklarer MathFloor-Fehler - Seite 6

 
fxsaber:
Ja.
Dankeschön
 
Vladislav Andruschenko:
Dankeschön
Auf der ersten Seite gab es eine Lösung... Es steht bereits auf Seite 6.
 
fxsaber:
Warum funktioniert es dann ohne Normalisierung und MathFloor?
Wenn die Eingabe 0,95?
 
Dmitry Fedoseev:
Wenn die Eingabe 0,95?
Das verstehe ich nicht.
 
Vladislav Andruschenko:
Ich bin mir zwar nicht ganz sicher, was ich kaufen soll, aber sehen Sie sich diese Option an
void OnStart()
{
double ask2 = 1.55557, ask3 = 1.55558, bid = 1.55555;
  Print("(ask2 + bid)/2 = ", (ask2 + bid)/2);
   Print("(ask3 + bid)/2 = ", (ask3 + bid)/2);
    int avPrice_2 = (int)NormalizeDouble((ask2/_Point + bid/_Point)/2, 0);
   int avPrice_3 = (int)NormalizeDouble((ask3/_Point + bid/_Point)/2, 0);
  Print("avPrice_2 = ", avPrice_2);
Print("avPrice_3 = ", avPrice_3);
}/*******************************************************************/
Ergebnis
2017.02.27 00:03:54.453 00 (EURUSD.m,H1)        (ask2 + bid)/2 = 1.55556
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        (ask3 + bid)/2 = 1.555565
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        avPrice_2 = 155556
2017.02.27 00:03:54.456 00 (EURUSD.m,H1)        avPrice_3 = 155557
 

"Nehmen Sie Ask und Bid und berechnen Sie den Durchschnittspreis. Wenn die Spanne ungerade ist (3,5,7,9, usw.), dann wird der Durchschnittspreis näher am Geldkurs angesetzt."

Die Aufgabe ist nicht gestellt:

- Was bedeutet eine ungerade Streuung? 1,3,...,9 mal Punkt oder 1,3,...,17,57 mal Punkt? Rundungen funktionieren auch innerhalb von Einheitssegmenten...

- Was bedeutet "näher am Gebot"? Vor allem, wenn die Spanne zum Beispiel 43 mal Punkt beträgt. Womit soll das Gebot gleichgesetzt werden?

Sie brauchen zunächst Klarheit über das Problem, erst dann kann eine eindeutige Entscheidung getroffen werden.

Da es sich aber um gerade/ungerade Zahlen handelt, wäre es logisch, zu den ganzen Zahlen überzugehen, wo dieses Konzept Sinn macht.

double Ask,Bid,Middle; // Уже известные курсы Ask и Bid, вычисляемый средний курс
int Mash,Spr; // Множитель перехода к целым числам. Для 4-разрядного EURUSD 10000. И целочисленный спред

Mash=MathRound(1.0/_Point);
Spr=MathRound((Ask-Bid)*Mash); // Целочисленный спред
// Придаем конкретность среднему курсу.  Предполагаем, что "ближе к Бид" значит "ближайший меньший среднего арифметического Ask и Bid, кратный Point"
Spr=Spr >> 1; // Целочисленный спред, деленный на 2 с отбрасыванием остатка
Middle=Bid+Spr*_Point;


// Если предположение неверно, канва последующих разборов такая
if ((Spr &  1)  != 0)) {  // Спред нечетный
  }
else {  // Спред четный
  }

 
Ich hatte etwas Ähnliches in einer sehr einfachen Aufgabe - das Skript las den EURUSD-Eröffnungskurs aus der Zeitreihe in ein verdoppeltes Array und schrieb dieses Array dann in eine Datei. Solange der Preis größer als eins war, war alles in Ordnung. Aber wenn im Jahr Null der Preis unter 1 fiel, was manchmal nicht sehr oft geschah, etwa 20 Mal pro Jahr, begannen einige seltsame Dinge zu geschehen - irgendwo in der 15. Es ist keine große Sache, aber es ist nicht schön. Normalisierung tat es überall und nach dem Lesen und vor dem Schreiben in die Datei und während der Aufzeichnung, und die Konvertierung von einem Array in ein anderes mit Normalisierung - nichts funktionierte. Wenn ich beim Lesen von Zeitreihen 1 hinzufügte, war alles in Ordnung. Irgendwann hatte ich die Nase voll davon, wechselte von Dowble auf Float und beruhigte mich.
 
Vladimir:

"Nehmen Sie Ask und Bid und berechnen Sie den Durchschnittspreis. Wenn die Spanne ungerade ist (3,5,7,9, usw.), dann wird der Durchschnittspreis näher am Geldkurs angesetzt."

Die Aufgabe ist nicht gestellt:

In der Tat scheint die Aufgabe einfach zu sein? und sie kann von einem Schuljungen erledigt werden? :-) Das dachte ich auch.

Aber bei der Preisgestaltung auf dem Server, der Datennormalisierung und dem Rest gibt es dunkle Ecken, die man gar nicht meint.

Ich programmiere seit 9 Jahren in mql - und ich hatte noch nie ein Problem mit der Normalisierung, weil ich es richtig gemacht habe. und die Genauigkeit auf 1 Millipunkt hat immer richtig funktioniert.

Aber es gibt Aufgaben, die eine hohe Genauigkeit erfordern.

Und es gibt Bedingungen.

Nämlich:

  1. Wir nehmen den ASC- und BID-Preis und berechnen den Durchschnittspreis = einfach? ok.
  2. Wenn die Spanne also ungerade ist (z. B. 3 Punkte), können wir nicht ohne Rest teilen, richtig?

Wir müssen also den Preis so normalisieren, dass wir, wenn es einen Rückstand gibt (und den wird es auch bei einer gleichmäßigen Spanne geben! :-)), den Durchschnittspreis näher am Tiefpunkt, d. h. am Geldkurs, ansetzen.

Zum Beispiel:

  • asc = 1,23455 bid = 1,23457 spread = 2 Durchschnittspreis: 1,23456
  • Ask = 1,23455 Bid = 1,23458 Spread = 3 Durchschnittspreis: 1,23456
  • ask = 1,23455 bid = 1,23459 spread = 4 Durchschnittspreis: 1,23457

Und alles scheint so einfach zu sein? Alles sollte funktionieren und ich bin selbst ein Narr? und ich saß 2 Tage lang in der Hoffnung, dass ich kein Narr bin. Verstehen über Schwänze und Dabbles und Tribbles und Bibbles..................

Aber! mit der gleichen Formel, mit geraden und ungeraden Streuungen - in einigen Situationen - hat die Formel nicht funktioniert . (siehe oben) .

Außerdem kann es bei Währungen funktionieren und bei Öl nicht.

Es kann sein, dass es bei JPY funktioniert und bei USD irgendwann nicht mehr.

Vielleicht ist es der Einfluss des Mondes? Das Wetter in Afrika .................

Aber wenn man sich sicher ist, dass die Formel funktioniert, merkt man nicht, dass 1 Millipunkt. und Sie arbeiten auf..... und dann "Bang, bang, bang, bang" und dieser Millipunkt, beschließt, wegzulaufen, oder rufen Sie den zweiten Millipunkt, der in den Weg kommt.

IMHO.

Sie können mich für einen Dummkopf halten, einen Unterprogrammierer, einen Schuljungen.... und so weiter.

Aber es bleibt eine Tatsache.

Bei verschiedenen Kombinationen von Doppelwerten tritt ein Fehler auf. Gleichzeitig ist alles klar mit Float.

Ich habe es noch nicht herausgefunden. Hilfe ist sehr gut, und ich bitte immer um Hilfe, das ist normal. Und ich werde vielleicht in 10 Jahren die Gemeinschaft um Hilfe bitten. Das ist normal. Und ich reagiere auf einen Hilferuf, wenn ich die Fallstricke kenne - das ist normal.

Natürlich werde ich nach solchen Tests "zusätzliche Untersuchungen" durchführen, um selbst zu verstehen, warum dies der Fall ist.

Ich danke Ihnen allen für Ihr Entgegenkommen und Ihre Hilfe.

 
Vladislav Andruschenko:

In der Tat scheint die Aufgabe einfach zu sein? und sie kann von einem Schuljungen erledigt werden? :-) Das dachte ich auch.

Aber es gibt solche dunklen Ecken in den vom Server erhaltenen Preisen, in der Datennormalisierung und dem Rest - die Sie nicht einmal meinen.

Ich programmiere seit 9 Jahren in mql - und ich hatte noch nie ein Problem mit der Normalisierung, weil ich es richtig gemacht habe. und die Genauigkeit auf 1 Millipunkt hat immer richtig funktioniert.

Aber! mit der gleichen Formel, mit geraden und ungeraden Streuungen - in einigen Situationen - hat die Formel nicht funktioniert . (siehe oben) .

Bei anderen Kombinationen - mit doppelten Werten - tritt ein Fehler auf. Gleichzeitig ist mit Float alles klar.

Was hat die Normalisierung der Daten nach Metacvotes überhaupt damit zu tun? Dieser Begriff bedeutet für Programmierer unterschiedliche Dinge und keineswegs Rundung. Lesen Sie den IEEE-Standard 754 zum Beispiel hier:http://www.softelectro.ru/ieee754.html. Unnormierte reelle Zahlen reichen bis zu 1,17549421*10^(-38) im Falle einer 4-Byte-Länge und bis zu 4....*10^(-324) im Falle einer 8-Byte-Länge, wir begegnen ihnen sehr selten und schon gar nicht in Kursrechnungen. Wenn Sie OrderSend aufrufen müssen, dann runden Sie es entsprechend den Anforderungen dieser Funktion. Die Rundung ist erst dann erforderlich, wenn die Aufgabe es erfordert.

Die Fehler liegen nicht im Double- oder Float-Format, sondern in den verwendeten Operationen. Die Tatsache, dass die Formel die Aufgabe nicht gelöst hat, zeigt Ihnen, dass sie für die Aufgabe nicht geeignet ist. Nicht mehr als das. Sagen Sie mir, welche Fehler bei einer normalen Berechnung ohne Normalisierung auftreten (das ist der Teil aus meinem Beitrag oben):

Spr=MathRound((Ask-Bid)/_Point); Spr=Spr >> 1; Middle=Bid+Spr*_Point;

IEEE 754 - стандарт двоичной арифметики с плавающей точкой
  • Yashkardin Vladimir
  • www.softelectro.ru
double-precision длина числа, бит 32 64 смещенная экспонента (E), бит 8 11 остаток от мантиссы (M), бит 23 52 смещение 127 1023 двоичное денормализованое число (-1)S∙0,M∙exp2-127 ,где M-бинарное (-1)S∙0,M∙exp2-1023 ,где M-бинарное двоичное нормализованое число (-1)S∙1,M∙exp2(E-127) ,где M-бинарное (-1)S∙1,M∙exp2(E-1023) ,где M-бинарное...
 
Vladislav Andruschenko:

Die Aufgabe scheint einfach zu sein und kann von einem Schuljungen erledigt werden? :-) Das dachte ich auch.

Aber es gibt solche dunklen Ecken in den vom Server erhaltenen Preisen, in der Datennormalisierung und dem Rest - die Sie nicht einmal meinen.

Ich programmiere seit 9 Jahren in mql - und ich hatte noch nie ein Problem mit der Normalisierung, weil ich es richtig gemacht habe. und die Genauigkeit auf 1 Millipunkt hat immer richtig funktioniert.

Aber es gibt Aufgaben, die eine hohe Genauigkeit erfordern.

Und es gibt Bedingungen.

Nämlich:

  1. Wir nehmen den ASC- und BID-Preis - wir berechnen den Durchschnittspreis = einfach? ok.
  2. Wenn die Spanne also ungerade ist (z. B. 3 Punkte), können wir nicht ohne Rest teilen, richtig?

Wir müssen also den Preis so normalisieren, dass wir, wenn es einen Rückstand gibt (und den wird es auch bei einer gleichmäßigen Spanne geben! :-)), den Durchschnittspreis näher am Tiefpunkt, d. h. am Geldkurs, ansetzen.

Zum Beispiel:

  • asc = 1,23455 bid = 1,23457 spread = 2 Durchschnittspreis: 1,23456
  • Ask = 1,23455 Bid = 1,23458 Spread = 3 Durchschnittspreis: 1,23456
  • ask = 1,23455 bid = 1,23459 spread = 4 Durchschnittspreis: 1,23457

Und alles scheint so einfach zu sein? Alles sollte funktionieren und ich bin selbst ein Narr? und ich saß 2 Tage lang in der Hoffnung, dass ich kein Narr bin. Verstehen über Schwänze und Dabbles und Tribbles und Bibbles..................

Aber! mit der gleichen Formel, mit geraden und ungeraden Streuungen - in einigen Situationen - hat die Formel nicht funktioniert . (siehe oben) .

Außerdem kann es bei Währungen funktionieren und bei Öl nicht.

Es kann sein, dass es bei JPY funktioniert und bei USD irgendwann nicht mehr.

Vielleicht ist es der Einfluss des Mondes? Das Wetter in Afrika .................

Aber wenn man sich sicher ist, dass die Formel funktioniert, merkt man nicht, dass 1 Millipunkt. und Sie arbeiten auf..... und dann "Bang, bang, bang, bang" und dieser Millipunkt, beschließt, wegzulaufen, oder rufen Sie den zweiten Millipunkt, der in den Weg kommt.

IMHO.

Sie können mich für einen Dummkopf halten, einen Unterprogrammierer, einen Schuljungen.... und so weiter.

Aber es bleibt eine Tatsache.

Bei verschiedenen Kombinationen von Doppelwerten tritt ein Fehler auf. Gleichzeitig ist alles klar mit Float.

Ich habe es noch nicht herausgefunden. Hilfe ist sehr gut, und ich bitte immer darum, das ist normal. Und ich werde vielleicht in 10 Jahren um Hilfe von der Gemeinschaft bitten. Das ist normal. Und ich reagiere auf einen Hilferuf, wenn ich die Fallstricke kenne - das ist normal.

Natürlich werde ich nach solchen Tests "zusätzliche Untersuchungen" durchführen, um selbst zu verstehen, warum dies der Fall ist.

Ich danke Ihnen allen für Ihr Entgegenkommen und Ihre Hilfe.

Je nach Ihren Zielen lohnt es sich manchmal, ganz auf ganze Zahlen umzusteigen. Das spart eine Menge Nerven :-) Als ich einmal eine Aufgabe hatte, bei der ich viele, viele Stufen genau markieren musste, hatte ich zunächst Schwierigkeiten mit dem Doppelten, aber dann habe ich alles in ganzzahlige Punkte von 0 umgewandelt und alles wurde leicht, einfach und fehlerfrei.