Can price != price ? - page 3

 
WHRoeder:
Beaucoup de calculs au lieu d'une solution simple.
Simple ou non, cela dépend du code dans lequel il faut l'implémenter...
 
RaptorUK:

Je suis arrivé à cette solution qui transforme les doubles en ints dans le but de comparer les doubles . . .

J'ai moi aussi trouvé une solution créative qui a fonctionné pour moi (jusqu'à présent) pour comparer des prix :

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

J'élève le prix à un int qui représente le prix en points exprimés sous forme de nombre entier. Ainsi :

ConvertToPoints(price) != ConvertToPoints(price)

ne peut jamais être vrai.

 
CompareDoubles() de la stdlib.mq4 est-elle disqualifiée de cette discussion ? Il fonctionne bien pour moi s'il est utilisé pour le prix.
 
Ovo:
CompareDoubles() de la stdlib.mq4 est-elle disqualifiée de cette discussion ? Elle fonctionne bien pour moi si elle est utilisée pour le prix.
Disqualifié ? non, mais tout ce qu'il fait est une comparaison pour l'égalité.
 
Thirteen:
ConvertToPoints(price) != ConvertToPoints(price)

Une division flottante, une addition flottante, une conversion en int, un appel de fonction (copie, saut, retour = 3,) * 2 tous les temps deux. (18) Et cela en supposant que la division et la conversion sont sur un pied d'égalité avec les autres opérations - ce n'est pas le cas.

vs

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

une soustraction, un test, 1/2 négation (en moyenne,) et comparaison. (3 1/2 si point/2 est fait dans init et ABS est remplacé par un IF)

Ne pas trop compliquer les choses

Peut se déclencher en cas d'égalité à cause de l'arrondi
if (a > b)
a est définitivement plus grand que b
if (a - b > Point / 2.)
Peut se déclencher lorsque a est inférieur à b à cause de l'arrondi.
if (a >= b)
a est définitivement >= b
if (a - b > -Point/2.)
if (a > b -Point/2.)
if (a +Point/2. > b)
Se déclenchera sur toute erreur d'arrondi
if (a != b)
N'est certainement pas égal
if (MathAbs(a - b) > Point / 2.)
 
WHRoeder:

Une division flottante, une addition flottante, une conversion en int, un appel de fonction (copie, saut, retour = 3,) * 2 tous les temps deux. (18) Et cela en supposant que la division et la conversion sont au même niveau que les autres opérations - ce n'est pas le cas.

vs

une soustraction, un test, 1/2 négation (en moyenne,) et comparaison. (3 1/2 si point/2 est fait dans init et ABS est remplacé par un IF)

Ne pas trop compliquer les choses

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


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

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

"La méthode "MathAbs(a-b)" est environ 7 fois plus rapide que la méthode ConvertToPoints() et presque 14 fois plus rapide que ma méthode "Flat()

 
Pour information, avec MQL5, vous pouvez surcharger les opérateurs standards, ce qui permet de mettre en œuvre des solutions très élégantes.
 
J'ai testé (intRecord > price / point) et
      intCheck = price /point;
      if (intRecord > intCheck) continue;

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

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

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

Mais la 3ième ne peut pas être pratiquée, et la 2ième (intRecord > intCheck) avait 1 assignation de plus dans le intCheck avant la comparaison.


 
rfb:
J'ai testé (intRecord > price / point) et

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

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

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

Mais la 3ième ne peut pas être pratiquée, et la 2ième (intRecord > intCheck) avait 1 assignation de plus dans le intCheck avant la comparaison.


Qu'est-ce que intRecord ?
 
Identique à "int intCheck" mais valeur assignée avant la fonction, comme les autres variables.