neue mql4 liefert Millisekunden in Zeitstempeln.... - Seite 3

 

Alle,

Hier geht es darum, den Zeitstempel des Ticks zu erhalten und nicht den Zeitpunkt, zu dem der Tick am Terminal ankommt, indem GetTickCount() verwendet wird (d. h. immer dann, wenn die Funktion start() aufgerufen wird), wie vorgeschlagen.

MarketInfo(Symbol(), MODE_TIME) gibt den Zeitstempel des Ticks zurück, wie er vom Server des Brokers im Datenfeed gesendet wird.

Mit freundlichen Grüßen

VS

 
AnkaSoftware:

Alle,

Hier geht es darum, den Zeitstempel des Ticks zu erhalten und nicht den Zeitpunkt, zu dem der Tick am Terminal ankommt, indem GetTickCount() verwendet wird (d. h. immer dann, wenn die Funktion start() aufgerufen wird), wie vorgeschlagen.

MarketInfo(Symbol(), MODE_TIME) gibt den Zeitstempel des Ticks zurück, wie er vom Server des Brokers im Datenfeed gesendet wurde.

Leider wird dies nur mit einer Genauigkeit von 1 Sekunde sein.
 
ubzen:

1) GetTickCount(), sollte live funktionieren. Sinnlos bei historischen Daten.

2) Auch mt5_data wird nicht in Millisekunden gespeichert. Allerdings kein_Problem Live.

3) Ich verstehe nicht, worauf Sie hinauswollen. Wenn es die gleiche Zeit in Millisekunden ist, dann würde es nichts bringen, Millisekunden zu haben. Wenn es unterschiedliche Zeiten in Millisekunden sind, dann könnte GetTickCount() helfen. Hilfe in dem Sinne, dass Ihr Code den aktuellen Tick innerhalb von weniger als einer Millisekunde verarbeitet. Wie wichtig das ist, hängt davon ab, was Sie zu erreichen versuchen... denke ich.


Danke an alle für ihre Antworten. Es gab einen Indikator, der in der Codebasis veröffentlicht wurde, Rogue Tick Detector. Aber er ist noch nicht genehmigt. Sie können es hier für jetzt finden.

Die Grundidee ist, dass es Zeiten gibt, in denen der aktuelle Tick tick0 mit einem späteren Zeitstempel eintrifft als der vorherige Tick tick-1. Aber der Preis wäre nicht mehr handlungsfähig, aber der EA oder der menschliche Händler würde dies erst im Nachhinein erfahren. Dies führte dazu, dass preisbasierte Ereignisse fälschlicherweise ausgelöst wurden. Der Rogue Tick Detector konnte diese gefälschten Ticks erkennen und den EA daran hindern, auf sie zu reagieren (und auf den nächsten "guten" Tick zu warten).

Die aktuelle Methode zur Erfassung von Zeitstempeln der Ticks, MarketInfo(Symbol(), MODE_TIME), liefert keine Zeitstempel im Millisekundenbereich. Deshalb bin ich hierher gekommen, um zu fragen, ob es Alternativen gibt, die wir übersehen haben.

Die EAs, die die Schurken-Tick-Erkennungsfunktionen enthalten, laufen alle auf VPS in New York mit SSD-Laufwerken, Windows 2008, und sind in der Regel <2ms vom Broker-Server. Kein HFT oder Hyperscalping (Trades durchschnittliche Haltezeit sind ca. 1 Stunde)

Bringt mich zurück zu einer meiner ursprünglichen Fragen: Wie soll die mt4 (und mt5) Plattform [selbst] zwischen Ticks, die zur "gleichen Zeit" eintreffen, richtig unterscheiden?

edit, danke ankasoftware für die Klarstellung.

 
4evermaat:


Bringt mich zurück zu einer meiner ursprünglichen Fragen: Wie soll die mt4 (und mt5) Plattform [selbst] richtig zwischen Ticks unterscheiden, die zur "gleichen Zeit" eintreffen?

Sie können nicht ... sendet Ihr Broker tatsächlich mehrere Ticks, die zur gleichen Zeit eintreffen? oder erhöhen sie einfach die Anzahl um 2 und senden den letzten Tick? wie könnten Sie wissen, wenn sie es taten? sind Sie sich bewusst, dass es einen großen Unterschied in der Tick-Anzahl zwischen Brokern gibt?
 
RaptorUK:
Sie können nicht ... sendet Ihnen Ihr Broker tatsächlich mehrere Ticks, die zur gleichen Zeit auftreten? oder erhöhen sie einfach die Anzahl um 2 und senden den letzten Tick? wie könnten Sie wissen, wenn sie es taten? sind Sie sich bewusst, dass es einen großen Unterschied in der Tick-Anzahl zwischen Brokern gibt?


Ja, ich bin mir bewusst, dass verschiedene Broker unterschiedliche Feeds haben und die Tick-Zählung sehr unterschiedlich sein kann. Aber es ist nun einmal so, dass die fehlerhaften Ticks zu bestimmten Zeiten gesendet werden, vor allem, wenn Geschäfte mit Gewinn geschlossen wurden. Dies hatte Auswirkungen auf die Auslösung von Closealls und Aufträgen, so dass wir einen Weg gefunden haben, sie so gut es geht zu erkennen und zu ignorieren. Ich hatte sogar den Verdacht, dass einige Broker die Feeds absichtlich manipulieren.

Aber vielleicht sollten wir eine Zeckenzählung durchführen, bei der wir die Gesamtzahl der Zecken zählen.

Es mag vielleicht nicht viele Leute betreffen, aber ich dachte, der potenzielle Schaden sei groß genug, um eine weitere Untersuchung zu rechtfertigen.

 
Es gibt derzeit keine Funktion/keinen Prozess, die/der genau das tut, wonach Sie fragen (soweit ich weiß).
4evermaatAber vielleicht sollten wir ein Tick-Count-Verhältnis haben, bei dem wir die gesamten Ticks zählen

Was haben Sie im Sinn? Wie würde sich dies von mt4 Volume unterscheiden? Ein Verhältnis von zwei Zahlen [ count und ??? ].

Dieses Thema wird sehr verwirrend sehr schnell. Ich selbst weiß weder alles über Ticks, noch wie metaQuotes es verarbeitet, noch warum es für jemanden sehr kritisch sein wird. Erlauben Sie mir, einige meiner Beobachtungen zusammenzufassen.

1) metaQuotes sagt: Sie wollen milli_seconds time_stamp, [ sie denken sofort an tick_data ], wer wird diese tick_data dem Broker vorhalten? Sie meinen, Ihnen zu sagen, dass es 200 Ticks in dieser Minute gibt, ist nicht gut genug für Sie? Sie wollen wirklich, dass wir 200 Dateneingaben speichern, weil OHLC+V nicht gut genug ist?

2) Händler Nummer 1 sagt: Ich brauche niemanden, der die Informationen speichert, ich will nur den Zeitstempel in Millisekunden, um alte Daten zu bestimmen.

3) Händler Nummer 2 sagt: Ich brauche Sie nicht, um die Informationen zu speichern, geben Sie mir einfach die Möglichkeit, sie zu importieren und ich werde meine eigenen Daten bekommen.

4) Händler Nummer 3 sagt: Ich verstehe nicht, warum es so eine große Sache ist, Tickdaten zu speichern und bereitzustellen. Kommen Sie, Computer haben heutzutage mehr Leistung und Speicher, sicherlich kann mein Broker die Daten irgendwo zur Verfügung stellen.

5) Broker sagt: Mann, es fällt mir schon schwer genug, Ihnen m1-Daten für mehr als 3 Monate zur Verfügung zu stellen, wie kommen Sie darauf, dass ich in der Lage oder willens bin, so viele Daten bereitzustellen, wenn Sie eine Verbindung herstellen oder zu Testzwecken.

6) trader number4: wir brauchen es nicht zum Testen und nur ein kleiner Teil der Daten würde live ausreichen, ich beschwere mich jetzt nicht über unzureichende m1, also wo ist das Problem.

7) metaQuotes: immer noch no-go, das bedeutet, dass wir Funktionen, die milli_seconds und Indikatoren und solche, die Ticks unterscheiden, erleichtern müssen ... versuchen Sie, das Terminal zum Absturz zu bringen oder so?

8) trader number5: Sie meinen, Volume ist nicht market_depth, sondern eine Zählung der Anzahl der Ticks innerhalb eines bestimmten time_frame :) . Sie meinen, ich kann Ticks verpassen? Sie meinen, Ticks können im Cyberspace verloren gehen oder sich verzögern? Sie meinen, der Tick_count ist bei den verschiedenen Brokern unterschiedlich? Sie meinen, dass die Daten, die der Broker speichert, nicht mit denen übereinstimmen, die ich erhalten hätte? Was soll dann die ganze Aufregung um den Tick?

