Запускайте примеры из справки, все увидите.
Пример из справки - напр., для `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 вводит в заблуждение.
Перефразируем: тип datetime в MT5 не содержит информации о таймзоне (хорошо это или плохо в контексте того, что данный тип используется в котировках - отдельный вопрос).
При получении котировок (хоть в MQL5, хоть в Python) время передается как есть (то есть с отсутствующим=нулевым смещением таймзоны, что соответствует чисто математически UTC), а информацию о таймзоне сервера (и котировок) можно получить через другие функции.
Время в котировках и на графиках - в таймзоне сервера, а не в локальном.
Перефразируем: тип datetime в MT5 не содержит информации о таймзоне (хорошо это или плохо в контексте того, что данный тип используется в котировках - отдельный вопрос).
При получении котировок (хоть в MQL5, хоть в Python) время передается как есть (то есть с отсутствующим=нулевым смещением таймзоны, что соответствует чисто математически UTC), а информацию о таймзоне сервера (и котировок) можно получить через другие функции.
Время в котировках и на графиках - в таймзоне сервера, а не в локальном.
Спасибо за ответ. Но думаю в справке по API это должно быть ясно оговорено. Кроме того, было бы разумно ожидать, чтобы при запросе информации по серверу или терминалу (напр. в `terminal_Info`) указывалась бы временная зона в которой он работает.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В справке "Модуль MetaTrader для интеграции с Python" настойчиво повторяется, что
"Данные, полученные из терминала MetaTrader 5, имеют UTC-время"
Если скачать котировки в текущий момент и перевести секунды в дату, то конечно можно получить время UTC. Но проблема в том, что это время еще не наступило 🤯.
В терминале котировки показываются для локального времени (можно щелкнуть по строящемуся бару и посмотреть время - оно совпадет с локальным временем компьютера). При скачивании котировок через API время тоже локальное (время в секундах можно перевести в дату на сторонних сайтах). При выводе котировок в pd.DataFrame показывается все тоже локальное время.
Если принять то, что MetaTrader 5 работает по локальному времени, то все становится на свои места. Если же довериться заверениям разработчиков, что время все-таки UTC, то получается, что они генерят котировки на несколько часов вперед?