Интеграция MetaTrader 5 с Python для начинающих - страница 3

 
Vladimir Karputov:

Вопрос: почему, если сделка попадает в этот интервал, она не видна через Python?

Проверка истории при помощи MQL5:

результат:

Для начала нужно убедиться, что в обоих случаях запрашиваются одинаковые интервалы.

В Python по умолчанию даты приводятся к таймзоне локального компьютера.

Нужно явно выбрать эту сделку и вывести её время.

 
Rashid Umarov:

Для начала нужно убедиться, что в обоих случаях запрашиваются одинаковые интервалы.

В Python по умолчанию даты приводятся к таймзоне локального компьютера.

Нужно явно выбрать эту сделку и вывести её время.

В скрипте Python расширил диапазон:

from_date=datetime.now()-timedelta(minutes=300)
to_date=datetime.now()+timedelta(minutes=300)

и торговая история захватилась:

2021.07.26 17:12:54.880 Python  
2021.07.26 17:12:54.896 Python  from date  2021-07-26 12:12:54.884055  to date  2021-07-26 22:12:54.884055
2021.07.26 17:12:54.896 Python  history_deals_get  2
2021.07.26 17:12:54.896 Python     TradeDeal(ticket=1035134037, order=1052486446, time=1627299010, time_msc=1627299010403, type=0, entry=0, magic=0, position_id=1052486446, reason=0, volume=0.01, price=110.205, commission=0.0, swap=0.0, profit=0.0, fee=0.0, symbol='USDJPY', comment='', external_id='')
2021.07.26 17:12:54.896 Python     TradeDeal(ticket=1035566306, order=1052975546, time=1627317326, time_msc=1627317326430, type=1, entry=1, magic=0, position_id=1052486446, reason=0, volume=0.01, price=110.362, commission=0.0, swap=0.0, profit=1.42, fee=0.0, symbol='USDJPY', comment='', external_id='')
2021.07.26 17:12:54.896 Python  
2021.07.26 17:12:54.896 Python         ticket       order                time       time_msc  type  entry  magic  position_id  reason  volume    price  commission  swap  profit  fee  symbol comment external_id
2021.07.26 17:12:54.896 Python  0  1035134037  1052486446 2021-07-26 11:30:10  1627299010403     0      0      0   1052486446       0    0.01  110.205         0.0   0.0    0.00  0.0  USDJPY                    
2021.07.26 17:12:54.896 Python  1  1035566306  1052975546 2021-07-26 16:35:26  1627317326430     1      1      0   1052486446       0    0.01  110.362         0.0   0.0    1.42  0.0  USDJPY                    

Время 16:35:26 такое же как и торговой истории терминала.

 

Выбрал принудительно сделку по тикету:

***
# 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.26 17: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.26 17:53:18.800 Python  0  1035566306  1052975546 2021-07-26 16:35:26  1627317326430     1      1      0   1052486446       0    0.01  110.362         0.0   0.0    1.42  0.0  USDJPY                    


То есть если расширить (сильно дату "ДО") или выбрать сделку напрямую по тикету видим одно и тоже время 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

Документация по MQL5: Интеграция / MetaTrader для Python / copy_ticks_range
Документация по MQL5: Интеграция / MetaTrader для Python / copy_ticks_range
  • www.mql5.com
copy_ticks_range - MetaTrader для Python - Интеграция - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Rashid Umarov:

Все таки нужно читать справку, неловко даже отвечать

https://www.mql5.com/ru/docs/integration/python_metatrader5/mt5copyticksrange_py

Справку читал,

# 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)

так работает.


Просто у меня был вопрос: ПОЧЕМУ если я вижу распечатку от ... до ... на самом деле в терминал отправляется совершенно другое время?


Сейчас от 15:55:08  до  16:26:08 дл

2021.07.26 19:25:08.142 Python  "C:\Users\barab\AppData\Local\Programs\Python\Python39\python.exe" -u "C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Scripts\Python\history_deals_get.py" USDJPY 15
2021.07.26 19:25:08.639 Python  MetaTrader5 package author:  MetaQuotes Software Corp.
2021.07.26 19:25:08.639 Python  MetaTrader5 package version:  5.0.34
2021.07.26 19:25:08.639 Python  
2021.07.26 19:25:08.714 Python  from date  2021-07-26 15:55:08.713023+00:00  to date  2021-07-26 16:26:08.713023+00:00
2021.07.26 19:25:08.714 Python  
2021.07.26 19:25:08.714 Python  history_deals_get  1
2021.07.26 19:25:08.714 Python     TradeDeal(ticket=1035843115, order=1053284874, time=1627327407, time_msc=1627327407639, type=0, entry=1, magic=0, position_id=1053098239, reason=0, volume=0.01, price=110.331, commission=0.0, swap=0.0, profit=-0.49, fee=0.0, symbol='USDJPY', comment='', external_id='')
2021.07.26 19:25:08.714 Python  
2021.07.26 19:25:08.728 Python         ticket       order                time       time_msc  type  entry  magic  position_id  reason  volume    price  commission  swap  profit  fee  symbol comment external_id
2021.07.26 19:25:08.728 Python  0  1035843115  1053284874 2021-07-26 19:23:27  1627327407639     0      1      0   1053098239       0    0.01  110.331         0.0   0.0   -0.49  0.0  USDJPY                    
2021.07.26 19:25:08.728 Python  
2021.07.26 19:25:08.764 Storage modify MQL5\Scripts\Python\history_deals_get.py to base

