MT5 e la velocità in azione - pagina 65

 
fxsaber:
Era al computer, non ha fatto alcun calcolo. Non ha caricato la CPU con nulla.

19 ms e 48 ms per l'esecuzione di SymbolInfoTick. C'erano diverse decine di casi in cui la durata era di centinaia di microsecondi. Ma non li ho citati.


A quanto pare, per riprodurlo, abbiamo bisogno di eseguire consiglieri di combattimento per 24 ore, e poi solo guardare. A mio parere, non è realistico capire cosa dia inizio a tali ritardi.

A volte il computer può scaricare aggiornamenti o eseguire alcuni compiti di servizio. Inoltre, le fluttuazioni della tensione di rete possono influenzarlo. In questo modo si può arrivare a schede di rete programmabili, dove tutta la logica bot è scritta a livello hardware :) ma anche lì ci saranno ritardi dovuti alle fluttuazioni del campo quantico
 
Maxim Dmitrievsky:
A volte il computer può pompare aggiornamenti o fare alcuni compiti di servizio. Inoltre, una variazione della tensione di rete può avere un effetto. In questo modo si può arrivare a schede di rete programmabili, dove tutta la logica del bot è cablata :) ma anche lì ci saranno ritardi dovuti alle fluttuazioni del campo quantico

Gli sviluppatori hanno fatto il meglio che potevano. E senza questo, il ramo ha fornito il codice che mostra come il tick è in ritardo rispetto al Market Watch e viceversa. Come la sequenza di arrivo dei tick è rotta e probabilmente qualcos'altro. Tutto sommato, viene pubblicato un brutto codice valido per riprodurre altre situazioni.

 
Anton:

SymbolInfoTick invia i dati ricevuti dal server del broker. Ciò che il server invia è ciò che si ottiene.

SymbolInfoTick() viene eseguita in modalità bloccante o non bloccante?

Per esempio, è nel corpo del ciclo while e non c'è connessione o il mercato è chiuso per il fine settimana,
allora sarà bloccato fermando il ciclo o sarà eseguito in modo asincrono?

 
fxsaber:

come l'orologio del mercato è in ritardo rispetto al Market Watch e viceversa.

Cioè SymbolInfoTick cattura un nuovo tick e noi otteniamo un diverso Ask e Bid attraverso il polling del Market Watch (senza aspettare un evento di cambiamento del Market Watch)? Non era possibile farlo circa un anno fa. SymbolInfoTick e CopyTick e vintage portano sempre allo stesso tick. Se ottenete dei tick attraverso varie funzioni OnXXX, ovviamente, otterrete qualcosa attraverso una funzione, e qualcosa attraverso un'altra...

 
pivomoe:

Cioè SymbolInfoTick cattura un nuovo tick e otteniamo un diverso Ask e Bid attraverso il polling della tazza (senza aspettare l'evento di cambiamento della tazza)?

Qui.

 
fxsaber:

Qui.

Come pensavo stai testando OnBookEvent e OnTick, non MarketBookGet e SymbolInfoTick. Se si facesse il test secondo questo schema si avrebbe un riscontro su tutto:

While(1)
{
 Sleep(1)
 Запрос тика через SymbolInfoTick
 Запрос тика через стакан MarketBookGet
 Проверка на совпадение. 
}

p.s Leggi i tuoi post qui sotto. Lo capisci anche tu. Perché avete bisogno di OnBookEvent e OnTick? Nel mio esempio Sleep(1) richiede 1-2 millisecondi, la richiesta e il tick con SymbloInfoTick richiede meno di MICROsecondo. Il processore sta già riposando il 99,9% del tempo se non ci sono ticchettii. Qual è il vantaggio di usare OnBookEvent e OnTick?

 
pivomoe:

Come pensavo stai testando OnBookEvent e OnTick, non MarketBookGet e SymbolInfoTick. Se tu facessi i test secondo questo schema, avresti tutto corrispondente:

p.s Leggi i tuoi post qui sotto. Lo capisci anche tu. Perché avete bisogno di OnBookEvent e OnTick? Nel mio esempio Sleep(1) richiede 1-2 millisecondi, la richiesta e il tick con SymbloInfoTick richiede meno di MICROsecondo. Il processore sta già riposando il 99,9% del tempo se non ci sono ticchettii. Qual è il vantaggio di usare OnBookEvent e OnTick?

Senza un pizzico di diplomazia, stai dicendo sciocchezze. Sleep(1) è un decimo di millisecondo. Vedo solo una teorizzazione.

Gli utenti di OnTick vogliono vedere un tick fresco e non quello che è arrivato al terminale qualche tempo fa. Puoi mettere SymbolInfoTick subito dopo MarketBookGet nel codice sorgente.


Gli sviluppatori hanno pienamente riconosciuto due problemi con il loro silenzio.

 
fxsaber:

Senza un pizzico di diplomazia, stai dicendo sciocchezze. Sleep(1) è una dozzina di millisecondi. Vedo solo una teorizzazione.

Gli utenti vogliono vedere un tick fresco in OnTick e non un tick che è arrivato al terminale qualche tempo fa. Puoi mettere SymbolInfoTick subito dopo MarketBookGet nel codice sorgente.


Gli sviluppatori, con il loro silenzio, hanno pienamente riconosciuto due problemi.

Non sempre e non ogni decimo di millisecondo. Controllato con un semplice script

//+------------------------------------------------------------------+
//|                                                    TestSleep.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#define  ITERATIONS 10000
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ulong t1=GetMicrosecondCount();
   for(int i=0; i<ITERATIONS; i++)
     {
      Sleep(1);
     }
   ulong t2=GetMicrosecondCount()-t1;
   PrintFormat("total %I64u microseconds (%.3f ms per iteration)",t2,double(t2)/(ITERATIONS*1000.0));
  }
//+------------------------------------------------------------------+

Ecco il mio registro

2020.11.04 13:14:31.590 TestSleep (EURUSD,H1)   total 17058138 microseconds (1.706 ms per iteration)

Gli utenti di OnTick vedono sempre la zecca più fresca.

Gli utenti di OnBookEvent vedono sempre la spunta più fresca.

Ma se volete confrontare i tick ricevuti con OnTick e quelli ricevuti con OnBookEvent vi aspetta una delusione perché gli eventi sono processati in modo sequenziale e non in parallelo. Questo è ciò che l'utente pivomoe ha cercato di dirti

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Slava:

Non sempre e non ovunque un decimo di millisecondo. Controllato con un semplice script

Ecco il mio registro.

Ed ecco il mio registro.

#include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void OnStart()
{
  for (int i = 0; i < 5; i++)
    _BV(Sleep(1), 1);
}

Risultato.

2020.11.04 15:19:32.565 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 5326 mcs.
2020.11.04 15:19:32.580 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14928 mcs.
2020.11.04 15:19:32.596 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15930 mcs.
2020.11.04 15:19:32.611 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 14910 mcs.
2020.11.04 15:19:32.627 Alert: Bench_Stack = 0, 1 <= Time[Test9.mq5 93 in OnStart: Sleep(1)] = 15941 mcs.

Gli utenti di OnTick vedono sempre la zecca più fresca.

Gli utenti di OnBookEvent vedono sempre la spunta più fresca.

Il risultato dell'esecuzione dell'EA su un singolo grafico da una macchina che non è occupata in alcun modo.

2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 6564 mcs.
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [0] 1.17192 1.17192     true     108150
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [1] 1.17192 1.17192    false         30
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [2] 1.17189 1.17191     true      88210
2020.11.04 15:31:19.151 Test9 (EURUSD,H1)       [3] 1.17189 1.17191    false       6564
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       Alert: OnBook-lag! - 3888 mcs.
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [0] 1.17192 1.17192    false     117471
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [1] 1.17192 1.17192     true         11
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [2] 1.17192 1.17193     true     882710
2020.11.04 15:31:30.260 Test9 (EURUSD,H1)       [3] 1.17192 1.17193    false       3888
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       Alert: OnTick-lag! - 4653 mcs.
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)             [bid]   [ask] [onTick] [Interval]
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [0] 1.17195 1.17195     true      86660
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [1] 1.17195 1.17195    false         11
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [2] 1.17194 1.17194    false     220122
2020.11.04 15:31:31.519 Test9 (EURUSD,H1)       [3] 1.17194 1.17194     true       4653

Segna tick identici, che sono ricevuti in diverse funzioni On da metodi corrispondenti. Il ritardo può essere fino a decine di millisecondi se viene eseguito su sei grafici invece di uno.

Ma se volete confrontare i tick ricevuti in OnTick e quelli ricevuti in OnBookEvent, allora sarete delusi perché gli eventi sono processati in modo sequenziale, non in parallelo. Quello che l'utente pivomoe ha cercato di dirti

Se un OnBookEvent/OnTick quasi vuoto viene attivato 20 millisecondi dopo il corrispondente OnTick/OnBookEvent quasi vuoto, va bene?


ZS Mentre fai attenzione al thread, c'è un altro codice di riproduzione qui. Lì in Market Watch i tick entrano con un tempo precedente a quello di Market Watch prima.

 
fxsaber:

Se un OnBookEvent/OnTick quasi vuoto viene attivato 20 millisecondi dopo il corrispondente OnTick/OnBookEvent quasi vuoto, va bene?


La coda EA è una risorsa bloccabile. Quando un evento viene scritto nella coda, l'Expert Advisor attende (a meno che l'Expert Advisor non stia elaborando un evento)

Gli eventi per l'Expert Advisor provengono dalla coda degli eventi del grafico corrispondente, che a sua volta proviene dal ciclo di elaborazione del simbolo corrispondente. E questo ciclo di elaborazione non solo distribuisce gli eventi ai propri grafici, ma fa anche un sacco di altre cose.

Vi ho già detto che Windows non è un sistema operativo in tempo reale.

Motivazione: