Módulo MetaTrader para integração com Python

A MQL5 foi projetada para desenvolver aplicativos de negociação de alto desempenho nos mercados financeiros e não possui análogos entre outras linguagens especializadas para algotrading. A sintaxe e a velocidade dos programas em MQL5 se aproximam mais das do C++, possui suporte a Opencl e integração com o MS Visual Studio, dispõe de bibliotecas de estatística, lógica difusa e ALGLIB. No ambiente de desenvolvimento do MetaEditor existe também um suporte nativo a bibliotecas .NET com a importação inteligente de funções sem escrever wrappers especiais, podem-se usar DLL de C++ de terceiros. Arquivos de códigos fonte em C++ (CPP e H) podem ser editados e compilados em DLLs diretamente do editor, basta usar o Microsoft Visual Studio instalado no computador do usuário.

Python é uma linguagem de programação moderna de alto nível para o desenvolvimento de scripts e aplicativos. Possui muitas bibliotecas para aprendizado de máquina, automação de processos, análise de dados e visualização.

O pacote MetaTrader para Python é projetado para o recebimento conveniente e rápido de informações de negociação através de comunicação entre processos diretamente do terminal MetaTrader 5. Os dados recebidos desta maneira podem ser utilizados para cálculos estatísticos e aprendizado de máquina.

Instalando o pacote na linha de comando:

  pip install MetaTrader5

Atualizando o pacote na linha de comando:

  pip install --upgrade MetaTrader5

Funções para integração de MetaTrader 5 e Python

Função

Ação

initialize

Estabelece a conexão com o terminal MetaTrader 5

login

Conecta-se a uma conta de negociação com os parâmetros especificados

shutdown

Fecha a conexão estabelecida anteriormente com o terminal MetaTrader 5

version

Retorna a versão do terminal MetaTrader 5

last_error

Retorna informações sobre o último erro

account_info

Obtém informações atuais sobre a conta de negociação

terminal_Info

Obtém o estado e os parâmetros do terminal MetaTrader 5 conectado

symbols_total

Obtém o número total de instrumentos financeiros no terminal MetaTrader 5

symbols_get

Obtém todos os instrumentos financeiros do terminal MetaTrader 5

symbol_info

Obtém informações sobre o instrumento financeiro especificado

symbol_info_tick

Obtém o último tick do instrumento financeiro especificado

symbol_select

Seleciona o símbolo na janela MarketWatch ou remove o símbolo deste janela

market_book_add

Faz com que o terminal MetaTrader 5 receba eventos sobre mudanças no livro de ofertas para o símbolo especificado

market_book_get

Retorna uma tupla desde BookInfo contendo os registros do livro de ofertas para o símbolo especificado

market_book_release

Cancela a subscrição do terminal MetaTrader 5 para receber eventos sobre alterações no livro de ofertas para o símbolo especificado

copy_rates_from

Recebe barras do terminal MetaTrader 5, a partir da data especificada

copy_rates_from_pos

Recebe barras do terminal MetaTrader 5, a partir do índice especificado

copyrates_range

Recebe barras a partir do terminal MetaTrader 5, no intervalo de datas especificado

copy_ticks_from

Recebe ticks do terminal MetaTrader 5, a partir da data especificada

copy_ticks_range

Recebe ticks a partir do terminal MetaTrader 5, no intervalo de datas especificado

orders_total

Obtém o número de ordens ativas.

orders_get

Obtém ordens ativas com a capacidade de filtrar por símbolo ou ticket

order_calc_margin

Retorna o tamanho da margem na moeda da conta para a operação de negociação especificada

order_calc_profit

Retorna o valor do lucro na moeda da conta para a operação de negociação especificada

order_check

Verifica que há fundos suficientes para realizar a operação de negociação requerida

order_send

Envia do terminal para o servidor de negociação uma solicitação para concluir uma operação de negociação.

positions_total

Obtém o número de posições abertas

positions_get

Obtém posições abertas com a capacidade de filtrar por símbolo ou bilhete

