MetaTrader 5 Python User Group - Come usare Python in Metatrader - pagina 51

 
MetaQuotes:

È stata rilasciata una nuova build della libreria python 5.0.25

Si prega di aggiornare via:

Signori, possiamo chiedere di aggiungere oggetti come:

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

aggiungere pls o __dict__, o as_dict()

In python è molto più conveniente operare con strutture standard, lo stesso 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)

Sarebbe bello estrarre il dettato di questa classe (e di altre simili) e lavorarci.

 

Domanda su initialize(), ci sono

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
   )

rispettivamente nei percorsi di due terminali che eseguono /portable

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

и 

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

ma tutte le chiamate diinizializzazione vanno all'ultima istanza in esecuzione del terminale.

rispettivamente MT build 2360 e MetaTrader5-5.0.26-cp38-cp38-win32.whl

Cosa c'è che non va? dovrebbe essere usato con qualche altra logica, o si dovrebbe passare qualcos'altro a /portable?

 

Mostra il codice reale, per favore.

Non accettiamo ancora parametri nei percorsi.

 
Renat Fatkhullin:

Mostra il codice reale, per favore.

Non accettiamo ancora parametri nei percorsi.

Ecco il codice:

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

Ultimo terminale in funzione:

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

A giudicare dallo screenshot, la chiamata è andata all'ultimo in esecuzione.

Vorrei chiamare quelli specifici che sono stati acceduti.

 
Renat Fatkhullin:

Non accettiamo ancora i parametri nelle tracce.

Mmm... Non capisco bene questo punto, il valore ma non il parametro, è qui che tolgo i parametri di connessione dalla configurazione.

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

Domanda su initialize(), ci sono

rispettivamente nei percorsi di due terminali che eseguono /portable

ma tutte le chiamate diinizializzazione vanno all'ultima istanza in esecuzione del terminale.

rispettivamente MT build 2360 e MetaTrader5-5.0.26-cp38-cp38-win32.whl

Cosa c'è che non va? dovrebbe essere usato con qualche altra logica, o si dovrebbe passare qualcos'altro a /portable?

Volete che 2 terminali in uno script lavorino simultaneamente? Non è possibile, la prossima chiamata di inizializzazione interromperà la connessione con il primo terminale, per questo è necessario inserire l'entità di connessione per distinguere i diversi terminali. Funziona solo con una connessione corrente.

initialize ha un altro parametro (non ancora documentato)mt5.initialize(blabla, portable=True) peravviare il terminale in modalità portatile.

 
Almaz:

Volete gestire 2 terminali simultaneamente in uno script? Questo non è possibile, la prossima chiamata di inizializzazione interromperà la connessione al primo terminale, è necessario inserire un'entità di connessione per distinguere tra i diversi terminali. Funziona solo con una connessione corrente.

initialize ha un altro parametro (non ancora documentato)mt5.initialize(blabla, portable=True) per avviare il terminale in modalità portatile.

Sì, si dovrebbe lavorare con più terminali che funzionano in modalitàportatile . Non è possibile inizializzare la connessione con due terminali diversi allo stesso tempo. Nessuna domanda qui.

Ho provato ad affrontare i terminali uno per 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')

in questo schema, non funziona. In tutti i casi si blocca all'ultimo terminale avviato manualmente nel sistema. Anche se è stato avviato da

path='/works/MT5-3'
mt5.initialize(blabla, portable=True)- non ha aiutato molto, chiede ancora l'ultimo terminale avviato nel sistema.
 

C'è una domanda qui.

Forum sul trading, sistemi di trading automatico e test di strategia

MetaTrader 5 Python User Group - Riassunto

nikoli shen, 2020.03.07 15:46

C'è un problema con il download del pacchetto MetaTrader 5 usando la versione pip che viene fornita con python. Un workaround è quello di aggiornare il pip. Comando per aggiornare pip in Windows:
python -m pip install -U pip

o in venv, usando

(inside virtualenv):easy_install -U pip

 
Almaz:

Volete gestire 2 terminali simultaneamente in uno script? Questo non è possibile, la prossima chiamata di inizializzazione interromperà la connessione al primo terminale, è necessario inserire un'entità di connessione per distinguere tra i diversi terminali. Funziona solo con una connessione corrente.

initialize ha un altro parametro (non ancora documentato)mt5.initialize(blabla, portable=True) per avviare il terminale in modalità portatile.

Notate che mt5.terminal_info() mostra

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'

sono identici. È normale che sia così?

Il codice è qui sotto:

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:

Volete gestire 2 terminali simultaneamente in uno script? Questo non è possibile, la prossima chiamata di inizializzazione interromperà la connessione al primo terminale, è necessario inserire un'entità di connessione per distinguere tra i diversi terminali. Funziona solo con una connessione corrente.


Creare un'entità (connessione) è possibile in linea di principio? Non credo che sia così necessario, ma per riferimento futuro.

Quando si installa un altro script (Py) sul grafico, il primo viene resettato. È così che dovrebbe essere?