[СЕРВИСДЕСК] Ошибка получения времени старшего ТФ в таймере! - страница 3

 
Vitaly Gorbunov:
А вроде я понял! Индюк запускается сразу вместе с терминалом? Если да то перед проверкой дождитесь что есть связь с сервером IsConnected() у вас очень быстрый таймер он не успевает синхронизироваться!

Хорошая попытка. Уже было начал думать, что это сработает. Но... нет:

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

В предыдущем коде функцию OnTimer() заменил на эту:

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

А вроде я понял! Индюк запускается сразу вместе с терминалом? Если да то перед проверкой дождитесь что есть связь с сервером IsConnected() у вас очень быстрый таймер он не успевает синхронизироваться!

Или сделай вот так

Но придётся учитывать разницу между Серверным временем и локальным. Отпишись по результатам! 

Костыли я точно городить не собираюсь. Тут на лицо явная ошибка в языке! Ждем разработчиков...

 

Очень интересно, по идее должно работать. Но опять таки очень быстрый таймер возможно терминал не успевает начать принимать котировки. Надо подумать. А если сделать нормальный таймер секунд на 5-ть для проверки идеи?

 
Vitaly Gorbunov:

Очень интересно, по идее должно работать. Но опять таки очень быстрый таймер возможно терминал не успевает начать принимать котировки. Надо подумать. А если сделать нормальный таймер секунд на 5-ть для проверки идеи?

А мне не нужен "подгон" под проверку идеи. В реальных условиях нужен максимально быстрый таймер.

 
Vitaly Gorbunov:

Очень интересно, по идее должно работать.

Вы всегда можете запустить индикатор у себя в терминале, подождать 15 минут и отписаться по результатам.

 

Ок но у меня ещё другой работы полно. Как только появиться пауза проведу эксперемент.

И вроде у меня даже появилась идея как это отлавливать.

 

Попробуй вот так!

//+------------------------------------------------------------------+
//|                                                      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:

Попробуй вот так!

Опять костыль. Вы пытаетесь решить проблему любыми методами, даже нерациональными, игнорируя причину проблемы - ошибки языка. Я считаю, так делать не стоит.

Добавлено:

Да, похоже такой прием работает. Как вариант использовать можно. Спасибо! Но, все таки хотелось бы нормальной работы функций.

 
Ну я бы не сказал что это костыль. Я ожидаю потока котировок от сервера иначе история не будет обновлена. Другой вариант это брать локальное время компьютера вводить поправку на тайм зону, которую можно высчитывать автоматически и в конце концов всё равно ждать обновления котировок. Да немного кривовато но не думаю что Метаквотовцы будут что то менять в МТ4. В конце концов эта проблема коннекта к серверу которую надо обрабатывать так или иначе.  
 
Alexey Kozitsyn:

Сначала ответ @Ihor Herasko. Код для воспроизведения:

Результат:

По записям лога. Терминал был выключен в 14:25. Далее, включен в 14:30. Проверяем время бара М15. Запуск с ТФ М1. Индикатор (код выше) показал актуальное время открытия 12:15 (терминальное время, отстает от моего локального на 2 часа). Должен был получен результат 12:30! Вывод - ошибка присутствует. И данный метод, предложенный @Ihor Herasko не работает.

В Вашем подходе к проверке имеется две существенные ошибки:

  1. В OnInit() индикатора невозможно получить корректные данные какого-либо ТФ, даже текущего. OnInit() индикатора при старте терминала выполняется практически в пустом окне (там может не быть даже тех данных, которые были на момент выключения терминала). Даже рыночное окружение зачастую еще недоступно. В справке достаточно много предупреждений насчет того, чего не стоит делать в OnInit(). Поэтому в ее код мало, что можно включать. Обычно это проверка значений настроечных параметров, связывание буферов индикатора с массивами и создание классов, если таковые используются. Все остальное приходится делать в OnCalculate().
  2. Все подобные проверки можно делать только после того, как хотя бы один раз произошел вызов OnCalculate.
Причина обращения: