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

 
Taras Slobodyanik:

Не вижу проблемы, появилась новая свеча - делаем перерасчет последней свечи индикатора/советника.
Появилось больше одной новой свечи - делаем полный перерасчет индикатора/советника.
Это то же самое - появляется новая свеча.

Еще - нужные периоды нужно постоянно "дёргать" чтобы они обновлялись.
Если на символе-периоде никто не работает, (не проверяются котировки, не запущен индикатор), то он "засыпает" потому как считается ненужным.

Дак дергаем мы, дергаем. Делаем запрос, получаем ошибку, выходим. Но тут, видите ли, другая "особенность" вылазит - ошибка снова не взводится после сброса. Взводилась бы - проблем бы не было. А так возврат некорректных данных - это проблема. И я ее очень отчетливо вижу.

Вся система проверки ошибок летит коту под хвост на данном примере.

 

Как терминалу понять, что последние данные устарели?
Ведь история есть - есть. 
Запрос брокеру отправлен... как только так и сразу.

Появляется новый бар - данные обновляются.

 
Taras Slobodyanik:

Как терминалу понять, что последние данные устарели?
Ведь история есть - есть. 
Запрос брокеру отправлен... как только так и сразу.

Появляется новый бар - данные обновляются.

Связь с сервером установлена. При запросе данных старшего ТФ, если данные не готовы - ошибка или возврат 0. Если данные готовы - возврат ТОЛЬКО актуальных данных. Все. Если данные не готовы продолжительное время - пусть и возвращает нам ошибку или 0.

 
Taras Slobodyanik:

Вы, кстати, на вопрос по поводу версии терминала не ответили.

 
Alexey Kozitsyn:

Вы, кстати, на вопрос по поводу версии терминала не ответили.

А при чем тут версия терминала вообще. Новый данные, они есть, или нету. И ни какая версия не спасет, если они не пришли с сервера.
Просто индикатор стартует раньше чем приходят новые данные. Как вариант перенести проверки в OnCalculate, который срабатывает при получении нового тика.

 
Konstantin Nikitin:

Как вариант перенести проверки в OnCalculate, который срабатывает при получении нового тика.

ему это предлагали несколько раз, и админ тоже

в индикаторе будет запущен OnCalculate() при запуске индикатора, а вот второй раз OnCalculate() запустится по приходу тика - вот тут и нужно включать таймер и скачивать новые данные OHLC

 
Igor Makanu:

ему это предлагали несколько раз, и админ тоже

в индикаторе будет запущен OnCalculate() при запуске индикатора, а вот второй раз OnCalculate() запустится по приходу тика - вот тут и нужно включать таймер и скачивать новые данные OHLC

Посмотрите последний опубликованный мной код. Дело уже не в таймере, уже все в OnCalculate() перенесено. Все равно не работает при запуске терминала.

 
//--- Проверяем связь с сервером
if(firstrun)
{
 firstrun=false;                // первый запуск индикатора
 return(0);
}   
if(!IsConnected())                              // Если не удалось установить связь с сервером
     {
      //--- Сбрасываем флаг соединения с сервером
      _isConnected=false;
      //--- Выходим
      return( 0 );
     }
я бы еще проверку на GetTickCount() сделал бы, чтобы было время терминалу загрузиться, сформировать графики и установить связь с сервером, Вам же факт перезапуска терминала нужно тоже отследить, как отследить не знаю, но время дать нужно
 
Alexey Kozitsyn:

Посмотрите последний опубликованный мной код. Дело уже не в таймере, уже все в OnCalculate() перенесено. Все равно не работает при запуске терминала.

Ну пропустите первый проход при запуске

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[])
  {
   static bool res = false;
   if( !res )
     {
      res = true;
      return( rates_total );
     }
   /* работаем */
   return( rates_total );
  }
 
Konstantin Nikitin:

Ну пропустите первый проход при запуске

Прочитайте п.1.

Причина обращения: