Cursos Para Traders Estratégias Trader WebRequest() na prática: Guia técnico completo

WebRequest() na prática: Guia técnico completo

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 imports nas propriedades do EA para que WebRequest() 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:

EtapaAção
1Definir string url = "https://api.exemplo.com/data?symbol=EURUSD";
2Configurar char &result[]; para receber a resposta.
3Chamar int res = WebRequest("GET",url, "", "", 0, result, timeout);
4Verificar 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:

  1. FetchData() – executa WebRequest(), valida o código HTTP e devolve o JSON bruto.
  2. ParseData(string json) – converte para estrutura MQL5 (struct ou class) e calcula indicadores auxiliares.
  3. 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)

ItemStatusÚltima atualização
Conexão APIOK00:02:15
Parse JSONOK00:02:16
Sinal geradoBUY EURUSD00:02:18
Ordem enviadaPendente00: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

LimiteImpacto
Domain whitelistQualquer chamada a domínios não autorizados é bloqueada pelo terminal, gerando erro 403.
Timeout padrão30 s; chamadas a APIs lentas exigem ajuste manual ou tratamento de exceção.
Volume de dadosRespostas acima de 1 MB podem ser truncadas ou causar overflow de buffers.
Segurança SSLCertificados 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.

Acesse o material completo

Deixe uma resposta

Related Post