Grupo de usuarios de MetaTrader 5 Python - cómo utilizar Python en Metatrader - página 51

 
MetaQuotes:

Se ha publicado una nueva versión de la biblioteca python 5.0.25

Por favor, actualice a través de:

Señores, podemos pedir que se añadan objetos como:

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

añadir pls o __dict__, o as_dict()

En python es mucho más cómodo operar con estructuras estándar, el mismo 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)

Estaría bien sacar dictados de esta clase (y de otras similares) y trabajar con ellos.

 

Pregunta sobre initialize(), hay

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
   )

respectivamente en las rutas de acceso a dos terminales que ejecutan /portable

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

и 

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

pero todas las llamadas deinicialización van a la última instancia en ejecución del terminal.

respectivamente MT build 2360 y MetaTrader5-5.0.26-cp38-cp38-win32.whl

¿Qué pasa? debe usarse con alguna otra lógica, o debe pasarse algo más a /portable?

 

Muestra el código real, por favor.

Todavía no aceptamos parámetros en las rutas.

 
Renat Fatkhullin:

Muestra el código real, por favor.

Todavía no aceptamos parámetros en las rutas.

Aquí está el código:

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

Último terminal en funcionamiento:

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

A juzgar por la captura de pantalla, la llamada fue al último que estaba en marcha.

Me gustaría llamar a los específicos a los que se accedió.

 
Renat Fatkhullin:

Todavía no aceptamos los parámetros en las pistas.

Mmm... No entiendo muy bien este punto, el valor pero no el parámetro, aquí es donde saco los parámetros de conexión del config.

            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())
 
Дмитрий Прокопьев:

Pregunta sobre initialize(), hay

respectivamente en las rutas de acceso a dos terminales que ejecutan /portable

pero todas las llamadas deinicialización van a la última instancia en ejecución del terminal.

respectivamente MT build 2360 y MetaTrader5-5.0.26-cp38-cp38-win32.whl

¿Qué pasa? debe usarse con alguna otra lógica, o debe pasarse algo más a /portable?

¿Quieres que dos terminales de un mismo script funcionen simultáneamente? No es posible, la siguiente llamada de inicialización romperá la conexión con el primer terminal, para ello es necesario introducir la entidad de conexión para distinguir los diferentes terminales. Sólo funciona con una conexión actual.

initialize tiene un parámetro más (aún no documentado)mt5.initialize(blabla, portable=True) parainiciar el terminal hard en modo portable.

 
Almaz:

¿Desea operar 2 terminales simultáneamente en un solo script? Esto no es posible, la siguiente llamada de inicialización romperá la conexión con el primer terminal, es necesario introducir una entidad de conexión para distinguir entre los diferentes terminales. Sólo funciona con una conexión actual.

initialize tiene un parámetro más (aún no documentado)mt5.initialize(blabla, portable=True) para iniciar la terminal en modo portable.

Sí, debe trabajar con varios terminales que funcionen en modoportátil . No se puede inicializar la conexión con dos terminales diferentes al mismo tiempo. No hay preguntas aquí.

Lo intenté para abordar los terminales uno por uno:

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

en este esquema, no funciona. En todos los casos, se bloquea el último terminal iniciado manualmente en el sistema. Incluso si se inició desde

path='/works/MT5-3'
mt5.initialize(blabla, portable=True)- no ayudó mucho, todavía pide la última terminal iniciada en el sistema.
 

Hay una pregunta aquí.

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Grupo de usuarios de MetaTrader 5 Python - Resumen

nikoli shen, 2020.03.07 15:46

Hay un problema al descargar el paquete de MetaTrader 5 usando la versión pip que viene con python. Una solución es actualizar el pip. Comando para actualizar pip en Windows:
python -m pip install -U pip

o en venv, utilizando

(inside virtualenv):easy_install -U pip

 
Almaz:

¿Desea operar 2 terminales simultáneamente en un solo script? Esto no es posible, la siguiente llamada de inicialización romperá la conexión con el primer terminal, es necesario introducir una entidad de conexión para distinguir entre diferentes terminales. Sólo funciona con una conexión actual.

initialize tiene un parámetro más (aún no documentado)mt5.initialize(blabla, portable=True) para iniciar el terminal hard en modo portable.

Observe que mt5.terminal_info() muestra

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

valuepath='C:\\Works\\\\\MT5 - terminals\MetaTrader 5', data_path='C:\Works\\\\MT5 - terminals\MetaTrader 5',commondata_path='C:\Users\rip\AppData\Roaming\MetaQuotes\Terminal\Common'

son idénticos. ¿Se supone que debe ser así?

El código es el siguiente:

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:

¿Desea operar 2 terminales simultáneamente en un solo script? Esto no es posible, la siguiente llamada de inicialización romperá la conexión con el primer terminal, es necesario introducir una entidad de conexión para distinguir entre diferentes terminales. Sólo funciona con una conexión actual.


¿Es posible, en principio, crear una entidad (conexión)? No creo que sea tan necesario, pero para futuras referencias.

Al instalar otro script (Py) en el gráfico, el primero se reinicia. ¿Es así como debe ser?

Razón de la queja: