Errori, bug, domande - pagina 1782

 
-Aleks-:

Quali funzionano?

La regola di perdere le cifre significative e riempirle con lavori casuali

Il risultato è lungo, ma nei calcoli intermedi del doppio ed è lì che si perdono cifre significative

(Cifre+1)*3-1=17

 
A100:

La regola di perdere le cifre significative e riempirle con lavori casuali

Il risultato è lungo, ma nei calcoli intermedi del doppio ed è lì che si perdono cifre significative

(Cifre+1)*3-1=17

Grazie per le informazioni.

Tuttavia, l'informazione è difficile da afferrare - cioè il numero può essere così, ma non si possono fare calcoli con esso?

Ecco un esempio di codice dove viene convertito da stringa a numero

long CalcY=StringToDouble("111111111111111111");
Print ("CalcY=",CalcY);

Stampa il numero 111111111111111104.

Cioè non ci sono calcoli qui o mi sbaglio?

È possibile gestire questi numeri o si tratta di limitazioni della lingua?

 
-Aleks-:

Quindi non ci sono calcoli qui, o mi sbaglio?

Un calcolo è una qualsiasi operazione (in questocaso una conversione). Per il numero specificato StringToDouble restituisce doppio con perdita di precisione

StringToInteger restituisce long, ma altre funzioni che operano con double non possono essere usate nei calcoli senza perdita di precisione, come NormalizeDouble, MathPow

 
A100:

Computazione - qualsiasi operazione (in questo caso una conversione). StringToDouble restituisce doppio - c'è una perdita di precisione

StringToInteger restituisce long, ma altre funzioni che operano con double non possono essere usate nei calcoli senza perdita di precisione, come NormalizeDouble, MathPow,

StringToInteger ha funzionato per esprimere il numero, ma poi diventa peggio, credo che il numero debba essere scomposto nei suoi componenti per le operazioni matematiche...

long CalcZ=StringToInteger("111111111111111111");
Print ("CalcZ=",CalcZ);

double Test=CalcZ;
Print ("Test=",Test);

Test=1.111111111111111e+17

 

Di nuovo, è scritto nell'helpdesk

INT_MAX

Valore massimo che può essere rappresentato dal tipo int

2147483647

Allora come ha fatto StringToInteger a eseguire la conversione e a memorizzarla in long se il numero è più grande del consentito?

 
-Aleks-:

Allora come ha fatto StringToInteger a convertire e memorizzare in long se il numero è più grande del consentito?

StringToInteger originariamente restituisce long entroLONG_MINLONG_MAX(potrebbe anche essere chiamato StringToColobok)

 
A100:
StringToInteger originariamente restituisce long (avrebbe anche potuto essere chiamato StringToBoob)

Certo, questo è probabilmente vero, ma nell'aiuto è così confuso

"

Converte una stringa contenente una rappresentazione a caratteri di un numero in un numero int(intero).

"

È questo che mi ha fuorviato.

Grazie per le informazioni.

Immagino che la rappresentazione dei numeri di cui sopra non entrerà nel buffer grafico?

 
-Aleks-:

Suppongo che il numero di cui sopra non entrerà nel buffer grafico?

Sono scritti come B'1111111111111111111111111111111111111111'

 
A100:

Affermo (e suggerisco di controllare) che quando il timeframe viene cambiato da M5 a M15 nessun comando M5 Deinit viene inviato al primo indicatore (e solo ad esso - in questo caso M5) e non si scaricherà dal grafico finché l'utente non cancella l'EA

Glory ha ragione e lo scarico funziona correttamente.

Si noti che in MT5, il nucleo di calcolo dell'indicatore è una risorsa condivisa con un contatore di utilizzo nel proprio gestore. Se diversi programmi o finestre utilizzano l'indicatore con gli stessi parametri, una copia di calcolo con il contatore di utilizzo funziona effettivamente. Questo fa risparmiare molto denaro quando un trader usa gli stessi indicatori nei grafici e in un Expert Advisor.

Il gestore di indicatori è progettato in modo da rimuovere fisicamente gli indicatori in modo asincrono e con un ritardo. E nel frattempo, viene creata una nuova copia di lavoro con nuovi parametri, che spesso viene inizializzata prima che la vecchia copia venga fisicamente cancellata.
 
Renat Fatkhullin:
Il gestore di indicatori è progettato in modo da rimuovere fisicamente gli indicatori in modo asincrono e con un ritardo. E nel frattempo viene creata una nuova copia di lavoro con nuovi parametri, che spesso viene inizializzata prima che la vecchia copia venga fisicamente cancellata.

Semplifichiamo l'indicatore

//Test_i.mq5 //Индикатор
void Prn( string f, int i = -1 ) { Print( f, "->", StringSubstr( EnumToString( Period()), 7 ), (i == -1 ? "" : ":" + i )); }
void OnInit()                    { Prn( __FUNCTION__ );         }
void OnDeinit( const int reason ) { Prn( __FUNCTION__, reason ); }
int OnCalculate( const int, const int, const int, const double& [] ) { return 0; }

Alleghiamo il Test.mq5 al grafico M5 e poi cambiamo il periodo del grafico da M5->M15

Risultato:

2017.02.06 00:54:20.897 OnInit->M5
2017.02.06 00:54:25.553 OnInit->M15

Domanda: quando sarà chiamato OnDeinit->M5 ?

La mia risposta: mai!

La tua risposta sopra: in modo asincrono e con un ritardo

File:
Test.mq5  1 kb
Motivazione: