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.
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.
08Preguntas frecuentes
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.