Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 95

 
Slava:

Sei sicuro di aver letto tutta la domanda?

...tra due chiamate a GetMicrosecondsCount...

Beh, è quello che sto dicendo. La prima chiamata avviene prima della sincronizzazione e la seconda dopo la sincronizzazione. La differenza sarà la stessa: il numero effettivo di microsecondi + la correzione della sincronizzazione.

 
Alexey Navoykov:

La prima chiamata è prima della sincronizzazione e la seconda chiamata è dopo la sincronizzazione. La differenza sarà uguale: il numero effettivo di microsecondi + la correzione della sincronizzazione.

Ora ditemi la probabilità di correzione del tempo tra due chiamate a GetMicrofsecondsCount?

Se si misurano davvero i microsecondi, la probabilità è vicina allo 0.

E voi misurate i microsecondi su intervalli di secondi o più? Perché? Spherocon nel vuoto?

 
Alexey Navoykov:

Ti sbagli, ho specificamente citato il codice qui usando WinApi. Eseguilo, cambia l'orologio nel processo e guarda il risultato.

Non è molto chiaro come condurre un qualsiasi dialogo con te, se i tuoi argomenti sono basati su congetture. E non consideri nemmeno necessario familiarizzare con il corso della discussione dell'argomento.

Sei tu che non hai idea del problema che hai sollevato.

Come ho detto, un cambiamento di tempo inaspettato vi ucciderà il codice, legato a un controllo preciso del tempo indipendentemente dalle funzioni che usate.
 
Slava:

Ora ditemi la probabilità di correzione del tempo tra due chiamate a GetMicrofsecondsCount?

Se state davvero misurando microsecondi, allora la probabilità è quasi 0.

E voi misurate i microsecondi in secondi o più? Perché? Spherocon nel vuoto?

Te l'ho già detto, questa probabilità dipende dal periodo di sincronizzazione: più è breve, più spesso avremo uno spostamento, cioè più alta è la probabilità. E anche dalla distanza tra le misure vicine. Più è lungo, più spesso colpiremo l'offset. Quindi, la probabilità è calcolata in base a questi due parametri, e non solo con un dito nel cielo.

E perché scrivete subito in intervalli di secondi? E gli intervalli di millisecondi? Per esempio, qualsiasi cosa inferiore a 16 ms può essere misurata solo con questa funzione. E anche 16-30 millisecondi devono essere misurati con questa funzione, altrimenti l'errore sarà troppo grande.

Se ti sembra che queste siano inezie e possono essere ignorate, allora è puramente una tua opinione personale. Prima abbiamo parlato qui della funzione standard di sistema QueryPerformanceCounter, che funziona correttamente, senza spostamenti. Deve essere stata inventata per un motivo. E a proposito, Renat l'ha dichiarata per qualche motivo:

È così che contiamo i microsecondi.

Ma in realtà non lo è. Si tratta del QueryPerformanceCounter.

 
Renat Fatkhullin:
Sei tu che non hai idea del problema che hai sollevato.

Come ho detto, un cambiamento di tempo inaspettato ucciderà il codice legato al controllo accurato del tempo, indipendentemente dalle funzioni utilizzate.

Non c'è nessun cambiamento di tempo in QueryPerformanceCounter. Hai eseguito il codice di cui ti ho dato il link?

 

Dopo aver controllato la macchina di esecuzione del codice MQL5, si è scoperto che avevamo uno schema di misurazione ibrido in GetMicrosecondCount:

  • per Windows 8 e superiori, è stata usata la funzione GetSystemTimePreciseAsFileTime, leggermente più veloce, a seconda del tempo di sistema
  • per altri casi, QueryPerformanceFrequency + QueryPerformanceCounter
  • in entrambi i casi, GetMicrosecondCount ha svolto la sua funzione di recuperare i microsecondi dall'inizio del programma

Questo codice è apparso a causa di un tentativo di ridurre l'overhead del sistema sulla chiamata di misurazione del tempo. Uno degli sviluppatori ha esagerato.

Noi, personalmente, e Slava eravamo sicuri che un QueryPerformanceCounter puro funzionasse. E c'era un tale codice. Ma ci siamo sbagliati a causa della presenza di un modello ibrido.

Ora la pura QueryPerformanceFrequency + QueryPerformanceCounter funzionerà.

In conclusione: sì, abbiamo sbagliato sia l'implementazione della funzione GetMicrosecondCount che la protezione del suo comportamento.

Slava e io ci scusiamo per questo!
 
I commenti non pertinenti a questo argomento sono stati spostati in "Bugs, bugs, issues".
 
Renat Fatkhullin:

Un promemoria sull'uso delle frasi "dovrebbe" in modo esplicito o implicito. L'uso di "le meta-citazioni dovrebbero" invece di "si prega di considerare" è ora inaccettabile.

Si prega di considerare l'ipotesi che, il più delle volte, leggere tra le righe non ha nulla a che vedere con ciò che scrive l'interlocutore.

Le segnalazioni effettive di bug con l'assistenza del forum e le punzecchiature sulle MQ sono cose incompatibili. È difficile immaginare una persona che si trasforma costantemente in un odiatore e viceversa.

 
MT5 stesso misura lunghi intervalli di tempo tramiteGetMicrosecondCount
IS      0       13:32:55.239    Trades  '11391209': accepted exchange buy 1.00 AFKS at market
DM      0       13:33:07.896    Trades  '11391209': deal #265475900 buy 1.00 AFKS at 9.095 done (based on order #284425784)
OD      0       13:33:07.898    Trades  '11391209': order #284425784 buy 1.00 / 1.00 AFKS at 9.095 done in 12757.608 ms
 

Amici, potete dirmi a chi chiedere consiglio - voglio capire come lavorare sulle differenze di prezzo per lo stesso prodotto su diverse borse - sono nuovo in questo business, voglio capire. Sarei grato per qualsiasi consiglio - forse dovrei scrivere in un altro thread?

Ho accesso a diverse borse estere, ma non capisco come funziona il tutto

Motivazione: