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

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

Netter Versuch. Ich dachte schon, es würde funktionieren. Aber... Nein:

2018.09.21 15:16:40.519 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: removed
2018.09.21 15:32:29.397 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: loaded successfully
2018.09.21 15:32:29.415 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: initialized
2018.09.21 15:32:29.508 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.532 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.557 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.587 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.620 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.651 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.683 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.716 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.743 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.776 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.807 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.841 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.872 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.901 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.935 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.972 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:29.996 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.21 15:32:30.059 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М15 = 2018.09.21 13:15. Ошибка #0

Ich habe die Funktion OnTimer() aus dem vorherigen Code durch diese ersetzt:

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if( !IsConnected() )
        {
         Print( __FUNCTION__,": Связь отсутствует!" );
         return;
        }
//--- Проверяем, записано ли время открытия текущего бара М15
   if(!CheckCurrentM15OpenTime())                        // Если время не записано
      return;                                                // Выходим
  }
 
Vitaly Gorbunov:

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 machen Sie es so.

Aber wir müssen den Unterschied zwischen Serverzeit und Ortszeit berücksichtigen. Schreiben Sie uns die Ergebnisse!

Ich werde keine Krücken herstellen. Es gibt einen offensichtlichen Fehler in der Sprache! Wir warten auf Entwickler...

 

Sehr interessant, es soll ja auch funktionieren. Aber andererseits ist der Timer sehr schnell, vielleicht hat das Terminal keine Zeit, Angebote anzunehmen. Ich muss darüber nachdenken. Wie wäre es, einen normalen Timer für 5 Sekunden zu erstellen, um die Idee zu testen?

 
Vitaly Gorbunov:

Sehr interessant, es soll ja auch funktionieren. Aber andererseits ist der Timer sehr schnell, vielleicht hat das Terminal keine Zeit, Angebote anzunehmen. Ich muss darüber nachdenken. Wie wäre es, wenn wir einen normalen Timer für 5 Sekunden erstellen, um die Idee zu überprüfen?

Und ich brauche keine "Passform", um die Idee zu überprüfen. Im wirklichen Leben brauche ich den schnellstmöglichen Timer.

 
Vitaly Gorbunov:

Sehr interessant, es soll ja auch funktionieren.

Sie können den Indikator jederzeit in Ihrem Terminal ausführen, 15 Minuten warten und dann Bericht erstatten.

 

Okay, aber ich habe eine Menge anderer Arbeit zu erledigen. Sobald ich eine Pause habe, werde ich ein Experiment machen.

Und ich glaube, ich habe sogar eine Idee, wie man sie einfangen kann.

 

Probieren Sie es so!

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_chart_window
datetime ChkTime;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Время открытия текущего часа, дня и недели
datetime _m15OpenTime=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//Сохраняем старое время  
   ChkTime=TimeCurrent();
//--- Запускаем таймер
   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()
  {
   if(!IsConnected())
     {
      Print(__FUNCTION__,": Связь отсутствует!");
      return;
     }
//Если есть соединение проверяем что прошла синхронизация времни     
   if(IsConnected() && ChkTime==TimeCurrent())
     {
      return;
     }
//--- Проверяем, записано ли время открытия текущего бара М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 );
  }
//+------------------------------------------------------------------+



2018.09.21 15:02:42.910 Custom indicator test XAUUSD,H1: removed
2018.09.21 15:15:27.985 test XAUUSD,H1: initialized
2018.09.21 15:15:29.520 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.552 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.589 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.605 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.636 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.667 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.705 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.736 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.768 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.805 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.837 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.868 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.906 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.937 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:29.969 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.006 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.038 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.069 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.106 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.138 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:30.169 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.21 15:15:31.880 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #4066
2018.09.21 15:15:31.900 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:31.940 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:31.990 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.010 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.074 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.100 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.120 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.174 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #0
2018.09.21 15:15:32.274 test XAUUSD,H1: test.mq4: Актуальное время открытия бара М15 = 2018.09.21 15:15. Ошибка #0
 
Vitaly Gorbunov:

Probieren Sie es so!

Da ist die Krücke wieder. Sie versuchen, das Problem mit allen Mitteln zu lösen, auch mit irrationalen, und ignorieren dabei die Ursache des Problems - Sprachfehler. Ich glaube nicht, dass Sie das tun sollten.

Hinzugefügt:

Ja, diese Art von Technik scheint zu funktionieren. Als Option können Sie es verwenden. Ich danke Ihnen! Aber ich möchte trotzdem, dass die Funktionen richtig funktionieren.

 
Nun, ich würde nicht sagen, dass es eine Krücke ist. Ich warte darauf, dass die Zitate vom Server kommen, sonst wird der Verlauf nicht aktualisiert. Eine andere Möglichkeit besteht darin, die lokale Computerzeit zu nehmen und um die Zeitzone zu korrigieren, die automatisch berechnet werden kann, und am Ende ohnehin auf die Aktualisierung der Kurse zu warten. Es ist ein bisschen schief, aber ich glaube nicht, dass die Metakvot-Leute etwas an MT4 ändern werden. Letztendlich handelt es sich um ein Problem mit der Serververbindung, das auf die eine oder andere Weise gelöst werden muss.
 
Alexey Kozitsyn:

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

Ergebnis:

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.

Es gibt zwei wesentliche Fehler in Ihrem Ansatz zu überprüfen:

  1. In der OnInit() des Indikators ist es unmöglich, die korrekten Daten eines beliebigen TF zu erhalten, selbst des aktuellen. Das OnInit() des Indikators beim Start des Terminals wird fast in einem leeren Fenster ausgeführt (es sind möglicherweise nicht einmal die Daten vorhanden, die zum Zeitpunkt des Herunterfahrens des Terminals vorhanden waren). Auch das Marktumfeld ist oft noch nicht verfügbar. Die Hilfe enthält viele Warnungen darüber, was man in OnInit() nicht tun sollte. Daher gibt es nicht viel, was in den Code aufgenommen werden muss. In der Regel handelt es sich dabei um eine Überprüfung der Werte der eingestellten Parameter, die Bindung von Indikatorpuffern an Arrays und die Erstellung von Klassen, falls solche verwendet werden. Alles andere muss in OnCalculate() erledigt werden.
  2. Alle diese Prüfungen können nur durchgeführt werden, nachdem OnCalculate mindestens einmal aufgerufen wurde.