nuovo mql4 che fornisce millisecondi in timestamps.... - pagina 3

 

Tutto,

La questione qui è ottenere la marca temporale del tick, e non il tempo in cui il tick arriva al terminale usando GetTickCount() (cioè ogni volta che viene chiamata la funzione start()), come suggerito.

MarketInfo(Symbol(), MODE_TIME) restituisce la marca temporale del tick come inviata dal server del broker nel feed di dati.

Saluti

VS

 
AnkaSoftware:

Tutto,

La questione qui è ottenere la marca temporale del tick, e non il tempo in cui il tick arriva al terminale usando GetTickCount() (cioè ogni volta che viene chiamata la funzione start()), come suggerito.

MarketInfo(Symbol(), MODE_TIME) restituisce la marca temporale del tick come inviata dal server del broker nel feed di dati.

Sfortunatamente sarà solo con una precisione di 1 secondo.
 
ubzen:

1) GetTickCount(), dovrebbe funzionare Live. Inutile sui dati storici.

2) Anche mt5_data non è salvato in millisecondi. Tuttavia, no_problem Live.

3) Non capisco dove vuoi arrivare. Se è lo stesso tempo in millisecondi allora avere i millisecondi non aiuterebbe. Se si tratta di tempi diversi in millisecondi che GetTickCount() potrebbe aiutare. Aiutare nel senso che il vostro codice elabora il tick corrente in meno di un millisecondo. Quanto sia importante tutto dipende da ciò che state cercando di realizzare... credo.


Grazie a tutti per le risposte. C'era un indicatore che è stato postato nel codebase, Rogue Tick Detector. Ma non è ancora approvato. Potete trovarlo qui per ora.

L'idea di base è che ci sono momenti in cui l'attuale tick tick0 arriverà con un timestamp successivo al precedente tick tick-1. Ma il prezzo non sarebbe più azionabile, ma l'EA o il trader umano non lo saprebbe fino a dopo il fatto. Questo causava l'attivazione di eventi basati sul prezzo in modo errato. Rogue tick detector era in grado di segnalare questi falsi tick e impedire all'EA di agire su di essi (aspettare il prossimo tick "buono")

Il metodo attuale per catturare i timestamp dei tick, MarketInfo(Symbol(), MODE_TIME), non restituisce timestamp al millisecondo. Così sono venuto qui a chiedere se c'erano alternative che stavamo trascurando.

Gli EAs che includono le funzioni di rilevamento dei tick disonesti girano tutti su VPS a New York con dischi SSD, windows 2008, e sono di solito <2ms dal server del broker. Nessun HFT o hyperscalping (i trade hanno un tempo medio di attesa di circa 1 ora)

Mi riporta a una delle mie domande originali: Come fa la piattaforma mt4 (e mt5) [stessa] a distinguere correttamente i tick che arrivano nello 'stesso momento'?

edit, grazie ankasoftware per il chiarimento.

 
4evermaat:


Mi riporta a una delle mie domande originali: Quindi, come si suppone che la piattaforma mt4 (e mt5)[stessa] distingua correttamente i tick che arrivano nello 'stesso momento'?

Non puoi... il tuo Broker ti manda effettivamente più tick che arrivano nello stesso momento o semplicemente incrementano il conteggio di 2 e mandano il secondo tick? Come potresti sapere se lo facessero? Sei consapevole che c'è un'enorme differenza nel conteggio dei tick tra i Broker?
 
RaptorUK:
Non puoi... il tuo Broker ti manda effettivamente tick multipli che avvengono nello stesso momento o semplicemente incrementano il conteggio di 2 e mandano il secondo tick? Come potresti sapere se l'hanno fatto? Sei consapevole che c'è un'enorme differenza nel conteggio dei tick tra i Broker?


Sì, sono consapevole che broker diversi hanno feed diversi e il conteggio dei tick può essere molto diverso. Ma si dà il caso che i rogue tick siano stati inviati in certi momenti, soprattutto quando i trade erano chiusi in profitto. Stava influenzando l'attivazione di closeall e ordini, quindi abbiamo trovato un modo per rilevarli e ignorarli al meglio. A un certo punto ho anche sospettato una manipolazione intenzionale del feed da parte di alcuni broker.

Ma forse dovremmo avere un rapporto di conteggio delle zecche, dove contiamo le zecche totali

