Se você já tentou puxar dados externos direto do MetaTrader, provavelmente percebeu que a primeira barreira não é o código, e sim a própria comunicação com a web. A função WebRequest() promete abrir essa porta, mas na prática ela costuma esbarrar em permissões, limites de tamanho de payload e no temido “erro 403”. O objetivo aqui é mostrar, passo a passo, como contornar esses obstáculos e deixar seu EA ou script conversando com APIs REST como se fosse um navegador.
Pré‑requisitos essenciais
- MetaTrader 4/5 com permissão de Allow DLL imports ativada.
- Endereço da API registrado nas opções Tools → Options → Expert Advisors → Allow WebRequest for listed URL.
- Conhecimento básico de JSON (ou XML) para interpretar a resposta.
Configuração rápida no MetaTrader
Abra o terminal, vá em Options e adicione o domínio da API à lista “Allowed URLs”. Sem isso, qualquer chamada será abortada com ERR_WEBREQUEST_DENIED. Lembre‑se de salvar e reiniciar o terminal para que a mudança tenha efeito.
Requisição GET simples
Um GET costuma ser o ponto de partida. Veja o esqueleto:
char result[]; int timeout=5000; int res=WebRequest("GET","https://api.exemplo.com/price?symbol=EURUSD", "", "", 0, timeout, result); if(res==-1) Print("Falha: ",GetLastError()); else Print("Resposta: ",result); Note que o parâmetro headers está vazio – para APIs que exigem token, basta concatenar "Authorization: Bearer XYZ" na string.
Requisição POST com JSON
POST é onde a maioria dos desenvolvedores tropeça: o tamanho do postdata não pode ultrapassar 8192 bytes, e o cabeçalho Content-Type: application/json deve ser incluído manualmente.
string json = "{\"order\":123,\"price\":1.2345}"; char result[]; int timeout=5000; string headers = "Content-Type: application/json\r\n"; int res = WebRequest("POST","https://api.exemplo.com/trade", headers, json, StringLen(json), timeout, result); Se o servidor responder com um código 200, o result conterá o JSON de retorno, pronto para ser analisado.
Tratamento de JSON no MQL
MQL4 não tem parser nativo, então a solução prática é usar a biblioteca Json.mqh da comunidade. Exemplo rápido:
#include CJsonParser parser; parser.Parse(result); double price = parser.GetDouble("price"); Onde a WebRequest falha
- Limite de taxa: servidores podem bloquear chamadas frequentes; implemente sleep ou controle de taxa.
- Timeout curto: 5 s costuma ser insuficiente para APIs lentas; ajuste para 15000 ms se necessário.
- HTTPS com certificado auto‑assinado: MetaTrader rejeita; use um proxy HTTP ou solicite certificado válido.
Exemplo completo de integração
Um script que consulta o preço atual e, se acima de um limite, envia uma ordem:
void OnStart() { string url = "https://api.exemplo.com/ticker?pair=EURUSD"; char resp[]; if(WebRequest("GET",url,"", "",0,5000,resp)!=-1) { CJsonParser p; p.Parse(resp); double price = p.GetDouble("last"); if(price>1.2500) OrderSend(Symbol(),OP_BUY,0.1,Ask,2,0,0,"AutoBuy",0,0,clrGreen); } } Esse padrão – request, parse, decisão – pode ser replicado para quase qualquer serviço: notícias, indicadores externos, ou mesmo gerenciamento de risco em nuvem.
Próximo passo
Teste cada chamada em um ambiente de demonstração. Monitore GetLastError() e registre respostas para detectar mudanças de API antes que quebrem seu EA. A única forma de garantir estabilidade é tratar a WebRequest como um ponto frágil e envolver lógica de retry e fallback.
1. Primeiro passo: preparar o ambiente
Instale o MetaTrader 5 (ou 4) e abra o MetaEditor. Crie um novo script ou expert advisor e inclua a diretiva #property strict. Essa base garante que o compilador aplique as regras mais recentes de segurança.
- Versão mínima: MQL5 v600 ou superior.
- Permissões: Ative
Allow DLL importsnas propriedades do EA para queWebRequest()possa ser chamado. - Lista de URLs confiáveis: No menu Tools → Options → Expert Advisors, adicione o domínio que será acessado (ex.:
https://api.exemplo.com).
2. Configuração da chamada GET
O padrão de uma requisição GET é simples: montar a URL completa, definir cabeçalhos opcionais e chamar WebRequest(). Veja o fluxo em forma de checklist:
| Etapa | Ação |
|---|---|
| 1 | Definir string url = "https://api.exemplo.com/data?symbol=EURUSD"; |
| 2 | Configurar char &result[]; para receber a resposta. |
| 3 | Chamar int res = WebRequest("GET",url, "", "", 0, result, timeout); |
| 4 | Verificar res == 200 antes de prosseguir. |
Se a resposta for JSON, prossiga para o tratamento descrito no próximo bloco.
3. Tratamento de JSON e extração de dados
MetaTrader não possui parser nativo avançado, mas JsonParse() da biblioteca padrão resolve a maioria dos casos. O fluxo abaixo demonstra a extração do preço de fechamento:
string json = CharArrayToString(result); int handle = JsonParse(json); double close = JsonGetDouble(handle, "close"); JsonFree(handle);
Para evitar exceções, sempre teste handle != 0 antes de ler os campos.
4. Implementando uma requisição POST
POST exige corpo da mensagem. Use uchar &postData[] para enviar JSON ou form‑urlencoded.
- Montagem do payload:
string payload = "{\"order\":123,\"qty\":10}"; - Conversão:
uchar postData[]; StringToCharArray(payload, postData); - Chamada:
int res = WebRequest("POST",url,"Content-Type: application/json\r\n", "", 0, postData, result, timeout);
Após a resposta, siga o mesmo procedimento de parsing do bloco 3.
5. Workflow recomendado – da chamada ao trade
Organize a lógica em três funções distintas para melhorar a manutenção:
- FetchData() – executa
WebRequest(), valida o código HTTP e devolve o JSON bruto. - ParseData(string json) – converte para estrutura MQL5 (struct ou class) e calcula indicadores auxiliares.
- ExecuteTrade(MySignal s) – abre, modifica ou fecha posições com
OrderSend()baseado no sinal.
Essa separação permite unit testing manual e facilita a inclusão de novos endpoints sem refatorar o core de trading.
6. Mini‑dashboard de monitoramento (texto)
| Item | Status | Última atualização |
|---|---|---|
| Conexão API | OK | 00:02:15 |
| Parse JSON | OK | 00:02:16 |
| Sinal gerado | BUY EURUSD | 00:02:18 |
| Ordem enviada | Pendente | 00:02:20 |
7. Erros comuns e como evitá‑los
- 403 – Forbidden: domínio não está na lista de URLs confiáveis. Atualize nas opções do MT.
- Timeout: aumente o parâmetro
timeout(ex.: 5000 ms) ou verifique a latência da rede. - JSON inválido: use
StringTrim()para remover caracteres de controle antes do parsing.
Com esses blocos operacionais, a integração de WebRequest() ao seu EA passa de teoria para prática, permitindo automatizar estratégias que dependem de dados externos em tempo real.
Perfil ideal e limites de uso do “Como utilizar WebRequest()”
Se você desenvolve robôs no MetaTrader e precisa consumir APIs externas, este material pode ser a ponte que faltava; se a sua necessidade se restringe a indicadores simples ou a executar ordens locais, ele será peso morto.
Quem deve mergulhar nesse guia
- Programadores MQL5 que já dominam eventos OnTick e timers.
- Trader‑developers que precisam integrar dados de notícias, cotações de corretoras ou serviços de risco em tempo real.
- Equipes de back‑testing que exigem simular chamadas GET/POST para validar estratégias sob condições reais.
Quem provavelmente não vai tirar proveito
- Usuários que operam apenas com Expert Advisors pré‑configurados e não pretendem tocar em código.
- Quem usa MetaTrader 4, já que WebRequest() não está disponível nessa versão.
- Desenvolvedores que dependem exclusivamente de protocolos não‑HTTP (FTP, SOAP, etc.).
Limitações práticas
| Limite | Impacto |
|---|---|
| Domain whitelist | Qualquer chamada a domínios não autorizados é bloqueada pelo terminal, gerando erro 403. |
| Timeout padrão | 30 s; chamadas a APIs lentas exigem ajuste manual ou tratamento de exceção. |
| Volume de dados | Respostas acima de 1 MB podem ser truncadas ou causar overflow de buffers. |
| Segurança SSL | Certificados auto‑assinados não são aceitos sem intervenção do usuário. |
FAQ contextual rápido
- Posso usar WebRequest() em um EA que roda 24 h? Sim, mas lembre‑se de limpar objetos JSON após cada chamada para evitar vazamento de memória.
- Como driblar a whitelist? Não há “gambiarra” legal; a única saída é solicitar ao cliente que adicione o domínio nas configurações.
- É possível fazer chamadas assíncronas? Não nativamente; será preciso usar threads via DLL ou dividir a operação em ticks sucessivos.
Checklist de compatibilidade
- MetaTrader 5, build ≥ 1310.
- Domínio da API incluído em Tools → Options → Expert Advisors → Allow WebRequest for listed URL.
- Biblioteca JSON (por exemplo, “cJSON”) integrada ao projeto.
- Conexão estável e latência < 200 ms para evitar timeouts críticos.
Mini cenário real
Um trader quer incorporar a taxa de câmbio oficial do Banco Central (API pública) dentro do seu algoritmo de arbitragem. Ele habilita o domínio “api.bcb.gov.br”, cria uma requisição GET via WebRequest(), parseia o JSON e ajusta o parâmetro “Spread”. O EA roda sem falhas, mas, ao mudar para outro provedor que usa HTTPS com certificado auto‑assinado, a chamada quebra – sinal de que a limitação de SSL está no caminho.
Observações práticas e próximos passos
Antes de apostar tudo, teste a chamada dentro do Strategy Tester em modo “Every tick”. Verifique logs de GetLastError() para identificar bloqueios de whitelist ou timeout. Se precisar de chamadas simultâneas, planeje um módulo externo em C++ ou use um serviço de fila (RabbitMQ, por exemplo) para mediar as requisições.
Em resumo, o guia “Como utilizar WebRequest()” entrega valor real para desenvolvedores que já transitaram do básico ao avançado no MQL5 e precisam de integração API/JSON. Não é solução mágica para quem só quer indicadores; seu maior ponto fraco é a dependência de configuração manual de domínios e a falta de suporte nativo a async.


