Può il prezzo != prezzo ? - pagina 3

 
WHRoeder:
Un sacco di calcoli invece della soluzione semplice
Semplice o no è determinato dal codice in cui deve essere implementato.
 
RaptorUK:

Sono arrivato a questa soluzione che trasforma i doppi in ints allo scopo di confrontare i doppi . . .

Anch'io ho trovato una soluzione creativa che ha funzionato per me (finora) per confrontare i prezzi:

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

Ho scalato il prezzo ad un int che rappresenta il prezzo come punti espressi come un numero intero. Così:

ConvertToPoints(price) != ConvertToPoints(price)

non può mai essere vero.

 
CompareDoubles() da stdlib.mq4 è escluso da questa discussione? Per me funziona bene se usato per il prezzo.
 
Ovo:
CompareDoubles() da stdlib.mq4 è escluso da questa discussione? Per me funziona bene se usato per il prezzo.
Squalificato ? no, ma tutto quello che fa è un confronto per l'uguaglianza.
 
Thirteen:
ConvertToPoints(price) != ConvertToPoints(price)

Una divisione fluttuante, un'addizione fluttuante, una conversione in int, una chiamata di funzione (copia, salto, ritorno = 3,) * 2 tutte volte due. (18) E questo supponendo che dividere e convertire siano alla pari con le altre operazioni - non lo sono.

vs

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

una sottrazione, un test, 1/2 negazione (in media,) e confronto. (3 1/2 se point/2 è fatto in init e ABS è sostituito da un IF)

Non complicare troppo le cose

Potrebbe scattare quando è uguale a causa dell'arrotondamento
if (a > b)
a è sicuramente più grande di b
if (a - b > Point / 2.)
Potrebbe scattare quando a è minore di b a causa dell'arrotondamento
if (a >= b)
a è sicuramente >= b
if (a - b > -Point/2.)
if (a > b -Point/2.)
if (a +Point/2. > b)
Si attiverà su qualsiasi errore di arrotondamento
if (a != b)
Sicuramente non uguale
if (MathAbs(a - b) > Point / 2.)
 
WHRoeder:

Una divisione fluttuante, aggiunta fluttuante, conversione in int, chiamata di funzione (copia, salto, ritorno = 3,) * 2 tutte volte due. (18) E questo supponendo che dividere e convertire siano alla pari con le altre operazioni - non lo sono.

vs

una sottrazione, un test, 1/2 negazione (in media,) e confronto. (3 1/2 se point/2 è fatto in init e ABS è sostituito da un IF)

Non complicare troppo le cose

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


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

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

"Il metodo "MathAbs(a-b)" è circa 7 volte più veloce del metodo ConvertToPoints() e quasi 14 volte più veloce del mio metodo "Flat()

 
Per informazione, con MQL5, è possibile sovraccaricare gli operatori standard, questo permette di implementare soluzioni molto eleganti.
 
Ho testato (intRecord > prezzo / punto) e
      intCheck = price /point;
      if (intRecord > intCheck) continue;

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

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

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

Ma la 3a non può essere praticabile, e la 2a (intRecord > intCheck) aveva 1 assegnazione in più per l'intCheck prima del confronto.


 
rfb:
Ho testato (intRecord > prezzo / punto) e

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

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

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

Ma la 3a non può essere praticabile, e la 2a (intRecord > intCheck) aveva 1 assegnazione in più per l'intCheck prima del confronto.


Cos'è intRecord?
 
Uguale a "intCheck", ma assegnato al valore prima della funzione, come altre vars.