Eineinhalb Minuten Unterschied zwischen der Ortszeit und der neuen Tickerzeit. Was ist zu tun? - Seite 5

 
pivomoe:
Ich weiß. Worauf wollen Sie hinaus?

Zu was:

pivomoe:

In der Marktübersicht gibt es noch die Spalten "Volumen" "Letzter Handel" Es besteht der Verdacht, dass diese Funktion einfach die .time des letzten Ticks zurückgibt.

Die FunktionSymbolInfoInteger(_Symbol,SYMBOL_TIME) gibt nur die Zeit des letzten Ticks zurück. Denn die Änderung eines Zitats bewirkt das Erscheinen eines neuen Informationshakens.

Sie wollen die Zeit zwischen dem Eintreffen des letzten Kurses und dem Zeitpunkt des letzten Tickens messen. In Sekunden scheint es immer 0 zu sein, so dass das Terminal alles sofort zurückgibt.

 
Alexey Kozitsyn:

An:

Die FunktionSymbolInfoInteger(_Symbol,SYMBOL_TIME) gibt nur die Zeit des letzten Ticks zurück. Denn eine Änderung eines Zitats führt zu einem neuen Informationshäkchen.

Sie möchten die Zeit zwischen dem Eintreffen des letzten Kurses und dem Zeitpunkt des letzten Tickens messen. In Sekunden scheint es immer 0 zu sein, so dass das Terminal alles sofort zurückgibt.

Auch hierin sehe ich das Problem.

Gegeben:

Die lokale Zeit und die Serverzeit sind mehr oder weniger synchron, d. h. der Unterschied zwischen .time_msc der neuen Ticks und der lokalen Zeit beträgt nur wenige Sekunden.

Wenn Sieum 18:00:00 Uhr Ortszeit versuchen, mit SymbolInfoTick einen neuen Tick für das SBER-Symbol zu erhalten, erhalten Sie einen Tick mit der Uhrzeit 17:57:00

Um 18:00:01 Uhr, wenn wir versuchen, einen neuen Tick mit SymbolInfoTick zu erhalten, erhalten wir einen Tick mit der Zeit 17 :58:30

Ich glaube nicht, dass dies als operativ bezeichnet werden kann.

Jetzt habe ich mich von der lokalen Computerzeit entfernt und verwende stattdessen die maximale Zeit des letzten Ticks aller Symbole aus der Marktübersicht.

 
pivomoe:

Noch einmal, was ich als Problem sehe.

Gegeben:

Die lokale Zeit und die Serverzeit sind mehr oder weniger synchronisiert, d.h. der Unterschied zwischen .time_msc der neuen Ticks und der lokalen Zeit beträgt nur wenige Sekunden.

Wenn Sieum 18:00:00 Uhr Ortszeit versuchen, mit SymbolInfoTick einen neuen Tick für das SBER-Symbol zu erhalten, erhalten Sie einen Tick mit der Uhrzeit 17:57:00

Um 18:00:01 Uhr, wenn wir versuchen, einen neuen Tick mit SymbolInfoTick zu erhalten, erhalten wir einen Tick mit der Zeit 17 :58:30

Ich glaube nicht, dass dies als operativ bezeichnet werden kann.

Jetzt bin ich von der lokalen Computerzeit abgerückt und verwende stattdessen die maximale Zeit des letzten Ticks unter allen Symbolen aus der Marktübersicht.

Haben Sie verstanden, dass Sie jede beliebige Computerzeit einstellen können? Sie können es nicht verwenden. Das hat man Ihnen bereits gesagt. Das ist der erste Punkt.

Zweitens kann die maximale Zeit des letzten Ticks unter allen Symbolen der Marktübersicht nicht verwendet werden. Sie möchten den Abstand zwischen dem Zeitpunkt des letzten Ticks des SBER-Symbols (SymbolInfoTick) und dem Zeitpunkt des letzten Kurses des SBER-Symbols (SymbolInfoInteger) ermitteln. D.h. Sie müssen es ungefähr so machen, wie ich es geschrieben habe (ungefähr, weil Sie für mehr Genauigkeit einen Tumbler verwenden müssen, wie Ihnen geraten wurde).

Drittens: dies:

В 18:00:00 по времени компа  пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:57:00

В 18:00:01 по времени компа опять пытаемся получить новый тик по символу SBER с помощью SymbolInfoTick, нам отдают тик со временем 17:58:30

Wird ohne Beweise behauptet. Wenn Sie Ihren Code als Beweis betrachten, siehe "Zweites".

 
Alexey Kozitsyn:

Ist Ihnen klar, dass Sie die Computerzeit auf alles einstellen können? Sie können nicht an sie gebunden sein. Das hat man Ihnen bereits gesagt. Zuallererst.


Wenn es sich um Millisekunden oder gar Sekunden handelt, können Sie die Zeit nicht beliebig einstellen. Es ist durchaus möglich, dass es sich um Verzögerungen von Minuten handelt. Ich messe den Unterschied jetzt nicht damit, sondern mit der maximalen Zeit .time_msc des letzten Ticks für alle Symbole aus der Marktübersicht.

Alexey Kozitsyn:

Sie möchten den Abstand zwischen dem Zeitpunkt des letzten Ticks des SBER-Symbols (SymbolInfoTick) und dem Zeitpunkt des letzten Kurses des SBER-Symbols (SymbolInfoInteger) ermitteln.

Ich weiß es nicht.

Alexey Kozitsyn:

Zweitens können Sie auch nicht die maximale Zeit des letzten Ticks für alle Symbole aus der Marktübersicht verwenden.

Warum? Ich vergleiche nicht die Zeit des letzten Ticks (durch den Computer), ich vergleiche die time_msc .

Alexey Kozitsyn:

Ich kann Ihren Code nicht ohne Beweis verwenden. Wenn Sie Ihren Code als Beweis ansehen - siehe "Zweites".

In der Regel fragen die Entwickler nach Code, um das Problem zu reproduzieren. Hier ist eine kürzlich aufgezeichnete Verzögerung von 2 Sekunden.

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Получен НОВЫЙ тик по символу                     GAZR-3.19 time_msc= 2019.03.20 14:53:11.638
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   ХОТЯ до этого был получeн тик                        RTS-3.19 time_msc 2019.03.20 14:53:13.695
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Локальное время получения нового тика по символу.                                   2019.03.20 14:53:10.277
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Предпоследние Локальное время попытки получить новый тик по символу    2019.03.20 14:53:10.259
AlexeyKozitsyn:

(ungefähr deshalb, weil Sie, wie Ihnen geraten wurde, für eine größere Genauigkeit einen Tumbler verwenden müssen).

Mir wurde geraten, OnBookEvent anstelle von OnTimer zu verwenden. Ich habe dies umgesetzt. Sie können in den Einstellungen wählen, wo die Ticks empfangen werden sollen, entweder OnTimer oder OnBookEvent. Mit OnBookEvent ist es noch schlimmer, es werden nur 70 % der neuen Tick-Ereignisse erfasst.
Dateien:
 

pivomoe:

14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)  РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 2057 милесекундa.
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Получен НОВЫЙ тик по символу                     GAZR-3.19 time_msc= 2019.03.20 14:53:11.638
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   ХОТЯ до этого был получeн тик                        RTS-3.19 time_msc 2019.03.20 14:53:13.695
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Локальное время получения нового тика по символу.                                   2019.03.20 14:53:10.277
14:53:10.277    ProverkaAktyalnostiTikov (RTS-3.19,H1)   Предпоследние Локальное время попытки получить новый тик по символу    2019.03.20 14:53:10.259

Allein aus diesen Zeilen geht hervor, was Sie wollen. Sie sind an so etwas wie der Intersymbol-Synchronisation interessiert. Das heißt, die allgemeine Relevanz der Daten über die gewünschten Instrumente.

Ich kann Ihnen im Moment nicht weiterhelfen, ich war an dieser Frage nicht beteiligt. Fragen Sie die Entwickler.

 
Alexey Kozitsyn:

Allein aus diesen Zeilen geht hervor, was Sie wollen. Sie sind an so etwas wie der Intersymbol-Synchronisation interessiert. Das heißt, die allgemeine Relevanz der Daten über die gewünschten Instrumente.

Ich kann Ihnen im Moment nicht weiterhelfen, ich war an dieser Frage nicht beteiligt. Adresse für Entwickler.

Alexey (wollte nicht mitmachen, aber...).

Handelt es sich nicht um den "Relevanz"-Code (NEW_TICK) von Seite 2 dieses Threads?

