
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
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 è 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
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 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
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
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.
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
"Non entro qui in spiegazioni dettagliate".
Perché no? Se volete scrivere una spiegazione dettagliata, allora fatelo pure.
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.
È 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...