Errori, bug, domande - pagina 2939

 
x572intraday:
Tutti i prezzi sono visualizzati con cinque cifre decimali, e uno per qualche motivo nella stessa lista lo prende così: perché? È un errore o il mio output dovrebbe essere modificato per avere un aspetto uniforme? Beh, diciamo che posso farlo con PrintFormat o fprint, ma in linea di principio non è una rappresentazione errata del numero?

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

Nikolai Semko, 2020.01.05 21:41

Ho sempre questa domanda.
Costantemente tutti parlano dello standard IEEE 754, ma le persone spesso, quando vanno su Wikipedia - sia a causa della complessità, sia per pigrizia lasciano senza capire il significato dello standard.

Dedicherò un po' di tempo per cercare di spiegare questa norma nel modo più breve possibile e con parole semplici, per fare ulteriore riferimento a questo post.


Quindi, il tipo doppio consiste di 8 byte = 64 bit.(float 4 byte = 32 bit)

E la rappresentazione numerica deldoppio e del float consiste di 3 componenti:segno, esponente e mantissa


DOPPIO:


GALLEGGIANTE:

Naturalmente non esiste una rappresentazione decimale dei numeri in questo formato, ma solo binaria.

  • Il segno è 1 bit. Se 0 è + (più), se 1 è - (meno).
  • L'esponente memorizza il grado per il numero 2. Può essere nell'intervallo da -12610 a 12710 per i float e da -1022 10 a 102310 per i double
  • La mantissa è la parte frazionaria del numero stesso in forma binaria, ridotta a una forma in cui la virgola sta dopo la prima unità senza tener conto di questa prima unità e della virgola


Un po' di comprensione della rappresentazione binaria dei numeri e la sua relazione con i numeri decimali:

2 4= 100002 = 1610

2 3= 10002 = 810

2 2= 1002 = 4

2 1=102= 2

2 0=12=110

2 -1= 0.12 =(1/2)10= 0.510

2 -2= 0.012 = (1/4)10= 0.2510

2 -3= 0.0012 = (1/8)10= 0.12510

2 -4= 0.00012 = (1/16)10= 0.062510

2 -5= 0.000012 = (1/32)10= 0.0312510

2 -6= 0.0000012 = (1/64)10= 0.01562510

2 -7= 0.00000012 = (1/128)10= 0.007812510

2 -8= 0.000000012 = (1/256)10= 0.0039062510

2 -9= 0.0000000012 = (1/512)10= 0.00195312510

2 - 10= 0.00000000012 = (1/1024)10= 0.000976562510

2 - 11= 0.000000000012 = (1/2048)10= 0.0004882812510

2 - 12= 0.0000000000012 = (1/4096)10= 0.00024414062510

2 - 13= 0.00000000000012 = (1/8192)10= 0.000122070312510

Rivediamo gli esempi per il doppio:

Esempio #1

Abbiamo un numero decimale: 891677.4025191

Questo numero può essere rappresentato in forma binaria:

110110011010110001010101.0110011100001011011101110111011000100000111111111010001110
(chi vuole può controllare))

Estraiamo la mantissa del numero dato semplicemente spostando la virgola 19 cifre a sinistra (in questo caso) in modo che venga dopo la prima unità.

1.1011001101100011101011001110000101101111101111000101000001111101110001110* 2 19

Ma abbiamo una mantissa di soli 52 bit. Quindi prendiamo i primi 52 bit significativi

Мантисса = 1011001101100011101011001110000101101111101111000101

Esponente = (19+1023)10 = 100000100102(poiché l'esponente è un numero firmato e l'esponente può essere negativo (per esempio se abbiamo 0,0000042132), dobbiamo aggiungere 1023 a 10(01111111111112), 011111111112 è zero, tutto ciò che è più è positivo, meno è negativo. In altre parole, per ottenere il valore inverso dell'esponente, dobbiamo sottrarre 1023 dal valore dell'esponente a 11 bit.

In totale, il nostro numero 891677.4025191 apparirà come segue in tipo doppio:

0100000100101011001101100011101011001110000101101111101111000101

Ma poiché questa è una rappresentazione binaria, convertiamola esattamente in decimale:

che sarebbe891677.402519099996425211429595947265625


Esempio #2

Abbiamo un numero decimale: -0.00000145258556224114

Questo numero può essere rappresentato in forma binaria:

-0.000000000000000000011000010111101100111010110111010011010101001111001110

Seleziona la mantissa di questo numero semplicemente spostando la virgola di 20 cifre a destra, in modo che si trovi dopo la prima unità.

1.1000010111101100111010110111010011010101001111001110 * 2 -20

Мантисса = 1000010111101100111010110111010011010101001111001110

esponente = (-20+1023)10=011111010112

segno meno, quindi il primo bit è 1.

Il nostro numero totale -0.00000145258556224114 apparirà come segue nel tipo doppio:

1011111010111000010111101100111010110111010011010101001111001110

convertirlo esattamente in decimale:

это будет -0.00000145258556224113991124017968015191826225418481044471263885498046875



Nel vostro caso, il problema si verifica con il numero 0,01, poiché nel tipo doppio sarà rappresentato nella forma:

0 01111111000 0100011110101110000101000111101011100001010001111011

che quando viene convertito nel sistema di notazione decimale è uguale a 0,010000000000000000208166817117216858513294309377670288085937510

Mentre con la rappresentazione

310 = 1.5*2 = 1.12*2 1

510 = 2.5*2 = 10.12*2 1

610 = 1.5*4 = 1.12*2 2

710 = 3.5*2 = 11.12*2 1

nessun problema.

Perché il numero doppio 0,01 è davvero maggiore di 0,01?

Ecco perché:

0 01111111000 01000111101101011101000010101111010111010101001010001111011 - 0.01000000000000000020816681711721685132943093776702880859375 errore = 0.000 000 000 000 000 000 000 208166817...

0 01111111000 01000111101101011100001010001111010 - 0.00999999999999999999984747344334114097569175064563751220703125 errore = - 0.000 000 000 000 000 001 5265566...

Per capire questo processo chimico si può giocare con queste calcolatrici:
https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html

https://baseconvert.com/ieee-754-floating-point


https://baseconvert.com/ieee-754-floating-point


 

Grazie, informativo. Beh, in pratica, le MQ avrebbero dovuto, ma sottocosto, o la decisione è stata lasciata all'utente?

 

C'è una funzione o qualche altra funzionalità aggiuntiva (libreria, codice) per salvare i parametri EA?

Il compito è quello di mettere del codice ondeinit, che, per esempio, quando si esegue l'EA su un simbolo (funzione aggiuntiva è anche l'analisi del periodo), salverebbe il file delle impostazioni impostate.

Per esempio - EA nome-simbolo-periodo.

File con la possibilità di sovrascrivere - solo le ultime impostazioni per il simbolo.

Per esempio, le impostazioni standard nel tester sono salvate per l'ultima esecuzione.

 
Buongiorno, problema su un computer remoto, non posso accedere al sito web di MQL5, quindi non posso scaricare l'indicatore che ho comprato. Non posso entrare nel sito MQL5, quindi non posso scaricare l'indicatore che ho comprato.
 
Slava Botalov:
Ciao, ho un problema su un computer remoto, non posso accedere al sito web MQL5 e quindi non posso scaricare l'indicatore che ho comprato. non posso scaricare l'indicatore che ho comprato.


ma un computer remoto su Zomro?

 
x572intraday:

Grazie, informativo. Beh, in pratica, le MQ dovrebbero avere, ma sottocosto, o la decisione è lasciata al giudizio dell'utente?

Quindi non l'hanno capito.
Non ci sono errori.
Tutto è come dovrebbe essere.
 
Vladislav Andruschenko:


ma un computer remoto su Zomro?

 
Slava Botalov:
Buongiorno, problema su un computer remoto, non posso accedere al sito web di MQL5, quindi non posso scaricare l'indicatore che ho comprato. Non posso scaricare l'indicatore, quindi non posso installarlo sul sito MQL5.
Vladislav Andruschenko:


ma un computer remoto su Zomro?

Slava Botalov:


Questo fornitore è bandito per cattiva condotta:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Perché l'accesso a www.mql4.com è bloccato?

Renat Fatkhullin, 2020.11.17 12:16

***

L'intero provider Zomro con le sottoreti è bloccato per massicce attività fraudolente dalle sue sottoreti.

***
 
Nikolai Semko:
Quindi non capiscono.
Non ci sono errori.
Tutto è come dovrebbe essere.

Non è questo il punto. La domanda è: dove può essere utile, specialmente per i commercianti, non per i programmatori? Non ho mai visto tali numeri nel terminale, né nella scala dei prezzi né nella finestra di inserimento dell'ordine; tutto lì è uguale dappertutto (da qualche parte cinque cifre, da qualche altra parte).

 
Vladimir Karputov:


Questo fornitore è stato bandito per cattiva condotta:

Peccato, dovremo passare a un altro, qualche suggerimento?