Usa la API de MetaTrader 5 en Linux y macOS
Por qué el paquete oficial MetaTrader5 de Python solo funciona en Windows junto a una terminal en marcha, los atajos con Wine, Docker y VPS que se usan en Linux y macOS, y cómo operar cuentas de MT5 por HTTP en su lugar, desde cualquier sistema operativo y cualquier lenguaje.
Si intentaste pip install MetaTrader5 en una Mac o en un servidor Linux, ya conoces el
problema del que trata esta página. El paquete oficial está hecho para Windows y se
comunica con una terminal de MetaTrader 5 que corre en la misma máquina. Esta guía explica
por qué, qué hace la gente al respecto y cómo saltarse el problema por completo operando
por HTTP.
Por qué el paquete oficial necesita Windows
La documentación de MetaQuotes describe el paquete como una forma de obtener datos "via interprocessor communication directly from the MetaTrader 5 terminal" (mediante comunicación entre procesos, directamente desde la terminal de MetaTrader 5). No es un cliente de red para el broker: es un puente hacia un proceso de terminal en la misma computadora.
De eso se desprenden dos hechos:
- Necesita una terminal de MetaTrader 5 en marcha.
initialize()"establishes a connection with the MetaTrader 5 terminal" (establece una conexión con la terminal) y recibe la ruta al.exede la terminal; si hace falta, la terminal se inicia cuando se llama ainitialize(). Cada llamada posterior —order_send,positions_get,history_deals_get— pasa por esa terminal. - Se publica solo para Windows. En PyPI, los archivos publicados del paquete son wheels de Windows
x86-64 (
win_amd64); no hay ninguno para Linux ni macOS, así quepipen esos sistemas no encuentra nada que pueda instalar.
Fuentes, revisadas el 30 de septiembre de 2026:
MetaTrader5 en PyPI,
Python integration, documentación de MQL5,
initialize(), documentación de MQL5.
Los atajos que usa la gente
Wine
MetaQuotes publica instrucciones para ejecutar la terminal de MetaTrader 5 en Linux con
Wine, con un script de instalación para Ubuntu, Debian, Linux Mint y Fedora, y una página
aparte para macOS
(MetaTrader 5 on Linux).
Eso ejecuta la terminal. Para usar el paquete de Python, además instalas una versión de
Python para Windows dentro del mismo prefijo de Wine, instalas MetaTrader5 ahí y
ejecutas tu script con ese intérprete.
Un puente entre el Python de Linux y el Python de Wine
Proyectos de código abierto como mt5linux
automatizan la segunda mitad: un servidor corre en el Python de Windows dentro de Wine,
junto a la terminal, y una biblioteca cliente en tu Python normal de Linux le reenvía cada
llamada por RPyC. Tu código importa un módulo que imita la API de MetaTrader5.
Imágenes de Docker
Las imágenes de la comunidad empaquetan Wine, la terminal, un Python de Windows, un puente como el anterior y, a menudo, un servidor VNC para que puedas ver la ventana de la terminal. Hacen que la configuración sea reproducible; no la hacen más pequeña.
Un VPS con Windows
La opción más simple que conserva el paquete oficial: renta una máquina con Windows, instala la terminal, ejecuta tu Python ahí y expón tú mismo lo que necesites al resto de tu sistema.
Lo que todas tienen en común
Cada enfoque ejecuta una terminal de trading de escritorio completa que ahora operas tú:
- Una terminal por cuenta a la vez. Una terminal tiene la sesión iniciada en una cuenta de trading; operar muchas cuentas a la vez significa ejecutar muchas terminales y llevar la cuenta de cuál es cuál.
- Una aplicación con interfaz gráfica en un servidor. Espera una pantalla (una virtual con Xvfb o VNC), se actualiza sola y puede detenerse en un diálogo que nadie ve.
- Mantenerla viva es tu trabajo: reinicios, inicios de sesión después de una desconexión del broker, disco y memoria por terminal, y darte cuenta cuando una se detuvo en silencio.
- Tu código queda atado a donde corre la terminal, que normalmente no es donde corre el resto de tu aplicación.
Para una cuenta personal en una máquina, eso muchas veces está bien. Para un producto que opera cuentas de otras personas, se convierte en un proyecto de operaciones.
Hacerlo por HTTP en su lugar
fxapis ejecuta las terminales de MetaTrader 5 por ti, en nuestra nube, y te da una API REST. Tu código —en macOS, Linux, Windows, un contenedor, una función serverless, en cualquier lenguaje— hace solicitudes HTTPS:
- Sin terminal, VPS, Wine ni Expert Advisor de tu lado.
- Muchas cuentas a la vez, cada una conectada con su login, contraseña y servidor.
- Una cuenta se pone en línea en unos diez segundos en nuestras pruebas cuando hace falta, y puede desconectarse sola cuando está inactiva.
- Las órdenes enviadas con un
Idempotency-Keyse pueden reintentar sin riesgo con la misma clave, y cada orden tiene un resultado registrado; uno que no está claro se confirma con el broker, no se adivina.
La misma operación, de las dos formas
Con el paquete oficial, en Windows, junto a una terminal:
import MetaTrader5 as mt5
mt5.initialize(login=26177561, password="…", server="VantageMarkets-Demo")
tick = mt5.symbol_info_tick("EURUSD")
result = mt5.order_send({
"action": mt5.TRADE_ACTION_DEAL,
"symbol": "EURUSD",
"volume": 0.01,
"type": mt5.ORDER_TYPE_BUY,
"price": tick.ask,
"deviation": 20,
})
print(result.retcode, result.price)
mt5.shutdown()Con fxapis, desde cualquier lugar:
import os, uuid, requests
API = "https://api.fxapis.com"
s = requests.Session()
s.headers["Authorization"] = f"Bearer {os.environ['FXAPIS_KEY']}"
account = s.post(f"{API}/v1/accounts", json={
"login": "26177561", "server": "VantageMarkets-Demo",
"password": os.environ["MT5_PASSWORD"], "mode": "warm_on_demand",
}).json()["data"] # once; keep account["id"]
order = s.post(f"{API}/v1/accounts/{account['id']}/orders/market",
headers={"Idempotency-Key": str(uuid.uuid4())},
json={"symbol": "EURUSD", "side": "buy", "volume": "0.01", "deviationPoints": 20},
timeout=90,
).json()["data"]
print(order["state"], order["filledPrice"], order["retcode"])La versión de fxapis no necesita precio: una orden de mercado se ejecuta al precio de
mercado, y una cuenta en modo warm_on_demand se pone en línea sola para la orden. La
cuenta se conecta una sola vez; guarda account["id"]. Para un programa completo con
reintentos correctos, consulta la guía de Python, o el mismo programa en
Node.js, PHP, C#, Go,
Java o Ruby.
Equivalencias de las llamadas del paquete
Paquete MetaTrader5 | fxapis |
|---|---|
initialize(), login() | POST /v1/accounts una vez, luego POST /v1/accounts/{id}/warm (o deja que una orden la ponga en línea) |
shutdown() | POST /v1/accounts/{id}/cool, o nada: las cuentas inactivas se desconectan solas |
order_send() con TRADE_ACTION_DEAL | POST /v1/accounts/{id}/orders/market |
order_send() con TRADE_ACTION_PENDING | POST /v1/accounts/{id}/orders/pending |
order_send() con TRADE_ACTION_SLTP | POST /v1/accounts/{id}/positions/{ticket}/modify |
order_send() con TRADE_ACTION_REMOVE | POST /v1/orders/{id}/cancel |
Cerrar con un TRADE_ACTION_DEAL opuesto | POST /v1/accounts/{id}/positions/{ticket}/close |
positions_get() | GET /v1/accounts/{id}/positions |
history_deals_get() | GET /v1/accounts/{id}/deals |
history_orders_get() | GET /v1/orders?accountId=… |
order_calc_margin(), order_calc_profit() | POST /v1/accounts/{id}/calculate |
symbol_info_tick(), copy_rates_*(), copy_ticks_*() | Sin equivalente; consulta abajo |
Algunas diferencias que conviene esperar:
- Los volúmenes y los precios son strings (
"0.01"), no floats, así que ningún tamaño se redondea nunca por un double. - Los stops son precios absolutos, como en MT5.
- Los códigos de retorno se conservan. Cada orden lleva el
retcodepropio del broker; los errores llevan uncodeestable comoORDER_REJECTEDoSEND_FAILED. Consulta Errores. - Las posiciones son una instantánea con marca de tiempo (
observedAt), actualizada cada 15 segundos aproximadamente mientras la cuenta está en línea.
Lo que fxapis no reemplaza
fxapis es para operar cuentas y consultar su historial. No transmite precios en streaming ni sirve barras y ticks, así que si tu estrategia calcula señales a partir de datos de mercado de MT5, necesitas una fuente de datos para esa parte. Solo es compatible con MetaTrader 5, no con MetaTrader 4. Para los eventos, usa webhooks en lugar de consultar repetidamente.
Siguientes pasos
- Inicio rápido: de una API key a una orden demo ejecutada en unos cinco minutos.
- Envía órdenes de MT5 desde Python: un programa completo y correcto.
- Conecta cuentas de MT5: nombres de servidor, contraseñas y estados.
Place MetaTrader 5 orders from Ruby — no MetaTrader installed
A complete Ruby program using Net::HTTP that connects an MT5 account, places a market order with an idempotency key, retries safely, never resends an unresolved order, reads positions and closes the trade — from Rails, Sidekiq or a plain script, with no terminal.
Conecta cuentas de MT5 con login, contraseña y servidor
Cómo conectar una cuenta de MetaTrader 5 a la API de fxapis: encontrar el nombre exacto del servidor, contraseña de trading frente a contraseña de inversor, inicio de sesión en dos pasos, manejo seguro de credenciales en tu app, comprobarlas de inmediato, estados que requieren atención y desconexión.