Новая версия платформы MetaTrader 5 build 2980: Push-уведомления о торговых операциях - страница 17

 
Vladimir Karputov:

Итак, скрипт взят со страницы ( https://www.mql5.com/ru/docs/integration/python_metatrader5 ).

Добавлена строка:

Журнал:

и ошибка:

А посмотреть справку по copy_rates_from ?

 

Поставлено заново: 

  • Python 3.8
  • pip install MetaTrader5 -> MetaTrader5-5.0.34 numpy-1.21.1
  • pip install matplotlib -> cycler-0.10.0 kiwisolver-1.3.1 matplotlib-3.4.2 pillow-8.3.1 pyparsing-2.4.7 python-dateutil-2.8.2 six-1.16.0
  • pip install pandas -> pandas-1.3.0 pytz-2021.1

Моя система:

2021.07.21 07:35:52.807 Terminal        MetaTrader 5 x64 build 3000 started for MetaQuotes Software Corp.
2021.07.21 07:35:52.808 Terminal        Windows 10 build 19043, Intel Core i7-9750H  @ 2.60GHz, 25 / 31 Gb memory, 773 / 947 Gb disk, IE 11, UAC, GMT+2
2021.07.21 07:35:52.808 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

Выпуск  Windows 10 Домашняя
Версия  21H1
Дата установки  ‎15.‎01.‎2021
Сборка ОС       19043.1110
Взаимодействие  Windows Feature Experience Pack 120.2212.3920.0

Из справки (Модуль MetaTrader для интеграции с Python) беру скрипт:

from datetime import datetime
import matplotlib.pyplot as plt
import pandas as pd
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import MetaTrader5 as mt5
 
# подключимся к MetaTrader 5
if not mt5.initialize():
    print("initialize() failed")
    mt5.shutdown()
 
# запросим статус и параметры подключения
print(mt5.terminal_info())
# получим информацию о версии MetaTrader 5
print(mt5.version())
 
# запросим 1000 тиков с EURAUD 
euraud_ticks = mt5.copy_ticks_from("EURAUD", datetime(2020,1,28,13), 1000, mt5.COPY_TICKS_ALL)
# запросим тики с AUDUSD в интервале 2019.04.01 13:00 - 2019.04.02 13:00 
audusd_ticks = mt5.copy_ticks_range("AUDUSD", datetime(2020,1,27,13), datetime(2020,1,28,13), mt5.COPY_TICKS_ALL)
 
# получим бары с разных инструментов разными способами
eurusd_rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_M1, datetime(2020,1,28,13), 1000)
eurgbp_rates = mt5.copy_rates_from_pos("EURGBP", mt5.TIMEFRAME_M1, 0, 1000)
eurcad_rates = mt5.copy_rates_range("EURCAD", mt5.TIMEFRAME_M1, datetime(2020,1,27,13), datetime(2020,1,28,13))
 
# завершим подключение к MetaTrader 5
mt5.shutdown()
 
#DATA
print('euraud_ticks(', len(euraud_ticks), ')')
for val in euraud_ticks[:10]: print(val)
 
print('audusd_ticks(', len(audusd_ticks), ')')
for val in audusd_ticks[:10]: print(val)
 
print('eurusd_rates(', len(eurusd_rates), ')')
for val in eurusd_rates[:10]: print(val)
 
print('eurgbp_rates(', len(eurgbp_rates), ')')
for val in eurgbp_rates[:10]: print(val)
 
print('eurcad_rates(', len(eurcad_rates), ')')
for val in eurcad_rates[:10]: print(val)
 
#PLOT
# создадим из полученных данных DataFrame
ticks_frame = pd.DataFrame(euraud_ticks)
# сделаем отрисовку тиков на графике
plt.plot(ticks_frame['time'], ticks_frame['ask'], 'r-', label='ask')
plt.plot(ticks_frame['time'], ticks_frame['bid'], 'b-', label='bid')
 
# выведем легенды 
plt.legend(loc='upper left')
 
# добавим заголовок 
plt.title('EURAUD ticks')
 
# покажем график
plt.show()

