Особенности языка mql5, тонкости и приёмы работы - страница 75

 
Vitaly Muzichenko:

Вешаю в субботу советник на график, но советник может получить время последнего тика, это к примеру в Обзоре рынка 23:58, и моё локальное 04:45. Время сервера Я не знаю.

Вопрос: сколько прошло времени от последнего тика по времени сервера(терминала)

Подумал немного. Получается нет разницы, когда советник прикреплен к графику. До тех пор, пока нет реального тика, нельзя выполнять ту часть алгоритма программы, которая использует реальное время сервера

Если требуются расчеты до прихода тика, то запросить у пользователя ServerGMTOffset. 

Таким образом, проблема решаема даже без ServerTradeTime(). 

 
Ihor Herasko:

Подумал немного. Получается нет разницы, когда советник прикреплен к графику. До тех пор, пока нет реального тика, нельзя выполнять ту часть алгоритма программы, которая использует реальное время сервера. 

Если требуются расчеты до прихода тика, то запросить у пользователя ServerGMTOffset. 

Таким образом, проблема решаема даже без ServerTradeTime(). 

Пользователь не знает Offset сервера, ему это неизвестно.

Известно всего два значение, и этих данных не достаточно чтобы вычислить: "сколько прошло времени от последнего тика по времени сервера(терминала)"

Задача специфичная, и решения пока не вижу, впрочем как вы.

 
Vitaly Muzichenko:

Вешаю в субботу советник на график, но советник может получить время последнего тика, это к примеру в Обзоре рынка 23:58, и моё локальное 04:45. Время сервера Я не знаю.

Вопрос: сколько прошло времени от последнего тика по времени сервера(терминала)

И то и другое не просто время, а datetime. Тоесть и дата и время. Так-что арифметическое действие с этими данными даст разницу времени в секундах которые не сложно перевести в дни, часы, минуты и секунды.

Плюс ещё надо проверить в выходной что покажет TimeTradeServer, а пока показывает так

2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeCurrent() = 2018.03.29 14:59:54
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeLocal() = 2018.03.29 15:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMT() = 2018.03.29 12:00:03
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeGMTOffset() = -10800
2018.03.29 15:00:03.640 00 (EURUSD,H1)  TimeTradeServer() = 2018.03.29 15:00:03
Обрати внимание на расхождение секунд серверного времени и локального, а потом на точное совпадение локального и расчётного времени сервера.
 
Для форекса можно переделать этот код с четверки

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql4, тонкости и приёмы работы

fxsaber, 2018.03.29 14:32

#property strict

#define HOUR 3600
#define DAY (24 * HOUR)
#define WEEK 7

datetime GetBarTime( const datetime time, const bool NextBar = false, string Symb = NULL, const ENUM_TIMEFRAMES TimeFrame = PERIOD_M1 )
{
  if (Symb == NULL)
    Symb = _Symbol;
    
  return(iTime(Symb, TimeFrame, iBarShift(Symb, TimeFrame, time) - (NextBar ? 1 : 0)));
}

datetime GetTimeDayOfWeek( const int Shift = 0, const ENUM_DAY_OF_WEEK Day = SUNDAY )
{
  const datetime Res = TimeCurrent() / DAY * DAY;
  
  return(Res - (((WEEK + (TimeDayOfWeek(Res) - Day)) % WEEK) + Shift * WEEK) * DAY);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmtoffset
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
int TimeServerGMTOffset( void )
{
  const datetime Sunday = GetTimeDayOfWeek();
  
  return(((int)MathRound((double)MathMin(Sunday - DAY - GetBarTime(Sunday), Sunday + DAY - GetBarTime(Sunday, true)) / HOUR) - 3) * HOUR);
}

// Аналог по серверному времени - https://www.mql5.com/ru/docs/dateandtime/timegmt
// Работает для FOREX-символов, когда M1-история доступна за ближайшую неделю
datetime TimeServerGMT( void )
{
  return(TimeCurrent() + TimeServerGMTOffset());
}
 
fxsaber:
Для форекса можно переделать этот код с четверки

Спасибо, погляжу. Но опять-же, есть не форексные символы.

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

Alexey Viktorov:

И то и другое не просто время, а datetime. Тоесть и дата и время. Так-что арифметическое действие с этими данными даст разницу времени в секундах которые не сложно перевести в дни, часы, минуты и секунды.

Плюс ещё надо проверить в выходной что покажет TimeTradeServer, а пока показывает так

Обрати внимание на расхождение секунд серверного времени и локального, а потом на точное совпадение локального и расчётного времени сервера.

Я у себя так-же распечатал, но как это использовать на выходных. В общем, нужно повертеть предоставленную информацию.

Задача минимальна:  "сколько прошло времени от последнего тика по времени сервера(терминала)"

if( TimeCurrent()<TimeServer()-60 ) Alert( "нет котировок более 1-й минуты" );
 
Vitaly Muzichenko:

Спасибо, погляжу. Но опять-же, есть не форексные символы.

Если у брокера есть хоть один форексный символ, то будет работать и для других.

Если у брокера ни одного форексного символа, то встает вопрос целесообразности.

 
Vitaly Muzichenko:

Спасибо, погляжу. Но опять-же, есть не форексные символы.

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

Я у себя так-же распечатал, но как это использовать на выходных. В общем, нужно повертеть предоставленную информацию.

Задача минимальна:  "сколько прошло времени от последнего тика по времени сервера(терминала)"

Проверить конечно надо, но судя по разнице TimeCurrent и TimeTradeServer можно предположить что разница будет нарастать.

А скажи пожалуйста, у меня время сервера MQ-demo совпадает с Московским, что показывает если время сервера не совпадает с локальным.

 
Alexey Viktorov:

Проверить конечно надо, но судя по разнице TimeCurrent и TimeTradeServer можно предположить что разница будет нарастать.

А скажи пожалуйста, у меня время сервера MQ-demo совпадает с Московским, что показывает если время сервера не совпадает с локальным.

Робо

Моё локальное было 17:17:13

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2017.05.19 22:35

TimeTradeServer может возвращать всякую ерунду. Например, значение меньше, чем TimeCurrent. Это сводит полностью на нет его практическое применение.

Если правильно понимаю идею, то TimeTradeServer при работающем терминале должен был вычислять прошедшее время, после получения TimeCurrent и прибавлять эту разность, своего рода эмулируя будущие значения TimeCurrent.

Сейчас же запустив советник

#define TOSTRING(A) #A + " = " + (string)(A) + "\n"

void OnInit()
{
  EventSetTimer(1);
}

void OnTimer()
{
  Comment(TOSTRING(TimeTradeServer()) + TOSTRING(TimeCurrent()));
}

можно увидеть любую ерунду

Обратите внимание на даты.

 
fxsaber:

И кто виноват в этом, терминал, или ДЦ с кривыми настройками?

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