mt5 strategia tester ticks - pagina 9

 
WhooDoo22:

Ciao comunità MQL5,

Qualcun altro ha incontrato numeri come questi durante l'esecuzione di strategie nel tester? -1.000000000006551e-005 e 1.000000000006551e-005 (sì, sono undici zeri). Deve essere un tipo specifico di formato doppio, ma quale tipo di formato doppio, hmm?

Inoltre, sto leggendo la documentazione di MQL5 come sì, ok, ok, il tipo di dati int standard ha un valore minimo di -2 147 483 648 e un valore massimo di 2 147 483 647 allora sì, naturalmente c'è il tipo di dati unsigned int con un valore minimo di 0 e un valore massimo di 4 294 967 295 MA ;) non c'è un tipo di dati int con un valore minimo di -4 294 967 295 e un valore massimo di 0. Avrei pensato che ci fosse un tipo di dati int con questi valori minimi e massimi ma è quello che è. L'affermazione precedente potrebbe applicarsi anche ad altri tipi di dati.

Grazie

0.00001 è lo stesso un 1 e-5 è un formato esponente. Le cifre extra alla fine, il 6551 sono equivalenti a 0.0000000000006551 e questo è il motivo per cui abbiamo problemi a confrontare i doppi . . dovete leggere questo, e fare qualche ricerca se necessario, in modo da capire cosa sta succedendo:Può il prezzo != prezzo ?
Can price != price ? - MQL4 forum
  • www.mql5.com
Can price != price ? - MQL4 forum
 
RaptorUK:
0.00001 è uguale a 1 e-5 è un formato esponenziale. Le cifre extra alla fine, il 6551 sono equivalenti a 0.0000000000006551 ed è per questo che abbiamo problemi a confrontare i doppi. . hai bisogno di leggere questo, e fare qualche ricerca se necessario, in modo da capire cosa sta succedendo:può prezzo != prezzo ?

Simon,

Molto obbligato, sto leggendo il thread e credo che la soluzione generale degli autori del thread mql4 coinvolti per il confronto dei doppi fosse di scoprire e utilizzare un metodo per arrotondare questi doppi in modo appropriato per restituire valori corretti. Cosa ne dite di questo?

Grazie a tutti

 
WhooDoo22:

Simon,

Molto obbligato, sto leggendo il thread e credo che la soluzione generale degli autori del thread mql4 coinvolti per il confronto dei doppi fosse di scoprire e utilizzare un metodo per arrotondare questi doppi in modo appropriato per restituire valori corretti. Cosa ne dici di questo?

Grazie a voi

Nel contesto del tuo post sopra il confronto dei doppi non è importante, capire perché non puoi semplicemente confrontare i doppi è ciò che è importante.
 
RaptorUK:
Nel contesto del tuo post sopra il confronto dei doppi non è importante, capire perché non si possono semplicemente confrontare i doppi è ciò che è importante.

Perché? Perché penso che i valori di prezzo siano restituiti in un formato di quattro e cinque cifre (con eccezioni come USDJPY che restituisce valori di prezzo di due e tre cifre). Cercherò di spiegarlo una volta per tutte perché non voglio trascinarlo più a lungo del necessario.

Il prezzo di offerta di USDCHF è attualmente 0,92909 e credo che il più lontano MetaTrader5 calcola questi valori di prezzo è sedici posti a destra del decimale, se questo è il caso allora ci sono undici posti dopo l'ultima cifra nove che vengono gettati nel calcolo del prezzo di USDCHF di 0,9290900000000000. Penso che la ragione per cui i doppi non possono essere semplicemente confrontati è perché il resto dei posti a destra del decimale di un prezzo (non quelli leggibili nel terminale ma quelli non leggibili nel terminale) causano problemi di disuguaglianza.

Grazie a tutti

 
WhooDoo22:

Perché? Perché credo che i valori di prezzo siano restituiti in un formato di quattro e cinque cifre (con eccezioni come USDJPY che restituisce valori di prezzo di due e tre cifre). Cercherò di risolvere il problema una volta per tutte perché non voglio trascinarlo più a lungo del necessario.

Il prezzo di offerta di USDCHF è attualmente 0,92909 e credo che il più lontano MetaTrader5 calcola questi valori di prezzo è sedici posti a destra del decimale, se questo è il caso allora ci sono undici posti dopo l'ultima cifra di nove che vengono gettati nel calcolo del prezzo di USDCHF di 0,9290900000000000. Penso che la ragione per cui i doppi non possono essere semplicemente confrontati è perché il resto dei posti a destra del decimale di un prezzo (non quelli leggibili nel terminale ma quelli non leggibili nel terminale) causano un problema di disuguaglianza.

Grazie a tutti

Il problema con i doppi viene dalla loro rappresentazione binaria. Ci sono doppi che non hanno una rappresentazione binaria esatta, quindi si ottengono cose come 1.000000000006551e-005. Non entro qui nella spiegazione dettagliata, se siete interessati potete leggere questo per esempio.
Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:

Perché?

