TimeCurrent() запаздывает

 

Всем привет!

Не могу понять, почему не обновляется своевременно TimeCurrent();

Фрагмент кода (код, естественно,  больше). Есть соображения на этот счет?

onTick(){

TimeCurrent(ts); 

 string ts2=TimeToString(TimeCurrent(ts));
Comment (ts.min," / ",ts2);

}
 

Вот поэтому нужно писать максимально короткий код - если думаете, что есть ошибка.

Пример:

//+------------------------------------------------------------------+
//|                                                     Expert 1.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input int      Input1=9;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   datetime time_current=TimeCurrent();
   Comment(TimeToString(time_current,TIME_DATE|TIME_SECONDS));
  }
//+------------------------------------------------------------------+


код отображает всё синхронно, нет никаких задержек.


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


 
Artem Mordvinkin:

Всем привет!

Не могу понять, почему не обновляется своевременно TimeCurrent();

Фрагмент кода (код, естественно,  больше). Есть соображения на этот счет?



Если вы работаете в OnTick(), то ваш код срабатывает только тогда, когда приходит тик по конкретному активу. Если нет тиков, значит нет обновления информации.

А время сервера не зависит от OnTick() вашей программы. Это другой поток.

Всеuда нужно помнить, что MQL4\5 - это событий язык.

 
Nikita Chernyshov:

Если вы работаете в OnTick(), то ваш код срабатывает только тогда, когда приходит тик по конкретному активу. Если нет тиков, значит нет обновления информации.

А время сервера не зависит от OnTick() вашей программы. Это другой поток.

Всеuда нужно помнить, что MQL4\5 - это событий язык.

Никита, я помню об этом. Днём по евре (на ней советник) тик приходит быстрее чем раз в полторы минуты рандомно:)
 
Vladimir Karputov:

Вот поэтому нужно писать максимально короткий код - если думаете, что есть ошибка.

Пример:


код отображает всё синхронно, нет никаких задержек.


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


Владимир, а может быть вариант, что код не успевает отработать между тиками? ИЛи же код полностью отрабатывает не зависимо от того, пришел ли в процессе обработки новый тик или нет? Я так, понимаю, что новые тики игнорятся до момента полной отработки кода. Если же новый тик запускает код сначала, то может быть и банально не успевает...

 
 Что касается тика - время последнего 14.38, время в TimeCurrent 14.37
 
Vladimir Karputov:

Вот поэтому нужно писать максимально короткий код - если думаете, что есть ошибка.

Почему не следуете своей рекомендации? Привели огромный избыточный код.

 
Artem Mordvinkin:

Владимир, а может быть вариант, что код не успевает отработать между тиками? ИЛи же код полностью отрабатывает не зависимо от того, пришел ли в процессе обработки новый тик или нет? Я так, понимаю, что новые тики игнорятся до момента полной отработки кода. Если же новый тик запускает код сначала, то может быть и банально не успевает...

Может. Если сложные вычисления ВНУТРИ OnTick, то тики пропускаются.

 
Vladimir Karputov:

Может. Если сложные вычисления ВНУТРИ OnTick, то тики пропускаются.

Значит время должно отображаться нормально - без опозданий.  Ладно, поковыряю еще. Найду решение - отпишусь.

 
Artem Mordvinkin:

Значит время должно отображаться нормально - без опозданий.  Ладно, поковыряю еще. Найду решение - отпишусь.

Странный лаг. Есть предположение что это может быть связано с тем как вы эту функцию используете.

Если вам нужно значение datetime, нет смысла использовать функцию, в которую передается структура mqldatetime, т.е. лучше использовать TimeCurrent() вместо TimeCurrent(ts)

Если вы используете TimeCurrent(ts) есть смысл работать дальше со структурой ts а не с возвращаемым значением.

 
TimeCurrent() возвращает последнее время по тому символу, на графике которого выполняется код. А в заголовке обзора время - последнее время их всех символов. Наверно.