***
# get deals for ticket
deals=mt5.history_deals_get(ticket=1035566306)
if deals==None:
print("No deals, error code={}".format(mt5.last_error()))
elif len(deals)> 0:
print("history_deals_get ",len(deals))
# display all obtained deals 'as is'for deal in deals:
print(" ",deal)
print()
# display these deals as a table using pandas.DataFrame
df=pd.DataFrame(list(deals),columns=deals[0]._asdict().keys())
df['time'] = pd.to_datetime(df['time'], unit='s')
print(df)
print("")
***
результат
2021.07.2617:53:18.800 Python ticket order time time_msc type entry magic position_id reason volume price commission swap profit fee symbol comment external_id
2021.07.2617:53:18.800 Python 0103556630610529755462021-07-2616:35:261627317326430110105248644600.01110.3620.00.01.420.0 USDJPY
То есть если расширить (сильно дату "ДО") или выбрать сделку напрямую по тикету видим одно и тоже время 16:35:26.
Остаётся вопрос
запрос от '2021-07-2611:37:12.317743'сделка прошла в '2021-07-2616:35:26'запрос до '2021-07-2616:38:12.317743'
то есть сделка попадает между двумя датами, но эта сделка не выдаётся терминалом.
Как я вижу: модуль Python показывает нам одно время (от '2021-07-2611:37:12.317743' до '2021-07-2616:38:12.317743'), но в терминал пересылается совершенно другое время.
# import pytz module for working with time zone
import pytz
# set time zone to UTC
timezone = pytz.timezone("Etc/UTC")
# get the number of deals in history
from_date=datetime.now(tz=timezone)-timedelta(minutes=30)
to_date=datetime.now(tz=timezone)+timedelta(minutes=1)
print("from date ",from_date," to date ",to_date)
так работает.
Просто у меня был вопрос: ПОЧЕМУ если я вижу распечатку от ... до ... на самом деле в терминал отправляется совершенно другое время?
распечатывает время. ТАк почему в терминал отсылается СОВЕРШЕННО чужое время? Что там внутри Python и какое там у него внутри представление времени - это никого не волнует, но если Python сам выдаёт распечатку от 15:55:08 до 16:26:08 , то почему в терминал отсылается совершенно другое время и ловится сделка от 19:23:27?
Это вся равно, что результат 2*2 распечатать как 4, но в переменную записать 6.
Для дополнительной информации смотрите функциюCopyTicks.
Python при создании объекта datetime использует таймзону локального времени, в то время как терминал MetaTrader 5 хранит время тиков и открытия баров в UTC таймзоне (без смещения). Поэтому, для выполнения функций, использующих время, необходимо создавать datetime в UTC-времени. Данные, полученные из терминала MetaTrader 5, имеют UTC-время, но при попытке вывести их на печать, Python опять применит смещение для локального времени. Поэтому, полученные данные также необходимо корректировать для визуального представления.
import MetaTrader5 as mt5
from datetime import datetime, timedelta
import pandas as pd
pd.set_option('display.max_columns', 500) # number of columns to be displayed
pd.set_option('display.width', 1500) # max table width to display
# display data on the MetaTrader 5 package
print("MetaTrader5 package author: ",mt5.__author__)
print("MetaTrader5 package version: ",mt5.__version__)
print()
# establish connection to the MetaTrader 5 terminal
if not mt5.initialize():
print("initialize() failed, error code =",mt5.last_error())
quit()
# import pytz module for working with time zone
import pytz
# set time zone to UTC
timezone = pytz.timezone("Etc/UTC")
# get the number of deals in history
from_date=datetime.now(tz=timezone)-timedelta(minutes=30)
to_date=datetime.now(tz=timezone)+timedelta(minutes=1)
print("from date ",from_date," to date ",to_date)
# get deals for symbols whose names contain "GBP" within a specified interval
deals=mt5.history_deals_get(from_date, to_date)
if deals==None:
print("No deals, error code={}".format(mt5.last_error()))
elif len(deals)> 0:
print("history_deals_get ",len(deals))
# display all obtained deals 'as is'for deal in deals:
print(" ",deal)
print()
# display these deals as a table using pandas.DataFrame
df=pd.DataFrame(list(deals),columns=deals[0]._asdict().keys())
df['time'] = pd.to_datetime(df['time'], unit='s')
print(df)
print("")
# shut down connection to the MetaTrader 5 terminal
mt5.shutdown()
Желающие могут ставить какие-то вопросы, как сделать что-то на Python в плане общения с терминалом МТ5 через библиотеку metatrader5, могу помочь, сам использую такое как основной способ торговли.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Вопрос: почему, если сделка попадает в этот интервал, она не видна через Python?
Проверка истории при помощи MQL5:
результат:
Для начала нужно убедиться, что в обоих случаях запрашиваются одинаковые интервалы.
В Python по умолчанию даты приводятся к таймзоне локального компьютера.
Нужно явно выбрать эту сделку и вывести её время.
Для начала нужно убедиться, что в обоих случаях запрашиваются одинаковые интервалы.
В Python по умолчанию даты приводятся к таймзоне локального компьютера.
Нужно явно выбрать эту сделку и вывести её время.
В скрипте Python расширил диапазон:
и торговая история захватилась:
Время 16:35:26 такое же как и торговой истории терминала.
Выбрал принудительно сделку по тикету:
результат
То есть если расширить (сильно дату "ДО") или выбрать сделку напрямую по тикету видим одно и тоже время 16:35:26.
Остаётся вопрос
запрос от '2021-07-26 11:37:12.317743' сделка прошла в '2021-07-26 16:35:26' запрос до '2021-07-26 16:38:12.317743'
то есть сделка попадает между двумя датами, но эта сделка не выдаётся терминалом.
Как я вижу: модуль Python показывает нам одно время (от '2021-07-26 11:37:12.317743' до '2021-07-26 16:38:12.317743'), но в терминал пересылается совершенно другое время.
Все таки нужно читать справку, неловко даже отвечать
https://www.mql5.com/ru/docs/integration/python_metatrader5/mt5copyticksrange_py
Все таки нужно читать справку, неловко даже отвечать
https://www.mql5.com/ru/docs/integration/python_metatrader5/mt5copyticksrange_py
Справку читал,
так работает.
Просто у меня был вопрос: ПОЧЕМУ если я вижу распечатку от ... до ... на самом деле в терминал отправляется совершенно другое время?
Сейчас от 15:55:08 до 16:26:08 дл
распечатывает время. ТАк почему в терминал отсылается СОВЕРШЕННО чужое время? Что там внутри Python и какое там у него внутри представление времени - это никого не волнует, но если Python сам выдаёт распечатку от 15:55:08 до 16:26:08 , то почему в терминал отсылается совершенно другое время и ловится сделка от 19:23:27?
Это вся равно, что результат 2*2 распечатать как 4, но в переменную записать 6.
Я правильно понимаю: смещение все время будет? ( Документация по MQL5: Интеграция / MetaTrader для Python / copy_ticks_range )
Примечание
Да, применения смещения времени работает!
Сейчас открыл демо на Just2Trade-MT5 - последнее время на нём 18 часов 19 минут (на MetaQuotes-Demo 21 час 19 минут).
На Just2Trade-MT5 сделка была в 18:17 (это время торгового сервера)
Скрипт
выдал результат
- последняя сделка (в течении текущей минуты-двух) была отловлена!
Спасибо за наводку на справку.
Желающие могут ставить какие-то вопросы, как сделать что-то на Python в плане общения с терминалом МТ5 через библиотеку metatrader5, могу помочь, сам использую такое как основной способ торговли.
Нужно не забывать снимать галочку 'Disable automatic trading through the external Python API'
Если не снять эту галочку, то торговый python скрипт будет возвращать ошибку 10027
10027
TRADE_RETCODE_CLIENT_DISABLES_AT
Автотрейдинг запрещен клиентским терминалом