MetaTrader 5 Python User Group - como usar o Python no Metatrader - página 51

 
MetaQuotes:

Foi lançada uma nova construção da biblioteca python 5.0.25

Por favor, actualize via:

Cavalheiros, podemos pedir para acrescentar objectos 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')

adicionar pls ou __dict__, ou as_dict()

Em python é muito mais conveniente operar com estruturas padrão, o mesmo ditado/lista.

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

Seria bom retirar a ditadura desta classe (e de outras semelhantes) e trabalhar com ela.

 

Pergunta sobre inicializar(), existem

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 em caminhos para dois terminais que funcionam /portáteis

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

и 

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

mas todas as chamadasinicializadas vão para a última instância de funcionamento do terminal.

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

O que é que está errado? O caminho deve ser usado com alguma outra lógica, ou deve algo mais ser passado para /portável?

 

Mostrar o código actual, por favor.

Ainda não aceitamos parâmetros nos caminhos.

 
Renat Fatkhullin:

Mostrar o código actual, por favor.

Ainda não aceitamos parâmetros nos caminhos.

Aqui está o 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 em funcionamento:

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

A julgar pela imagem do ecrã, a chamada foi para o último a correr.

Gostaria de chamar as específicas que foram acedidas.

 
Renat Fatkhullin:

Ainda não aceitamos os parâmetros nas pistas.

Mmm ... Não compreendo bem este ponto, o valor mas não o parâmetro, é aqui que retiro os parâmetros de ligação da configuração.

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

Pergunta sobre inicializar(), existem

respectivamente em caminhos para dois terminais que funcionam /portáteis

mas todas as chamadasinicializadas vão para a última instância de funcionamento do terminal.

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

O que é que está errado? O caminho deve ser usado com alguma outra lógica, ou deve algo mais ser passado para /portável?

Quer 2 terminais num guião para trabalhar simultaneamente? Não é possível, a próxima chamada inicializada irá quebrar a ligação com o primeiro terminal, para isso necessita de entrar na entidade de ligação para distinguir diferentes terminais. Funciona apenas com uma ligação actual.

initialize tem mais um parâmetro (ainda não documentado)mt5.initialize(blabla, portable=True) parainiciar o terminal com força no modo portátil.

 
Almaz:

Quer operar 2 terminais em simultâneo num único guião? Isto não é possível, a próxima chamada inicializada irá quebrar a ligação ao primeiro terminal, pelo que é necessário entrar numa entidade de ligação para distinguir entre os diferentes terminais. Funciona apenas com uma ligação actual.

initialize tem mais um parâmetro (ainda não documentado)mt5.initialize(blabla, portable=True) para iniciar o terminal em modo portátil.

Sim, deve trabalhar com múltiplos terminais a funcionar em modoportátil . Não se pode inicializar a ligação com dois terminais diferentes ao mesmo tempo. Aqui não há perguntas.

Tentei abordar os terminais um a um:

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

neste esquema, não funciona. Em todos os casos, o sistema trava até ao último terminal iniciado manualmente no sistema. Mesmo que tenha sido iniciada a partir de

path='/works/MT5-3'
mt5.initialize(blabla, portable=True)- não ajudou muito, ainda assim, faz com que o último terminal seja iniciado no sistema.
 

Há aqui uma questão.

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

MetaTrader 5 Python User Group - Resumo

nikoli shen, 2020.03.07 15:46

Há um problema ao descarregar o pacote MetaTrader 5 usando a versão pip que vem com python. Uma alternativa é actualizar o pip. Comando para actualizar pip no Windows:
python -m pip install -U pip

ou em venv, utilizando

(inside virtualenv):easy_install -U pip

 
Almaz:

Quer operar 2 terminais em simultâneo num único guião? Isto não é possível, a próxima chamada inicializada irá quebrar a ligação ao primeiro terminal, é necessário entrar numa entidade de ligação para distinguir entre diferentes terminais. Funciona apenas com uma ligação actual.

initialize tem mais um parâmetro (ainda não documentado)mt5.initialize(blabla, portable=True) para iniciar o terminal com força no modo portátil.

Note que 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 - terminaisMetaTrader 5', data_path='C:|Works\\\\MT5 - terminaisMetaTrader 5',commondata_path='C:|Utilizadores_PipDataAppData_Roaming='MetaQuotes_Terminal'

são idênticos. É suposto ser assim?

O código está abaixo:

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:

Quer operar 2 terminais em simultâneo num único guião? Isto não é possível, a próxima chamada inicializada irá quebrar a ligação ao primeiro terminal, é necessário entrar numa entidade de ligação para distinguir entre os diferentes terminais. Funciona apenas com uma ligação actual.


A criação de uma entidade (ligação) é possível em princípio? Não creio que seja tão necessário, mas para referência futura.

Ao instalar outro guião (Py) no gráfico, o primeiro é reiniciado. Será assim que deve ser?