[SERVICE DESK] Fehler beim Abrufen der Zeit der älteren TF im Timer! - Seite 2

 
Alexey Kozitsyn:

Noch einmal. Das steht nirgendwo. Das ist das Wichtigste. Zweitens, warum ist es dann irreführend, wenn zuerst ein Fehlercode 4066 angezeigt wird und dann nicht?

Die Daten werden in Batches gepumpt und dann vom Terminal verarbeitet, und da Sie an einem Timer arbeiten, werden Sie angehalten. Ich sehe es nirgendwo explizit, aber viele Programmierer, die MTF-Anwendungen schreiben, wissen in der Regel darüber Bescheid, und ich habe Ihnen sofort davon erzählt.

https://docs.mql4.com/ru/series/timeseries_access gründlich gelesen.

Nun, oben haben Sie uns bereits eine Variante zur Überprüfung der Zugänglichkeit der Historie genannt. Sie ist nicht perfekt, aber sie ist einfach und offensichtlich.

Sollte diese Variante nicht funktionieren, prüfen Sie bitte wie folgt.

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

Die Daten werden in Portionen gepumpt und dann vom Terminal verarbeitet, und da Sie sich in einem Zeitfenster befinden, werden Sie angehalten. Ja, es wird nirgendwo ausdrücklich erwähnt, aber viele Programmierer, die MTF-Anwendungen schreiben, wissen in der Regel darüber Bescheid, und ich habe es Ihnen gleich gesagt.

https://docs.mql4.com/ru/series/timeseries_access gründlich gelesen.

Nun, oben haben Sie uns bereits eine Variante zur Überprüfung der Zugänglichkeit der Historie genannt. Es ist nicht perfekt, aber es ist einfach und offensichtlich.

Wo sind die Beweise für das "Innehalten"?

Ich habe ihn sorgfältig gelesen (und habe ihn schon vorher gelesen). Ich bin mir bewusst, dass Daten (insbesondere ältere TFs) nicht immer sofort verfügbar sind. Kein Problem. Aber warum gibt die Funktion SeriesInfoInteger() dann keinen Fehler zurück? Hier ist die Frage!

Angenommen, die Anfrage fällt auf eine Pause/Swap/Update/Pause usw., dann soll sie den Fehlercode != 0 zurückgeben. Und es wird keine Probleme geben!

 
Vitaly Gorbunov:

Und oben haben Sie bereits die Möglichkeit gegeben, die Zugänglichkeit der Geschichte zu überprüfen. Es ist nicht perfekt, aber es ist einfach und überschaubar.

Zu diesem Punkt hat @Ihor Herasko bereits geantwortet.

 
Alexey Kozitsyn:

Zu diesem Punkt wurde @Ihor Herasko oben bereits geantwortet.

Oben wurde seine Version des Tests vorgestellt. Warum so Frage an die Entwickler, aber dieser Punkt ist seit sehr langer Zeit bekannt!
 
Vitaly Gorbunov:
Ich habe meine Version des Tests oben angegeben. Warum so Frage an die Entwickler, aber dieser Punkt ist seit langem bekannt!

Ich werde auf jeden Fall Ihre Version des Tests ausprobieren und die Ergebnisse mitteilen.

 
Alexey Kozitsyn:

Ich werde auf jeden Fall Ihre Version des Tests ausprobieren und über die Ergebnisse berichten.

Ich werde auf jeden Fall Bericht erstatten! Das funktioniert bei mir! Aber wenn es nicht klappt, kann es alle möglichen Fallstricke geben, und wir werden darüber nachdenken, was wir sonst noch tun können.
 

Zunächst eine Antwort von @Ihor Herasko. Code für die Wiedergabe:

#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 );
  }

Ergebnis:

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

Laut den Protokolleinträgen. Das Terminal wurde um 14:25 Uhr abgeschaltet. Als nächstes wird um 14:30 Uhr eingeschaltet. Wir überprüfen die Uhrzeit von Takt M15. Wir haben mit TF M1 begonnen. Der Indikator (obiger Code) zeigte die tatsächliche Öffnungszeit um 12:15 Uhr an (Terminalzeit, lag 2 Stunden hinter meiner Ortszeit zurück). Das Ergebnis hätte 12:30 sein müssen! Fazit: Der Fehler ist vorhanden. Und diese von @Ihor Herasko vorgeschlagene Methode funktioniert nicht.

 
Vitaly Gorbunov:
Bitte melden Sie sich! Das funktioniert bei mir! Aber es kann alle möglichen Fallstricke geben, wenn es nicht funktioniert, werden wir überlegen, was wir sonst tun können.

Ich werde mich abmelden. 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 );
  }
//+------------------------------------------------------------------+

Ergebnis:

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

Ich habe das Terminal um 14:48 Uhr ausgeschaltet und um 15:01 Uhr wieder eingeschaltet. Sie hätten die Uhrzeit um 13.00 Uhr erfahren müssen. Ich habe 12:45 Uhr. Haben Sie noch Fragen?

Ich habe TF von M1 auf M5 geändert und das richtige Ergebnis erhalten:

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
 
Noch einmal bitte ich die Entwickler(@Slava, @Alexander, @Renat Fatkhullin), sich dieses Problems anzunehmen.
 

Ich glaube, ich hab's! Wird der Indikator sofort mit dem Terminal gestartet? Wenn ja, vor der Überprüfung warten auf eine Verbindung zum Server IsConnected() Sie haben eine sehr schnelle Timer hat es keine Zeit zu synchronisieren!

Oder tun Sie dies

if(iBarShift(Symbol(),PERIOD_M15,TimeLocal(),true)==-1)
        {
         Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
         return( false );
        }
Sie müssen jedoch den Unterschied zwischen der Serverzeit und der Ortszeit berücksichtigen. Schreiben Sie uns die Ergebnisse!
Grund der Beschwerde: