Une minute et demie de différence entre l'heure locale et l'heure du tic-tac frais. Ce qu'il faut faire. - page 5

 
pivomoe:
Je sais. Où voulez-vous en venir ?

A quoi :

pivomoe:

Dans la vue d'ensemble du marché, il y a toujours les colonnes "Volume" "Dernière transaction" On soupçonne que cette fonction renvoie simplement l'heure du dernier tick.

La fonctionSymbolInfoInteger(_Symbol,SYMBOL_TIME) renvoie uniquement l'heure du dernier tick. Parce que la modification d'une citation entraîne l'apparition d'une nouvelle coche informative.

Vous voulez mesurer le temps entre l'arrivée de la dernière cotation et l'heure du dernier tic-tac. En secondes, il semble être toujours égal à 0. Par conséquent, le terminal renvoie tout rapidement.

 
Alexey Kozitsyn:

A :

La fonctionSymbolInfoInteger(_Symbol,SYMBOL_TIME) renvoie uniquement l'heure du dernier tick. Parce que la modification d'une citation entraîne une nouvelle coche informationnelle.

Vous voulez mesurer le temps entre l'arrivée de la dernière cotation et le moment du dernier tic-tac. En secondes, il semble être toujours égal à 0. Par conséquent, le terminal renvoie tout rapidement.

Encore une fois, c'est ce que je considère comme le problème.

Étant donné :

L'heure locale et l'heure du serveur sont plus ou moins synchronisées, c'est-à-dire que la différence entre le .time_msc des nouveaux ticks et l'heure locale est de quelques secondes.

A 18:00:00 heure locale vous essayez d'obtenir un nouveau tick par le symbole SBER avec SymbolInfoTick, vous obtenez un tick avec l'heure 17:57:00

A 18:00:01 comp temps nous essayons d'obtenir un nouveau tick avec SymbolInfoTick, nous obtenons un tick avec le temps 17 :58:30

Je ne pense pas que cela puisse être appelé opérationnel.

Maintenant, je me suis éloigné de l'heure locale de l'ordinateur et j'utilise plutôt l'heure maximale du dernier tick parmi tous les symboles de l'aperçu du marché.

 
pivomoe:

Encore une fois, c'est ce que je considère comme le problème.

Étant donné :

L'heure locale et l'heure du serveur sont plus ou moins synchronisées, c'est-à-dire que la différence entre le .time_msc du nouveau tick et l'heure locale est de quelques secondes.

A 18:00:00 heure locale vous essayez d'obtenir un nouveau tick par le symbole SBER avec SymbolInfoTick, vous obtenez un tick avec l'heure 17:57:00

A 18:00:01 comp temps nous essayons d'obtenir un nouveau tick avec SymbolInfoTick, nous obtenons un tick avec le temps 17 :58:30

Je ne pense pas que cela puisse être appelé opérationnel.

Maintenant, je me suis éloigné de l'heure locale de l'ordinateur et j'utilise plutôt l'heure maximale du dernier tick parmi tous les symboles de l'aperçu du marché.

Comprenez-vous que vous pouvez régler n'importe quelle heure d'ordinateur ? Vous ne pouvez pas l'utiliser. On vous l'a déjà dit. C'est la première chose.