history_orders_total

Obtém o número de ordens no histórico de negociação no intervalo especificado

history_orders_get

Obtém ordens do histórico de negociação com a capacidade de filtrar por bilhete ou posição

history_deals_total

Obtém o número de transações no histórico de negociação no intervalo especificado

history_deals_get

Obtém transações do histórico de negociação com a capacidade de filtrar por bilhete ou posição

Exemplo de conexão do Python ao MetaTrader 5

  1. Baixe a última versão do Python 3.8 da página https://www.python.org/downloads/windows
  2. Ao instalar o Python, marque a caixa "Add Python 3.8 to PATH%" para poder executar scripts Python a partir da linha de comando.
  3. Instale o módulo MetaTrader5 a partir da linha de comando

  pip install MetaTrader5

  1. Adicione os pacotes matplotlib e pandas

  pip install matplotlib
  pip install pandas

  1. Execute o script de teste

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
 
# conecte-se ao MetaTrader 5
if not mt5.initialize():
    print("initialize() failed")
    mt5.shutdown()
 
# consultamos o estado e os parâmetros de conexão
print(mt5.terminal_info())
# obtemos informações sobre a versão do MetaTrader 5
print(mt5.version())
 
# solicitamos 1 000 ticks de EURAUD
euraud_ticks = mt5.copy_ticks_from("EURAUD"datetime(2020,1,28,13), 1000mt5.COPY_TICKS_ALL)
# solicitamos ticks de AUDUSD no intervalo 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)
 
# obtemos barras de vários instrumentos de diferentes maneiras
eurusd_rates = mt5.copy_rates_from("EURUSD"mt5.TIMEFRAME_M1datetime(2020,1,28,13), 1000)
eurgbp_rates = mt5.copy_rates_from_pos("EURGBP"mt5.TIMEFRAME_M101000)
eurcad_rates = mt5.copy_rates_range("EURCAD"mt5.TIMEFRAME_M1datetime(2020,1,27,13), datetime(2020,1,28,13))
 
# concluímos a conexão ao 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
# a partir dos dados recebidos criamos o DataFrame
ticks_frame = pd.DataFrame(euraud_ticks)
# plotamos os ticks no gráfico
plt.plot(ticks_frame['time'], ticks_frame['ask'], 'r-', label='ask')
plt.plot(ticks_frame['time'], ticks_frame['bid'], 'b-', label='bid')
 
# exibimos rótulos
plt.legend(loc='upper left')
 
# adicionamos cabeçalho
plt.title('EURAUD ticks')
 
# mostramos o gráfico
plt.show()

  1. Obtemos os dados e o gráfico
    python_script_chart

[2, 'MetaQuotes-Demo', '16167573']
[5002325, '19 Feb 2020']
 
euraud_ticks( 1000 )
(1580209200, 1.63412, 1.63437, 0., 0, 1580209200067, 130, 0.)
(1580209200, 1.63416, 1.63437, 0., 0, 1580209200785, 130, 0.)
(1580209201, 1.63415, 1.63437, 0., 0, 1580209201980, 130, 0.)
(1580209202, 1.63419, 1.63445, 0., 0, 1580209202192, 134, 0.)
(1580209203, 1.6342, 1.63445, 0., 0, 1580209203004, 130, 0.)
(1580209203, 1.63419, 1.63445, 0., 0, 1580209203487, 130, 0.)
(1580209203, 1.6342, 1.63445, 0., 0, 1580209203694, 130, 0.)
(1580209203, 1.63419, 1.63445, 0., 0, 1580209203990, 130, 0.)
(1580209204, 1.63421, 1.63445, 0., 0, 1580209204194, 130, 0.)
(1580209204, 1.63425, 1.63445, 0., 0, 1580209204392, 130, 0.)
audusd_ticks( 40449 )
(1580122800, 0.67858, 0.67868, 0., 0, 1580122800244, 130, 0.)
(1580122800, 0.67858, 0.67867, 0., 0, 1580122800429, 4, 0.)
(1580122800, 0.67858, 0.67865, 0., 0, 1580122800817, 4, 0.)
(1580122801, 0.67858, 0.67866, 0., 0, 1580122801618, 4, 0.)
(1580122802, 0.67858, 0.67865, 0., 0, 1580122802928, 4, 0.)
(1580122809, 0.67855, 0.67865, 0., 0, 1580122809526, 130, 0.)
(1580122809, 0.67855, 0.67864, 0., 0, 1580122809699, 4, 0.)
(1580122813, 0.67855, 0.67863, 0., 0, 1580122813576, 4, 0.)
(1580122815, 0.67856, 0.67863, 0., 0, 1580122815190, 130, 0.)
(1580122815, 0.67855, 0.67863, 0., 0, 1580122815479, 130, 0.)
eurusd_rates( 1000 )
(1580149260, 1.10132, 1.10151, 1.10131, 1.10149, 44, 1, 0)
(1580149320, 1.10149, 1.10161, 1.10143, 1.10154, 42, 1, 0)
(1580149380, 1.10154, 1.10176, 1.10154, 1.10174, 40, 2, 0)
(1580149440, 1.10174, 1.10189, 1.10168, 1.10187, 47, 1, 0)
(1580149500, 1.10185, 1.10191, 1.1018, 1.10182, 53, 1, 0)
(1580149560, 1.10182, 1.10184, 1.10176, 1.10183, 25, 3, 0)
(1580149620, 1.10183, 1.10187, 1.10177, 1.10187, 49, 2, 0)
(1580149680, 1.10187, 1.1019, 1.1018, 1.10187, 53, 1, 0)
(1580149740, 1.10187, 1.10202, 1.10187, 1.10198, 28, 2, 0)
(1580149800, 1.10198, 1.10198, 1.10183, 1.10188, 39, 2, 0)
eurgbp_rates( 1000 )
(1582236360, 0.83767, 0.83767, 0.83764, 0.83765, 23, 9, 0)
(1582236420, 0.83765, 0.83765, 0.83764, 0.83765, 15, 8, 0)
(1582236480, 0.83765, 0.83766, 0.83762, 0.83765, 19, 7, 0)
(1582236540, 0.83765, 0.83768, 0.83758, 0.83763, 39, 6, 0)
(1582236600, 0.83763, 0.83768, 0.83763, 0.83767, 21, 6, 0)
(1582236660, 0.83767, 0.83775, 0.83765, 0.83769, 63, 5, 0)
(1582236720, 0.83769, 0.8377, 0.83758, 0.83764, 40, 7, 0)
(1582236780, 0.83766, 0.83769, 0.8376, 0.83766, 37, 6, 0)
(1582236840, 0.83766, 0.83772, 0.83763, 0.83772, 22, 6, 0)
(1582236900, 0.83772, 0.83773, 0.83768, 0.8377, 36, 5, 0)
eurcad_rates( 1441 )
(1580122800, 1.45321, 1.45329, 1.4526, 1.4528, 146, 15, 0)
(1580122860, 1.4528, 1.45315, 1.45274, 1.45301, 93, 15, 0)
(1580122920, 1.453, 1.45304, 1.45264, 1.45264, 82, 15, 0)
(1580122980, 1.45263, 1.45279, 1.45231, 1.45277, 109, 15, 0)
(1580123040, 1.45275, 1.4528, 1.45259, 1.45271, 53, 14, 0)
(1580123100, 1.45273, 1.45285, 1.45269, 1.4528, 62, 16, 0)
(1580123160, 1.4528, 1.45284, 1.45267, 1.45282, 64, 14, 0)
(1580123220, 1.45282, 1.45299, 1.45261, 1.45272, 48, 14, 0)
(1580123280, 1.45272, 1.45275, 1.45255, 1.45275, 74, 14, 0)
(1580123340, 1.45275, 1.4528, 1.4526, 1.4528, 94, 13, 0)