Seleccionar página

Cómo conectar Python y MetaTrader 5 – Parte 1

por

Apreciado trader,

Este es el primero de una serie de tres artículos donde te voy a enseñar cómo conectar python y MetaTrader 5 de manera nativa.

En este primer artículo nos centraremos en conectar python y MetaTrader 5, mientras que en los dos siguientes exploraremos cómo obtener datos históricos (en OHLC y Tick) y en cómo enviar órdenes al mercado y cerrarlas.

Si eres de los que prefiere seguir este tipo de tutoriales en formato de vídeo, también hemos preparado una lista de reproducción con todos los pasos en nuestro canal de YouTube. Te dejo aquí el primero de ellos:

Importante: Durante todo este artículo voy a dar por hecho que tienes tanto python como MetaTrader 5 instalados.

Por otro lado, puedes obtener también el Jupyter Notebook que hemos preparado con todo el código y sus explicaciones por si quieres ir directamente al grano.

¡Vamos a ello!

Creación del entorno virtual mediante conda

En este primer apartado, crearemos un entorno virtual de python para poder tener nuestro proyecto aislado y bien configurado. Seguidamente activaremos dicho entorno e instalaremos en él las dependencias necesarias.

En mi caso, utilizo el gestor de paquetes Anaconda, y es con el que voy a crear el entorno virtual.

Para crear nuestro entorno virtual utilizando conda, deberemos primero abrir el terminal de Anaconda. En ese momento, podremos utilizar el siguiente comando para crear el entorno virtual, darle un nombre e instalar python en una sola línea:

conda create --name mt5python python=3.11

Analicemos ahora el comando por partes:

  • conda create: utilizamos el gestor de paquetes conda para crear un entorno virtual dentro del propio gestor conda.
  • --name mt5python: indicamos el nombre que le vamos a dar al entorno virtual, en este caso “mt5python”, pero puedes darle el que quieras.
  • python=3.11: con esta última parte indicamos qué versión de python queremos instalar en este entorno virtual.

Durante la instalación, nos pedirá confirmación para instalar python y los módulos necesarios. Tendremos que explícitamente aceptar en la terminal. Si quieres que se acepte automáticamente, puedes modificar el comando anterior añadiendo “-y”, para que conteste “yes” a todos los requerimientos:

conda create -y --name mt5python python=3.11

Finalmente, solo nos quedará activar el entorno para poder seguir instalando las dependencias. Para ello, tendrás que utilizar el comando:

conda activate mt5python

Si has definido un nombre distinto, tendrás que modificar el comando anterior con el nombre de tu entorno virtual.

Instalación de dependencias

Una vez nuestro entorno virtual esté listo y activado, podremos comenzar la instalación de las dependencias necesarias para conectarnos al terminal de MetaTrader5 usando python.

Para ello, deberemos instalar dos módulos: Pandas y MetaTrader5. Lo haremos utilizando los siguientes comandos:

En primer lugar, instalaremos Pandas usando Pip:

pip install pandas

En segundo lugar, instalaremos el módulo oficial de MetaTrader 5 usando también Pip:

pip install MetaTrader5

Finalmente, deberemos instalar Matplotlib para poder crear gráficos y visualizar nuestros datos.

pip install matplotlib

¡Genial! Ahora ya estamos listos para poder conectarnos a nuestro terminal MetaTrader 5.

Creación de un Jupyter Notebook

Seguimos ahora con los pasos necesarios para establecer la conexión entre python y el terminal MT5. Para hacerlo de manera sencilla, vamos a utilizar un Jupyter Notebook (aunque puedes hacerlo también a través de un script .py directamente).

Para ello, vamos primero a crear una carpeta donde guardaremos los archivos del proyecto. En mi caso, la he creado directamente en el escritorio, y la he abierto utilizando VSCode, aunque puedes utilizar cualquier otro editor de código.

Después, crearemos un nuevo archivo dentro de la carpeta en cuestión llamado mt5_python_connetc.ipynb (importante escribir bien el formato .ipynb) para crear nuestro notebook dentro de VSCode y estaremos listos para comenzar a programar.

Recuerda que si quieres obtener el Jupyter Notebook completo con todos los pasos de este tutorial, te lo enviamos directamente a tu bandeja de entrada:

Conectar python y MetaTrader 5

Es importante que selecciones el entorno virtual que hemos creado anteriormente como Kernel para el Jupyter Notebook.

Lo primero que deberemos hacer será importar los módulos de Pandas y MetaTrader5, que haremos con dos instrucciones import con sus correspondientes alias:

import pandas as pd
import MetaTrader5 as mt5

Es probable que si intentas ejecutar una celda del notebook, te aparezca un error donde te pide que instales ipykernel para poder ejecutarlo. Instálalo mediante el propio mensaje que te aprece, o sino puedes instalarlo mediante pip con el siguiente comando:

pip install ipykernel

Una vez importados los módulos, podremos conectarnos finalmente a la plataforma. Para ello, deberemos crear primero un diccionario con los datos de credenciales. Lo haremos de la siguiente manera:

# Ahora vamos a crear un diccionario con las credenciales necesarias.
# Tendrás que actualizar los valores path, login, pass y server según tu caso concreto.
creds = {
    "path": "C:\\Program Files\\Darwinex MetaTrader 5\\terminal64.exe",
    "login": 3000012345,
    "pass": "tu_contraseña",
    "server": "Darwinex-Demo",
    "timeout": 60000,
    "portable": False
}

En el caso del “path”, deberás copiar aquí la ruta a la carpeta de instalación de MT5 dentro de tu ordenador. En la imagen puedes ver la ruta por defecto donde se instala la plataforma de Darwinex, por lo que puede que en tu caso, si trabajas con otro broker, la ruta sea distinta.

En cualquier caso, es importante que definas las barras de separación de manera doble (\\) para que python pueda encontrar correctamente el directorio.

Con las credenciales definidas, ya podremos lanzar nuestra plataforma MT5 y establecer la conexión.

# Lanzamos la plataforma MT5 y nos conectamos al servidor con nuestro usuario y contraseña
if mt5.initialize(path=creds['path'],
                  login=creds['login'],
                  password=creds['pass'],
                  server=creds['server'],
                  timeout=creds['timeout'],
                  portable=creds['portable']):
    
    print("Plataforma MT5 lanzada correctamente")

else:
    print(f"Ha habido un problema en la inicialización: {mt5.last_error()}")

Fíjate que este código ya tiene incorporada una pequeña gestión de errores. Por ahora no te preocupes, veremos la función last_error() más adelante.

Información de la plataforma

En esta sección nos vamos a centrar en cómo obtener la información relacionada con la plataforma. Veremos cómo acceder a los ajustes, a la información personal de la cuenta, y a los datos relevantes del último error ocurrido para poder gestionarlo adecuadamente.

Obtener información de los ajustes del terminal

Podemos obtener toda la información del terminal, es decir, de la propia plataforma MetaTrader 5, utilizando la función terminal_info(). En nuestro caso, vamos a convertir los datos a un diccionario para mejor lectura, así como en un DataFrame por si te fuera de utilidad.

# Podemos recuperar información del terminal utilizando la función terminal_info().

# En forma de diccionario:
terminal_info_dict = mt5.terminal_info()._asdict() 

# Convirtiendo el diccionario en un DataFrame
terminal_info_df = pd.DataFrame(terminal_info_dict, index=[0])

Si exploramos el contenido de terminal_info_dict, podremos ver toda la información referente a nuestro terminal.

Cabe destacar que el ajuste más importante aquí es verificar que el trading automatico ('trade_allowed': True) está activado, ya que sin esta opción en “True”, no podremos enviar ninguna órden al mercado desde python.

Obtener información de la cuenta

Para poder acceder a la información relativa a la cuenta, es decir, a valores tan interesantes como nuestro balance disponible, el margen utilizado o los beneficios flotantes, recurriremos al uso de la función account_info() de la siguiente manera:

# Recuperamos la información de nuestra cuenta en ambos formatos, diccionario y DataFrame
account_info_dict = mt5.account_info()._asdict()
account_info_df = pd.DataFrame(account_info_dict, index=[0])

También podremos explorar el contenido de account_info_dict para ver todos los datos que aparecen en él.

Si quisieras acceder a ciertos valores específicos dentro del diccionario, podrías hacerlo siguiendo este ejemplo en el que hemos utilizado instrucciones print para poder imprimir la información en pantalla:

# Accedemos a valores de interés, como el Equity o el beneficio flotante actual:
print(f"Mi equity actual es: {account_info_dict['equity']} {account_info_dict['currency']}")
print(f"Mi PnL actual es: {account_info_dict['profit']} {account_info_dict['currency']}")

Siendo los resultados de la instrucción anterior:

  • Mi equity actual es: 997413.06 EUR
  • Mi PnL actual es: 112.59 EUR

Obtener información del último error ocurrido

Es habitual que, en ocasiones, se produzcan errores durante el normal funcionamiento de la plataforma. Estos errores pueden ser debidos a varios factores, como el de intentar enviar una órden desde python pero teniendo la plataforma desactivada.

Para poder gestionar y acceder a estos errores, vamos a utilizar la siguiente función:

# Obtener información del último error ocurrido
last_error = mt5.last_error()

De esta manera, podremos evaluar el contenido de la variable last_error y poder tomas las acciones oportunas.

Puedes obtener la información de todos los códigos de error en este enlace.

Obtener información de los símbolos disponibles

En esta sección exploraremos todo lo relacionado con los símbolos, es decir, los instrumentos financieros disponibles en la plataforma MetaTrader 5.

Deberás tener en cuenta que los instrumentos que tengas disponibles en tu caso podrían no ser los mismos que en este tutorial, ya que la oferta de instrumentos puede variar entre brókers distintos. Del mismo modo, podría ser que los nombres no fueran los mismos («SPX500» en el broker A, «SP500» en el broker B, por ejemplo).

Obtener el número de símbolos disponibles

Lo primero que vamos a ver es cómo obtener el número de símbolos disponibles en la plataforma. Este número incluye todos los símbolos personalizados (si los tienes), así como los símbolos que no están activos en el MarketWatch.

Para conocer el número de símbolos disponibles, utilizaremos la siguiente función:

# Para saber la cantidad total de símbolos en la plataforma,
# incluyendo los símbolos personalizados y los que NO están en el Market Watch
total_symbols = mt5.symbols_total()

Filtrar los símbolos por su nombre

También podemos filtrar los símbolos utilizando su nombre. Por ejemplo, si queremos obtener los instrumentos que tienen el Euro en su nombre, lo podemos hacer con la función symbols_get():

# Si quieres filtrar solo los símbolos que contienen en EUR, puedes hacerlo así:
filtered_symbols = mt5.symbols_get('*EUR*')

for symbol in filtered_symbols:
    print(symbol.name)

Obtener información específica de un símbolo

En el caso de querer obtener una información más específica acerca de un símbolo, lo podremos hacer mediante la función symbol_info(). A continuación te muestro un ejemplo:

# Podemos obtener información interesante de un símbolo de esta manera:
symbol_info = mt5.symbol_info('EURJPY')

print(symbol_info)
print(f"El símbolo {symbol_info.name} tiene {symbol_info.digits} dígitos.")
print(f"Su tamaño de contrato es de {symbol_info.trade_contract_size} unidades por lote estándar.")

Al ejecutar esta celda, obtenemos primero toda la información de symbol_info, así como campos específicos que nos interesaban como el nombre, los dígitos o el tamaño del contrato.

Obtener información del último tick recibido por un símbolo

Si quisiéramos conocer cuál ha sido el último precio Ask o Bid de un instrumento, podríamos utilizar la función symbol_info_tick() para averiguarlo:

# Obtenemos información interesante sobre el último tick recibido
last_tick = mt5.symbol_info_tick('EURJPY')

print(f"El precio Ask es {last_tick.ask} y el Bid es {last_tick.bid}.")
print(f"El flag del último tick es: {last_tick.flags}")

Al ejecutar esta celda, podríamos ver que el último tick recibido del EURJPY tiene este aspecto:

  • El precio Ask es 156.346 y el Bid es 156.337
  • El flag del último tick es: 6

El flag no es más que el desencadenante que ha generado el último tick. Por si te interesa, te dejo también el enlace para que puedas obtener más información acerca de los flags aquí.

Añadir o eliminar un símbolo del MarketWatch

Finalmente, la última función que veremos en este artículo será la de poder añadir o eliminar un símbolo del MarketWatch. Esta funcionalidad será muy útil a la hora de poder enviar órdenes al mercado, ya que vamos a necesitar que los símbolos estén añadidos en el MarketWatch para poder operar.

Podemos añadir o eliminar un símbolo del MarketWatch y gestionar si la acción se ha podido llevar a cabo o no de la siguiente manera:

# Si action es True, lo añadiremos. Si es False, lo eliminaremos
action = True

if mt5.symbol_select('EURJPY', action):
    print("Símbolo añadido correctamente al MarketWatch")
else:
    print(f"Ha ocurrido un error añadiendo el símbolo: {mt5.last_error()}")

Conclusión

¡Y hasta aquí este artículo! Ahora ya sabes cómo conectar fácilmente python y MetaTrader 5, recuperar información de la cuenta, del terminal, de los símbolos e incluso los últimos precios Ask y Bid. Aunque todo esto está muy bien, aún nos queda algo de camino por recorrer.

En el siguiente artículo vamos a ver cómo obtener los datos históricos desde nuestro terminal, tanto los OHLC como los datos tick. Esto será muy útil para cuando diseñes tus propias estrategias, ya que los datos históricos van a ser fundamentales.

Como siempre, si tienes cualquier duda, puedes ponerte en contacto con nostros a través de nuestro formulario o de la comunidad de Discord.

Gracias por tu lectura.

Un saludo,

Martí

Escrito por Marti Castany

Martí Castany es Quant Researcher, Portfolio Manager y Co-Fundador de KomaLogic, una firma de trading algorítmico. Con más de una década de experiencia en el sector de la inversión sistemática, Martí se ha destacado en el desarrollo de modelos estadísticos, análisis y limpieza de datos y gestión cuantitativa del riesgo.

21 Jul, 2023

También puede interesarte…