English Русский 中文 Español Deutsch 日本語
preview
Do iniciante ao especialista: Criação de um EA de notícias animado em MQL5 (II)

Do iniciante ao especialista: Criação de um EA de notícias animado em MQL5 (II)

MetaTrader 5Exemplos |
22 0
Clemence Benjamin
Clemence Benjamin

Sumário:


Introdução

Nesta discussão, partimos da base construída no artigo anterior, no qual criamos uma faixa de rolagem horizontal no gráfico para exibir os próximos eventos noticiosos junto com temporizadores de contagem regressiva, indicando quanto tempo falta para cada divulgação, com os itens classificados por importância. Encerramos aquele artigo criando um espaço reservado para o feed de notícias em tempo real, e agora estamos prontos para dar vida a essa função.

EA de manchetes com espaço reservado para o feed de notícias.

Primeira versão do novo EA "Manchetes de Notícias" (sem integração com API, apenas eventos do calendário econômico no MQL5).

Hoje nosso foco está na integração de manchetes de notícias provenientes de fontes externas via API, para contornar o problema de disponibilidade de notícias na plataforma MetaTrader 5. Daremos atenção especial às manchetes, isto é, chamadas curtas que dão aos traders uma visão rápida do que acontece no mercado financeiro.. Isso permite que eles se mantenham informados e decidam se vale a pena se aprofundar nesses temas por meio de um navegador web ou da aba de notícias integrada ao terminal.

Principais aprendizados deste artigo:

  • Explorar diferentes fontes de notícias do mercado financeiro
  • Aprender a usar APIs externas de notícias
  • Extrair e processar dados de notícias para facilitar seu uso em MQL5
  • Dominar a função WebRequest()
  • Integrar facilmente APIs externas a ferramentas baseadas em MQL5

Para apoiar essa integração, dediquei um esforço adicional ao estudo das APIs de notícias disponíveis. Para sua conveniência, preparei uma lista. A maioria desses serviços oferece planos gratuitos com limitações de uso, que ainda assim são suficientes para aprendizado e testes. A tabela abaixo apresenta cinco fontes de notícias recomendadas, embora existam muitas outras que você pode explorar.

ProvedorLimite de usoFunções especiaisCobertura dos dados
NewsAPI.org500 requisições por diaFiltros de busca (palavras-chave, datas, publicadores, idiomas), operadores lógicos, suporte multilíngue (14 idiomas)Notícias gerais globais (mais de 150.000 fontes em 55 países)
Marketaux5 chamadas de API por requisiçãoExtração de entidades (ações/empresas), avaliação de sentimento por entidade, análise de notícias financeiras com IANotícias financeiras com indicadores específicos por empresa 
Alpha Vantage500 requisições por dia, 5 requisições por minutoMais de 60 indicadores econômicos (PIB, inflação), dados técnicos/fundamentais, análise de sentimento de mercadoAções, Forex, criptomoedas, ETFs 
Finnhub60 chamadas por minutoStreaming de dados em tempo real, calendário econômico, relatórios de resultados financeiros, análise de sentimento com IANotícias de mercado, indicadores econômicos, relatórios corporativos 
EODHD20 chamadas por dia (plano gratuito)Avaliações diárias de sentimento (de -1 a 1), mais de 50 tags temáticas (lucro, IPO), artigos em texto completo com filtragem por símbolos.Ações, ETFs, Forex, notícias sobre criptomoedas 

Neste projeto, vamos trabalhar com a Alpha Vantage, um serviço de API popular e fácil de usar, conhecido por seus dados financeiros abrangentes e métodos simples de acesso. Seus endpoints bem documentados e sua camada gratuita sólida fazem dele uma excelente escolha para integrar manchetes de notícias em tempo real ao nosso EA.

Na próxima seção, descreveremos o roteiro da nossa discussão, cobrindo etapas essenciais como a obtenção de chaves de API, o envio de requisições web, o parsing de respostas JSON e a exibição dos dados de notícias no gráfico. Em seguida, passaremos à implementação prática para dar vida a essa funcionalidade.


Visão geral