9) xxxxxxxxxxxx sagt: tick ist streng geheim, was zur Verfügung gestellt wird, ist sicherlich gut genug, ich habe geholfen, den tick-Generator zu entwerfen und habe sehr wenig Interesse daran, diese Art von Auflösung zur Verfügung zu stellen. wird nicht passieren.... punkt.

10) trader number6: es gibt technologische Grenzen, was bereitgestellt werden kann, wie die Tickzählung funktioniert, was empfangen werden kann, etc. Dies ist kein MetaTrader-Problem, sondern ein Problem, das bei vielen Handelsplattformen auftritt. Schauen Sie sich nach institutioneller Software um und seien Sie bereit, das große Geld zu bezahlen.

Trader#3 an Trader#10: Ich stimme nicht zu.

Ubzen sagt: Ich weiß einfach nicht mehr, was ich sagen soll.

Ps> fast hätte ich es vergessen Trader#7: gut, ich speichere meine eigenen Ticks, die auf mein Terminal kommen und programmiere meine eigenen Indikatoren und so, um diese Daten zu verarbeiten... So habe ich die Frage interpretiert und deshalb habe ich die GetTickCount() empfohlen.

 
ubzen:

Ps> fast vergessen trader#7: gut, ich werde meine eigenen tick, die zu meinem Terminal kommt speichern und programmieren meine eigenen Indikatoren und solche, diese Daten zu verarbeiten... Das ist, wie ich die Frage interpretiert und daher habe ich die GetTickCount() empfohlen.

In der Praxis ist es unmöglich, seine eigenen Ticks zu speichern, man kann sie nicht alle erfassen, und da man einige verpassen wird, sind die gespeicherten Daten falsch, wenn diese Tatsache nicht aufgezeichnet wird, was möglicherweise schlimmer als nutzlos ist, da sie irreführend sind.
 
RaptorUK: In der Praxis ist es unmöglich, die eigenen Ticks zu speichern, man kann sie nicht alle erfassen, und da man einige verpasst, sind die gespeicherten Daten nicht korrekt, wenn diese Tatsache nicht aufgezeichnet wird, so dass sie möglicherweise nicht nur nutzlos, sondern auch irreführend sind.

Ich hoffe, dass ich hier beim Thema bleibe :). In diesem Sinne, stellen Sie sich einen Broker vor, der bei jedem Tick Millisekunden-TimeStamps sendet. Aber diese Informationen dann nicht auf ihrer_seiner Seite speichert. Bei all dem Misstrauen gegenüber Brokern im Allgemeinen würde dieser Broker einen Ansturm von Anfragen auslösen. Aber dieses Mal haben die Leute Beweise in Millisekunden, aber der Broker hat keine Unterlagen, mit denen er kontern kann. In gewissem Sinne ist also die Frage nach Tick_data | Millisekunden oder was auch immer, die zu denselben Argumenten führt, im Grunde eine Aufforderung an den Broker, Tick_data zu speichern und an die Plattform, dies zu ermöglichen.

Eine zweite Anmerkung: Betrachten Sie die umgekehrten Backtests, die die meisten Leute durchführen. Wo Sie eine strategy_live für etwa eine Woche laufen lassen und dann fortfahren, einen back_test auf diese Woche in_order durchzuführen, um zu überprüfen, ob Sie die gleichen Ergebnisse zu erhalten. Diese Person hat Millisekunden Zeitstempel live und Verzögerungen und fehlende Pakete live. Natürlich ignorieren Sie, wie der ursprüngliche Poster, die fehlenden Daten und/oder verwerfen die verzögerten Ticks. Wenn Sie jedoch den Backtest durchführen, sind alle Daten des Brokers mit korrekten Zeitstempeln vorhanden. Das führt natürlich zu anderen Ergebnissen als das, was Sie gerade live erhalten haben.

Sagen Sie mir also, wurden Sie live in die Irre geführt oder werden Sie beim Back_Test in die Irre geführt?

Ich stimme jedoch mit Ihrer obigen Aussage überein. Imo, all dies führt zu einer Reihe von Paradoxien, die mich dazu veranlassen, mich von inter_minute-Prozessen ganz fernzuhalten. Die Plattform hat ihre Grenzen, ich akzeptiere sie einfach und gehe weiter.

 
ubzen:
...

Ich stimme jedoch mit Ihrer obigen Aussage überein. Imo, all dies schafft eine Reihe von Paradoxien, die mich dazu bringen, von inter_minute Prozessen ganz weg zu bleiben. Die Plattform hat ihre Grenzen, ich akzeptiere sie einfach und gehe weiter.

;-)
 