Deuxièmement, l'heure maximale du dernier tick parmi tous les symboles de l'aperçu du marché ne peut pas être utilisée. Vous voulez trouver le décalage entre l'heure du dernier tick du symbole SBER (SymbolInfoTick) et l'heure de la dernière cotation du symbole SBER (SymbolInfoInteger). C'est-à-dire que vous devez le faire à peu près comme je l'ai écrit (à peu près parce que vous devez utiliser un culbuteur pour plus de précision, comme on vous l'a conseillé).

Troisièmement, ceci :

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

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

Est affirmé sans preuve. Si vous considérez votre code comme une preuve, voir "deuxième".

 
Alexey Kozitsyn:

Savez-vous que vous pouvez régler l'heure de l'ordinateur sur n'importe quoi ? Vous ne pouvez pas être lié à elle. On vous l'a déjà dit. Tout d'abord.


Vous ne pouvez pas le régler sur n'importe quel moment si vous parlez de millisecondes ou même de secondes. Parler de délais de quelques minutes est tout à fait possible. Je ne mesure pas la différence avec lui maintenant, mais avec le temps maximum .time_msc du dernier tick pour tous les symboles de l'aperçu du marché.

Alexey Kozitsyn:

Vous voulez trouver le décalage entre l'heure du dernier tick du symbole SBER (SymbolInfoTick) et l'heure de la dernière cotation du symbole SBER (SymbolInfoInteger).

Je ne le fais pas.

Alexey Kozitsyn:

Deuxièmement, vous ne pouvez pas non plus utiliser l'heure maximale du dernier tick parmi tous les symboles de l'aperçu du marché.

Pourquoi ? Je ne compare pas l'heure du dernier tick (par ordinateur), je compare le time_msc.

Alexey Kozitsyn:

Je ne peux pas utiliser votre code sans preuve. Si vous considérez votre code comme une preuve - voir "deuxième".

En général, les développeurs demandent du code pour reproduire le problème. Voici un retard de 2 secondes pris récemment.

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:

(en gros, parce que vous devez utiliser un culbuteur pour plus de précision, comme on vous l'a conseillé).

On m'a conseillé d'utiliser OnBookEvent au lieu de OnTimer. Je l'ai mis en œuvre. Vous pouvez choisir dans les paramètres où recevoir les ticks, soit OnTimer, soit OnBookEvent. C'est encore pire avec OnBookEvent, qui ne capte que 70% des nouveaux événements tick.
Dossiers :
 

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

Rien qu'à travers ces lignes, ce que vous voulez semble clair. Vous êtes intéressé par quelque chose comme la synchronisation inter-symboles. C'est-à-dire la pertinence générale des données sur les instruments que vous souhaitez.

Je ne peux pas vous aider pour l'instant, je n'ai pas été impliqué dans cette question. Demandez aux développeurs.

 
Alexey Kozitsyn:

Rien qu'à travers ces lignes, ce que vous voulez semble clair. Vous êtes intéressé par quelque chose comme la synchronisation inter-symboles. C'est-à-dire la pertinence générale des données sur les instruments que vous souhaitez.

Je ne peux pas vous aider pour l'instant, je n'ai pas été impliqué dans cette question. Adresse aux développeurs.

Alexey (ne voulait pas participer, mais...).

N'est-ce pas le code "pertinence" (NEW_TICK) de la page 2 de ce fil ?

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

Ajouté

Avec CUR_TICK, vous pouvez toujours vérifier qu'il s'agit du même tick qu'avant ou

le nouveau paquet de tics contient un tic qui n'était pas dans le précédent.

 
prostotrader:

Alexey (je ne voulais pas m'impliquer, mais...).

N'est-ce pas le code de "pertinence" (NEW_TICK) de la page 2 de ce fil ?

Apparemment non. Depuis :

TimeTradeServer

Renvoie l'heure actuelle estimée du serveur commercial. Contrairement àTimeCurrent(), la valeur de l'heure est calculée dans le terminal client et dépend des paramètres horaires de l'ordinateur de l'utilisateur.

C'est-à-dire qu'il dépend du temps de l'ordinateur (il ne devrait pas en être ainsi pour la précision de la mesure).

L'important ici, bien sûr, est de vérifier l'exactitude du code depivomoe, et s'il y a vraiment un bogue, de contacter les développeurs.

 
prostotrader:

La vérification semble devoir se faire via TimeGMTOffset. J'esquisserai un exemple plus tard.

 
Alexey Kozitsyn:

Apparemment non. Parce que :


Regardez bien le code !

TimeTradeServer() ne sert qu'à déterminer le jour et c'est tout (cette vérification est faite "au cas où") !

TimeTradeServer() peut ne pas être fait du tout !

Ajouté par

Je répète

"Avec CUR_TICK, vous pouvez toujours vérifier qu'il s'agit du même tick que précédemment, ou bien

le nouveau paquet de tick contient un tick qui n'a pas été transmis dans le paquet précédent, et le paquet contient 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:

Il s'agit ici, bien sûr, de vérifier l'exactitude du code depivomoe et, s'il y a effectivement un bug, de contacter les développeurs.

Le bug apparaît soit s'il y a des dizaines de caractères dans la revue de marché, soit s'il y a plusieurs caractères ouverts dans la revue, mais qu'il y a plusieurs dizaines d'onglets dans le navigateur Opera. J'ai écrit aux développeurs par message privé.

Comme je l'ai écrit précédemment, le problème est résolu avec un Sleep assez grand entre les appels, pour 40 caractères sleep(10) est suffisant. À mesure que le nombre de personnages augmente, il faut de plus en plus de sommeil.