# Usa la API de MetaTrader 5 en Linux y macOS

URL: https://docs.fxapis.com/es/guides/linux-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…



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 [#why-the-official-package-needs-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 `.exe` de la
  terminal; si hace falta, la terminal se inicia cuando se llama a `initialize()`. 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í que `pip` en esos sistemas no encuentra
  nada que pueda instalar.

Fuentes, revisadas el 30 de septiembre de 2026:
[MetaTrader5 en PyPI](https://pypi.org/project/MetaTrader5/),
[Python integration, documentación de MQL5](https://www.mql5.com/en/docs/python_metatrader5),
[`initialize()`, documentación de MQL5](https://www.mql5.com/en/docs/python_metatrader5/mt5initialize_py).

## Los atajos que usa la gente [#the-workarounds-people-use]

### Wine [#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](https://www.metatrader5.com/en/terminal/help/start_advanced/install_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 [#a-bridge-between-linux-python-and-wine-python]

Proyectos de código abierto como [mt5linux](https://pypi.org/project/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 [#docker-images]

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 [#a-windows-vps]

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 [#what-all-of-them-have-in-common]

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 [#doing-it-over-http-instead]

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-Key` se 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 [#the-same-trade-both-ways]

Con el paquete oficial, en Windows, junto a una terminal:

```python
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:

```python
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](/guides/python), o el mismo programa en
[Node.js](/guides/nodejs), [PHP](/guides/php), [C#](/guides/csharp), [Go](/guides/go),
[Java](/guides/java) o [Ruby](/guides/ruby).

### Equivalencias de las llamadas del paquete [#mapping-the-packages-calls]

| Paquete `MetaTrader5`                                    | fxapis                                                                                                                                                                                                          |
| -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `initialize()`, `login()`                                | [`POST /v1/accounts`](/api-reference/accounts/connect-an-mt5-account) una vez, luego [`POST /v1/accounts/{id}/warm`](/api-reference/lifecycle/bring-an-account-online) (o deja que una orden la ponga en línea) |
| `shutdown()`                                             | [`POST /v1/accounts/{id}/cool`](/api-reference/lifecycle/take-an-account-offline), o nada: las cuentas inactivas se desconectan solas                                                                           |
| `order_send()` con `TRADE_ACTION_DEAL`                   | [`POST /v1/accounts/{id}/orders/market`](/api-reference/trading/place-a-market-order)                                                                                                                           |
| `order_send()` con `TRADE_ACTION_PENDING`                | [`POST /v1/accounts/{id}/orders/pending`](/api-reference/trading/place-a-limit-stop-or-stop-limit-order)                                                                                                        |
| `order_send()` con `TRADE_ACTION_SLTP`                   | [`POST /v1/accounts/{id}/positions/{ticket}/modify`](/api-reference/trading/move-a-positions-stop-loss-or-take-profit)                                                                                          |
| `order_send()` con `TRADE_ACTION_REMOVE`                 | [`POST /v1/orders/{id}/cancel`](/api-reference/trading/cancel-a-pending-order)                                                                                                                                  |
| Cerrar con un `TRADE_ACTION_DEAL` opuesto                | [`POST /v1/accounts/{id}/positions/{ticket}/close`](/api-reference/trading/close-a-position)                                                                                                                    |
| `positions_get()`                                        | [`GET /v1/accounts/{id}/positions`](/api-reference/trading/positions-on-an-account)                                                                                                                             |
| `history_deals_get()`                                    | [`GET /v1/accounts/{id}/deals`](/api-reference/history/an-accounts-full-deal-history)                                                                                                                           |
| `history_orders_get()`                                   | [`GET /v1/orders?accountId=…`](/api-reference/history/list-orders)                                                                                                                                              |
| `order_calc_margin()`, `order_calc_profit()`             | [`POST /v1/accounts/{id}/calculate`](/api-reference/trading/margin-required-or-profit-at-a-price)                                                                                                               |
| `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 `retcode` propio del broker; los errores
  llevan un `code` estable como `ORDER_REJECTED` o `SEND_FAILED`. Consulta [Errores](/es/errors).
* **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 [#what-fxapis-does-not-replace]

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](/guides/webhooks) en
lugar de consultar repetidamente.

## Siguientes pasos [#next-steps]

* [Inicio rápido](/es/quickstart): de una API key a una orden demo ejecutada en unos cinco minutos.
* [Envía órdenes de MT5 desde Python](/guides/python): un programa completo y correcto.
* [Conecta cuentas de MT5](/es/guides/connect-accounts): nombres de servidor, contraseñas y estados.