Potrebbe benissimo non influenzare molte persone, ma ho pensato che il danno potenziale fosse sufficiente per giustificare ulteriori indagini.

 
Non c'è nessuna funzione/processo che faccia esattamente quello che stai chiedendo [ per quanto ne so ] in questo momento.
4evermaat:Ma forse dovremmo avere un rapporto di conteggio dei tick, dove contiamo i tick totali

Cosa avete in mente? In che modo sarebbe diverso dal Volume di mt4? Un rapporto di quali due numeri [ conteggio e ??? ].

Questo argomento diventa molto confuso molto velocemente. Io stesso incluso non so tutto sui tick, né come metaQuotes li elabora, né perché sarà molto critico per qualcuno. Permettetemi di riassumere alcune delle mie osservazioni.

1) metaQuotes dice: vuoi milli_secondi time_stamp, [ iniziano subito a pensare ai tick_data ], chi terrà questi tick_data il broker? Vuoi dire che dirti che ci sono 200 tick in quel minuto non ti basta? Vuoi davvero che salviamo 200 ingressi di dati perché OHLC+V non è abbastanza buono?

2) trader numero1 dice: Non ho bisogno che qualcuno salvi le informazioni, voglio solo la marca temporale in milli_secondi per determinare i vecchi dati.

3) trader numero2 dice: Non ho bisogno che tu mi salvi le informazioni, dammi solo la possibilità di importarle e otterrò i miei dati.

4) il trader numero3 dice: Non vedo perché sia così importante salvare e fornire dati in tick. Andiamo, i computer hanno più potenza e memoria al giorno d'oggi, sicuramente il mio broker può fornire i dati da qualche parte.

5) il broker dice: amico ho già difficoltà a darti i dati m1 per più di 3 mesi, cosa ti fa pensare che io sia capace o disposto a fornirti così tanti dati quando ti connetti o per i test.

6) trader number4: non ne abbiamo bisogno per i test e solo una piccola parte per i dati sarebbe sufficiente dal vivo, non mi lamento di m1 insufficiente ora quindi qual è il problema.

7) metaQuotes: ancora no-go, questo significa che dovremo facilitare le funzioni che restituiscono milli_secondi e indicatori e simili che distinguono i tick ... stai cercando di mandare in crash il terminale o qualcosa del genere?

8) trader numero5: vuoi dire che Volume non è market_depth ma un conteggio del numero di tick in un determinato time_frame :) . Vuoi dire che posso perdere tick? Vuoi dire che i tick possono perdersi o ritardare nel cyber_spazio? Vuoi dire che il tick_count differisce da un broker all'altro? Vuoi dire che i dati che il broker memorizza non sarebbero stati gli stessi di quelli che avrei ricevuto? Che cos'è tutto questo trambusto per i tick allora?

9) xxxxxxxxxxxx dice: il tick è top secret, quello che viene fornito è certamente abbastanza buono, ho aiutato a progettare il generatore di tick e ho molto poco interesse a fornire quel tipo di risoluzione. non accadrà.... punto.

10) trader numero6: ci sono limitazioni tecnologiche, a ciò che può essere fornito, come funziona il conteggio dei tick, cosa può essere ricevuto, ecc..ecc. Questo non è un problema di MetaTrader, piuttosto tutte le piattaforme retail hanno questo problema. Guarda al software istituzionale e sii pronto a sborsare un sacco di soldi.

Trader#3 a Trader#10: non sono d'accordo.

Ubzen dice: Non so più cosa dire.

Ps> quasi dimenticavo trader#7: bene, salverò i miei tick che arrivano al mio terminale e programmerò i miei indicatori e simili per elaborare questi dati... Questo è il modo in cui ho interpretato la domanda e quindi il motivo per cui ho consigliato il GetTickCount().

 
ubzen:

Ps> quasi dimenticavo trader#7: bene, salverò i miei tick che arrivano al mio terminale e programmerò i miei indicatori e simili per elaborare questi dati... Questo è il modo in cui ho interpretato la domanda e quindi il motivo per cui ho consigliato il GetTickCount().

Sfortunatamente questo non è ancora in grado di gestire i tick mancanti... in pratica è impossibile salvare i propri tick, non è possibile ottenerli tutti e poiché ne mancheranno alcuni, a meno che questo fatto non venga registrato, i dati salvati saranno errati, quindi potenzialmente peggio che inutili, saranno fuorvianti.
 
