Какое время имеют котировки, полученные из терминала MetaTrader 5 через API для Python?

 
Какое время имеют котировки, полученные из терминала MetaTrader 5 через API для Python?

В справке "Модуль MetaTrader для интеграции с Python" настойчиво повторяется, что

"Данные, полученные из терминала MetaTrader 5, имеют UTC-время"

Если скачать котировки в текущий момент и перевести секунды в дату, то конечно можно получить время UTC. Но проблема в том, что это время еще не наступило 🤯.

В терминале котировки показываются для локального времени (можно щелкнуть по строящемуся бару и посмотреть время - оно совпадет с локальным временем компьютера). При скачивании котировок через API время тоже локальное (время в секундах можно перевести в дату на сторонних сайтах). При выводе котировок в pd.DataFrame показывается все тоже локальное время. 

Если принять то, что  MetaTrader 5 работает по локальному времени, то все становится на свои места. Если же довериться заверениям разработчиков, что время все-таки  UTC, то получается, что они генерят котировки на несколько часов вперед?



no_utc

 
Запускайте примеры из справки, все увидите.
 
Rashid Umarov #:
Запускайте примеры из справки, все увидите.

Пример из справки - напр., для `copy_rates_from(symbol, timeframe, date_from, count)` не позволяет увидеть ошибку.

Если в качестве `date_from` поставить текущее локальное время, то котировки аккуратно скачаются ровно до указанного времени. Если же использовать `pytz`, то начало котировок будет срезано на несколько баров, но сами котировки останутся в том же локальном времени.

Суть проблемы - терминал и питон-API работают по локальному времени, а не по заявленному UTC.

 

Посмотрим пример. В качестве времени для получения котировок было указано локальное время - 11 часов (MSK). Переводим наши 11 часов в формат datetime c учетом часовой зоны "Etc/UTC". Заметим, что введение timezone не смещает введенное время ко времени UTC. Оно лишь говорит, что 11 часов - это время не локальное, а время по UTC. Вот только 11 часов по UTC еще не наступили. Другими словами заданное время не корректно - надо было вводить 8 часов. Если мы все-таки оставим 11 часов, то и котировки получим ровно до 11 часов. Еще раз повторим 11 часов - это локальное время, а не время UTC. То есть, даже когда мы убираем сдвиг часовых поясов мы все равно получаем котировки по локальному времени. А если timezone не вводить мы еще и отрежем от котировок последние 3 часа.

timezone = pytz.timezone("Etc/UTC")
utc_from = datetime(2024, 4, 24, hour=11, tzinfo=timezone)
rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_H1, utc_from, 10)
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
df


В принципе, то что терминал работает по локальному времени - это удобно. Но если котировки нужны именно по времени UTC, то справка по API вводит в заблуждение.


utc

 

Перефразируем: тип datetime в MT5 не содержит информации о таймзоне (хорошо это или плохо в контексте того, что данный тип используется в котировках - отдельный вопрос).

При получении котировок (хоть в MQL5, хоть в Python) время передается как есть (то есть с отсутствующим=нулевым смещением таймзоны, что соответствует чисто математически UTC), а информацию о таймзоне сервера (и котировок) можно получить через другие функции.

Время в котировках и на графиках - в таймзоне сервера, а не в локальном.

 
Stanislav Korotky #:

Перефразируем: тип datetime в MT5 не содержит информации о таймзоне (хорошо это или плохо в контексте того, что данный тип используется в котировках - отдельный вопрос).

При получении котировок (хоть в MQL5, хоть в Python) время передается как есть (то есть с отсутствующим=нулевым смещением таймзоны, что соответствует чисто математически UTC), а информацию о таймзоне сервера (и котировок) можно получить через другие функции.

Время в котировках и на графиках - в таймзоне сервера, а не в локальном.

Спасибо за ответ. Но думаю в справке по API это должно быть ясно оговорено. Кроме того, было бы разумно ожидать, чтобы при запросе информации по серверу или терминалу (напр. в `terminal_Info`) указывалась бы временная зона в которой он работает.
 
maresin #:
Спасибо за ответ. Но думаю в справке по API это должно быть ясно оговорено. Кроме того, было бы разумно ожидать, чтобы при запросе информации по серверу или терминалу (напр. в `terminal_Info`) указывалась бы временная зона в которой он работает.
Есть локальное серверное и Гринвич время. Получаете их и считаете зону свою, локальную и ДЦ, серверную. Все есть. В ОнИнит)
 
Valeriy Yastremskiy #:
Есть локальное серверное и Гринвич время. Получаете их и считаете зону свою, локальную и ДЦ, серверную. Все есть. В ОнИнит)

а соединений ещё нет, таймзонам взяться неоткуда и всё некорректно :-) опаньки

в ОнИнит даже AccountNumber может быть 0

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