Para facilitar o acompanhamento da discussão, vamos começar com uma breve revisão de alguns termos-chave que usaremos ao longo de todo o projeto:
  • API (interface de programação de aplicações): Conjunto de regras que permite que uma aplicação de software interaja com outra. No nosso caso, isso permite que o MetaTrader 5 extraia dados de fontes externas, como a Alpha Vantage.
  • Documentação da API: Guia oficial fornecido pelo provedor da API que descreve os endpoints disponíveis, os formatos de requisição, os parâmetros e a estrutura das respostas.
  • Chave de API: Identificador único fornecido pelo provedor da API, que dá acesso aos seus serviços. Ele ajuda a gerenciar o uso e garante uma comunicação segura.
  • JSON (JavaScript Object Notation): É um formato leve de intercâmbio de dados, fácil de ler e escrever por pessoas, e também fácil de interpretar e gerar por máquinas. O JSON é normalmente usado para transmitir dados entre um servidor e um site ou uma aplicação de software, especialmente em APIs web.
  • Parsing: análise sintática de dados estruturados (por exemplo, JSON) para extrair informações úteis.
  • WebRequest: Função MQL5 usada para enviar requisições HTTP do terminal para servidores externos.
  • Integração: Processo de conectar e combinar os dados da API com o nosso EA para garantir um funcionamento fluido no gráfico.

Como nosso código-base, o EA "Manchetes de notícias", já está pronto, o primeiro passo é obter uma chave de API do provedor escolhido, a Alpha Vantage. Para obter sua chave de API, acesse o site da Alpha Vantage e registre uma conta gratuita. O formulário solicitará informações básicas, como seu nome, endereço de e-mail e uso pretendido. Depois de enviar o formulário, sua chave de API será exibida imediatamente.

O próximo passo é estudar a documentação da API fornecida pela Alpha Vantage. Isso nos ajudará a entender o formato da requisição, os endpoints de notícias disponíveis e a estrutura dos dados JSON retornados. Com isso claro, poderemos desenvolver uma forma de fazer o parsing dos dados e integrá-los ao nosso EA.

Estrutura do JSON retornado pela Alpha Vantage

Eu já obtive minha chave de API para este projeto, e a Alpha Vantage oferece uma ampla gama de recursos. No entanto, neste momento, vamos nos concentrar especificamente nas notícias financeiras.

Para visualizar a resposta JSON da API, podemos usar este link.

Antes de implementar a lógica de parsing das notícias da API da Alpha Vantage, podemos observar que cada item de notícia na resposta JSON contém vários campos, como "title", "summary", "url" e também "time_published". No entanto, nas etapas iniciais de desenvolvimento deste EA, priorizamos a simplicidade e a clareza visual, concentrando-nos apenas na extração do campo "title". As manchetes são chamadas concisas que oferecem uma visão geral do conteúdo da notícia, o que se alinha bem ao objetivo do EA de oferecer um ticker de notícias com rolagem rápida, com o mínimo de interferências visuais. Ao nos concentrarmos apenas em "title", reduzimos o custo de parsing de grandes blocos de texto e mantemos uma exibição limpa e compacta no gráfico, ajudando os traders a se manterem informados sem perder o foco. Abaixo, compartilhei um trecho de código JSON para ajudar você a entender a estrutura dos dados retornados.

 {
    "items": "50",
    "sentiment_score_definition": "x <= -0.35: Bearish; -0.35 < x <= -0.15: Somewhat-Bearish; -0.15 < x < 0.15: Neutral; 0.15 <= x < 0.35: 
	Somewhat_Bullish; x >= 0.35: Bullish",
    "relevance_score_definition": "0 < x <= 1, with a higher score indicating higher relevance.",
    "feed": [
        {
            "title": "How To Trade Tesla Today Using Technical Analysis - Tesla  ( NASDAQ:TSLA ) ",
            "url": "https://www.benzinga.com/markets/equities/25/06/45857951/how-to-trade-tesla-today-using-technical-analysis",
            "time_published": "20250610T121929",
            "authors": [
                "RIPS"
            ],
            "summary": "Good Morning Traders! In today's Market Clubhouse Morning Memo, we will discuss SPY, QQQ, AAPL, MSFT, NVDA, GOOGL, META, and TSLA. 
	Our proprietary formula, exclusive to Market Clubhouse, dictates these price levels. This dynamic equation takes into account price, volume, and options flow.",
            "banner_image": "https://cdnwp-s3.benzinga.com/wp-content/uploads/2024/10/22181427/Paolo-and-Gali.jpg?optimize=medium&dpr=2&auto=webp&width=230",
            "source": "Benzinga",
            "category_within_source": "Trading",
            "source_domain": "www.benzinga.com",
            "topics": [
                {
                    "topic": "Technology",
                    "relevance_score": "0.5"
                },
                {
                    "topic": "Financial Markets",
                    "relevance_score": "0.5855"
                },
                {
                    "topic": "Manufacturing",
                    "relevance_score": "0.5"
                }
            ],
            "overall_sentiment_score": 0.216021,
            "overall_sentiment_label": "Somewhat-Bullish",
            "ticker_sentiment": [
                {
                    "ticker": "MSFT",
                    "relevance_score": "0.101012",
                    "ticker_sentiment_score": "0.303818",
                    "ticker_sentiment_label": "Somewhat-Bullish"
                },
                {
                    "ticker": "GOOG",
                    "relevance_score": "0.033751",
                    "ticker_sentiment_score": "0.075535",
                    "ticker_sentiment_label": "Neutral"
                },
                {
                    "ticker": "NVDA",
                    "relevance_score": "0.101012",
                    "ticker_sentiment_score": "0.346995",
                    "ticker_sentiment_label": "Somewhat-Bullish"
                },
                {
                    "ticker": "AAPL",
                    "relevance_score": "0.134402",
                    "ticker_sentiment_score": "0.077776",
                    "ticker_sentiment_label": "Neutral"
                },
                {
                    "ticker": "TSLA",
                    "relevance_score": "0.134402",
                    "ticker_sentiment_score": "0.111086",
                    "ticker_sentiment_label": "Neutral"
                }
            ]
        },

O EA proposto receberá as manchetes de notícias uma vez por dia de negociação e as exibirá em um ticker contínuo usando um objeto canvas. O campo "title" será extraído e aparado a partir da string JSON bruta. Isso evita a necessidade de desserialização completa do JSON, que é ineficiente na linguagem MQL5. Assim, o EA pode processar atualizações em tempo real de forma simples e confiável. Como essas manchetes são naturalmente curtas e chamativas, elas são ideais para uma leitura rápida. Futuramente, campos adicionais como "summary" ou "url" poderão ser extraídos para uma visualização detalhada ou tooltips, mas o uso do campo "title" nesta etapa oferece uma solução rápida e de baixa latência, que se encaixa diretamente na estrutura visual e de desempenho já existente.

Nas próximas seções, vamos abordar cada uma dessas etapas: acesso à API, processamento dos dados e exibição deles no gráfico do MetaTrader 5 com o EA "Manchetes de notícias".



Integração de APIs externas de notícias ao EA "Manchetes de notícias"

O objetivo é extrair dinamicamente manchetes financeiras relevantes e exibi-las no gráfico de forma fluida em tempo real. Isso aumenta significativamente o valor do EA, mantendo os traders informados sobre as manchetes mais recentes que influenciam o sentimento de mercado, diretamente nos gráficos, sem trocar de plataforma. Neste guia passo a passo, explicaremos em detalhes como cada parte da implementação funciona, o que ela faz e por que adotamos essa estrutura.

Passo 1: Adicionar um campo para inserir a chave de API na configuração do usuário

input string InpAlphaVantageKey = "";  // your Alpha Vantage API key

Aqui definimos um parâmetro de entrada configurável pelo usuário chamado InpAlphaVantageKey. Isso permite que os usuários insiram sua chave pessoal de API da Alpha Vantage diretamente no painel de configurações do EA. Sem uma chave válida, os dados de notícias não podem ser obtidos. A Alpha Vantage fornece chaves de API gratuitas com limitações de uso (normalmente 500 requisições por dia), portanto este campo dá aos usuários controle sobre a autenticação sem codificar credenciais diretamente no código. Projetamos o restante do sistema para pular corretamente a coleta de notícias quando esse valor estiver vazio, garantindo estabilidade mesmo se os usuários esquecerem de inserir a chave.

Passo 2: Declaração de variáveis de estado para armazenar manchetes e a lógica de controle

string   newsHeadlines[];     // holds the extracted headline titles
int      totalNews = 0;       // keeps track of how many headlines we’ve stored
datetime lastNewsReload = 0;  // helps ensure we fetch news only once per day

Essas variáveis formam o núcleo do nosso sistema de controle de notícias.

  • newsHeadlines[] é um array dinâmico de strings que conterá as manchetes de notícias extraídas da resposta da API. Cada string representa uma manchete de notícia.
  • totalNews é um contador inteiro que registra quantas manchetes armazenamos, o que é importante para exibir a quantidade correta de manchetes no gráfico.
  • lastNewsReloadé usado para controlar a atualização diária. Alpha Vantage pode penalizar o uso excessivo, portanto essa variável garante que buscaremos as manchetes apenas uma vez por dia, a menos que alteremos explicitamente essa lógica. Isso também evita requisições de rede redundantes durante a mesma sessão de negociação.

Passo 3: Obtenção dos dados de notícias da Alpha Vantage com WebRequest

void FetchAlphaVantageNews()
{
  if(StringLen(InpAlphaVantageKey) == 0) return;

Começamos verificando se a chave de API foi inserida pelo usuário. Se o campo estiver vazio, a função é encerrada imediatamente. Essa verificação evita atividade de rede desnecessária e garante que o sistema funcione de forma estável e silenciosa até ser devidamente configurado. Isso também evita o retorno de resultados inválidos ou a ocorrência de erros de limite de requisições no servidor da API devido a requisições formadas incorretamente.

Aqui construímos um valor normalizado de datetime para o início do dia de negociação atual (meia-noite no horário do servidor). Esse valor é comparado com lastNewsReload , para sabermos se as manchetes de hoje já foram obtidas. Ao usar esse método em vez de timestamps brutos, garantimos que as notícias sejam carregadas apenas uma vez por dia, independentemente de quantas vezes o EA seja acionado por ticks. Essa abordagem torna nosso uso da API eficiente e previsível.

MqlDateTime tm; TimeToStruct(TimeTradeServer(), tm);
tm.hour = tm.min = tm.sec = 0;
datetime today = StructToTime(tm);

if(lastNewsReload == today) return;
lastNewsReload = today;

Criamos dinamicamente a URL da requisição à API adicionando a chave de API do usuário ao endpoint base. Essa é a URL que passaremos para WebRequest. A função NEWS_SENTIMENT foi projetada para retornar metadados em JSON e manchetes associadas ao sentimento de mercado a partir de várias fontes de notícias confiáveis. Ao montar essa string em tempo de execução, tornamos nosso EA modular e independente de chaves de API codificadas diretamente no código.

  string url = "https://www.alphavantage.co/query?function=NEWS_SENTIMENT&apikey=" + InpAlphaVantageKey;

Nesta seção, inicializamos os parâmetros necessários para a função WebRequest:

char post[];
char response_data[];
string headers;
int timeout = 5000;
ResetLastError();

  • post[] permanece vazio, pois enviamos uma requisição GET, sem dados no corpo da requisição.
  • response_data[] é o array em que a resposta bruta em bytes do servidor será armazenada.
  • headers fica como uma string vazia, pois a API da Alpha Vantage não exige cabeçalhos HTTP personalizados para este endpoint.
  • timeout é definido como 5000 milissegundos, para que não fiquemos presos por muito tempo em conexões lentas.
  • A função ResetLastError() remove todos os códigos de erro anteriores para garantir que qualquer erro detectado em seguida esteja realmente relacionado a esta requisição, e não a outra coisa.

int result = WebRequest("GET", url, headers, timeout, post, response_data, headers);
if(result != 200)
{
  Print("WebRequest failed with result: ", result, ", error: ", GetLastError());
  return;
}

Este bloco envia a requisição HTTP propriamente dita. WebRequest retorna o código de status HTTP (por exemplo, 200 para requisição bem-sucedida, 403 para acesso proibido etc.). Se o resultado não for igual a 200, isso significa que a requisição falhou ou foi bloqueada; por isso, exibimos uma mensagem de diagnóstico com o código de erro e encerramos a execução antecipadamente. Isso nos ajuda a diagnosticar problemas de conexão ou autenticação sem causar falhas no EA nem corromper os dados.

Logo depois de confirmar que a requisição foi concluída com sucesso, convertemos o array de bytes response_data[] em uma string legível (resultStr). Agora essa string contém a resposta JSON completa da Alpha Vantage. Antes de começar a extrair as manchetes, limpamos o array newsHeadlines[] para remover todos os dados antigos e abrir espaço para as manchetes do novo dia.

string resultStr = CharArrayToString(response_data, 0, WHOLE_ARRAY);
ArrayResize(newsHeadlines, 0);

Configuramos nossa lógica de parsing. A variável pos é nosso índice de varredura na string JSON. O array keys[] contém duas variantes comuns da chave que antecede cada manchete na resposta JSON. Incluímos tanto a versão com espaço quanto a versão sem espaço para garantir robustez diante de pequenas mudanças de formatação na resposta da API.

  int pos = 0;
  const string keys[2] = { "\"title\": \"", "\"title\":\"" };

Este loop percorre a string JSON para localizar e extrair a manchete de cada notícia.

  while(true)
  {
    int start = -1;
    for(int k=0;k<ArraySize(keys);k++)
    {
      start = StringFind(resultStr, keys[k], pos);
      if(start >= 0)
      {
        start += StringLen(keys[k]);
        break;
      }
    }
    if(start < 0) break;

    int end = StringFind(resultStr, "\"", start);
    if(end < 0) break;

    string title = StringSubstr(resultStr, start, end - start);
    title = Trim(title);

Nós:

  • Procuramos a próxima chave "title",
  • Definimos a posição inicial no começo do conteúdo textual real,
  • Procuramos o fim da string da manchete delimitada por aspas,
  • Extraímos e limpamos a manchete com a função Trim(), para remover os espaços nas extremidades.

Essa abordagem simples de correspondência de padrões evita a necessidade de um parser JSON completo e é eficiente o suficiente para o nosso caso de uso limitado e específico.

Sempre que encontramos uma manchete, expandimos dinamicamente o array newsHeadlines[] e adicionamos a nova manchete. Depois que todas as manchetes forem processadas, atualizamos totalNews para refletir quantos registros coletamos. Isso nos dá uma visão clara do material com que trabalharemos mais adiante ao montar o ticker de manchetes.

    int idx = ArraySize(newsHeadlines);
    ArrayResize(newsHeadlines, idx + 1);
    newsHeadlines[idx] = title;
  }

  totalNews = ArraySize(newsHeadlines);

Passo 4: Renderização do ticker de notícias no gráfico

Aqui criamos o ticker de notícias combinando todas as manchetes selecionadas em uma única string rolável.

  • Para melhorar a legibilidade, adicionamos o separador "|" entre os registros.
  • Se não houver manchetes disponíveis, exibimos uma mensagem de espaço reservado para manter o ticker ativo.
  • A função TextOut() exibe essa string no canvas com um deslocamento específico offNews, criando o efeito de rolagem.
  • A linha offNews -= InpNewsSpeed; faz com que o texto se desloque para a esquerda ao longo do tempo, criando um movimento contínuo. Assim que ele sair do campo de visão, vamos redefini-lo no loop principal de renderização.

string ticker = "";
for(int i=0;i<totalNews;i++)
{
  ticker += newsHeadlines[i];
  if(i < totalNews - 1) ticker += "   |   ";
}
if(totalNews == 0) ticker = placeholder;

newsCanvas.TextOut(offNews, yOff, ticker, XRGB(255,255,255), ALIGN_LEFT);
offNews -= InpNewsSpeed;

Passo 5: Agendamento da coleta de notícias (News Fetch) com timer

Colocamos a chamada FetchAlphaVantageNews() dentro da função OnTimer() para garantir que ela seja acionada periodicamente. A lógica interna de data garante que acessaremos a API apenas uma vez por dia. Esse design permite que o EA se atualize sozinho, sem exigir o recarregamento do gráfico nem qualquer ação do usuário. Aqui também é chamada a função DrawAll(), que atualiza o canvas a cada evento do timer, garantindo a rolagem suave do ticker pela tela.

void OnTimer()
{
  //...for the other code
  FetchAlphaVantageNews();  // only updates once daily
  //...for the rest of the code
  DrawAll();  // redraws canvas each timer tick
}

Passo 6: Limpeza ao remover o EA

Incluímos uma rotina de limpeza na função OnDeinit() para limpar o array newsHeadlines. Isso ajuda a garantir que a memória não permaneça ocupada depois que o EA for descarregado, o que é uma boa prática para evitar vazamento de recursos e garantir uma reinicialização limpa no próximo carregamento do EA.

void OnDeinit(const int reason)
{
  //...our preivous code here
  ArrayResize(newsHeadlines,0);  // clear stored headlines
}

Agora que tudo está pronto, temos uma versão atualizada do EA "Manchetes de notícias", que integra uma API externa (Alpha Vantage) e usa o calendário econômico integrado do MQL5. Em conjunto, essas funções permitem exibir de notícias e eventos econômicos diretamente no gráfico em tempo real, oferecendo aos traders acesso imediato e contínuo a informações importantes, sem sair da plataforma.

Ao final deste artigo, anexarei o código-fonte completo, incluindo tudo o que discutimos até agora. O próximo passo será testar cuidadosamente essas novas funções para garantir que o conceito funcione como esperado. Com base em nossas observações, faremos uma avaliação final e falaremos sobre os próximos passos em atualizações futuras.


Testes

No terminal MetaTrader 5, certifique-se de que o acesso via WebRequest esteja habilitado e de que a URL do servidor da Alpha Vantage tenha sido adicionada à lista de URLs permitidas. Essas configurações podem ser acessadas pelo menu Tools > Options > Expert Advisors ou pressionando Ctrl + O no teclado. Veja a imagem abaixo.

Opções de permissão do WebRequest

Opções de permissão do WebRequest

Você pode acessar o arquivo compilado do EA na seção "Expert Advisors" da janela "Navegador" (atalho de teclado: Ctrl + N). Para carregá-lo no gráfico, basta clicar com o botão direito no EA e selecionar "Anexar ao gráfico" ("Attach to Chart") ou arrastá-lo diretamente para o gráfico desejado. Um breve guia visual aparece na imagem abaixo.

Acesso ao arquivo compilado no terminal

Acesso ao arquivo compilado no terminal

Graças à integração recente, nossas configurações de entrada foram ampliadas e agora incluem novos recursos, principalmente a capacidade de obter manchetes de notícias em tempo real por meio de uma API externa. Para ativar a função de rolagem de notícias no gráfico, é necessário obter uma chave de API da Alpha Vantage e inseri-la no campo de entrada correspondente. A imagem abaixo mostra como a interface das configurações de entrada está agora. Se a chave de API não for informada, o EA exibirá um texto de espaço reservado na seção de notícias em vez de manchetes em tempo real.

Configurações de entrada (EA "Manchetes de notícias")

Configurações de entrada (EA "Manchetes de notícias")

Aqui está uma ilustração que mostra o EA em funcionamento após a integração bem-sucedida. Todos os eventos econômicos de 11 de junho fluem suavemente junto com as manchetes de notícias do mercado global. Para uma visualização mais clara e informações mais detalhadas, consulte a imagem abaixo.

Anexando o EA "Manchetes de notícias" ao gráfico

Anexando o EA "Manchetes de notícias" ao gráfico

Também consegui capturar uma visualização nítida dos eventos exibidos no terminal em 11 de junho. Isso destaca o quanto o EA "Manchetes de notícias" é eficaz em destacar informações importantes diretamente no gráfico, ajudando os traders a se manterem informados sem interromper a análise dos gráficos. Além disso, o EA foi desenvolvido com foco no uso eficiente do espaço em pixels, o que permite exibir a janela inteira do gráfico, ao mesmo tempo em que integra notícias e eventos de forma fluida, sem reduzir nem poluir a visualização. Abaixo, uma ilustração animada demonstra como o EA "Manchetes de notícias" simplifica o acesso tanto aos eventos econômicos quanto às manchetes de notícias do mercado.

A vantagem do EA "Manchetes de notícias" é que ele simplifica o acesso às notícias com uma única linha.

A vantagem do EA "Manchetes de notícias" é que ele simplifica o acesso às notícias com uma única linha.

Experimentamos com bastante interesse diferentes velocidades de rolagem, e os resultados foram realmente impressionantes. Isso destacou o potencial de criar visualizações fluidas e eficientes no uso de recursos diretamente no gráfico. Esse experimento também demonstrou o quanto as bibliotecas MQL5 podem ser poderosas e fáceis de usar. Um dos destaques foi o uso da classe CCanvas, que nos permitiu criar um fundo semitransparente para a faixa de notícias e eventos, mantendo a grade principal do gráfico visível. Isso reforça a ideia de que os usuários podem se manter informados sem comprometer a visibilidade completa do gráfico.

Embora a implementação atual ainda não ofereça interação com os elementos visuais, ela abre caminho para melhorias futuras interessantes. Abaixo está um exemplo da nossa configuração de rolagem em alta velocidade, na qual o texto fica levemente desfocado devido ao movimento rápido, mas ainda assim demonstra os resultados e o potencial visual.

Configuração de rolagem em alta velocidade para eventos do calendário e notícias

Configuração de rolagem em alta velocidade para eventos do calendário e notícias



Conclusão

Fico sinceramente satisfeito com o uso bem-sucedido da classe CCanvas, que resolve de forma eficaz o problema evidente que encontramos. Conseguimos desenvolver um método alternativo de acesso a notícias e eventos econômicos diretamente no gráfico. Embora o MetaTrader 5 de fato ofereça acesso a essas atualizações, sua visibilidade e acessibilidade durante a negociação ativa podem ser limitadas. Ao otimizar a exibição com a rolagem das manchetes, apresentamos uma solução mais prática e visualmente integrada.

É claro que a versão atual tem algumas limitações. Nesta versão, as notícias ficam restritas a manchetes curtas, ao contrário da versão nativa do terminal, na qual é possível clicar e ler os artigos completos. Ainda assim, nossa solução funciona muito bem com os eventos do calendário econômico, permitindo que os traders se mantenham informados durante o uso. A vantagem das manchetes é que você pode acompanhar os temas relevantes e depois estudá-los fora do terminal. Normalmente, você lê apenas as manchetes que despertam interesse, portanto exibi-las em rolagem no gráfico ajuda a garantir que você não perca notícias financeiras globais importantes, tudo isso sem interromper seu fluxo habitual de negociação.

Uma das vantagens incontestáveis é que todas essas informações são exibidas diretamente no gráfico de forma discreta, permitindo tomar decisões de negociação fundamentadas sem comprometer a clareza do gráfico.

Olhando adiante, possíveis melhorias podem incluir rótulos de data para cada manchete, redimensionamento dinâmico para se adaptar a diferentes escalas do gráfico e um sistema de alertas que notifique os traders antes dos eventos programados. Estou ansioso para iniciar a terceira etapa deste projeto, na qual planejamos incorporar uma nova faixa de informações adaptada às necessidades dos traders.

No fim das contas, um dos objetivos mais amplos deste projeto é tornar a programação em MQL5 mais acessível, especialmente para iniciantes. Para consolidar esse objetivo, pretendo encerrar cada etapa de desenvolvimento com um breve resumo dos principais conceitos de programação utilizados e continuar essa prática nos próximos capítulos da série.



Principais aprendizados

Abaixo está uma tabela-resumo dos principais conceitos de programação demonstrados nesta discussão.
ConceitoDetalhes
Design orientado a objetosEncapsulamento dos eventos do calendário em uma classe dedicada, com propriedades relacionadas a horário, símbolo, nome e importância, melhorando a modularidade e a legibilidade
Memória dinâmica e arraysUso de arrays redimensionáveis e alocação dinâmica para gerenciar quantidades variáveis de objetos event em coleções separadas de alta, média e baixa importância.
Arquitetura orientada a eventosFunções de ciclo de vida para inicialização, atualizações temporizadas e limpeza, que definem o comportamento do EA ao iniciar, a cada evento do timer e ao encerrar
Integração de APIConexão a um serviço externo de notícias por meio de requisições HTTP, tratamento de respostas e erros, bem como extração do texto das manchetes a partir dos dados retornados
Programação gráficaRenderização de textos e figuras em um overlay transparente usando um objeto canvas para criar faixas de rolagem suaves para eventos e manchetes
Lógica de data e horaConversão do horário do servidor em limites de data para carregar apenas os eventos futuros de hoje e garantir que as notícias sejam recebidas apenas uma vez por dia.
Projeto funcional modularSeparação das tarefas em funções auxiliares especializadas para posicionamento, carregamento de dados, renderização de faixas e truncamento de texto, mantendo o código estruturado e fácil de manter.
Limpeza de recursosDestruição correta dos objetos visuais e remoção dos objetos de eventos criados dinamicamente para evitar vazamentos de memória ao remover o EA
Tratamento da entrada do usuárioDisponibilização dos parâmetros de velocidade de rolagem, opções de exibição, frequência do timer, configurações de deslocamento e campo da chave de API para permitir a customização pelo usuário.
Métodos eficientes de redesenhoMinimização da carga de redesenho por meio da remoção e atualização apenas das partes necessárias do canvas e da adaptação às mudanças de tamanho do gráfico
Calendário econômico MQL5Obtenção dos eventos do calendário, filtragem por data, classificação por importância e ordenação por horário para exibir uma lista priorizada dos próximos eventos.

Como referência, aqui está uma imagem que ilustra o significado dos três retângulos coloridos usados para indicar a prioridade das notícias. O principal indicador é a cor, embora também seja possível usar formas, como círculos.

Como referência, aqui está uma imagem que ilustra o significado dos três retângulos coloridos usados para indicar a prioridade das notícias.



Conteúdo do anexo

Veja abaixo o código-fonte anexado do EA, compile-o, teste-o e depois compartilhe seus comentários e ideias de evolução nos comentários. Acompanhe nosso próximo artigo!
Nome do arquivoVersãoDescrição
News Headline EA.mq51.03EA que exibe eventos do calendário econômico e manchetes de notícias do mercado em tempo real diretamente no gráfico usando o MQL5 Canvas e a API Alpha Vantage integrados ao projeto

Voltar ao conteúdo

Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/18465

Arquivos anexados |
Operando opções sem opções (Parte 2): Uso em operações reais Operando opções sem opções (Parte 2): Uso em operações reais
O artigo aborda estratégias simples com opções e sua implementação em MQL5. Escrevemos um EA básico que será modernizado e gradualmente ampliado.
Superando as limitações do aprendizado de máquina (Parte 1): carência de métricas compatíveis Superando as limitações do aprendizado de máquina (Parte 1): carência de métricas compatíveis
Neste artigo, mostramos que parte dos problemas que enfrentamos está enraizada em seguir cegamente as "melhores práticas". Ao apresentar ao leitor evidências simples, baseadas no mercado real, explicaremos por que devemos evitar esse comportamento e, em vez disso, adotar boas práticas baseadas em domínios específicos, caso nossa comunidade queira ter alguma chance de recuperar o potencial oculto da IA.
Do iniciante ao especialista: Criando um EA animado de notícias em MQL5 (III): Análise de indicadores Do iniciante ao especialista: Criando um EA animado de notícias em MQL5 (III): Análise de indicadores
Neste artigo, daremos continuidade à apresentação do EA "manchetes", apresentando uma faixa especial de "Análise de indicadores" (indicator insights): uma exibição compacta, no gráfico, dos principais sinais técnicos gerados por indicadores populares, como RSI, MACD, Stochastic e CCI. Essa abordagem elimina a necessidade de várias subjanelas de indicadores no terminal MetaTrader 5, mantendo sua área de trabalho limpa e eficiente. Usando a API MQL5 para acessar dados dos indicadores em segundo plano, podemos processar e visualizar informações de mercado em tempo real com lógica personalizada.
Do iniciante ao especialista: criação de um EA animado para notícias em MQL5 (I) Do iniciante ao especialista: criação de um EA animado para notícias em MQL5 (I)
O acesso às notícias é um fator crítico ao operar no terminal MetaTrader 5. Apesar da existência de várias APIs de notícias, muitos traders enfrentam dificuldades para acessá-las e integrá-las de forma eficiente ao seu ambiente de negociação. Neste artigo, nosso objetivo é desenvolver uma solução otimizada que exiba as notícias diretamente no gráfico, onde elas são mais necessárias. Faremos isso criando o EA "Manchetes de Notícias", que monitora e exibe atualizações em tempo real a partir de APIs de notícias.