Módulo MetaTrader para la integración con Python

MQL5 ha sido pensado para el desarrollo de aplicaciones comerciales de alto rendimiento en los mercados financieros y no tiene análogos entre otros lenguajes especializados, utilizados en el trading algorítmico. La sintaxis y velocidad de funcionamiento de los programas en MQL5 se encuentra muy próxima a С++, dispone de soporte de OpenCL e integración con MS Visual Studio, y también de una biblioteca de estadística, lógica difusa y ALGLIB. En el entorno de desarrollo del MetaEditor también existe el soporte nativo de bibliotecas .NET con importación "inteligente" de funciones sin necesidad de escribir envoltorios especiales, ya que es posible usar DLL de C++ de terceros.  Los archivos de los códigos fuente en С++ (CPP y H) se pueden redactar y compilar en DLL directamente desde el editor. Para ello, se usa el Microsoft Visual Studio instalado en la computadora del usuario.

Python es un lenguaje de programación moderno y de alto nivel para el desarrollo de escenarios y aplicaciones. Contiene multitud de bibliotecas para el aprendizaje de máquinas, la automatización de procesos, y también el análisis y visualización de datos.

El paquete MetaTrader para Python ha sido pensado para obtener de forma rápida y sencilla información bursátil a través de la interacción entre procesadores directamente desde el terminal MetaTrader 5. Los datos obtenidos de esta forma se pueden utilizar en lo sucesivo para cálculos estadísticos y aprendizaje de máquinas.

Instalar el paquete en la línea de comandos:

  pip install MetaTrader5

Actualizar el paquete en la línea de comandos:

  pip install --upgrade MetaTrader5

Funciones para la integración de MetaTrader 5 y Python

Función

Acción

initialize

Establece una conexión con el terminal MetaTrader 5

login

Se conecta a la cuenta comercial con los parámetros indicados

shutdown

Cierra una conexión anteriormente establecida con el terminal MetaTrader 5

version

Retorna la versión del terminal MetaTrader 5

last_error

Retorna la información sobre el último error

account_info

Obtiene la información sobre la cuenta comercial actual

terminal_Info

Obtiene el estado y los parámetros del terminal MetaTrader 5 conectado

symbols_total

Obtiene el número total de instrumentos financieros en el terminal MetaTrader 5

symbols_get

Obtiene todos los instrumentos financieros del terminal MetaTrader 5

symbol_info

Obtiene la información sobre el instrumento financiero indicado

symbol_info_tick

Obtiene el último tick del instrumento financiero indicado

symbol_select

Selecciona un símbolo en la ventana MarketWatch o quita un símbolo de esta ventana

market_book_add

Realiza la suscripción del terminal MetaTrader 5 para recibir eventos sobre los cambios en la profundidad de mercado

market_book_get

Retorna desde BookInfo la tupla que contiene las entradas de la profundidad de mercado del símbolo indicado

market_book_release

Cancela la suscripción del terminal MetaTrader 5 para recibir eventos sobre los cambios en la profundidad de mercado

copy_rates_from

Obtiene las barras del terminal MetaTrader 5, a partir de la fecha indicada

copy_rates_from_pos

Obtiene las barras del terminal MetaTrader 5, a partir del índice establecido

copyrates_range

Obtiene las barras en el intervalo de fechas indicado del terminal MetaTrader 5

copy_ticks_from

Obtiene los ticks del terminal MetaTrader 5, a partir de la fecha indicada

copy_ticks_range

Obtiene los ticks en el intervalo de fechas indicado del terminal MetaTrader 5

orders_total

Obtiene el número de órdenes activas.

orders_get

Obtiene la órdenes activas con posibilidad de filtrado según un símbolo o ticket

order_calc_margin

Retorna el tamaño del margen en la divisa de la cuenta para realizar la operación comercial indicada

order_calc_profit

Retorna el tamaño del beneficio en la divisa de la cuenta para la operación comercial indicada

order_check

Comprueba si los fondos son suficientes para realizar la operación comercial requerida

order_send

Envía desde el terminal al servidor comercial una solicitud de ejecución de una operación comercial.

positions_total

Obtiene el número de posiciones abiertas

positions_get

Obtiene las posiciones abiertas con posibilidad de filtrado según un símbolo o ticket

history_orders_total

Obtiene el número de órdenes en la historia comercial en el intervalo indicado

history_orders_get

Obtiene las órdenes de la historia comercial con posibilidad de filtrado según un ticket o posición

history_deals_total

Obtiene el número de transacciones en la historia comercial en el intervalo indicado

history_deals_get

Obtiene las transacciones de la historia comercial con posibilidad de filtrado según un ticket o posición

Ejemplo de conexión de Python a MetaTrader 5

  1. Descargue la última versión Python 3.8 de la página https://www.python.org/downloads/windows
  2. Al instalar Python, marque la casilla de verificación "Add Python 3.8 to PATH%", para que sea posible iniciar scripts en Python desde la línea de comandos.
  3. Instale el módulo MetaTrader5 desde la línea de comandos

  pip install MetaTrader5

  1. Añada los paquetes matplotlib y pandas

  pip install matplotlib
  pip install pandas

  1. Inicie el script de prueba

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
 
# conectamos con MetaTrader 5
if not mt5.initialize():
    print("initialize() failed")
    mt5.shutdown()
 
# solicitamos el estado y los parámetros de conexión
print(mt5.terminal_info())
# obtenemos la información sobre la versión de MetaTrader 5
print(mt5.version())
 
# solicitamos 1000 ticks de EURAUD
euraud_ticks = mt5.copy_ticks_from("EURAUD"datetime(2020,1,28,13), 1000mt5.COPY_TICKS_ALL)
# solicitamos los ticks de AUDUSD en el 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)
 
# obtenemos con distintos métodos las barras de diferentes instrumentos
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))
 
# finalizamos la conexión con 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
# creamos un DataFrame de los datos obtenidos
ticks_frame = pd.DataFrame(euraud_ticks)
# dibujamos los ticks en el gráfico
plt.plot(ticks_frame['time'], ticks_frame['ask'], 'r-', label='ask')
plt.plot(ticks_frame['time'], ticks_frame['bid'], 'b-', label='bid')
 
# mostramos los rótulos
plt.legend(loc='upper left')
 
# añadimos los encabezados
plt.title('EURAUD ticks')
 
# mostramos el gráfico
plt.show()

  1. Obtenga los datos y el 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)