//+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
enum FRESH_TICK
{
  UNKNOWN_TICK,
  NEW_TICK,
  CUR_TICK
};
//
int is_book;
ulong last_tick_time; //Время последнего тика
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  last_tick_time = 0;
  is_book = MarketBookAdd(Symbol());
  if(is_book == false) return(INIT_FAILED);
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
  if(is_book == true) MarketBookRelease(Symbol()); 
}
//+------------------------------------------------------------------+
// Expert Book event function                                        |
//+------------------------------------------------------------------+  
void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol())
  {
    MqlTick a_ticks[];
    int result = CopyTicks(symbol, a_ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      FRESH_TICK tick_state = CheckTickTime(a_ticks[0]);
      switch(tick_state)
      {
       case UNKNOWN_TICK:; //Тик не определен
       break;
       case NEW_TICK:;     //Торговое время, можно отсылать ордера;
       break;
       case CUR_TICK:;     //По усмотрению разработчика;
       break;
      }
    }  
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
FRESH_TICK CheckTickTime(MqlTick &a_tick)
{
  MqlDateTime cur_time, tick_time;
  cur_time.year = 0;
  TimeTradeServer(cur_time); //Возвращает расчетное текущее время торгового сервера.
  if(cur_time.year > 0)
  {
    if(TimeToStruct(a_tick.time, tick_time) == true)
    {
      if(tick_time.day_of_year == cur_time.day_of_year)      //Проверка, что это сегодняшний тик
      {
        double t_msc = double(a_tick.time_msc - ulong(a_tick.time) * 1000)/1000;
        double tr_time = double(tick_time.hour * 3600 + tick_time.min * 60 + tick_time.sec) + t_msc;
        if(((tr_time >= 36000) && (tr_time < 50370)) ||   //10:00:00 - 13:59:30
           ((tr_time >= 50700) && (tr_time < 67470)) ||   //14:05:00 - 19:44:30 
           ((tr_time >= 68700) && (tr_time < 85770)))     //19:05:00 - 23:49:30
        {
          if(ulong(a_tick.time_msc) > last_tick_time)
          {
            last_tick_time = ulong(a_tick.time_msc);
            return(NEW_TICK);
          } else return(CUR_TICK);  
        }
      }
    }
  }   
  return(UNKNOWN_TICK);
} 

Hinzugefügt

Mit CUR_TICK können Sie immer noch überprüfen, ob es sich um denselben Tick handelt wie vorher oder

das neue Tick-Paket einen Tick enthält, der im vorherigen Paket nicht enthalten war.

 
prostotrader:

Alexey (wollte sich nicht einmischen, aber...).

Ist das nicht der "Relevanz"-Code (NEW_TICK) von Seite 2 dieses Threads?

Offensichtlich nicht. Seitdem:

TimeTradeServer

Gibt die geschätzte aktuelle Zeit des Handelsservers zurück. Im Gegensatz zuTimeCurrent() wird der Zeitwert im Client-Terminal berechnet und hängt von den Zeiteinstellungen auf dem Computer des Benutzers ab.

D.h. sie hängt von der Computerzeit ab (das sollte für die Genauigkeit der Messung nicht so sein).

Es ist natürlich gut, denpivomoe-Code auf Korrektheit zu prüfen, und wenn es wirklich einen Fehler gibt, die Entwickler zu kontaktieren.

 
prostotrader:

Die Prüfung scheint über TimeGMTOffset erfolgen zu müssen. Ich werde später ein Beispiel skizzieren.

 
Alexey Kozitsyn:

Offensichtlich nicht. Weil:


Schauen Sie sich den Code genau an!

TimeTradeServer() wird nur verwendet, um den Tag zu bestimmen und das war's (diese Prüfung wird "nur für den Fall" durchgeführt)!

TimeTradeServer() darf überhaupt nicht ausgeführt werden!

Hinzugefügt von

Ich wiederhole

"Mit CUR_TICK können Sie immer noch überprüfen, ob es derselbe Tick ist wie vorher, oder

das neue Tick-Paket enthält einen Tick, der im vorherigen Paket nicht enthalten war, und das Paket enthält 1 Tick("old")".

if(ulong(a_tick.time_msc) > last_tick_time)
{
  last_tick_time = ulong(a_tick.time_msc);
  return(NEW_TICK);
}
 else
{
   //Дополнительные проверки 
}
 
Alexey Kozitsyn:

Es empfiehlt sich natürlich, denpivomoe-Code auf seine Korrektheit hin zu überprüfenund, falls tatsächlich ein Fehler vorliegt, die Entwickler zu kontaktieren.

Der Fehler tritt entweder auf, wenn es Dutzende von Zeichen in der Marktübersicht gibt oder wenn mehrere Zeichen in der Übersicht geöffnet sind, aber mehrere Dutzend Tabs im Opera-Browser vorhanden sind. Ich habe die Entwickler per privater Nachricht angeschrieben.

Wie ich bereits schrieb, wird das Problem mit einem ausreichend großen Sleep zwischen den Aufrufen behoben, für 40 Zeichen reicht sleep(10). Je größer die Zahl der Zeichen, desto mehr Schlaf wird benötigt.
Grund der Beschwerde: