⬡ API · COM CÓDIGO · READ 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.

By RoboTraderIA Team· updated may/2026· nível intermediário a avançado

O MQL5 (linguagem nativa do MetaTrader) é poderoso, but o Python tem um ecossistema imbatível: pandas, numpy, scikit-learn, bibliotecas de indicatores prontas. A biblioteca oficial MetaTrader5 resolve o melhor dos dois mundos — você usa o Python for pensar e o MT5 for executar. E o mais importante for você: é a forma mais acessível de automatizar a B3 (mini index e mini dollar) com Python.

How it works a ponte: a biblioteca MetaTrader5 isn't 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 broker. 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 broker instalado e logado, e Python 3.11+. Então:

pip install MetaTrader5 pandas

About o sistema operacional: a biblioteca é oficialmente Windows, because depende do terminal MT5. Dá for rodar via Wine no Linux ou (o mais comum for bot 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 demo account!), 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}")

# always encerre a conexão ao terminar
# mt5.shutdown()

If you 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 indicatores. Puxe candles de any ativo que sua broker 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 index), "WDO$N" (mini dollar) ou "EURUSD"
# o nome exato do símbolo varia por broker — 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 about símbolos da B3: o nome exato (ex: WIN$N, WINFUT, WDO$N) varia between brokers. Open the Market Watch no MT5, clique direito → "Mostrar tudo", e copie o nome exato que aparece. Use mt5.symbol_select(simbolo, True) to ensure that está habilitado.

04Calcular sinal com seus indicatores

Aqui o Python brilha — use as funções de indicator that you already aprendeu nos nossos guias. O DataFrame que veio do MT5 entra direto:

# reuse as funções dos guias de indicatores
from indicatores 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 that you already viu: as funções de RSI, MACD, ATR dos nossos guias funcionam direto about esse DataFrame. É essa a beleza de usar Python: todo o ecossistema fica disponível for B3.

05Enviar ordem

O envio de ordem no MT5 é mais verboso que na Binance, porthat you 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 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

Detalhe que trava iniciante: o type_filling (modo de execution) 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 bot (útil for gerenciar só as suas).

Já entende a estrutura de um bot?

Veja o complete guide de arquitetura de bot — a mesma lógica do nosso tutorial da Binance se aplica ao MT5.

Ver arquitetura →

06Gerenciar posições

Pra um bot completo, você precisa consultar e fechar posições:

# consultar posições abertas do seu bot (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 bot

Juntando tudo, o esqueleto do bot MT5:

import time

mt5.initialize()
try:
    while True:
        df = puxar_candles("WIN$N", mt5.TIMEFRAME_M5)
        sinal = calcular_sinal(df)              # sua strategy
        atr = calcular_atr(df).iloc[-1]        # stop dinâmico

        if sinal == "COMPRA" and not tem_posicao():
            lote = dimensionar(atr)             # risk management
            comprar("WIN$N", lote, stop_pts=2*atr, alvo_pts=4*atr)

        time.sleep(60)                       # checa a each minuto
except Exception as e:
    print("Erro:", e)
finally:
    mt5.shutdown()

Antes do dinheiro real: rode em demo account por semanas. Confirme que os símbolos, o type_filling e o cálculo de lote estão certos for the seu ativo. Um erro de volume ou de ponto can mandar uma ordem do tamanho errado. Teste, teste, teste — e só then live account, com lote mínimo.

08Pertanyaan yang sering diajukan

Dá to automate a B3 com Python?

Sim. A biblioteca oficial MetaTrader5 conecta ao terminal MT5, e se sua broker 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 isn't uma API web — ela is a ponte com o terminal MT5 instalado e aberto no Windows. O Python manda comandos, o MT5 executa na broker.

Funciona no Linux ou Mac?

Oficialmente é Windows. Dá for rodar via Wine no Linux ou em VPS Windows (o mais comum for bot 24/5). No Mac, via máquina virtual. Pra operação séria, VPS Windows.

What is the difference for usar MQL5 direto?

MQL5 roda inside do MT5 e é mais integrado for execution pura. Python via API ganha no ecossistema (pandas, ML, bibliotecas). Muitos usam Python for pesquisa/sinais e MQL5 for execution 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 broker (WIN$N, WINFUT, WIN$, etc.). Open the Market Watch no MT5, mostre todos os símbolos e copie o nome exato. Use mt5.symbol_select(nome, True) for habilitar.