MQL5 (el lenguaje nativo de MetaTrader) es potente, pero Python tiene un ecosistema imbatible: pandas, numpy, scikit-learn, librerías de indicadores listas para usar. La librería oficial MetaTrader5 resuelve lo mejor de los dos mundos — usas Python para pensar y MT5 para ejecutar. Y lo más importante para ti: es la forma más accesible de automatizar la B3 (mini índice y mini dólar) con Python.
Cómo funciona el puente: la librería MetaTrader5 no es una API web independiente. Conecta tu script de Python a un terminal MT5 instalado y abierto en Windows. Python manda comandos, MT5 ejecuta en el bróker. Piensa en MT5 como el "motor" y en Python como el "cerebro".
01Instalación y requisitos previos
Necesitas: Windows, el terminal MT5 de tu bróker instalado y con sesión iniciada, y Python 3.11+. Entonces:
pip install MetaTrader5 pandas
Sobre el sistema operativo: la librería es oficialmente para Windows, porque depende del terminal MT5. Se puede ejecutar con Wine en Linux o (lo más común para un bot 24/5) en un VPS Windows. En Mac, con máquina virtual. Para automatización seria, el VPS Windows es el camino.
02Conectar al terminal
Con MT5 abierto y con sesión iniciada en tu cuenta (¡usa cuenta demo!), inicializa la conexión:
# conectar.py import MetaTrader5 as mt5 # inicializa la conexión con el terminal MT5 abierto if not mt5.initialize(): print("Falha ao conectar:", mt5.last_error()) quit() # información de la cuenta (confirme que es DEMO) conta = mt5.account_info() print(f"Conta: {conta.login} | Saldo: {conta.balance} | Servidor: {conta.server}") # siempre cierre la conexión al terminar # mt5.shutdown()
Si necesitas iniciar sesión por código (en vez de manualmente en el terminal), pasa las credenciales a initialize:
mt5.initialize(login=12345678, password="sua_senha", server="NomeDoServidor-Demo")
03Extraer velas (incluidas las de la B3)
Aquí está lo que conecta con tus indicadores. Extrae velas de cualquier activo que ofrezca tu bróker — incluidos WIN y WDO si te da acceso a la B3 brasileña:
# dados.py import MetaTrader5 as mt5 import pandas as pd from datetime import datetime mt5.initialize() # símbolo: ej. "WIN$N" (mini índice), "WDO$N" (mini dólar) o "EURUSD" # el nombre exacto del símbolo varía según el bróker — revise en Market Watch simbolo = "WIN$N" timeframe = mt5.TIMEFRAME_M5 # M1, M5, M15, H1, etc. # toma las últimas 500 velas rates = mt5.copy_rates_from_pos(simbolo, timeframe, 0, 500) df = pd.DataFrame(rates) df["time"] = pd.to_datetime(df["time"], unit="s") print(df[["time","open","high","low","close","tick_volume"]].tail())
Consejo sobre los símbolos de la B3: el nombre exacto (ej.: WIN$N, WINFUT, WDO$N) varía entre brókeres. Abre el Market Watch en MT5, clic derecho → "Mostrar todo", y copia el nombre exacto que aparezca. Usa mt5.symbol_select(simbolo, True) para asegurarte de que está habilitado.
04Calcular la señal con tus indicadores
Aquí Python brilla — usa las funciones de indicador que ya aprendiste en nuestras guías. El DataFrame que vino de MT5 entra directo:
# reutilice las funciones de las guías de indicadores from indicadores import calcular_rsi, calcular_macd # sus módulos df["rsi"] = calcular_rsi(df["close"]) macd, sinal, hist = calcular_macd(df["close"]) # ejemplo de señal combinada u = df.iloc[-1] sinal_compra = (u["rsi"] < 70) and (macd.iloc[-1] > sinal.iloc[-1])
Integración con todo lo que ya viste: las funciones de RSI, MACD, ATR de nuestras guías funcionan directo sobre ese DataFrame. Esa es la belleza de usar Python: todo el ecosistema queda disponible para la B3.
05Enviar orden
El envío de órdenes en MT5 es más verboso que en Binance, porque montas un "request" detallado. Ejemplo de compra a mercado con stop y objetivo:
# executar.py def comprar(simbolo, lote, stop_pts, alvo_pts): info = mt5.symbol_info_tick(simbolo) preco = info.ask point = mt5.symbol_info(simbolo).point request = { "action": mt5.TRADE_ACTION_DEAL, "symbol": simbolo, "volume": lote, "type": mt5.ORDER_TYPE_BUY, "price": preco, "sl": preco - stop_pts * point, # stop loss "tp": preco + alvo_pts * point, # take profit "deviation": 20, # slippage tolerado "magic": 123456, # id de su bot "type_filling": mt5.ORDER_FILLING_FOK, } resultado = mt5.order_send(request) if resultado.retcode != mt5.TRADE_RETCODE_DONE: print("Erro na ordem:", resultado.retcode, resultado.comment) return resultado
El detalle que traba al principiante: el type_filling (modo de ejecución) tiene que ser compatible con lo que acepta el activo — FOK, IOC o RETURN. Si la orden falla con error de "filling", prueba los otros modos. El magic number identifica las órdenes de tu bot (útil para gestionar solo las tuyas).
¿Ya entiendes la estructura de un bot?
Mira la guía completa de arquitectura de bots — la misma lógica de nuestro tutorial de Binance se aplica a MT5.
06Gestionar posiciones
Para un bot completo, necesitas consultar y cerrar posiciones:
# consultar posiciones abiertas de su bot (por el magic) posicoes = mt5.positions_get(symbol="WIN$N") for p in posicoes: if p.magic == 123456: print(f"Posição {p.ticket}: lucro {p.profit}") # cerrar una posición def fechar(posicao): tick = mt5.symbol_info_tick(posicao.symbol) request = { "action": mt5.TRADE_ACTION_DEAL, "symbol": posicao.symbol, "volume": posicao.volume, "type": mt5.ORDER_TYPE_SELL if posicao.type == 0 else mt5.ORDER_TYPE_BUY, "position": posicao.ticket, "price": tick.bid if posicao.type == 0 else tick.ask, "deviation": 20, "type_filling": mt5.ORDER_FILLING_FOK, } return mt5.order_send(request)
07El bucle del bot
Juntando todo, el esqueleto del bot MT5:
import time mt5.initialize() try: while True: df = puxar_candles("WIN$N", mt5.TIMEFRAME_M5) sinal = calcular_sinal(df) # su estrategia atr = calcular_atr(df).iloc[-1] # stop dinámico if sinal == "COMPRA" and not tem_posicao(): lote = dimensionar(atr) # gestión de riesgo comprar("WIN$N", lote, stop_pts=2*atr, alvo_pts=4*atr) time.sleep(60) # revisa cada minuto except Exception as e: print("Erro:", e) finally: mt5.shutdown()
Antes del dinero real: ejecuta en cuenta demo durante semanas. Confirma que los símbolos, el type_filling y el cálculo de lote son correctos para tu activo. Un error de volumen o de punto puede enviar una orden del tamaño equivocado. Prueba, prueba, prueba — y solo entonces cuenta real, con lote mínimo.
08Preguntas frecuentes
¿Se puede automatizar la B3 con Python?
Sí. La librería oficial MetaTrader5 conecta con el terminal MT5, y si tu bróker ofrece MT5 con acceso a la B3 brasileña (WIN, WDO), extraes datos y envías órdenes desde Python. Es la forma más accesible de automatizar el mercado brasileño con Python.
¿Necesito tener MT5 instalado?
Sí. La librería no es una API web — es un puente con el terminal MT5 instalado y abierto en Windows. Python manda comandos, MT5 ejecuta en el bróker.
¿Funciona en Linux o Mac?
Oficialmente es Windows. Se puede ejecutar con Wine en Linux o en un VPS Windows (lo más común para un bot 24/5). En Mac, con máquina virtual. Para operación seria, VPS Windows.
¿Qué diferencia hay con usar MQL5 directamente?
MQL5 corre dentro de MT5 y está más integrado para la ejecución pura. Python vía API gana en ecosistema (pandas, ML, librerías). Muchos usan Python para investigación/señales y MQL5 para la ejecución crítica. Para empezar, Python es más accesible.
El nombre del símbolo WIN no funciona, ¿por qué?
El nombre exacto varía según el bróker (WIN$N, WINFUT, WIN$, etc.). Abre el Market Watch en MT5, muestra todos los símbolos y copia el nombre exacto. Usa mt5.symbol_select(nombre, True) para habilitarlo.