È tutto spiegato nella prima pagina del thread di cui ho dato il link, in sostanza; un valore di 1.57373 può essere effettivamente tenuto come un valore doppio di 1.5737300000000001 mentre NormalizeDouble(1.5737373, 5) potrebbe produrre un valore doppio di 1.573729999999999999 entrambi i valori arrotondati alla quinta cifra più vicina sono uguali ma confrontati direttamente non sono uguali . ... questo è il modo in cui i valori doppi sono memorizzati, sono numeri in virgola mobile (cercate i numeri in virgola mobile, leggete e capite) e spesso il valore tenuto non è esattamente lo stesso del valore che pensate sia tenuto.

Quindi il tuo commento mostra una sottrazione di due doppi e tu vedi la differenza come 1.0000000000xyz -e5 questo perché questo è il modo in cui i doppi sono memorizzati - numeri in virgola mobile.

Articles - Understanding Floating Point Number Representation - Cprogramming.com
Articles - Understanding Floating Point Number Representation - Cprogramming.com
  • www.cprogramming.com
Floating point representations vary from machine to machine, as I've implied. Fortunately one is by far the most common these days: the IEEE-754 standard. This standard is prevalent enough that it's worthwhile to look at it in depth; chances are good you'd be able to use this information on your platform (look for ieee754.h). An IEEE-754...
 
angevoyageur:
Il problema con i doppi viene dalla loro rappresentazione binaria. Ci sono doppi che non hanno una rappresentazione binaria esatta, quindi si ottengono cose come 1.000000000006551e-005. Non entro qui nella spiegazione dettagliata, se interessati potete leggere questo per esempio.

Il sedicesimo posto a destra del decimale di 1.000000000006551e-005 è e-005.

Sta dicendo che 1.000000000006551e-005 non ha una rappresentazione binaria esatta perché il suo sedicesimo posto a destra del decimale non è un numero intero, è e-005?


"Non entro qui in una spiegazione dettagliata".

Perché no? Se volete scrivere una spiegazione dettagliata, allora fatelo pure.


"Se vi interessa potete leggere questo per esempio".

Ho iniziato a leggerlo.

Grazie

Double-precision floating-point format - Wikipedia, the free encyclopedia
Double-precision floating-point format - Wikipedia, the free encyclopedia
  • en.wikipedia.org
Double-precision floating-point format is a computer number format that occupies 8 bytes (64 bits) in computer memory and represents a wide dynamic range of values by using floating point. Computers with 32-bit storage locations use two memory locations to store a 64-bit double-precision number (a single storage location can hold a...
 
WhooDoo22:


"Non entro qui in spiegazioni dettagliate".

Perché no? Se volete scrivere una spiegazione dettagliata, allora fatelo pure.


Ti ricordi una discussione che abbiamo avuto sulle cose fondamentali di base che dovresti conoscere se vuoi essere in grado di codificare correttamente? I numeri in virgola mobile sono uno di questi...DYOR, ci sono un sacco di informazioni là fuori, trovale, leggile, comprendile e allora sarai in grado di codificare un po' meglio.
DYOR
DYOR
  • acronyms.thefreedictionary.com
What does DYOR stand for?
 
WhooDoo22:

Il sedicesimo posto a destra del decimale di 1.000000000006551e-005 è e-005.

Stai dicendo che 1.000000000006551e-005 non ha una rappresentazione binaria esatta perché il suo sedicesimo posto a destra del decimale non è un numero intero, è e-005?


No. Se leggessi il mio link e/o quello di RaptorUK, ti sarebbe più chiaro. Se no, leggi di nuovo :-D

1.000000000006551e-005 è semplicemente un'altra notazione per 0.000010000000006551.

 
RaptorUK:

È tutto spiegato nella prima pagina del thread a cui ho dato un link, in sostanza; un valore di 1.57373 può essere effettivamente tenuto come un valore doppio di 1.5737300000000001 mentre NormalizeDouble(1.5737373, 5) potrebbe produrre un valore doppio di 1.5737299999999999 entrambi i valori arrotondati alla quinta cifra più vicina sono uguali ma confrontati direttamente non sono uguali . ... questo è il modo in cui i valori doppi sono memorizzati, sono numeri in virgola mobile (cercate i numeri in virgola mobile, leggete e capite) e spesso il valore tenuto non è esattamente lo stesso del valore che pensate sia tenuto.

Quindi il tuo commento mostra una sottrazione di due doppi e tu vedi la differenza come 1.0000000000xyz -e5 questo perché questo è il modo in cui i doppi sono memorizzati - numeri in virgola mobile.

1.57373 (ignorare)

1.5737300000000001

1.5737299999999999

"entrambi i valori arrotondati alla quinta cifra più vicina sono uguali

Entrambi i valori arrotondati alla quinta cifra più vicina sono uguali a 1,57373.


"ma confrontati direttamente non sono uguali"

Sì, perché c'è una differenza.


"questo è il modo in cui vengono memorizzati i valori doppi"

Valori doppi come 1.5737300000000001 sono memorizzati come 1.57373 (se normalizza il doppio è usato, presumo). Se normalizza il doppio non viene usato, il valore doppio 1.5737300000000001 manterrebbe questo formato di valore, giusto?


"e spesso il valore tenuto non è esattamente lo stesso del valore che si pensa sia tenuto".

La mia ultima affermazione risponde anche a questa affermazione.


Leggerò il link che hai fornito, grazie.

Grazie, grazie...