¿Puede el precio != el precio ? - página 3

 
WHRoeder:
A mucho cálculo en lugar de la solución simple
Sencillo o no está determinado por el código en el que hay que implementarlo....
 
RaptorUK:

He llegado a esta solución que convierte los dobles en ints para poder comparar los dobles . . .

Yo también llegué a una solución creativa que me ha funcionado (hasta ahora) para comparar precios:

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

Subo el precio a un int que representa el precio como puntos expresados como un número entero. Así:

ConvertToPoints(price) != ConvertToPoints(price)

nunca puede ser cierto.

 
¿EstáCompareDoubles() del stdlib.mq4 descalificado de esta discusión? A mí me funciona bien si se utiliza para el precio.
 
Ovo:
¿EstáCompareDoubles() del stdlib.mq4 descalificado de esta discusión? A mi me funciona bien si se usa para el precio.
¿Descalificado? no, pero todo lo que hace es una comparación para la igualdad.
 
Thirteen:
ConvertToPoints(price) != ConvertToPoints(price)

Una división flotante, una adición flotante, una conversión a int, una llamada a una función (copia, salto, retorno = 3,) * 2 todo por dos. (18) Y eso suponiendo que la división y la conversión estén a la par con las otras operaciones - no lo están.

vs

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

una resta, una prueba, 1/2 negación (en promedio,) y comparación. (3 1/2 si punto/2 se hace en init y ABS se sustituye por un IF)

No complicar demasiado las cosas

Podría disparar cuando es igual debido al redondeo
if (a > b)
a es definitivamente mayor que b
if (a - b > Point / 2.)
Podría disparar cuando a es menor que b debido al redondeo
if (a >= b)
a es definitivamente >= b
if (a - b > -Point/2.)
if (a > b -Point/2.)
if (a +Point/2. > b)
Se activará ante cualquier error de redondeo
if (a != b)
Definitivamente no es igual
if (MathAbs(a - b) > Point / 2.)
 
WHRoeder:

Una división flotante, una suma flotante, una conversión a int, una llamada a una función (copia, salto, retorno = 3,) * 2, todo ello por dos. (18) Y eso suponiendo que la división y la conversión estén a la par con las otras operaciones - no lo están.

vs

una resta, una prueba, 1/2 negación (en promedio,) y comparación. (3 1/2 si punto/2 se hace en init y ABS se sustituye por un IF)

No complique demasiado las cosas

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


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

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

El método "MathAbs(a-b)" es aproximadamente 7 veces más rápido que el método ConvertToPoints() y casi 14 veces más rápido que mi método "Flat()"

 
A título informativo, con MQL5 se pueden sobrecargar los operadores estándar, lo que permite implementar soluciones muy elegantes.
 
He probado (intRecord > precio / punto) y
      intCheck = price /point;
      if (intRecord > intCheck) continue;

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

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

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

Pero la 3ª no puede ser practicable, y la 2ª (intRecord > intCheck) tenía 1 asignación más dentro para el intCheck antes de la comparación.


 
rfb:
He probado (intRecord > precio / punto) y

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

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

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

Pero la 3ª no puede ser practicable, y la 2ª (intRecord > intCheck) tenía 1 asignación más dentro para el intCheck antes de la comparación.


¿Qué es intRecord?
 
Igual que "intCheck" pero con valor asignado antes de la función, como otras vars.