Danke für die interessanten Links, die mich zu Microsecond Resolution Time Services for Windows geführt haben. Ich habe einige Tests auf der Grundlage der Informationen von diesen Seiten durchgeführt.

Meine Tests auf einem Win 7 PC und einem Windows 2012 VPS zeigen, dass GetTickCount() immer eine Auflösung von 15,6 ms (64 Interrupts pro Sekunde) hat, unabhängig von der Einstellung des Systemtimers, wohingegen die Auflösung beim Abrufen der Millisekundenzeit durch den Aufruf der kernel32.dll-Funktionen GetSystemTime() [oder GetLocalTime()] oder GetSystemTimeAsFileTime() von den Einstellungen des Systemtimers beeinflusst wird und auf beiden getesteten Rechnern bis zu 0,5 ms Auflösung ergeben kann.

GetTickCount() Auflösung

Hier ist der Code für ein Skript zum Testen der Auflösung von 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;
    }
}

Auf beiden getesteten Rechnern ergibt dies immer 15 oder 16 (d.h. 15,6), unabhängig von den unten erwähnten Änderungen der Auflösung des Systemzeitgebers für die anderen Tests.

GetSystemTime() Auflösung

Jetzt werden die Dinge interessant. Hier ist der Code für ein Skript zum Testen der GetSystemTime()-Auflösung:

/* 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;
    }
  }
}

Das ergibt eine Auflösung von 15/16 msec auf einem frisch gebooteten PC, auf dem keine andere Software läuft, aber 1 msec, wenn Chrome auf dem PC läuft! Wie der zweite Link von angevoyageur erklärt, setzt Chrome den Systemtimer auf eine Auflösung von 1 msec, wie auch einige andere Software.

Ich habe zwei kleine Hilfsprogramme gefunden, mit denen man die Auflösung des Systemtimers einstellen kann, so dass eine Auflösung von 1 msec (oder sogar 0,5 msec) auf einem sauber gebooteten Rechner kontrolliert erreicht werden kann:

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

Timer-Auflösung: http://www.lucashale.com/timer-resolution/

Ich bevorzuge das erste der beiden, Windows System Timer Tool. Damit konnte ich über GetSystemTime() zuverlässig eine Auflösung von 1 msec erreichen. Auch GetLocalTime() könnte ähnlich verwendet werden.

Übrigens ist der obige Skriptcode ein Beispiel dafür, wie viel besser der neue MT4-Code dank der Structs sein kann. Im alten MT4 erforderte der Zugriff auf GetSystemTime() die Verwendung eines Integer-Arrays und eine Menge chaotischer Bit-Manipulationen.

GetSystemTimeAsFileTime() Auflösung

Schließlich habe ich festgestellt, dass die Microsecond Resolution Time Services for Windows erwähnen, dass GetSystemTimeAsFileTime() eine schnellere Funktion für den Zugriff auf die Systemzeit ist und außerdem eine kleinere und einfachere Struktur erfordert. Letzteres trifft sicherlich auf den neuen MT4 zu, da die "struct" auf einen ulong reduziert werden kann.

Hier ist der Code für ein Skript zum Testen der GetSystemTimeAsFileTiime()-Auflösung:

// 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;
    }
  }
}

Wenn das Windows System Timer Tool verwendet wird, um die Auflösung des Systemtimers auf 0,5 Sekunden einzustellen, meldet das kleine Skript eine Auflösung von 5000 (oder manchmal 5001) 100 nSek-Einheiten = 0,5 Millisekunden.

Die Verwendung von GetSystemTimeAsFileTiime() ist tatsächlich einfacher und kann eine feinere Auflösung anzeigen.

Hier sind einige Bilder von dieser Funktion im Einsatz.

Nach einem sauberen Start:

Nach einem Neustart

Mit dem Timer Tool, um die Auflösung des Systemtimers auf 1 ms zu setzen:

Mit dem Timer-Tool kann die Auflösung des Systemtimers auf 1 ms eingestellt werden.

Und mit Timer Tool verwendet, um die Auflösung des Systemtimers auf 0,5 ms zu setzen:

Mit dem Timer-Tool kann die Auflösung des Systemtimers auf 0,5 ms eingestellt werden.

Schlussfolgerung

Die beste Funktion, um Millisekunden-Timings in MT4 zu erhalten, ist GetSystemTimeAsFileTiime(), die wie im obigen Testskript aufgerufen wird, wobei ein Dienstprogramm wie das Windows System Timer Tool verwendet wird, um die gewünschte Auflösung des Systemtimers einzustellen.

Grund der Beschwerde: