⬡ API · COM CÓDIGO · LEITURA 14 MIN

API MetaTrader 5 com Python: automatize a B3 e Forex.

A ponte que conecta a flexibilidade do Python ao terminal MT5. Puxe dados da B3, calcule sinais com suas bibliotecas favoritas e envie ordens — tudo via código. Com exemplos completos.

Por Equipe RoboTraderIA· atualizado mai/2026· nível intermediário a avançado

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.

Ver arquitetura →

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.