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

 
prostotrader:

Il y a un code source avec des commentaires.

Trop paresseux pour le regarder ? Ou y a-t-il quelque chose que vous ne comprenez pas ?

Je l'ai fait. J'ai eu l'idée sans le code. Je ne comprends pas pourquoi vous me conseillez :

prostotrader:

Vous devez ajouter les instruments les plus liquides à Market Watch.

Ensuite, ajoutez des couches de ces instruments.

Et, quand OnBookEvent() se déclenche, copier 1 tick (dernier) il y aura un temps et prendre immédiatement le temps local et comparer.

En quoi votre méthode est-elle meilleure ?

 
pivomoe:

J'ai jeté un coup d'oeil. J'ai eu l'idée sans le code. Je ne comprends pas pourquoi vous me conseillez :

Pourquoi votre méthode est-elle meilleure ?

Parce que c'est la bonne !

J'ai fait une erreur, pas l'heure locale, mais l'heure du serveur.

1. les ticks arrivent au terminal par paquets.

2. Chaque paquet suivant peut contenir des ticks qui n'ont pas été "empilés" dans le paquet précédent, mais qui ont la même heure que le précédent.

3) OnBookEvent() est déclenché à l'arrivée de tout tick (changement de prix, volume), c'est-à-dire à chaque tick. (vous déclenchez une minuterie - déjà mauvais).

4. Vous utilisez du temps informatique local, qui n'est pas du tout nécessaire !

 

Voici en fait tout ce dont vous avez besoin pour trader (vérifiez les horaires des sessions de trading)

//+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                                                   Copyright 2019 |
//|                                                                  |
//+------------------------------------------------------------------+
int is_book;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
  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())
  {
    if(CheckMarketTime() == true)
    {
     //Торговое время
     //Наш код
    }
  }
}
//+------------------------------------------------------------------+
//| Expert Check Market Time function                                |
//+------------------------------------------------------------------+
bool CheckMarketTime()
{
  MqlDateTime cur_time, sv_time;
  MqlTick ticks[];
  cur_time.year = 0;
  TimeTradeServer(cur_time); //Возвращает расчетное текущее время торгового сервера.
  if(cur_time.year > 0)
  {
    int result = CopyTicks(Symbol(), ticks, COPY_TICKS_ALL, 0, 1);
    if(result > 0)
    {
      if(TimeToStruct(ticks[0].time, sv_time) == true)
      {
        if(sv_time.day_of_year == cur_time.day_of_year)      //Проверка, что это сегодняшний тик
        {
          ulong tr_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec;
          if(((tr_time >= 3600) && (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
          {
            return(true);
          }
        }
      }
    }
  }   
  return(false);
} 

Ajouté par

Si vous avez besoin d'une précision à la milliseconde près, alors ceci

double t_msc = double(ticks[0].time_msc - ulong(ticks[0].time) * 1000)/1000; //Получаем в секундах
double tr_time = sv_time.hour * 3600 + sv_time.min * 60 + sv_time.sec + t_msc;

Ajouté

Mais tout cela ne donnera pas le résultat escompté (les limites du temps de négociation) car

il peut n'y avoir aucun tic dans une session de négociation, et le temps ne s'arrête pas.

Supposons que quelqu'un ait retiré son ordre en attente, que le ticker ait changé,

il y a un signal mais il y a une corrélation "ancienne" (le temps n'est pas le temps actuel).

Le terminal ne diffuse pas l'heure exacte du serveur.

 

Vous ne me comprenez pas. Commençons par le début.

1) Dans votre programme, vous appelez TimeCurrent() et obtenez l'heure d'arrivée de la dernière cotation pour l'un des symboles sélectionnés dans Market Watch.

Qu'il soit 18:00:00.

2) Avec la commande suivante, vous obtenez l'heure du dernier tick par SBER.

Laisse tomber 17:58:00

3) Un peu de temps passe et vous demandez à nouveau l'heure du dernier tick par SBER.

Que ce soit 17:59:00


Notez la question : Pensez-vous qu'il est acceptable à 18:00:00 par TimeCurrent() de ne pas connaître le tick de 17:59:00 ?

 
pivomoe:

Vous ne me comprenez pas. Commençons par le début.

1) Dans votre programme, vous appelez TimeCurrent() et obtenez l'heure d'arrivée de la dernière cotation pour l'un des symboles sélectionnés dans Market Watch.

Qu'il soit 18:00:00.

2) Avec la commande suivante, vous obtenez l'heure du dernier tick SBER.

Laisse tomber 17:58:00

3) Un peu de temps passe et vous demandez à nouveau l'heure du dernier tick par SBER.

Que ce soit 17:59:00


Question d'attention : Pensez-vous qu'il est acceptable d'ignorer à 18:00:00 par TimeCurrent() un tick avec l'heure 17:59:00 ?

Dans le code que j'ai cité, vous pouvez tenir compte de tous les ticks (sans problème).

Le dernier code n'utilise pas TineCurrent() maisTimeTradeServer() - cette fois-ci, il n'est que nécessaire

pour vérifier la tique avec une précision d'un jour et c'est tout !

Commençons par le début.

En général, que voulez-vous faire, pour savoir ?

Pourquoi avez-vous commencé à comparer l'heure du tic-tac avec l'heure locale ?

Quel est le but initial ?

 

Je vais maintenant vous montrer comment ce problème se présente en pratique. J'ai complètement remanié le conseiller expert. J'ai fait en sorte qu'il soit possible d'attraper les nouveaux ticks dans OnTimer ainsi que dans OnBookEvent.

Il y a 45 symboles dans Market Watch. La plupart d'entre eux ne sont pas liquides.

Voici le résultat de la capture de nouveaux ticks dans OnBookEvent :

РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу 494013 милесекундa.

CR      0       18:51:47.334    ProverkaAktyalnostiTikov (ALRS,H1)       Получен НОВЫЙ тик по символу                     SNGR-3.19 time_msc= 2019.03.18 18:41:47.988

HN      0       18:51:47.335    ProverkaAktyalnostiTikov (ALRS,H1)       ХОТЯ до этого был получeн тик                        ARMD time_msc 2019.03.18 18:50:02.001

C'est-à-dire qu'un nouveau tick a été pris à 18:50 sur TimeCurrent pour le symboleSNGR-3.19 avec un temps de 18:41.


Ensuite, il y a les mesures du temps de l'ordinateur local au moment de :


1) obtenir un nouveau tick, c'est-à-dire au moment du dernier appel de CopyTick (ou SymbolInfo selon les paramètres).

2) Le moment du dernier appel.

18:51:47.335    ProverkaAktyalnostiTikov (ALRS,H1)       Локальное время получения нового тика по символу.                      2019.03.18 18:51:47.334

18:51:47.335    ProverkaAktyalnostiTikov (ALRS,H1)       Предпоследние Локальное время попытки получить новый тик по символу    2019.03.18 18:41:47.204


Donc, dans ce cas, le problème est survenu parce que la fonction get new n'a tout simplement pas été appelée pendant 10 minutes..... C'est parce que l'événement OnBookEvent pour leSNGR-3.19 n'a pas été généré pendant 10 minutes.

Peut-être que le terminal l'a placé dans la file d'attente des événements et qu'il a disparu de cette file d'attente. Il n'y a pas de telles erreurs avec OnTimer. Oui, il peut y avoir un tic avec 20 secondes de retard.


 
pivomoe:


Quel est votre objectif initial ?

Pourquoi avez-vous besoin de comparer les heures de départ avec l'heure locale?

 
prostotrader:

Quel est votre objectif initial ?

Pourquoi avez-vous besoin de comparer l'heure du tic-tac avec l'heure locale ?

Je veux connaître le délai maximum entre le moment où le tick se produit sur le serveur et celui où il arrive dans le terminal. Et je veux savoir comment minimiser ce temps.

Ces connaissances peuvent être utilisées pour écrire mon propre testeur. Vous pouvez même demander aux développeurs d'allonger le délai.

TimeCurrent() - le temps du dernier tic-tac d'un symbole sera inférieur au temps de retard, il peut donc être utilisé. L'utilisation de l'heure locale dans la première version n'était pas une bonne idée.

 
pivomoe:

Je veux connaître le délai maximum entre le moment où un tick se produit sur le serveur et celui où il atteint le terminal. Et comment minimiser ce temps.

Ces connaissances pourront être utilisées lors de l'écriture de mon propre testeur. Et peut-être pourrai-je même dérouter les développeurs avec des délais plus longs.

Je vois. Continuez... Sans moi.

Et pour le reste du forum

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

Question d'attention : Pensez-vous qu'il est normal d'ignorer un tic à 18:00:00 par TimeCurrent() avec une heure de 17:59:00 ?

Je pense que la question est discutable. Nous voulons que la séquence de tics réponde au moins aux critères suivants :

1. il doit être séquentiel, c'est-à-dire que l'heure de chaque tick suivant >= l'heure du tick précédent ;

2. l'actualité. C'est-à-dire que l'heure du dernier tic-tac entrant est aussi proche que possible de l'heure actuelle ;

Il semble que le problème se situe au niveau du deuxième point.

L'argumentation du point 2 est la suivante : je veux que le temps entre la génération du tick sur le serveur et sa réception (lag) soit minimal, afin que je puisse le traiter plus rapidement que les autres et prendre une décision de trading. Mais si le décalage est le même pour tous les enchérisseurs, il n'y a pas de problème (d'après ce que je comprends). C'est-à-dire que le serveur du courtier a le problème, mais tout le monde est sur un pied d'égalité. Si quelqu'un a obtenu l'information sur le tic-tac à 17:59:01, et que je ne l'ai pas eu même à 18:00 - c'est le gros problème.

Et voici la question. Quel est le problème (et y en a-t-il un) ? Dans le serveur du courtier, qui ne donne pas le tick (à tout le monde) pendant un long moment, ou dans MT5, qui ne le reçoit pas pendant un long moment.

Raison: