MetaTrader 5 Python User Group - как использовать Python в Метатрейдере - страница 51

 
MetaQuotes:

Выпустили новый билд питоновской библиотеки 5.0.25

Просьба обновиться через:

Господа, можно попросить добавить объекты типа:

TradePosition(ticket=55970661, time=1583523524, time_msc=1583523524484, time_update=1583523524, time_update_msc=1583523524484, 
type=1, magic=0, identifier=55970661, reason=0, volume=0.04, price_open=1.13022, sl=0.0, tp=0.0, price_current=1.13179, swap=0.0, 
profit=-6.28, symbol='EURUSD', comment='', external_id='55970661')

добавить плс или __dict__, или as_dict()

В питоне куда удобнее оперировать стандартные структурами, теми же dict/list.

('__add__', <method-wrapper '__add__' of TradePosition object at 0x085A1808>)
('__class__', <class 'TradePosition'>)
('__contains__', <method-wrapper '__contains__' of TradePosition object at 0x085A1808>)
....
....
....
('symbol', 'EURUSD')
('ticket', 55970661)
('time', 1583523524)
('time_msc', 1583523524484)
('time_update', 1583523524)
('time_update_msc', 1583523524484)
('tp', 0.0)
('type', 1)
('volume', 0.04)

Хотелось бы потом, с этого класса (и других подобных) выдернуть dict, и уже с ним работать.

 

Вопрос по initialize(), есть

initialize(
   path                      // path to the MetaTrader 5 terminal EXE file
   timeout=TIMEOUT,          // timeout
   login=LOGIN,              // account number
   password="PASSWORD",      // password
   server="SERVER"           // server name as it is specified in the terminal
   )

соответственно в path пути к двум терминалам которые запускаются /portable

'c:\Works\MT5 - terminals\MetaTrader 5\terminal64.exe'

и 

'c:\Works\MT5 - terminals\Alpari MT5\terminal64.exe'

но при этом, все вызовы initialize ломятся в последний запущенный экземпляр терминала.

соответственно MT build 2360 и MetaTrader5-5.0.26-cp38-cp38-win32.whl

Что не так? path должна использоваться с какой-то другой логикой, или в /portable надо еще что-то передавать?

 

Покажите реальный код, пожалуйста.

Параметры в путях мы пока не принимаем. 

 
Renat Fatkhullin:

Покажите реальный код, пожалуйста.

Параметры в путях мы пока не принимаем. 

Вот код:

import MetaTrader5 as mt5

def check_order ():
    if mt5.initialize(path='c:\Works\MT5 - terminals\MetaTrader 5\terminal64.exe', 
                            login=25153683, server='MetaQuotes-Demo', password=''):
                print("mt5.version(): ", mt5.version())
                print("mt5.terminal_info()", mt5.terminal_info())
                print("mt5.account_info()", mt5.account_info())
                symbol="GBPUSD"
                if mt5.symbol_select(symbol,True):
                    info = mt5.symbol_info(symbol)
                    point=mt5.symbol_info(symbol).point
                    request = {
                        "action": mt5.TRADE_ACTION_DEAL,
                        "symbol": symbol,
                        "volume": 0.01,
                        "type": mt5.ORDER_TYPE_BUY,
                        "price": mt5.symbol_info_tick(symbol).ask,
                        "sl": mt5.symbol_info_tick(symbol).ask-100*point,
                        "tp": mt5.symbol_info_tick(symbol).ask+100*point,
                        "deviation": 10,
                        "magic": 234000,
                        "comment": "python script",
                    }
 
                    result = mt5.order_check(request)
                    print(result)
		mt5.shutdown()


    if mt5.initialize(path='c:\Works\MT5 - terminals\Alpari MT5\terminal64.exe', 
                            login=50518455, server='Alpari-MT5-Demo', password=''):
                print("mt5.version(): ", mt5.version())
                print("mt5.terminal_info()", mt5.terminal_info())
                print("mt5.account_info()", mt5.account_info())
                symbol="GBPUSD"
                if mt5.symbol_select(symbol,True):
                    info = mt5.symbol_info(symbol)
                    point=mt5.symbol_info(symbol).point
                    request = {
                        "action": mt5.TRADE_ACTION_DEAL,
                        "symbol": symbol,
                        "volume": 0.01,
                        "type": mt5.ORDER_TYPE_BUY,
                        "price": mt5.symbol_info_tick(symbol).ask,
                        "sl": mt5.symbol_info_tick(symbol).ask-100*point,
                        "tp": mt5.symbol_info_tick(symbol).ask+100*point,
                        "deviation": 10,
                        "magic": 234000,
                        "comment": "python script",
                    }
 
                    result = mt5.order_check(request)
                    print(result)
		mt5.shutdown()


if __name__ == "__main__":
    check_order()

Последний запущенный терминал: 

"c:\Works\MT5 - terminals\ForexClub MT5\terminal64.exe" 

Судя по скриншоту, обращение пошло в последний запущенный.

А хотелось бы вызвать конкретные, к которым обращался.

 
Renat Fatkhullin:

Параметры в путях мы пока не принимаем. 

Ммм ... не совсем понял вот этот момент, значение, но ни как не параметр, в этом месте я с конфига вынимаю параметры подключения.

            if mt5.initialize(path=acc['path'], login=acc['login'], server=acc['server'], password=acc['pass']):
                print("mt5.version(): ", mt5.version())
                print("mt5.terminal_info()", mt5.terminal_info())
                print("mt5.account_info()", mt5.account_info())
 
Дмитрий Прокопьев:

Вопрос по initialize(), есть

соответственно в path пути к двум терминалам которые запускаются /portable

но при этом, все вызовы initialize ломятся в последний запущенный экземпляр терминала.

соответственно MT build 2360 и MetaTrader5-5.0.26-cp38-cp38-win32.whl

Что не так? path должна использоваться с какой-то другой логикой, или в /portable надо еще что-то передавать?

Вы хотите в одном скрипте одновременно работать с 2-мя терминалами? Такой возможности нет, следующий вызов initialize разорвет соединение с первым терминалом, для такого нужно вводить сущность соединения чтобы различать разные терминалы. Работа идет только с одним текущим соединением.

у initialize есть еще 1 параметр (он еще не документирован) mt5.initialize(blabla, portable=True) для запуска Терминала жестко в portable mode.

 
Almaz:

Вы хотите в одном скрипте одновременно работать с 2-мя терминалами? Такой возможности нет, следующий вызов initialize разорвет соединение с первым терминалом, для такого нужно вводить сущность соединения чтобы различать разные терминалы. Работа идет только с одним текущим соединением.

у initialize есть еще 1 параметр (он еще не документирован) mt5.initialize(blabla, portable=True) для запуска Терминала жестко в portable mode.

Да, надо работать с несколькими терминалами запущенными в режиме portable. О том, что нельзя одновременно инициализировать соединение с двумя разными терминалами - это было видно из структуры самой либы. Тут вопросов нет.

Я пробовал это обращаться к терминалам по очереди:

if mt5.initialize(login=11111, path='/works/MT5-1'...):
        ...   
        mt5.shutdown()
else:
   print('error')

if mt5.initialize(login=2222, path='/works/MT5-2'...):
        ...   
        mt5.shutdown()
else:
   print('error')

вот в такой схеме, не работает. Во всех случаях ломится на последний запущенный руками в системе терминал. Даже если он был запущен из

path='/works/MT5-3'
mt5.initialize(blabla, portable=True) - особо не помогло, все равно лезет с запросом в последний запускавшийся в системе терминал.
 

Тут спрашивают -

Форум по трейдингу, автоматизированным торговым системам и тестированию торговых стратегий

MetaTrader 5 Python User Group - краткая информация

николи шен , 2020.03.07 15:46

Существует проблема с загрузкой пакета MetaTrader 5 с использованием версии pip, которая поставляется в комплекте с python. Обходной путь должен обновить пип. Команда для обновления pip в Windows:
python -m pip install -U pip

или в venv, используя

(inside virtualenv):easy_install -U pip

 
Almaz:

Вы хотите в одном скрипте одновременно работать с 2-мя терминалами? Такой возможности нет, следующий вызов initialize разорвет соединение с первым терминалом, для такого нужно вводить сущность соединения чтобы различать разные терминалы. Работа идет только с одним текущим соединением.

у initialize есть еще 1 параметр (он еще не документирован) mt5.initialize(blabla, portable=True) для запуска Терминала жестко в portable mode.

Обратите внимание, что mt5.terminal_info() показываем:

mt5.version():  [500, 2360, '06 Mar 2020']
mt5.terminal_info() TerminalInfo(community_account=False, community_connection=False, connected=True, dlls_allowed=False, trade_allowed=True, 
tradeapi_disabled=False, email_enabled=False, ftp_enabled=False, notifications_enabled=False, mqid=False, build=2360, maxbars=100000000, codepage=0, ping_last=42381,
community_balance=0.0, retransmission=7.976601967561818, company='MetaQuotes Software Corp.', name='MetaTrader 5', language='English', 
path='C:\\Works\\MT5 - terminals\\MetaTrader 5', data_path='C:\\Works\\MT5 - terminals\\MetaTrader 5', commondata_path='C:\\Users\\rip\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common')
mt5.version():  [500, 2360, '06 Mar 2020']
mt5.terminal_info() TerminalInfo(community_account=False, community_connection=False, connected=True, dlls_allowed=False, trade_allowed=True, 
tradeapi_disabled=False, email_enabled=False, ftp_enabled=False, notifications_enabled=False, mqid=False, build=2360, maxbars=100000000, codepage=0, ping_last=40849,
community_balance=0.0, retransmission=7.976601967561818, company='MetaQuotes Software Corp.', name='MetaTrader 5', language='English', 
path='C:\\Works\\MT5 - terminals\\MetaTrader 5', data_path='C:\\Works\\MT5 - terminals\\MetaTrader 5', commondata_path='C:\\Users\\rip\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common')

значение path='C:\\Works\\MT5 - terminals\\MetaTrader 5', data_path='C:\\Works\\MT5 - terminals\\MetaTrader 5', commondata_path='C:\\Users\\rip\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common'

идентичны. Так и должно быть?

Код ниже:

import MetaTrader5 as mt5

def check_order ():
    if mt5.initialize(path='c:\\Works\\MT5 - terminals\\MetaTrader 5\\terminal64.exe', 
                            login=25153683, server='MetaQuotes-Demo', password='',  portable=True):
        print("mt5.version(): ", mt5.version())
        print("mt5.terminal_info()", mt5.terminal_info())
        mt5.shutdown()

    if mt5.initialize(path='c:\\Works\\MT5 - terminals\\Alpari MT5\\terminal64.exe', 
                            login=50518455, server='Alpari-MT5-Demo', password='',  portable=True):
        print("mt5.version(): ", mt5.version())
        print("mt5.terminal_info()", mt5.terminal_info())
        mt5.shutdown()

if __name__ == "__main__":
    check_order()
 
Almaz:

Вы хотите в одном скрипте одновременно работать с 2-мя терминалами? Такой возможности нет, следующий вызов initialize разорвет соединение с первым терминалом, для такого нужно вводить сущность соединения чтобы различать разные терминалы. Работа идет только с одним текущим соединением.


А в принципе создание сущности(соединение) возможно? Не думаю, что это так нужно, но на будущее. 

При установке еще одного скрипта (Py) на график, первый сбрасывается. Так и должно быть?

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