Запускаю в редакторе MetaEditor (терминал предварительно также запущен, в обзоре рынка есть 'EURAUD', 'AUDUSD', 'EURGBP', 'EURCAD'.


Результат:

Журнал:

2021.07.21 07:45:22.779 Python  "C:\Users\barab\AppData\Local\Programs\Python\Python38\python.exe" -u "C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Scripts\Python\MyScr\1.py" USDJPY 10
2021.07.21 07:45:23.472 Python  TerminalInfo(community_account=True, community_connection=True, connected=True, dlls_allowed=False, trade_allowed=False, tradeapi_disabled=False, email_enabled=False, ftp_enabled=False, notifications_enabled=True, mqid=True, build=3000, maxbars=100000, codepage=0, ping_last=57533, community_balance=160.16756, retransmission=0.0, company='MetaQuotes Software Corp.', name='MetaTrader 5', language='English', path='C:\\Program Files\\MetaTrader 5', data_path='C:\\Users\\barab\\AppData\\Roaming\\MetaQuotes\\Terminal\\D0E8209F77C8CF37AD8BF550E51FF075', commondata_path='C:\\Users\\barab\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common')
2021.07.21 07:45:23.472 Python  (500, 3000, '19 Jul 2021')
2021.07.21 07:45:23.488 Python  euraud_ticks( 1000 )
2021.07.21 07:45:23.488 Python  (1580209200, 1.63412, 1.63437, 0., 0, 1580209200067, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580209200, 1.63416, 1.63437, 0., 0, 1580209200785, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580209201, 1.63415, 1.63437, 0., 0, 1580209201980, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580209202, 1.63419, 1.63445, 0., 0, 1580209202192, 134, 0.)
2021.07.21 07:45:23.488 Python  (1580209203, 1.6342, 1.63445, 0., 0, 1580209203004, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580209203, 1.63419, 1.63445, 0., 0, 1580209203487, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580209203, 1.6342, 1.63445, 0., 0, 1580209203694, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580209203, 1.63419, 1.63445, 0., 0, 1580209203990, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580209204, 1.63421, 1.63445, 0., 0, 1580209204194, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580209204, 1.63425, 1.63445, 0., 0, 1580209204392, 130, 0.)
2021.07.21 07:45:23.488 Python  audusd_ticks( 40449 )
2021.07.21 07:45:23.488 Python  (1580122800, 0.67858, 0.67868, 0., 0, 1580122800244, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580122800, 0.67858, 0.67867, 0., 0, 1580122800429, 4, 0.)
2021.07.21 07:45:23.488 Python  (1580122800, 0.67858, 0.67865, 0., 0, 1580122800817, 4, 0.)
2021.07.21 07:45:23.488 Python  (1580122801, 0.67858, 0.67866, 0., 0, 1580122801618, 4, 0.)
2021.07.21 07:45:23.488 Python  (1580122802, 0.67858, 0.67865, 0., 0, 1580122802928, 4, 0.)
2021.07.21 07:45:23.488 Python  (1580122809, 0.67855, 0.67865, 0., 0, 1580122809526, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580122809, 0.67855, 0.67864, 0., 0, 1580122809699, 4, 0.)
2021.07.21 07:45:23.488 Python  (1580122813, 0.67855, 0.67863, 0., 0, 1580122813576, 4, 0.)
2021.07.21 07:45:23.488 Python  (1580122815, 0.67856, 0.67863, 0., 0, 1580122815190, 130, 0.)
2021.07.21 07:45:23.488 Python  (1580122815, 0.67855, 0.67863, 0., 0, 1580122815479, 130, 0.)

Ошибка:


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

- создать скрипт на Python 

- в окне МЕ:

кнопка компилировать, получаю в журнале ME:


у Вас что напишет при таких же действиях?

У меня настроен символ, на котором проходит тест:

поэтому Ваш скрипт даёт в журнале:

2021.07.21 09:35:32.058 Python  "C:\Users\barab\AppData\Local\Programs\Python\Python38\python.exe" -u "C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Scripts\Python\MyScr\Script 1.py" AUDUSD 1
2021.07.21 09:35:32.150 Python  5

То есть символ 'AUDUSD', таймфрейм '1'.

 
Vladimir Karputov:

Результат:

Журнал:

Ошибка:


Нужно добавить обработку ошибок, как я писал вчера

# Copyright 2021, MetaQuotes Ltd.
from datetime import datetime 
import matplotlib.pyplot as plt 
import pandas as pd 
from pandas.plotting import register_matplotlib_converters 
register_matplotlib_converters() 
import MetaTrader5 as mt5 
  
# подключимся к MetaTrader 5 
if not mt5.initialize(): 
    print("initialize() failed") 
    mt5.shutdown() 
  
# запросим статус и параметры подключения 
print(mt5.terminal_info()) 
# получим информацию о версии MetaTrader 5 
print(mt5.version()) 
  
# запросим 1000 тиков с EURAUD  
euraud_ticks = mt5.copy_ticks_from("EURAUD", datetime(2020,1,28,13), 1000, mt5.COPY_TICKS_ALL) 
# запросим тики с AUDUSD в интервале 2019.04.01 13:00 - 2019.04.02 13:00  
audusd_ticks = mt5.copy_ticks_range("AUDUSD", datetime(2020,1,27,13), datetime(2020,1,28,13), mt5.COPY_TICKS_ALL) 
  
# получим бары с разных инструментов разными способами 
eurusd_rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_M1, datetime(2020,1,28,13), 1000) 
print('type(eurusd_rates)=',type(eurusd_rates))
if eurusd_rates is None:
   print('mt5.copy_rates_from(EURUSD) failed. error=',mt5.last_error())