распечатывает время. ТАк почему в терминал отсылается СОВЕРШЕННО чужое время? Что там внутри Python и какое там у него внутри представление времени - это никого не волнует, но если Python сам выдаёт распечатку от 15:55:08  до  16:26:08 , то почему в терминал отсылается совершенно другое время и ловится сделка от 19:23:27?


Это вся равно, что результат 2*2 распечатать как 4, но в переменную записать 6.

 

Я правильно понимаю: смещение все время будет? ( Документация по MQL5: Интеграция / MetaTrader для Python / copy_ticks_range )

Примечание

Для дополнительной информации смотрите функцию CopyTicks.

Python при создании объекта datetime использует таймзону локального времени, в то время как терминал MetaTrader 5 хранит время тиков и открытия баров в UTC таймзоне (без смещения). Поэтому, для выполнения функций, использующих время, необходимо создавать datetime в UTC-времени. Данные, полученные из терминала MetaTrader 5, имеют UTC-время, но при попытке вывести их на печать, Python опять применит смещение для локального времени. Поэтому, полученные данные также необходимо корректировать для визуального представления.

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyTicks
  • www.mql5.com
CopyTicks - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Да, применения смещения времени работает!

Сейчас открыл демо на Just2Trade-MT5 - последнее время на нём 18 часов 19 минут (на MetaQuotes-Demo 21 час 19 минут).

На Just2Trade-MT5 сделка была в 18:17 (это время торгового сервера)


Скрипт

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() 

выдал результат

2021.07.26 21:18:39.622 Python  MetaTrader5 package author:  MetaQuotes Software Corp.
2021.07.26 21:18:39.622 Python  MetaTrader5 package version:  5.0.34
2021.07.26 21:18:39.622 Python  
2021.07.26 21:18:39.702 Python  from date  2021-07-26 17:48:39.691679+00:00  to date  2021-07-26 18:19:39.691679+00:00
2021.07.26 21:18:39.702 Python  history_deals_get  2
2021.07.26 21:18:39.702 Python     TradeDeal(ticket=214585224, order=0, time=1627322088, time_msc=1627322088025, type=2, entry=0, magic=0, position_id=0, reason=0, volume=0.0, price=0.0, commission=0.0, swap=0.0, profit=100000.0, fee=0.0, symbol='', comment='', external_id='')
2021.07.26 21:18:39.702 Python     TradeDeal(ticket=214585248, order=217618811, time=1627323454, time_msc=1627323454377, type=1, entry=0, magic=0, position_id=217618811, reason=0, volume=0.01, price=1.18089, commission=0.0, swap=0.0, profit=0.0, fee=0.0, symbol='EURUSD', comment='', external_id='')
2021.07.26 21:18:39.702 Python  
2021.07.26 21:18:39.702 Python        ticket      order                time       time_msc  type  entry  magic  position_id  reason  volume    price  commission  swap    profit  fee  symbol comment external_id
2021.07.26 21:18:39.702 Python  0  214585224          0 2021-07-26 17:54:48  1627322088025     2      0      0            0       0    0.00  0.00000         0.0   0.0  100000.0  0.0                            
2021.07.26 21:18:39.702 Python  1  214585248  217618811 2021-07-26 18:17:34  1627323454377     1      0      0    217618811       0    0.01  1.18089         0.0   0.0       0.0  0.0  EURUSD                    
2021.07.26 21:18:39.702 Python  

- последняя сделка (в течении текущей минуты-двух) была отловлена!

Спасибо за наводку на справку.

 
Какое спасибо. Читать нужно сначала
 

Желающие могут ставить какие-то вопросы, как сделать что-то на Python в плане общения с терминалом МТ5 через библиотеку metatrader5, могу помочь, сам использую такое как основной способ торговли.

 

Нужно не забывать снимать галочку 'Disable automatic trading through the external Python API'

y

Если не снять эту галочку, то торговый python скрипт будет возвращать ошибку 10027

10027

TRADE_RETCODE_CLIENT_DISABLES_AT

Автотрейдинг запрещен клиентским терминалом