Do iniciante ao especialista: Criando um EA animado de notícias em MQL5 (III): Análise de indicadores
Sumário:
Introdução
Hoje, vamos apresentar uma nova faixa de "Análise de indicadores", uma funcionalidade no gráfico baseada em regras, desenvolvida para complementar as ferramentas que já exploramos nos artigos anteriores (I e II). Se ainda não ficou claro, o objetivo principal é claro: otimizar a interface do terminal MetaTrader 5 para oferecer acesso compacto e eficiente aos principais recursos de trading, diretamente no gráfico.
A maioria dos osciladores é tradicionalmente exibida em subjanelas separadas abaixo do gráfico principal, o que fragmenta o espaço de trabalho e ocupa espaço valioso na tela. Quanto mais indicadores você usa, mais o gráfico fica comprimido, dificultando a visualização clara do movimento do preço.Para resolver essa questão, vamos simplificar a abordagem implementando a faixa de "Análise de indicadores" no gráfico usando a classe CCanvas. Isso nos permite extrair e processar valores dos indicadores por meio da API MQL5 e exibir sinais relevantes sem sobrecarregar a interface. Preparei um exemplo visual que ilustra como várias subjanelas de indicadores reduzem o tamanho da visualização principal do gráfico.

Esta imagem mostra como as janelas do indicador afetam o gráfico.
Na próxima seção, veremos o conceito que sustenta essa abordagem antes de passar para sua implementação.
Conceito
Nosso plano consiste em introduzir, por padrão, uma única faixa rolante que exibe informações sobre quatro osciladores principais, indicadores que fornecem aos traders sinais importantes para a tomada de decisão. Essa estrutura compacta reduz o excesso de elementos nos gráficos e oferece uma visualização mais limpa e focada. No entanto, os usuários que preferirem informações mais detalhadas poderão, se desejarem, separar os dados analíticos em faixas individuais, cada uma dedicada a um indicador específico.
É essencial compreender bem esses indicadores para entender como eles dão suporte a estratégias de trading robustas. Após concluir essa implementação, você terá manchetes de notícias, calendário econômico e dados analíticos dos indicadores em tempo real, tudo reunido em uma única interface inteligente diretamente no gráfico do MetaTrader 5.
Enquanto aguardamos futuras atualizações, também estou considerando a possibilidade de adicionar uma faixa de informações dos analistas (Analyst Insights Lane), um espaço dedicado no qual seria possível exibir materiais analíticos editados a partir de publicações de analistas profissionais. Com acesso às respectivas APIs, essa funcionalidade poderia exibir comentários de especialistas e perspectivas estratégicas diretamente no gráfico, criando uma visualização poderosa e orientada à tomada de decisão dos traders.
Agora, tanto para iniciantes quanto como reforço para traders experientes, vejamos como cada um dos quatro osciladores que vamos integrar é amplamente utilizado no trading e como seus sinais combinados podem melhorar significativamente a tomada de decisão em tempo real.
Entendendo RSI, CCI, Estocástico e MACD no trading:
Índice de força relativa (Relative Strength Index, RSI)
O RSI, desenvolvido por J. Welles Wilder em 1978, é um oscilador de impulso que mede a velocidade e a variação dos movimentos de preço. Ele é usado principalmente para identificar condições de sobrecompra e sobrevenda, bem como possíveis reversões de tendência. O RSI é especialmente eficaz em mercados laterais, nos quais os preços oscilam entre níveis de suporte e resistência.
Cálculo:
O RSI geralmente é calculado em um período de 14 dias, embora os traders possam ajustá-lo para timeframes mais curtos ou mais longos. Sua fórmula:

Em que RSI (índice de força relativa) é a razão entre o ganho médio e a perda média nesse intervalo. O ganho médio e a perda média são calculados com base nas variações de preço durante o período analisado.
Níveis-chave e interpretação:
O RSI oscila de 0 a 100, com o ponto médio em 50.
- Valores acima de 70 são considerados sobrecomprados, indicando que o ativo pode estar sobrevalorizado, com possibilidade de correção para baixo.
- Valores abaixo de 30 são considerados sobrevendidos, indicando que o ativo pode estar subvalorizado e que uma recuperação pode ocorrer.
- Valores acima de 50 geralmente indicam momentum de alta, enquanto valores abaixo de 50 indicam momentum de baixa.

Índice de força relativa (Relative Strength Index, RSI)
Estratégias de trading baseadas no RSI:
- Sinais de sobrecompra/sobrevenda: Os traders frequentemente aguardam o cruzamento do RSI acima de 30 como um possível sinal de compra, indicando que o ativo está saindo da zona de sobrevenda. Por outro lado, o rompimento abaixo de 70 pode sinalizar venda, indicando uma condição de sobrecompra.
- Divergência: O RSI pode sinalizar possíveis reversões por meio de divergência. Por exemplo, a divergência de baixa ocorre quando o preço atinge uma nova máxima, mas o RSI registra uma máxima mais baixa, sugerindo enfraquecimento do momentum. A divergência de alta ocorre quando o preço atinge uma nova mínima, mas o RSI forma uma mínima mais alta.
- Confirmação de tendência: Em uma tendência de alta, o RSI geralmente deve permanecer acima de 50, enquanto em uma tendência de baixa deve permanecer abaixo de 50, ajudando os traders a identificar a direção da tendência.
- Failure swings: Wilder definiu os "failure swings" como sinais claros de reversão do mercado, como uma leitura do RSI que não consegue subir acima de 70 depois de atingir 76 e, em seguida, caiu abaixo de 72, sinalizando uma possível reversão.
Exemplo de aplicação:
Se o RSI cruzar a marca de 30 para cima depois de permanecer na zona de sobrevenda (abaixo de 30), isso pode sinalizar uma oportunidade de compra, especialmente se esse sinal vier acompanhado de outros indicadores de alta, como um cruzamento de média móvel. Por outro lado, se o RSI cair abaixo de 70 após uma condição de sobrecompra, isso pode sinalizar uma oportunidade de venda.
Índice de canal de commodities (CCI)
O CCI é um oscilador de impulso desenvolvido originalmente para identificar oscilações cíclicas dos preços de commodities, mas atualmente é usado em diversas classes de ativos, incluindo ações e moedas. Ele mede o preço atual em relação ao preço médio em um determinado período, ajudando os traders a identificar condições de sobrecompra/sobrevenda e a força da tendência. Foi apresentado por Donald Lambert em 1980.
Cálculo:
O CCI geralmente é calculado em um timeframe de 20 períodos, embora possa ser ajustado. Sua fórmula:

Onde:
Preço típico = (Máxima + mínima + preço de fechamento) / 3SMA = Média móvel simples do preço típico no período especificado
Desvio médio = Média dos desvios absolutos do preço típico em relação à SMA
O coeficiente 0,015 é usado para escalonar os resultados e facilitar a leitura.
Níveis-chave e interpretação:
- O CCI oscila em torno de zero, sem limite superior ou inferior.
- Valores acima de +100 indicam uma condição de sobrecompra, sugerindo possíveis oportunidades de venda.
- Valores abaixo de -100 indicam sobrevenda, sugerindo possíveis oportunidades de compra.
- Em tendências fortes, o CCI pode ultrapassar +200 ou -200, indicando momentum extremo.