eurgbp_rates = mt5.copy_rates_from_pos("EURGBP", mt5.TIMEFRAME_M1, 0, 1000) 
if eurgbp_rates is None:
   print('mt5.copy_rates_from(EURGBP) failed. error=',mt5.last_error())

eurcad_rates = mt5.copy_rates_range("EURCAD", mt5.TIMEFRAME_M1, datetime(2020,1,27,13), datetime(2020,1,28,13)) 
if eurcad_rates is None:
   print('mt5.copy_rates_from(EURCAD) failed. error=',mt5.last_error())
  
# завершим подключение к MetaTrader 5 
mt5.shutdown() 
  
#DATA 
if euraud_ticks is not None:
   print('euraud_ticks(', len(euraud_ticks), ')') 
   for val in euraud_ticks[:10]: print(val) 
else:
   print("No data in euraud_ticks")
   
if audusd_ticks is not None:  
   print('audusd_ticks(', len(audusd_ticks), ')') 
   for val in audusd_ticks[:10]: print(val) 
else:
   print("No data in audusd_ticks")

  
if eurusd_rates is not None:
   print('eurusd_rates(', len(eurusd_rates), ')') 
   for val in eurusd_rates[:10]: print(val) 
else:
   print("No data in eurusd_rates")
  
if eurgbp_rates is not None:
   print('eurgbp_rates(', len(eurgbp_rates), ')') 
   for val in eurgbp_rates[:10]: print(val) 

  
if eurcad_rates is not None:
   print('eurcad_rates(', len(eurcad_rates), ')') 
   for val in eurcad_rates[:10]: print(val) 
else:
   print("No data in eurcad_rates")

  
#PLOT 
# создадим из полученных данных DataFrame 
ticks_frame = pd.DataFrame(euraud_ticks) 
# сделаем отрисовку тиков на графике 
plt.plot(ticks_frame['time'], ticks_frame['ask'], 'r-', label='ask') 
plt.plot(ticks_frame['time'], ticks_frame['bid'], 'b-', label='bid') 
  
# выведем легенды  
plt.legend(loc='upper left') 
  
# добавим заголовок  
plt.title('EURAUD ticks') 
  
# покажем график 
plt.show()

Результат

 
Rashid Umarov:

Нужно добавить обработку ошибок, как я писал вчера

Результат


Ага, так лучше. Остаётся выяснить вопрос - почему не качает данные по EURUSD. Я правильно поинмаю?


Добавлено: на трёх серверах проверил старт на холодную

  • BenchMark-Server - OK
  • XMGlobal-MT5 2 - OK
  • RoboForex-ECN - OK

- запустил скрипт (), терминал начал самостоятельную закачку и всё отработало без ошибок - тип объекта получаем правильный, а вот на сервере MetaQuotes-Demo (хедж) получаю стабильно ошибку типа данных. Больше сделать со своей стороны ничего не могу. 

 
Vladimir Karputov:

Запускаю в редакторе MetaEditor (терминал предварительно также запущен, в обзоре рынка есть 'EURAUD', 'AUDUSD', 'EURGBP', 'EURCAD'.


В обзоре 4 символа из 5, к которым обращается скрипт. Нет символа EURUSD и баров по нему, поэтому в момент запроса баров с этого символа результат нулевой.

Можно ведь тогда сделать проверку и включить нужный символ через symbol_select.

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

Ага, так лучше. Остаётся выяснить вопрос - почему не качает данные по EURUSD. Я правильно поинмаю?

Нужно анализировать полученные результаты и читать справку.

 
Rashid Umarov:

Нужно анализировать полученные результаты и читать справку.

Провел 18 запусков нового скрипта - на сервере  MetaQuotes-Demo (хедж) - стабильно ошибка. Что можно анализировать, если сервер балуется?

 
Vladimir Karputov:

Провел 18 запусков нового скрипта - на сервере  MetaQuotes-Demo (хедж) - стабильно ошибка. Что можно анализировать, если сервер балуется?

Изначально посыл был в том, что Python в MetaEditor не работает. Пока я сам не привел нужный код для проверки.

 
Rashid Umarov:

Изначально посыл был в том, что Python в MetaEditor не работает. Пока я сам не привел нужный код для проверки.

Решился вопрос полным сносом папки [data folder]\bases (её размер был почти 40 Гб, сколько занимала история сервера 'MetaQuotes-Demo' я, к сожалению, не подумал запомнить).

Пока не знаю, как проверять такую ситуацию. 

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