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

 
Alexey Kozitsyn:

Попробуйте сами. Запустите индикатор, выключите терминал и включите, когда наступит новый час.

Так если вы получаете TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.

Все правильно.
 
Konstantin Nikitin:

Так если вы получаете TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.

Все правильно.

Подскажите, где в этом коде вызов TimeCurrent?

 
Alexey Kozitsyn:

Подскажите, где в этом коде вызов TimeCurrent?

Так время открытия бара у все равно то которое получено до закрытия терминала. Образуется новый бар, обновиться время. В чем проблема.

 
Konstantin Nikitin:

Так время открытия бара у все равно то которое получено до закрытия терминала. Образуется новый бар, обновиться время. В чем проблема.

В том то и дело, что терминал выключается когда последний часовой бар на графике имеет час 22:00. Выключается в 22:45, например. Включается в 23:01 - запрос времени последнего часа после установления связи с сервером, и после предзапроса в OnInit() без всяких таймеров - все равно 22 часа. Это нормально по Вашему?

 

Проверяйте не расчет баров, а время свечи.
Вот так будет правильно обновляться (проверил).

//--- Проверяем первый запуск индикатора
   if(prev_calculated<=0 || 
      _weekOpenTime!=iTime(_Symbol,PERIOD_W1,0)+SEC_PER_DAY ||
      _dayOpenTime!=iTime(_Symbol,PERIOD_D1,0) ||
      _hourOpenTime!=iTime(_Symbol,PERIOD_H1,0) )
     {
     
      _weekOpenTime= 0;
      _dayOpenTime = 0;
      _hourOpenTime= 0;
        
      //--- Проверяем, записано ли время открытия текущей недели
      if(!CheckCurrentWeekOpenTime())                              // Если время не записано
         return(0);                                                // Выходим
      //--- Проверяем, записано ли время открытия текущего дня
      if(!CheckCurrentDayOpenTime())                              // Если время не записано
         return(0);                                                // Выходим
      //--- Проверяем, записано ли время открытия текущего часа
      if(!CheckCurrentHourOpenTime())                              // Если время не записано
         return(0);                                                // Выходим
      //--- Устанавливаем флаг соединения с сервером для запуска таймера
      _isConnected=true;
      //---
      Print(__FUNCTION__,": Данные старших ТФ загружены!");
     }
 
Как я понимаю, терминал, в первый раз, выдает последние данные, те которые у него есть в истории, а уже потом происходит подгрузка с сервера.
 
Taras Slobodyanik:

Проверяйте не расчет баров, а время свечи.
Вот так будет правильно обновляться (проверил).

О каком расчете баров идет речь?

Проверю Ваш вариант, но, по сути, Вы просто добавили один "холостой" запрос данных в OnCalculate() и все, причем по логике, до "холостого" запроса дело даже не дойдет, т.к. prev_calculated <= 0 уже выполнится и будет исполнен блок первого запуска.

В любом случае - это костыльное решение, не должно быть таких ситуаций в языке. Связь установлена, функция получения данных проверяется на ошибки и на корректность полученных данных. А в итоге что? Данные все равно левые.

Вообще, если действовать наверняка, можно просто в ините запросить текущее время, затем в OnCalculate() запрашивать текущее время и сравнивать их до тех пор, пока они не будут различаться. Но это такой же костыль и быть такого не должно.

 
Alexey Kozitsyn:

В том то и дело, что терминал выключается когда последний часовой бар на графике имеет час 22:00. Выключается в 22:45, например. Включается в 23:01 - запрос времени последнего часа после установления связи с сервером, и после предзапроса в OnInit() без всяких таймеров - все равно 22 часа. Это нормально по Вашему?

Время закрытия любого последнего бара будет TimeCurrent (то есть текущее). оно вам похоже и нужно, судя по вашему вопросу.

 
Taras Slobodyanik:
Как я понимаю, терминал, в первый раз, выдает последние данные, те которые у него есть в истории, а уже потом происходит подгрузка с сервера.

Вопрос! Почему он выдает предыдущие данные после того, как связь с сервером уже установлена, был предзапрос данных в OnInit(), проверка на подгрузку данных в каждой из функций CheckCurren..(). Сколько, блин, проверок нужно сделать, чтобы все нормально отработало...

 
Konstantin Nikitin:

Время закрытия любого последнего бара будет TimeCurrent (то есть текущее). оно вам похоже и нужно, судя по вашему вопросу.

Какого закрытия? Мне нужно время открытия...