[Erreur dans la récupération de l'heure du senior TF dans le chronomètre ! - page 2

 
Alexey Kozitsyn:

Encore une fois. Ça ne le dit nulle part. C'est la première chose. Deuxièmement, pourquoi est-il alors trompeur en montrant d'abord un code d'erreur 4066 et ensuite non ?

Les données sont pompées par lots, puis traitées par le terminal, et comme vous travaillez sur une minuterie, vous êtes en pause. Je ne le vois nulle part explicitement, mais de nombreux programmeurs qui écrivent des applications MTF le savent généralement et je vous en ai déjà parlé.

https://docs.mql4.com/ru/series/timeseries_access l'a lu attentivement.

Eh bien, vous nous avez déjà donné ci-dessus une variante de la vérification de l'accessibilité de l'historique. Il n'est pas parfait mais il est simple et évident.

Si cette variante ne fonctionne pas, vérifiez comme suit.

if(iBarShift(Symbol(),PERIOD_H1,TimeCurrent(),true)==-1){Print("Данные истории по последнему часу отсутствуют!");}
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL4
Организация доступа к данным - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Прежде чем ценовые данные будут доступны в терминале MetaTrader 4, их необходимо получить и обработать. Для получения данных требуется подключение к торговому серверу MetaTrader 4. Данные поступают с сервера по запросу терминала в виде экономно упакованных блоков минутных баров. Механизм обращения к серверу за данными не зависит от того, каким...
 
Vitaly Gorbunov:

Les données sont pompées par portions, puis traitées par le terminal, et comme vous êtes sur une minuterie, vous êtes mis en pause. Oui, ce n'est mentionné explicitement nulle part, mais de nombreux programmeurs qui écrivent des applications MTF le savent généralement et je vous l'ai dit tout de suite.

https://docs.mql4.com/ru/series/timeseries_access l'a lu attentivement.

Eh bien, ci-dessus vous nous avez déjà donné une variante de la vérification de l'accessibilité de l'historique. Il n'est pas parfait mais il est simple et évident.

Pour ce qui est d'entrer "dans une pause", où sont les preuves ?

Je l'ai lu attentivement (et je l'ai déjà lu auparavant). Je suis conscient que les données (surtout les anciens TF) ne sont pas toujours immédiatement disponibles. Pas de problème. Mais pourquoi alors la fonction SeriesInfoInteger() ne renvoie-t-elle aucune erreur ? Voici la question !

En supposant que la demande tombe sur une pause/swap/mise à jour/rupture, etc., elle renvoie le code d'erreur != 0. Et il n'y aura aucun problème !

 
Vitaly Gorbunov:

Et ci-dessus, vous avez déjà donné la possibilité de vérifier l'accessibilité de l'histoire. Ce n'est pas parfait, mais c'est simple et direct.

Réponse ci-dessus à @Ihor Herasko sur ce point.

 
Alexey Kozitsyn:

Déjà répondu à @Ihor Herasko ci-dessus sur ce point.

Ci-dessus, il a donné sa version du test. Pourquoi donc questionner les développeurs mais ce point est connu depuis très longtemps !
 
Vitaly Gorbunov:
J'ai donné ma version du test ci-dessus. Pourquoi cette question aux développeurs mais ce point est connu depuis longtemps !

Je vais certainement essayer votre version du test et rapporter les résultats.

 
Alexey Kozitsyn:

Je vais certainement essayer votre version du test et vous faire part des résultats.

Je ne manquerai pas de vous en faire part ! Ça marche pour moi ! Mais il peut y avoir toutes sortes d'embûches si cela ne fonctionne pas et nous allons réfléchir à ce que nous pouvons faire d'autre.
 

D'abord une réponse de @Ihor Herasko. Code pour la lecture :

#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _m15OpenTime=0;
//--- Вести лог журнала
const bool inpFileLog=true;
//--- Количество секунд в одном дне
const int SEC_PER_DAY=86400;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Запускаем таймер
   if(!EventSetMillisecondTimer(20))
     {
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 ms не установлен!");
      return( INIT_FAILED );
     }
//--- Сбрасываем время открытия текущего бара м15, часа, дня
   _m15OpenTime = 0;
//---
   return( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   return( rates_total );
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- Проверяем, записано ли время открытия текущего бара М15
   if(!CheckCurrentM15OpenTime())                        // Если время не записано
      return;                                                // Выходим                                                                                                                         // Выходим
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего бара М15             |
//+------------------------------------------------------------------+
bool CheckCurrentM15OpenTime()
  {
//--- Проверяем, записано ли время
   if(_m15OpenTime==0) // Если время не записано
     {
      //---
      ResetLastError();
      iTime(NULL,PERIOD_M15,1);
      //---
      if(GetLastError()==ERR_NO_ERROR)
        {
         ResetLastError();
         //--- Запоминаем время открытия бара
         _m15OpenTime=iTime(NULL,PERIOD_M15,0);
         //---
         Print(__FILE__,": Актуальное время открытия бара М15 = "+TimeToString(_m15OpenTime)+". Ошибка #",GetLastError());
         //--- Возвращаем истину
         return( true );
        }
      else
         return( false );
     }
//--- Время открытия М15 ранее записано. Возвращаем истину
   return( true );
  }

Résultat :

2018.09.21 14:25:02.793 Custom indicator test_isNewDayInTimer_iTime() EURGBP.e,M1: removed
2018.09.21 14:30:44.120 Custom indicator test_isNewDayInTimer_iTime() EURGBP.e,M1: loaded successfully
2018.09.21 14:30:44.149 test_isNewDayInTimer_iTime() EURGBP.e,M1: initialized
2018.09.21 14:30:44.262 test_isNewDayInTimer_iTime() EURGBP.e,M1: test_isNewDayInTimer_iTime().mq4: Актуальное время открытия бара М15 = 2018.09.21 12:15. Ошибка #0

D'après les entrées du journal. Le terminal a été éteint à 14h25. Suivant, allumé à 14h30. Nous vérifions l'heure de la barre M15. Nous avons commencé par le TF M1. L'indicateur (code ci-dessus) indiquait l'heure d'ouverture réelle à 12:15 (heure du terminal, décalée de 2 heures par rapport à mon heure locale). Le résultat aurait dû être 12:30 ! Conclusion - l'erreur est présente. Et cette méthode suggérée par @Ihor Herasko ne fonctionne pas.

 
Vitaly Gorbunov:
N'oubliez pas de faire un rapport ! Ça marche pour moi ! Mais il peut y avoir toutes sortes d'embûches ; si cela ne fonctionne pas, nous réfléchirons à ce que nous pouvons faire d'autre.

Je vais terminer. Code :

#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _m15OpenTime=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Запускаем таймер
   if(!EventSetMillisecondTimer(20))
     {
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 ms не установлен!");
      return( INIT_FAILED );
     }
//--- Сбрасываем время открытия текущего бара м15
   _m15OpenTime=0;
//---
   return( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

   return( rates_total );
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- Проверяем, записано ли время открытия текущего бара М15
   if(!CheckCurrentM15OpenTime())                        // Если время не записано
      return;                                                // Выходим
  }
//+------------------------------------------------------------------+
//| Проверяем, записано ли время открытия текущего бара М15             |
//+------------------------------------------------------------------+
bool CheckCurrentM15OpenTime()
  {
//--- Проверяем, записано ли время
   if(_m15OpenTime==0) // Если время не записано
     {
      //---
      ResetLastError();
      if(iBarShift(Symbol(),PERIOD_M15,TimeCurrent(),true)==-1)
        {
         Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
         return( false );
        }
      //---
      if(GetLastError()==ERR_NO_ERROR)
        {
         ResetLastError();
         //--- Запоминаем время открытия бара
         _m15OpenTime=iTime(NULL,PERIOD_M15,0);
         //---
         Print(__FILE__,": Актуальное время открытия бара М15 = "+TimeToString(_m15OpenTime)+". Ошибка #",GetLastError());
         //--- Возвращаем истину
         return( true );
        }
      else
         return( false );
     }
//--- Время открытия недели ранее записано. Возвращаем истину
   return( true );
  }
//+------------------------------------------------------------------+

Résultat :

2018.09.21 14:48:46.485 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: removed
2018.09.21 15:01:23.158 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: loaded successfully
2018.09.21 15:01:23.175 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: initialized
2018.09.21 15:01:23.295 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М15 = 2018.09.21 12:45. Ошибка #0

J'ai éteint le terminal à 14h48, je l'ai rallumé à 15h01. J'aurais dû avoir l'heure à 13 heures. J'ai eu 12:45. D'autres questions ?

J'ai changé le TF de M1 à M5 et j'ai obtenu un résultat correct :

2018.09.21 15:01:23.295 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М15 = 2018.09.21 12:45. Ошибка #0
2018.09.21 15:05:50.057 test_isNewDayInTimer_iBarShirt() EURGBP.e,M1: uninit reason 3
2018.09.21 15:05:50.058 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: initialized
2018.09.21 15:05:50.094 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М15 = 2018.09.21 13:00. Ошибка #0
 
Une fois encore, je demande aux développeurs(@Slava, @Alexander, @Renat Fatkhullin) de prêter attention à ce problème.
 

Je crois que j'ai trouvé ! L'indicateur est-il mis en route immédiatement avec le terminal ? Si c'est le cas, avant de vérifier l'attente d'une connexion au serveur IsConnected() vous avez une minuterie très rapide ; elle n'a pas le temps de se synchroniser !

Ou faites ceci

if(iBarShift(Symbol(),PERIOD_M15,TimeLocal(),true)==-1)
        {
         Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
         return( false );
        }
Mais vous devez tenir compte de la différence entre l'heure du serveur et l'heure locale. Écrivez-nous avec les résultats !