Kann Preis != Preis ? - Seite 3

 
WHRoeder:
Viel Rechenarbeit anstelle der einfachen Lösung
Ob einfach oder nicht, hängt von dem Code ab, in den es implementiert werden muss.
 
RaptorUK:

Ich bin zu dieser Lösung gekommen, die Doubles in Ints umwandelt, um Doubles zu vergleichen. . .

Auch ich habe eine kreative Lösung gefunden, die mir (bisher) beim Vergleich von Preisen geholfen hat:

int ConvertToPoints (double _price) {
   double price_double = _price / Point;
   int price_int = MathRound(price_double);
      
   return (price_int);
}

Ich skaliere den Preis zu einem int, der den Preis in Punkten als ganze Zahl ausdrückt:

ConvertToPoints(price) != ConvertToPoints(price)

kann niemals wahr sein.

 
IstCompareDoubles() aus stdlib.mq4 für diese Diskussion disqualifiziert? Es funktioniert gut für mich, wenn es für den Preis verwendet wird.
 
Ovo:
IstCompareDoubles() aus stdlib.mq4 für diese Diskussion disqualifiziert? Für mich funktioniert es gut, wenn es für den Preis verwendet wird.
Disqualifiziert? Nein, aber alles, was es tut, ist ein Vergleich für die Gleichheit.
 
Thirteen:
ConvertToPoints(price) != ConvertToPoints(price)

Eine Gleitkommadivision, eine Gleitkommaddition, eine Konvertierung nach int, ein Funktionsaufruf (copy, jump, return = 3,) * 2, alles mal zwei. (18) Und das unter der Annahme, dass Dividieren und Konvertieren mit den anderen Operationen gleichwertig sind - das sind sie nicht.

gegen

if (MathAbs(a - b) > Point / 2.)

eine Subtraktion, ein Test, 1/2 Negieren (im Durchschnitt) und Vergleich. (3 1/2, wenn point/2 in init durchgeführt wird und ABS durch ein IF ersetzt wird)

Die Dinge nicht zu sehr verkomplizieren

Könnte bei Gleichheit aufgrund von Abrundungen ausgelöst werden
if (a > b)
a ist definitiv größer als b
if (a - b > Point / 2.)
Könnte ausgelöst werden, wenn a aufgrund von Abrundung kleiner als b ist
if (a >= b)
a ist definitiv >= b
if (a - b > -Point/2.)
if (a > b -Point/2.)
if (a +Point/2. > b)
Wird bei jedem Rundungsfehler ausgelöst
if (a != b)
Eindeutig nicht gleich
if (MathAbs(a - b) > Point / 2.)
 
WHRoeder:

Eine fließende Division, fließende Addition, Umwandlung in int, Funktionsaufruf (copy, jump, return = 3,) * 2 mal zwei. (18) Und das unter der Annahme, dass Dividieren und Konvertieren mit den anderen Operationen gleichwertig sind - das sind sie nicht.

gegen

eine Subtraktion, ein Test, 1/2 Negieren (im Durchschnitt) und Vergleich. (3 1/2, wenn point/2 in init durchgeführt wird und ABS durch ein IF ersetzt wird)

Die Dinge nicht zu sehr verkomplizieren

2013.04.03 17:39:12 TestSpeed-CompareDbls USDJPY,M5: MathAbs(a - b) 9000000 mal in 266 ms.


2013.04.03 17:39:11 TestSpeed-CompareDbls USDJPY,M5: ConvertToPoints 9000000 mal in 1887 ms.

2013.04.03 17:46:02 TestSpeed-CompareDbls USDJPY,M5: Flat(price) 9000000 mal in 3604 ms.

"MathAbs(a-b)"-Methode ist ca. 7 mal schneller als ConvertToPoints() und fast 14 mal schneller als meine "Flat()"-Methode

 
Zur Information: Mit MQL5 können Sie Standardoperatoren überladen, was die Implementierung sehr eleganter Lösungenermöglicht .
 
Ich habe getestet (intRecord > Preis/Punkt) und
      intCheck = price /point;
      if (intRecord > intCheck) continue;

2013.04.04 14:27:38 TestSpeed-CompareDbls EURUSD,H4: MathAbs(a - b) HalfAPoint 99999999 mal in 3403 ms.

2013.04.04 14:27:42 TestSpeed-CompareDbls EURUSD,H4: (intRecord > intCheck) 99999999 mal in 2505 ms.

2013.04.04 14:27:40 TestSpeed-CompareDbls EURUSD,H4: intRecord > price /point 99999999 mal in 1712 ms.

Aber die 3. kann nicht praktikabel sein, und die 2. (intRecord > intCheck) hatte 1 Zuordnung mehr innerhalb für die intCheck vor dem Vergleich.


 
rfb:
Ich habe getestet (intRecord > Preis/Punkt) und

2013.04.04 14:27:38 TestSpeed-CompareDbls EURUSD,H4: MathAbs(a - b) HalfAPoint 99999999 mal in 3403 ms.

2013.04.04 14:27:42 TestSpeed-CompareDbls EURUSD,H4: (intRecord > intCheck) 99999999 mal in 2505 ms.

2013.04.04 14:27:40 TestSpeed-CompareDbls EURUSD,H4: intRecord > price /point 99999999 mal in 1712 ms.

Aber die 3. kann nicht praktikabel sein, und die 2. (intRecord > intCheck) hatte 1 Zuordnung mehr innerhalb für die intCheck vor dem Vergleich.


Was ist intRecord?
 
Wie "int intCheck", jedoch wird der Wert vor der Funktion zugewiesen, wie bei anderen Variablen.