Lendo Feeds de Notícias RSS Via MQL4
Introdução
Este artigo trata de um exemplo da leitura de RSS via MQL4 utilizando as funções do artigo "HTML Demonstrado Passo a Passo Usando MQL4". Supõe-se que o leitor leu o artigo ou pelo menos tem a compreensão das ideias descritas nele.
O Que é RSS e Por que Precisamos Dele em MQL4?
RSS é um formato XML para transferência de vários dados de uma fonte para outra.
RSS é usado ativamente por agências de notícias, empresas, bem como em vários sites de notícias.
RSS podem ser agregados (ou lidos) por uma variedade de aplicações especiais (leitores) e entregues aos usuários numa forma prática. Neste artigo, vamos tentar fazer uma peça de trabalho que pode então ser transformada num indicador de notícias ou apenas um leitor de RSS na linguagem MQL4. Que tipo de informação que estamos interessados em RSS? É a notícia, é claro.
Como mencionado acima, RSS é um documento XML. Então, o que é XML?
XML (eXtensible Markup Language) é um formato de texto para armazenamento de dados estruturados. A estrutura pode ser representada visualmente como uma árvore de elementos. Elementos XML são descritos pelos tags.
Abaixo temos um exemplo de um documento XML simples:
<!--?xml version="1.0" encoding="windows-1252"?--> <weeklyevents> <event> <title>Rightmove HPI m/m</title> <country>GBP</country> <date><!--[CDATA[05-15-2011]]--></date> <time><!--[CDATA[23:01]]--></time> <impact><!--[CDATA[Medium]]--></impact> <forecast> <previous><!--[CDATA[1.7%]]--></previous> </forecast></event> </weeklyevents>
Implementação
Como podemos ver a partir do exemplo acima, XML é um pouco semelhante ao HTML. Portanto, a fim de não "reinventar a roda", vamos usar o código do artigo "HTML Demonstrado Passo a Passo Usando MQL4".
A primeira coisa que precisa fazer é conectar as funções HTML demonstradas passo a passo no nosso projeto (indicador). Para isto, faça o download do arquivo ReportHTMLtoCSV-2.mq4 e coloque na pasta experts/include. Uma vez que vamos usar o arquivo como uma biblioteca da função, a função start() deve ser comentada na mesma.
Também gostaria de sugerir a renomeação do arquivo (por exemplo, HTMLTagsLib.mq4), para obter mais clareza.
O arquivo está pronto. Agora, conecte-o ao indicador (o arquivo da peça de trabalho ao indicador está ligado a seguir):
#include <htmltagslib.mq4>
Agora precisamos incluir o arquivo da biblioteca padrão do Windows, wininet.dll, para trabalhar com os links:
#include <winuser32.mqh> #import "wininet.dll" int InternetAttemptConnect(int x); int InternetOpenA(string sAgent, int lAccessType, string sProxyName = "", string sProxyBypass = "", int lFlags = 0); int InternetOpenUrlA(int hInternetSession, string sUrl, string sHeaders = "", int lHeadersLength = 0, int lFlags = 0, int lContext = 0); int InternetReadFile(int hFile, int& sBuffer[], int lNumBytesToRead, int& lNumberOfBytesRead[]); int InternetCloseHandle(int hInet); #import
Usaremos a função ReadWebResource (string url) para leitura da URL. Operação da função não é um tema deste artigo. Portanto, não vamos insistir nisso.
Estamos interessados apenas nos argumentos de entrada e saída. A função recebe um link para ser lida e retorna o conteúdo do recurso como uma string.
A fim de analisar as tags, vamos usar duas funções do arquivo HTMLTagsLib.mq4 file: FillTagStructure() e GetContent(). Estas funções são descritas em detalhes no artigo "HTML Demonstrado Passo a Passo Usando MQL4". Deve ser observado que os dados de entrada para análise são transmitidos como um array, portanto após os dados terem sido recebidos, devem ser convertidos em array usando a função ReadWebResource (string url).
A função ArrayFromString() irá ajudar no seguinte:
//+------------------------------------------------------------------+ int ArrayFromString(string & webResData[], string inputStr, string divider) { if (inputStr == "") { Print ("Input string is not set"); return(0); } if (divider == "") { Print ("Separator is not set"); return(0); } int i, stringCounter = 0; string tmpChar, tmpString, tmpArr[64000]; int inputStringLen = StringLen(inputStr); for (i = 0; i < inputStringLen; i++ ) { tmpChar = StringSubstr(inputStr, i, 1); tmpString = tmpString + tmpChar; tmpArr[stringCounter] = tmpString; if (tmpChar == divider) { stringCounter++; tmpString = ""; } } if (stringCounter > 0) { ArrayResize(webResData, stringCounter); for (i = 0; i < stringCounter; i++) webResData[i] = tmpArr[i]; } return (stringCounter); }
Três argumentos são transmitidos para a entrada da função. O primeiro é o link do array, onde o resultado da operação da função é armazenado, o segundo é uma string que deve ser convertida num array e o terceiro é um separador, onde a string é dividida. A função retorna o número de linhas no array resultante.
Agora os nossos dados estão prontos para uma análise.
No próximo fragmento, analisamos dados e exibimos os valores de título e tags dos países no console do terminal:
string webRss = ReadWebResource(rssUrl); int i, stringsCount = ArrayFromString(webResData, webRss, ">"); string tags[]; // array para armazenar as tags int startPos[][2];// Coordenadas iniciais da tag int endPos[][2]; // Coordenadas finais da tag FillTagStructure(tags, startPos, endPos, webResData); int tagsNumber = ArraySize(tags); string text = ""; string currTag; int start[1][2]; int end[1][2]; for (i = 0; i < tagsNumber; i++) { currTag = tags[i]; if (currTag == "<weeklyevents>") { Print("News block start;"); } if (currTag == "<event>") { text = ""; start[0][0] = -1; start[0][1] = -1; } if (currTag == "<title>") {// Coordenadas da posição inicial para selecionar o conteúdo entre as tags start[0][0] = endPos[i][0]; start[0][1] = endPos[i][1]; } if (currTag == "</title>") {// Coordenadas da posição final para selecionar o conteúdo entre as tags end[0][0] = startPos[i][0]; end[0][1] = startPos[i][1]; text = text + GetContent(webResData, start, end) + ";"; } if (currTag == "<country>") {// Coordenadas da posição inicial para selecionar o conteúdo entre as tags start[0][0] = endPos[i][0]; start[0][1] = endPos[i][1]; } if (currTag == "</country>") {// Coordenadas da posição final para selecionar o conteúdo entre as tags end[0][0] = startPos[i][0]; end[0][1] = startPos[i][1]; text = text + GetContent(webResData, start, end) + " ;"; } if (currTag == "</event>") { Print(text); } if (currTag == "</weeklyevents>") { Print("end of the news;"); } }
Usando a função FillTagStructure(), recebemos o número e a estrutura das tags, enquanto que com a função getContent() é providenciado o seu valor.
Resultados da operação do script:
Fig. 1. Resultados da operação do script NewsRss
Nos resultados, podemos ver o título das notícias e do símbolo de moeda do país em que a notícia está relacionada.
Conclusões
Examinamos a maneira da leitura de RSS via MQL4, utilizando as funções para análise de tags HTML. As desvantagens deste método são descritas em detalhes no artigo "HTML Demonstrado Passo a Passo Usando MQL4". Gostaria também de acrescentar que uma das desvantagens do método é o "inconveniente" de usar as funções no código em contraste com outras bibliotecas padrão para leitura de XML.
Agora que o artigo e o script foram concluídos, vou considerar a conexão da biblioteca externa para trabalhar com XML. Quanto às vantagens, gostaria de citar a velocidade de implementação como uma delas.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1366
- 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