RaptorUK: Purtroppo questo ancora non fa fronte ai tick mancati . . . in pratica è impossibile salvare i propri tick, non è possibile ottenerli tutti e poiché ne mancheranno alcuni, a meno che questo fatto non venga registrato i dati salvati saranno errati quindi potenzialmente peggio che inutili, saranno fuorvianti.

Spero di rimanere in tema qui :). Detto questo, immaginate un broker che invia timeStamp millisecondi ad ogni tick. Ma, poi procede a non salvare queste informazioni sul suo_lato. Data tutta la sfiducia nei confronti dei broker in generale, questo broker aprirebbe un assalto di domande. Ma questa volta la gente ha la prova in millisecondi, ma il broker non ha nessun record con cui controbattere. Quindi, in un certo senso, chiedere tick_data | millisecondi o qualsiasi altra cosa che porta agli stessi argomenti è fondamentalmente chiedere al broker di salvare tick_data e che la piattaforma lo faciliti.

Su una seconda nota, considerate i back-test inversi che la maggior parte della gente fa. Dove si esegue una strategia_live per circa una settimana e poi si procede ad eseguire un back_test su quella settimana per verificare se si ottengono gli stessi risultati. Questa persona ha time_stamp millisecondi dal vivo e ritardi e pacchetti mancanti dal vivo. Naturalmente, come il poster originale, si ignorano i dati mancanti e/o si scartano i tick ritardati. Tuttavia, quando si esegue il back-test, ci sono tutti i dati del broker con timestamp corretti. Questo ovviamente genererà risultati diversi da quelli che hai appena ricevuto dal vivo.

Quindi dimmi, sei stato ingannato dal vivo o sei stato ingannato durante il Back_Test?

Sono comunque d'accordo con la tua affermazione di cui sopra. Imo, tutto questo crea una serie di paradossi che mi porta a stare lontano dai processi inter_minute all_together. La piattaforma ha dei limiti, semplicemente accetto e vado avanti.

 
ubzen:
...

Sono comunque d'accordo con la tua affermazione di cui sopra. Imo, tutto questo crea un insieme di paradossi che mi porta a stare lontano dai processi inter_minuti all_together. La piattaforma ha dei limiti, io accetto e vado avanti.

;-)
 

Link interessanti grazie, che mi hanno portato a Microsecond Resolution Time Services per Windows. Ho condotto alcuni test basati sulle informazioni di quelle pagine.

I miei test su un PC Win 7 e un VPS Windows 2012 indicano che GetTickCount() ha sempre una risoluzione di 15,6 msec (64 interrupt al secondo) indipendentemente dalle impostazioni del timer di sistema, mentre la risoluzione quando si ottiene il tempo in millisecondi chiamando le funzioni kernel32.dll GetSystemTime() [o GetLocalTime()] o GetSystemTimeAsFileTime() è influenzata dalle impostazioni del timer di sistema, e può dare fino a 0,5 msec di risoluzione su entrambe le macchine che ho provato.

Risoluzione di GetTickCount()

Ecco il codice di uno script per testare la risoluzione di GetTickCount():

// Script to test Millisecond Resolution via GetTickCount()

