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)
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()
Un sacco di calcoli invece della soluzione semplice
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:
Ho scalato il prezzo ad un int che rappresenta il prezzo come punti espressi come un numero intero. Così:
non può mai essere vero.
CompareDoubles() da stdlib.mq4 è escluso da questa discussione? Per me funziona bene se usato per il prezzo.
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
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
if (a > b)if (a >= b)if (a != b)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: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()
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.
Ma la 3a non può essere praticabile, e la 2a (intRecord > intCheck) aveva 1 assegnazione in più per l'intCheck prima del confronto.
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.
Ma la 3a non può essere praticabile, e la 2a (intRecord > intCheck) aveva 1 assegnazione in più per l'intCheck prima del confronto.