O MQL5 (linguagem nativa do MetaTrader) é poderoso, mas o Python tem um ecossistema imbatível: pandas, numpy, scikit-learn, bibliotecas de indicadores prontas. A biblioteca oficial MetaTrader5 resolve o melhor dos dois mundos — você usa o Python pra pensar e o MT5 pra executar. E o mais importante pra você: é a forma mais acessível de automatizar a B3 (mini índice e mini dólar) com Python.
Como funciona a ponte: a biblioteca MetaTrader5 não é uma API web independente. Ela conecta o seu script Python a um terminal MT5 instalado e aberto no Windows. O Python manda comandos, o MT5 executa na corretora. Pense no MT5 como o "motor" e o Python como o "cérebro".
01Instalação e pré-requisitos
Você precisa de: Windows, o terminal MT5 da sua corretora instalado e logado, e Python 3.11+. Então:
pip install MetaTrader5 pandas
Sobre o sistema operacional: a biblioteca é oficialmente Windows, porque depende do terminal MT5. Dá pra rodar via Wine no Linux ou (o mais comum pra robô 24/5) numa VPS Windows. No Mac, via máquina virtual. Pra automação séria, VPS Windows é o caminho.
02Conectar ao terminal
Com o MT5 aberto e logado na sua conta (use conta demo!), inicialize a conexão:
# conectar.py import MetaTrader5 as mt5 # inicializa a conexão com o terminal MT5 aberto if not mt5.initialize(): print("Falha ao conectar:", mt5.last_error()) quit() # informações da conta (confirme que é DEMO) conta = mt5.account_info() print(f"Conta: {conta.login} | Saldo: {conta.balance} | Servidor: {conta.server}") # sempre encerre a conexão ao terminar # mt5.shutdown()
Se você precisa logar via código (em vez de manualmente no terminal), passe credenciais ao initialize:
mt5.initialize(login=12345678, password="sua_senha", server="NomeDoServidor-Demo")
03Puxar candles (incluindo da B3)
Aqui está o que conecta com seus indicadores. Puxe candles de qualquer ativo que sua corretora oferece — incluindo WIN e WDO se ela der acesso à B3:
# dados.py import MetaTrader5 as mt5 import pandas as pd from datetime import datetime mt5.initialize() # símbolo: ex "WIN$N" (mini índice), "WDO$N" (mini dólar) ou "EURUSD" # o nome exato do símbolo varia por corretora — confira no Market Watch simbolo = "WIN$N" timeframe = mt5.TIMEFRAME_M5 # M1, M5, M15, H1, etc. # pega os últimos 500 candles 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())
Dica sobre símbolos da B3: o nome exato (ex: WIN$N, WINFUT, WDO$N) varia entre corretoras. Abra o Market Watch no MT5, clique direito → "Mostrar tudo", e copie o nome exato que aparece. Use mt5.symbol_select(simbolo, True) pra garantir que está habilitado.
04Calcular sinal com seus indicadores
Aqui o Python brilha — use as funções de indicador que você já aprendeu nos nossos guias. O DataFrame que veio do MT5 entra direto:
# reuse as funções dos guias de indicadores from indicadores import calcular_rsi, calcular_macd # seus módulos df["rsi"] = calcular_rsi(df["close"]) macd, sinal, hist = calcular_macd(df["close"]) # exemplo de sinal combinado u = df.iloc[-1] sinal_compra = (u["rsi"] < 70) and (macd.iloc[-1] > sinal.iloc[-1])
Integração com tudo que você já viu: as funções de RSI, MACD, ATR dos nossos guias funcionam direto sobre esse DataFrame. É essa a beleza de usar Python: todo o ecossistema fica disponível pra B3.
05Enviar ordem
O envio de ordem no MT5 é mais verboso que na Binance, porque você monta um "request" detalhado. Exemplo de compra a mercado com stop e alvo:
# 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 do seu robô "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
Detalhe que trava iniciante: o type_filling (modo de execução) precisa ser compatível com o que o ativo aceita — FOK, IOC ou RETURN. Se a ordem falhar com erro de "filling", teste os outros modos. O magic number identifica as ordens do seu robô (útil pra gerenciar só as suas).
Já entende a estrutura de um bot?
Veja o guia completo de arquitetura de robô — a mesma lógica do nosso tutorial da Binance se aplica ao MT5.
06Gerenciar posições
Pra um robô completo, você precisa consultar e fechar posições:
# consultar posições abertas do seu robô (pelo 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}") # fechar uma posição 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)
07O loop do robô
Juntando tudo, o esqueleto do robô MT5:
import time mt5.initialize() try: while True: df = puxar_candles("WIN$N", mt5.TIMEFRAME_M5) sinal = calcular_sinal(df) # sua estratégia atr = calcular_atr(df).iloc[-1] # stop dinâmico if sinal == "COMPRA" and not tem_posicao(): lote = dimensionar(atr) # gestão de risco comprar("WIN$N", lote, stop_pts=2*atr, alvo_pts=4*atr) time.sleep(60) # checa a cada minuto except Exception as e: print("Erro:", e) finally: mt5.shutdown()
Antes do dinheiro real: rode em conta demo por semanas. Confirme que os símbolos, o type_filling e o cálculo de lote estão certos pro seu ativo. Um erro de volume ou de ponto pode mandar uma ordem do tamanho errado. Teste, teste, teste — e só então conta real, com lote mínimo.
08Perguntas frequentes
Dá pra automatizar a B3 com Python?
Sim. A biblioteca oficial MetaTrader5 conecta ao terminal MT5, e se sua corretora oferece MT5 com acesso à B3 (WIN, WDO), você puxa dados e envia ordens via Python. É a forma mais acessível de automatizar o mercado brasileiro com Python.
Preciso do MT5 instalado?
Sim. A biblioteca não é uma API web — ela é uma ponte com o terminal MT5 instalado e aberto no Windows. O Python manda comandos, o MT5 executa na corretora.
Funciona no Linux ou Mac?
Oficialmente é Windows. Dá pra rodar via Wine no Linux ou em VPS Windows (o mais comum pra robô 24/5). No Mac, via máquina virtual. Pra operação séria, VPS Windows.
Qual a diferença pra usar MQL5 direto?
MQL5 roda dentro do MT5 e é mais integrado pra execução pura. Python via API ganha no ecossistema (pandas, ML, bibliotecas). Muitos usam Python pra pesquisa/sinais e MQL5 pra execução crítica. Pra começar, Python é mais acessível.
O nome do símbolo WIN não funciona, por quê?
O nome exato varia por corretora (WIN$N, WINFUT, WIN$, etc.). Abra o Market Watch no MT5, mostre todos os símbolos e copie o nome exato. Use mt5.symbol_select(nome, True) pra habilitar.