Índice de canal de commodities (CCI)
Vale observar que, quando o Índice de canal de commodities (CCI) cai abaixo de -100 ou sobe acima de +100, isso não sinaliza necessariamente uma oportunidade imediata de entrada em uma operação. Muitas vezes, é necessário obter confirmação de outros indicadores ou da análise de price action antes de executar uma ordem. Por exemplo, no exemplo acima, mesmo depois de o CCI cair abaixo de -100, o preço continuou recuando por mais alguns pips antes de mudar de direção.
Esse comportamento não é exclusivo do CCI; padrões semelhantes também são observados em outros osciladores, como o oscilador Estocástico, especialmente perto de seus níveis de referência predefinidos. Embora esses sinais cruzados possam ser valiosos, depender apenas deles pode levar a entradas prematuras. Uma abordagem mais robusta envolve combinar sinais do oscilador com confirmação técnica adicional para dar mais robustez à tomada de decisão.
Estratégias de trading baseadas no CCI:
- Sinais de sobrecompra/sobrevenda: Um CCI acima de +100 pode sinalizar uma possível venda, enquanto uma leitura abaixo de -100 pode sinalizar uma compra. Para confirmar o sinal, os traders costumam aguardar até que o CCI volte a cair abaixo de +100 ou suba acima de -100.
- Força da tendência: Um movimento sustentado acima de +100 indica uma forte tendência de alta, enquanto um movimento abaixo de -100 indica uma forte tendência de baixa. Isso pode ajudar os traders a permanecerem na tendência por mais tempo.
- Divergência: Assim como o RSI, o CCI pode sinalizar possíveis reversões por meio de divergência, por exemplo, quando o preço atinge novas máximas enquanto o CCI forma máximas mais baixas, indicando enfraquecimento do impulso.
- Cruzamentos: Alguns traders usam os cruzamentos da linha zero do CCI como sinais de tendência, com os ascendentes indicando impulso de alta e os descendentes indicando impulso de baixa.
Exemplo de aplicação:
Se o CCI ultrapassar a marca de +100, isso pode sinalizar uma forte tendência de alta, mas os traders devem ficar atentos a uma reversão caso o CCI comece a cair e volte abaixo de +100. Da mesma forma, um CCI abaixo de -100 pode sinalizar uma oportunidade de compra se começar a subir e ultrapassar -100.
O Oscilador Estocástico é um indicador baseado em impulso, desenvolvido para identificar possíveis pontos de virada no comportamento do mercado ao comparar o preço de fechamento de um ativo com seu intervalo recente de negociação. Geralmente configurado para 14 períodos, ele é especialmente eficaz na identificação de condições de sobrecompra e sobrevenda. Como se concentra na velocidade da variação dos preços, o indicador foi desenvolvido para sinalizar reversões de tendência antes que elas ocorram.
Esse indicador foi apresentado por George Lane (George Lane) na década de 1950, e seus princípios continuam servindo como referência para traders que buscam sinais antecipados de mudança na dinâmica do mercado.
Cálculo:
O Oscilador Estocástico consiste em duas linhas: %K (linha rápida) e %D (linha lenta). A linha %K é calculada da seguinte forma:

em que:
Close = preço de fechamento atualLowest Low = menor preço mínimo no período especificado
Highest High = maior preço máximo no período especificado
A linha %D representa uma média móvel da linha %K, geralmente uma média móvel simples de 3 períodos que serve para suavizar as oscilações.
Níveis-chave e interpretação:
- O Oscilador Estocástico oscila em uma faixa de 0 a 100.
- Valores acima de 80 são considerados sobrecomprados, sugerindo possíveis oportunidades de venda.
- Valores abaixo de 20 indicam sobrevenda, sugerindo possíveis oportunidades de compra.
- A linha %D atua como linha de sinal, e os cruzamentos entre %K e %D fornecem sinais de trading.

Oscilador Estocástico
Estratégias de trading baseadas no Estocástico:
- Sinais de sobrecompra/sobrevenda: Os traders aguardam o cruzamento de %K acima de 20 como possível sinal de compra, indicando que o ativo está saindo da zona de sobrevenda. Por outro lado, o cruzamento abaixo de 80 pode sinalizar venda, indicando uma condição de sobrecompra.
- Cruzamentos: Um sinal de alta ocorre quando %K cruza %D de baixo para cima, especialmente na zona de sobrevenda (abaixo de 20). Um sinal de baixa ocorre quando %K cruza %D de cima para baixo, especialmente na zona de sobrecompra (acima de 80).
- Divergência: O estocástico pode sinalizar possíveis reversões por meio de divergência, como uma divergência de alta quando o preço forma mínimas mais baixas, mas %K forma mínimas mais altas, indicando enfraquecimento do impulso de baixa.
- Confirmação de tendência: Em uma tendência de alta, o Estocástico geralmente deve permanecer acima de 50, enquanto, em uma tendência de baixa, deve permanecer abaixo de 50, ajudando os traders a identificar a direção da tendência.
Exemplo de aplicação:
Se %K cruzar acima de %D enquanto ambas as linhas estiverem abaixo de 20, isso pode sinalizar um forte sinal de compra, especialmente se esse sinal vier acompanhado de outros sinais de alta, como um rompimento acima do nível de resistência. Por outro lado, se %K cruzar abaixo de %D, mas ainda estiver acima de 80, isso pode sinalizar venda, indicando uma possível reversão por sobrecompra.
Convergência e divergência de médias móveis (MACD)
O MACD é um indicador de impulso seguidor de tendência amplamente utilizado, que compara tendências de preços de curto e longo prazo por meio da análise da diferença entre duas médias móveis exponenciais, ou EMAs. Ele ajuda a identificar mudanças na dinâmica do mercado, na direção da tendência e em possíveis pontos de entrada ou saída, o que o torna um componente valioso em muitos sistemas técnicos de trading.
O MACD foi desenvolvido por Gerald Appel no fim da década de 1970. Ele continua sendo uma das ferramentas mais usadas pelos traders para determinar a força da tendência e possíveis reversões.
Cálculo:
O MACD é calculado subtraindo a EMA de 26 períodos da EMA de 12 períodos:
![]()
Em seguida, uma EMA de 9 períodos da linha MACD é traçada como "linha de sinal". A diferença entre a linha MACD e a linha de sinal costuma ser exibida na forma de histograma, que representa visualmente a força do impulso.
Níveis-chave e interpretação:
- O MACD oscila em torno de zero, sem limites superior ou inferior.
- Um valor positivo do MACD indica impulso de alta, enquanto um valor negativo indica impulso de baixa.
- O cruzamento da linha MACD com a linha de sinal fornece sinais de trading: sinal de alta quando o MACD cruza acima da linha de sinal e sinal de baixa quando cruza abaixo dela.
- Os cruzamentos da linha zero também são relevantes: um cruzamento acima de zero indica uma possível tendência de alta, enquanto abaixo de zero indica uma possível tendência de baixa.