void OnStart() {
  uint startMsecsU = GetTickCount(), nowMsecsU;
  for (int j=0; j<1000000000; j++) {
    if ((nowMsecsU = GetTickCount()) > startMsecsU) {
      MessageBox(StringFormat("GetTickCount %u -> %u diff %u", startMsecsU, nowMsecsU, nowMsecsU - startMsecsU), "Test Millisecond Resolution via GetTickCount");
      return;
    }
}

Questo dà sempre 15 o 16 (cioè 15.6) su entrambe le macchine testate, indipendentemente dalle modifiche alla risoluzione del timer di sistema menzionate sotto per gli altri test.

Risoluzione GetSystemTime()

Ora le cose iniziano a farsi interessanti. Ecco il codice di uno script per testare la risoluzione di GetSystemTime():

/* Script to test Millisecond Resolution via GetSystemTime()

Windows struct for a GetSystemTime() or GetLocalTime() call:
typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wDay;
  WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
*/

// MT4 equivalent struct:
struct _SYSTEMTIME {
  ushort wYear;         // 2014 etc
  ushort wMonth;        // 1 - 12
  ushort wDayOfWeek;    // 0 - 6 with 0 = Sunday
  ushort wDay;          // 1 - 31
  ushort wHour;         // 0 - 23
  ushort wMinute;       // 0 - 59
  ushort wSecond;       // 0 - 59
  ushort wMilliseconds; // 0 - 999
};

#import "kernel32.dll"
void GetSystemTime(_SYSTEMTIME &time);
#import

void OnStart() {
  _SYSTEMTIME st;
  GetSystemTime(st);
  int startMsecs = st.wMilliseconds, nowMsecs;
  for (int j=0; j<1000000000; j++) {
    GetSystemTime(st);
    if (st.wMilliseconds != startMsecs) {
      nowMsecs = st.wMilliseconds;
      if (nowMsecs < startMsecs)
        nowMsecs += 1000; // wMilliseconds wrapped
      MessageBox(StringFormat("GetSystemTime msecs %d -> %d diff %d", startMsecs, nowMsecs, nowMsecs - startMsecs), "Test Millisecond Resolution via GetSystemTime");
      return;
    }
  }
}

Questo dà una risoluzione di 15/16 msec su un PC appena avviato senza altri software in esecuzione, ma 1 msec se Chrome è in esecuzione sul PC! Come spiega il secondo link di angevoyageur, Chrome imposta il timer di sistema alla risoluzione di 1 msec, così come alcuni altri software.

Ho trovato due piccole utility per impostare la risoluzione del timer di sistema, in modo che 1 msec (o anche 0.5 msec) possa essere ottenuto in modo controllato su una macchina avviata in modo pulito:

Strumento Windows System Timer: http://vvvv.org/contribution/windows-system-timer-tool

Timer-Resolution: http://www.lucashale.com/timer-resolution/

Preferisco il primo dei due, Windows System Timer Tool. Con questo potrei ottenere in modo affidabile la risoluzione di 1 msec tramite GetSystemTime(). Anche GetLocalTime() potrebbe essere usato in modo simile.

Btw il codice dello script qui sopra è un esempio di quanto il nuovo codice MT4 possa essere migliore grazie alle strutture. Nel vecchio MT4 accedere a GetSystemTime() richiedeva l'uso di un array di interi più un sacco di manipolazione di bit disordinata.

Risoluzione GetSystemTimeAsFileTime()

Infine, ho notato che Microsecond Resolution Time Services per Windows ha menzionato che GetSystemTimeAsFileTime() è una funzione più veloce per accedere al tempo di sistema, oltre a richiedere una struct più piccola e semplice. Quest'ultimo è certamente vero per il nuovo MT4, dato che la "struct" può essere ridotta a solo un ulong.

Ecco il codice di uno script per testare la risoluzione di GetSystemTimeAsFileTiime():

// Script to test Millisecond Resolution via GetSystemTimeAsFileTime()

#import "kernel32.dll"
void GetSystemTimeAsFileTime(ulong &SystemTimeAsFileTime); // Returns the system time in 100 nsec units in a ulong
#import

void OnStart() {
  ulong startL, nowL;
  GetSystemTimeAsFileTime(startL);
  for (int j=0; j<1000000000; j++) {
    GetSystemTimeAsFileTime(nowL);
    if (nowL > startL) {
      int diff = int(nowL - startL);
      MessageBox(StringFormat("GetSystemTimeAsFileTime %llu -> %llu diff %d in 100 nsec units = %.1f msecs",
                 startL, nowL, diff, diff/10000.0), "Test Millisecond Resolution via GetSystemTimeAsFileTime");
      return;
    }
  }
}

Se Windows System Timer Tool viene utilizzato per impostare una risoluzione del timer di sistema di 0.5secs quel piccolo script riporta una risoluzione di 5000 (o a volte 5001) 100 nsecs unità = 0.5 msecs.

L'uso di GetSystemTimeAsFileTiime() è infatti più semplice e può mostrare una risoluzione più fine.

Ecco alcune foto di questo in uso.

Dopo un avvio pulito:

Dopo un avvio pulito

Con Timer Tool usato per impostare la risoluzione del timer di sistema a 1 ms:

Con Timer Tool usato per impostare la risoluzione del timer di sistema a 1 ms

E con Timer Tool usato per impostare la risoluzione del timer di sistema a 0.5 ms:

Con Timer Tool usato per impostare la risoluzione del timer di sistema a 0,5 ms

Conclusione

La migliore funzione da usare per ottenere le temporizzazioni in millisecondi in MT4 è GetSystemTimeAsFileTiime() chiamata come mostrato nello script di prova sopra, con una utility come Windows System Timer Tool usata per impostare la risoluzione del timer di sistema desiderata.