Convergência/divergência de médias móveis
Estratégias de trading baseadas no MACD:
- Cruzamentos: Os traders compram quando a linha MACD cruza a linha de sinal de baixo para cima, indicando impulso de alta, e vendem quando ela cruza a linha de sinal de cima para baixo, indicando impulso de baixa.
- Cruzamentos da linha zero: Um cruzamento do MACD acima de zero indica uma possível tendência de alta, enquanto um cruzamento abaixo de zero indica uma tendência de baixa, o que é útil para confirmar a tendência.
- Análise do histograma: A altura do histograma reflete a força do impulso. Um histograma em expansão indica aumento do impulso, enquanto sua contração indica desaceleração, potencialmente sinalizando uma reversão.
- Divergência: O MACD pode sinalizar possíveis reversões por meio de divergência, por exemplo, uma divergência de alta quando o preço forma mínimas mais baixas, mas o MACD forma mínimas mais altas, indicando enfraquecimento do impulso de baixa.
Exemplo de aplicação:
Se a linha MACD cruzar a linha de sinal e o histograma estiver em expansão, isso pode sinalizar compra, especialmente se esse sinal vier acompanhado de um rompimento acima de um nível importante de resistência. Por outro lado, se a linha MACD cruzar abaixo da linha de sinal e o histograma se contrair, isso pode sinalizar venda, indicando uma possível reversão.
| Indicador | Finalidade | Níveis-chave | Principais sinais | Melhor aplicação |
|---|---|---|---|---|
| RSI | Mede o momentum e identifica condições de sobrecompra/sobrevenda | >70 (sobrecompra), <30 (sobrevenda), 50 (ponto médio) | Cruzamento acima de 30 (compra), cruzamento abaixo de 70 (venda), divergências, oscilações de falha | Mercados laterais |
| CCI | Identifica pontos de reversão cíclicos e a força da tendência | +100 (sobrecompra), <-100 (sobrevenda), linha zero | Cruzamento acima de +100 (venda), cruzamento abaixo de -100 (compra), divergências, cruzamentos da linha zero | Mercados em tendência |
| Estocástico | Mede o impulso e identifica possíveis reversões | >80 (sobrecompra), <20 (sobrevenda) | Cruzamentos entre %K e %D (compra quando %K cruza acima de %D abaixo de 20, venda quando %K cruza abaixo de %D acima de 80), divergências | Mercados laterais e mercados em tendência |
| MACD | Indicador de momentum seguidor de tendência | Linha zero, cruzamentos da linha de sinal | Cruzamento da linha MACD acima da linha de sinal (compra), abaixo da linha de sinal (venda), cruzamento da linha zero, variação do histograma | Mercados em tendência |
Implementação
Os valores de um indicador incorporado para o símbolo e o timeframe exibidos no gráfico ativo podem ser obtidos por meio de uma sequência de três etapas: "handle → buffer → liberação". Primeiro, o handle do indicador é criado por meio da chamada da função MQL5 correspondente, como iRSI ou iMACD, sem parâmetros explícitos de símbolo e timeframe, para usar o contexto do gráfico. Em seguida, CopyBuffer é chamado com esse handle a fim de extrair os valores mais recentes de um ou mais buffers de saída do indicador. Por fim, IndicatorRelease é chamado para liberar o handle e os recursos associados a ele. Reunir essas etapas em uma rotina auxiliar viabiliza a obtenção eficiente de RSI, MACD, Estocástico, CCI ou qualquer outro indicador padrão sob demanda, sem criar subjanelas de indicador adicionais.
As etapas a seguir descrevem a integração da função "Análise de indicadores" (Indicator Insights) ao EA "Manchetes de notícias", oferecendo uma demonstração prática de como trabalhar com indicadores nativos com MQL5.
Integração da funcionalidade "Análise de indicadores" ao EA
1. Declaração dos parâmetros de entrada personalizados
Ao disponibilizar InpSeparateLanes e InpInsightSpeed junto com os demais parâmetros de entrada, você permite que o trader escolha se deseja exibir uma única faixa com rolagem de indicadores combinados.
input bool InpSeparateLanes = false; // combined vs separate insights input int InpInsightSpeed = 3; // scroll speed for insight text
2. Variáveis globais e handles de canvas
Declaramos previamente os objetos canvas combinados e individuais. Seus deslocamentos de rolagem controlam a animação. Em MQL5, os handles de canvas devem ser armazenados globalmente para que persistam entre callbacks do timer. Ao manter esses handles junto com outras variáveis de estado, como largura do gráfico e marcas temporais de recarregamento, mantemos todos os estados usados entre ticks em um só lugar.
//--- Globals --------------------------------------------- CCanvas combinedCanvas; // holds all four insights in one lane CCanvas rsiCanvas, stochCanvas, macdCanvas, cciCanvas; // separate lanes int offCombined, offRSI, offStoch, offMACD, offCCI;
3. Funções auxiliares no cálculo dos indicadores
Cada função auxiliar segue o esquema "handle → buffer → liberação do handle", garantindo que criemos o handle de cada indicador apenas uma vez por tick, leiamos o valor mais recente e, em seguida, liberemos imediatamente os recursos do sistema. Centralizar a formatação aqui preserva a limpeza e a eficiência do loop principal de renderização. Combinar os quatro sinais em uma única string para o modo combined-lane simplifica ainda mais a lógica de renderização.
//+------------------------------------------------------------------+ //| Compute indicator insights | //+------------------------------------------------------------------+ string ComputeRSIInsight() { int h=iRSI(NULL,PERIOD_CURRENT,14,PRICE_CLOSE); if(h==INVALID_HANDLE) return "["+Symbol()+"] RSI err"; double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h); double v=b[0]; string s=DoubleToString(v,1); string m=v<30?"Oversold("+s+")":v>70?"Overbought("+s+")":"Neutral("+s+")"; return "["+Symbol()+"] RSI:"+m; } string ComputeStochInsight() { int h=iStochastic(NULL,PERIOD_CURRENT,14,3,3,MODE_SMA,STO_LOWHIGH); if(h==INVALID_HANDLE) return "["+Symbol()+"] Stoch err"; double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h); double v=b[0]; string s=DoubleToString(v,1); string m=v<20?"Oversold("+s+")":v>80?"Overbought("+s+")":"Neutral("+s+")"; return "["+Symbol()+"] Stoch:"+m; } string ComputeMACDInsight() { int h=iMACD(NULL,PERIOD_CURRENT,12,26,9,PRICE_CLOSE); if(h==INVALID_HANDLE) return "["+Symbol()+"] MACD err"; double m[],g[]; CopyBuffer(h,0,1,1,m); CopyBuffer(h,1,1,1,g); IndicatorRelease(h); double d=m[0]-g[0]; string s=DoubleToString(d,2); string m2=d>0?"Bull("+s+")":d<0?"Bear("+s+")":"Neu(0)"; return "["+Symbol()+"] MACD:"+m2; } string ComputeCCIInsight() { int h=iCCI(NULL,PERIOD_CURRENT,14,PRICE_TYPICAL); if(h==INVALID_HANDLE) return "["+Symbol()+"] CCI err"; double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h); double v=b[0]; string s=DoubleToString(v,1); string m=v<-100?"Oversold("+s+")":v>100?"Overbought("+s+")":"Neutral("+s+")"; return "["+Symbol()+"] CCI:"+m; } string ComputeAllInsights() { return ComputeRSIInsight() + " | " + ComputeStochInsight() + " | " + ComputeMACDInsight() + " | " + ComputeCCIInsight(); }
4. Criação do canvas em OnInit
Em OnInit, adicionamos nossas novas faixas. No modo separate-lane, inicializamos quatro objetos canvas; no modo combined-lane, apenas um, com o rótulo estático "Indicator Insights:". Executar um Update inicial garante que, antes mesmo do primeiro tick do timer, os traders vejam o contexto, um detalhe importante de usabilidade ao carregar EAs mais complexos.
int OnInit() { // … existing canvases for events & news … if(InpSeparateLanes) { rsiCanvas.CreateBitmapLabel("RsiC",0,0,canvW,lineH); stochCanvas.CreateBitmapLabel("StoC",0,0,canvW,lineH); macdCanvas.CreateBitmapLabel("MacC",0,0,canvW,lineH); cciCanvas.CreateBitmapLabel("CciC",0,0,canvW,lineH); // set transparency… } else { combinedCanvas.CreateBitmapLabel("AllC",0,0,canvW,lineH); combinedCanvas.TransparentLevelSet(120); // static label at x=5: “Indicator Insights:” combinedCanvas.FontSizeSet(-120); combinedCanvas.TextOut(5, (lineH-combinedCanvas.TextHeight("Indicator Insights:"))/2, "Indicator Insights:", XRGB(200,200,255), ALIGN_LEFT); combinedCanvas.Update(true); } // … remainder of OnInit … }
5. Lógica de rolagem em OnTimer
Este é o coração do EA: a cada tick do timer, os objetos canvas são movidos, recarregamos os dados, processamos qualquer alteração no tamanho do gráfico e, em seguida, iniciamos o ciclo de cálculo e renderização para cada faixa, seja de eventos, notícias ou indicadores. Ao agrupar todas as chamadas de atualização no final, reduzimos a tremulação ao mínimo e mantemos a rolagem perfeitamente sincronizada entre as camadas. A função auxiliar que cria um wrapper para os deslocamentos mantém o código "DRY" ("NÃO SE REPITA").
//+------------------------------------------------------------------+ //| OnTimer: redraw | //+------------------------------------------------------------------+ void OnTimer() { // reposition canvases SetCanvas("EvC",InpPositionTop,InpTopOffset); SetCanvas("NwC",InpPositionTop,InpTopOffset+3*lineH); if(InpSeparateLanes) { SetCanvas("RsiC",InpPositionTop,InpTopOffset+4*lineH); SetCanvas("StoC",InpPositionTop,InpTopOffset+5*lineH); SetCanvas("MacC",InpPositionTop,InpTopOffset+6*lineH); SetCanvas("CciC",InpPositionTop,InpTopOffset+7*lineH); } else { SetCanvas("AllC",InpPositionTop,InpTopOffset+4*lineH); } // refresh data ReloadEvents(); FetchAlphaVantageNews(); // resize if needed int wNew=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS); if(wNew!=canvW) { canvW=wNew; ObjectSetInteger(0,"EvC",OBJPROP_WIDTH,canvW); ObjectSetInteger(0,"NwC",OBJPROP_WIDTH,canvW); if(InpSeparateLanes) { ObjectSetInteger(0,"RsiC",OBJPROP_WIDTH,canvW); ObjectSetInteger(0,"StoC",OBJPROP_WIDTH,canvW); ObjectSetInteger(0,"MacC",OBJPROP_WIDTH,canvW); ObjectSetInteger(0,"CciC",OBJPROP_WIDTH,canvW); } else { ObjectSetInteger(0,"AllC",OBJPROP_WIDTH,canvW); } } // draw events DrawAll(); // draw news newsCanvas.Erase(ARGB(170,0,0,0)); string nt = totalNews>0?newsHeadlines[0]:placeholder; newsCanvas.TextOut(offNews,(lineH-newsCanvas.TextHeight(nt))/2, nt,XRGB(255,255,255),ALIGN_LEFT); offNews-=InpNewsSpeed; if(offNews+newsCanvas.TextWidth(nt)<-20) offNews=canvW; // draw insights if(InpSeparateLanes) { string t; t=ComputeRSIInsight(); rsiCanvas.Erase(ARGB(120,0,0,0)); rsiCanvas.TextOut(offRSI,(lineH-rsiCanvas.TextHeight(t))/2, t,XRGB(180,220,255),ALIGN_LEFT); offRSI-=InpInsightSpeed; if(offRSI+rsiCanvas.TextWidth(t)<-20) offRSI=canvW; t=ComputeStochInsight(); stochCanvas.Erase(ARGB(120,0,0,0)); stochCanvas.TextOut(offStoch,(lineH-stochCanvas.TextHeight(t))/2, t,XRGB(180,220,255),ALIGN_LEFT); offStoch-=InpInsightSpeed; if(offStoch+stochCanvas.TextWidth(t)<-20) offStoch=canvW; t=ComputeMACDInsight(); macdCanvas.Erase(ARGB(120,0,0,0)); macdCanvas.TextOut(offMACD,(lineH-macdCanvas.TextHeight(t))/2, t,XRGB(180,220,255),ALIGN_LEFT); offMACD-=InpInsightSpeed; if(offMACD+macdCanvas.TextWidth(t)<-20) offMACD=canvW; t=ComputeCCIInsight(); cciCanvas.Erase(ARGB(120,0,0,0)); cciCanvas.TextOut(offCCI,(lineH-cciCanvas.TextHeight(t))/2, t,XRGB(180,220,255),ALIGN_LEFT); offCCI-=InpInsightSpeed; if(offCCI+cciCanvas.TextWidth(t)<-20) offCCI=canvW; } else { combinedCanvas.Erase(ARGB(120,0,0,0)); string txt=ComputeAllInsights(); combinedCanvas.TextOut(offCombined,(lineH-combinedCanvas.TextHeight(txt))/2, txt,XRGB(180,220,255),ALIGN_LEFT); offCombined-=InpInsightSpeed; if(offCombined+combinedCanvas.TextWidth(txt)<100) offCombined=canvW; } // batch update eventsCanvas.Update(true); newsCanvas. Update(true); if(InpSeparateLanes) { rsiCanvas. Update(true); stochCanvas.Update(true); macdCanvas. Update(true); cciCanvas. Update(true); } else { combinedCanvas.Update(true); } }
6. Limpeza em OnDeinit
A limpeza correta evita bitmaps perdidos e timers órfãos. Cada CreateBitmapLabel em OnInit corresponde a um Destroy seguido de ObjectDelete em OnDeinit, e o timer é desativado para eliminar qualquer callback acidental. A remoção explícita de quaisquer objetos dinâmicos, como instâncias de eventos, conclui uma limpeza robusta.
//+------------------------------------------------------------------+ //| OnDeinit: cleanup | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); eventsCanvas.Destroy(); ObjectDelete(0,"EvC"); newsCanvas.Destroy(); ObjectDelete(0,"NwC"); if(InpSeparateLanes) { rsiCanvas.Destroy(); ObjectDelete(0,"RsiC"); stochCanvas.Destroy();ObjectDelete(0,"StoC"); macdCanvas.Destroy(); ObjectDelete(0,"MacC"); cciCanvas.Destroy(); ObjectDelete(0,"CciC"); } else { combinedCanvas.Destroy();ObjectDelete(0,"AllC"); } for(int i=0;i<ArraySize(highArr);i++) delete highArr[i]; for(int i=0;i<ArraySize(medArr);i++) delete medArr[i]; for(int i=0;i <ArraySize(lowArr);i++) delete lowArr[i]; ArrayResize(newsHeadlines,0); }
Com a integração adequada dos novos componentes ao código existente do artigo anterior, agora temos uma versão atualizada do nosso programa que permite analisar indicadores em tempo real. Na próxima seção, apresentaremos os resultados dos testes dessas funções recém-adicionadas e, em seguida, resumiremos os principais aprendizados obtidos durante o desenvolvimento.
Testes
No MetaTrader 5, você pode testar o EA arrastando-o para o gráfico a partir da seção "EAs" no painel "Navegador". A partir da versão 1.04, o EA "Manchetes de notícias" agora inclui análise integrada de indicadores. A figura abaixo mostra como alternar entre o modo de visualização padrão com uma única faixa e o modo de visualização com faixas separadas usando os parâmetros de entrada do EA. Observe que a chave de API foi deixada intencionalmente em branco por motivos de segurança e deve ser inserida manualmente antes do uso.

Teste de novas funções
Assim que a chave de API da Alpha Vantage for adicionada, as manchetes de notícias serão exibidas junto com nossos novos dados analíticos integrados dos indicadores, mostrados abaixo.

EA "Manchetes de notícias" com a função "Análise de indicadores"
Testei o EA usando o Testador de Estratégias e, embora as faixas desenhadas no canvas fossem exibidas, elas não continham dados. Provavelmente, isso ocorre porque o acesso às informações necessárias, como notícias e valores dos indicadores, precisa ocorrer em tempo real, o que não é totalmente suportado pelo testador.
Conclusão
Com tudo isso reunido, conseguimos transformar nossa ideia em algo funcional. Demonstramos a possibilidade de criar uma ferramenta gráfica integrada que fornece as informações essenciais para trading: eventos do calendário econômico, manchetes de notícias financeiras e análise de indicadores baseada em regras, tudo em uma interface compacta e visualmente acessível.
A inclusão de dados analíticos dos indicadores é especialmente valiosa para os traders, pois oferece uma leitura imediata das condições de mercado, ajudando os usuários a tomar decisões fundamentadas sem alternar entre várias subjanelas de indicadores ou gráficos. Isso aumenta a eficiência e economiza espaço valioso na tela.
Do ponto de vista do desenvolvimento, aprofundamos nossa compreensão de como extrair dados dos indicadores nativos do MetaTrader 5 e processá-los com a API MQL5. Usando a flexibilidade da classe CCanvas, conseguimos apresentar esses dados em um formato visualmente claro e simplificado, melhorando a experiência de uso. Este projeto demonstrou as possibilidades de personalização da interface de software em MQL5 e também estabeleceu a base para melhorias futuras, como informações dos analistas ou integração de indicadores personalizados que podem aumentar ainda mais a utilidade da ferramenta.
Abaixo, preparei uma tabela-resumo com os principais aprendizados obtidos nesta discussão. O código-fonte completo está anexado no final do artigo. Convidamos você a participar da conversa compartilhando suas ideias e opiniões nos comentários. Sua contribuição é muito valorizada!
Principais aprendizados
| Aprendizado | Descrição |
|---|---|
| Separação de responsabilidades | O uso de objetos canvas separados para eventos, notícias e análise de indicadores aumenta a modularidade do código e oferece flexibilidade de layout e estilo. |
| Uso da classe CCanvas | Proporciona uma renderização suave de texto personalizado e texto personalizado e elementos visuais no gráfico, permitindo melhorias personalizadas de interface que vão além dos objetos padrão do MetaTrader 5. |
| Lógica de animação da rolagem | O controle das variáveis de deslocamento ajuda a criar elementos textuais com rolagem horizontal suave, o que é ideal para exibições dinâmicas, como feeds de notícias e resumos de indicadores. |
| Princípio "NÃO SE REPITA" | A criação de funções auxiliares, como SetCanvas, permite manter o código limpo, reutilizável e mais fácil de manter, evitando repetições. |
| Integração com APIs | O uso de WebRequest para obter dados externos mostra como o MetaTrader 5 pode ser ampliado por meio de serviços de terceiros, como provedores de notícias financeiras. |
| Limitações de acesso a dados em tempo real | Dados em tempo real, como eventos econômicos e notícias de mercado, muitas vezes exigem acesso em tempo real, o que pode não funcionar no ambiente do Testador de Estratégias. |
| Uso de indicadores nativos | O acesso aos buffers de indicadores padrão, como RSI, MACD e CCI, e sua interpretação permitem gerar automaticamente informações analíticas diretamente no código. |
| Interface de usuário compacta | A combinação de vários fluxos de dados em uma única faixa com rolagem ajuda a reduzir o excesso de elementos nos gráficos, ao mesmo tempo em que oferece todas as informações necessárias em um só lugar. |
| Posicionamento dinâmico dos objetos canvas | Alterar a posição dos objetos canvas de acordo com as preferências do usuário e as dimensões do gráfico proporciona um layout interativo e adaptável. |
| Controle de versões e acompanhamento de recursos | Manter números de versão claros ajuda a rastrear alterações, documentar a evolução do desenvolvimento e comunicar atualizações de forma eficiente a usuários e desenvolvedores. |
Conteúdo do anexo
| Arquivo | Versão | Descrição |
|---|---|---|
| News Headline EA.mq5 | 1.04 | EA que exibe eventos do calendário econômico e manchetes de notícias do mercado em tempo real diretamente no gráfico por meio do MQL5 Canvas e da API Alpha Vantage, além de informações técnicas provenientes dos indicadores. |
Traduzido do Inglês pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/en/articles/18528
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
Esse artigo foi escrito por um usuário do site e reflete seu ponto de vista pessoal. A MetaQuotes Ltd. não se responsabiliza pela precisão das informações apresentadas nem pelas possíveis consequências decorrentes do uso das soluções, estratégias ou recomendações descritas.
Caminhe em novos trilhos: Personalize indicadores no MQL5
Operando opções sem opções (Parte 2): Uso em operações reais
Está chegando o novo MetaTrader 5 e MQL5
Do iniciante ao especialista: Criação de um EA de notícias animado em MQL5 (II)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso