English Русский 中文 Español Deutsch 日本語
Lendo Feeds de Notícias RSS Via MQL4

Lendo Feeds de Notícias RSS Via MQL4

MetaTrader 4Exemplos | 30 setembro 2015, 09:05
1 083 0
vgs
vgs


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:

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

Arquivos anexados |
HTMLTagsLib.mqh (10.02 KB)
NewsRSS.mq4 (6.03 KB)
Controle Gráfico dos Parâmetros Externos dos Indicadores Controle Gráfico dos Parâmetros Externos dos Indicadores
Variáveis externas de indicadores são controladas usando uma janela especial, onde os parâmetros podem ser alterados e então o indicador é executado novamente. O inconveniente óbvio destas manipulações deu origem à necessidade de exibir os parâmetros na tela e controlar o indicador graficamente.
LibMatrix: Biblioteca de Álgebra Matricial (Parte I) LibMatrix: Biblioteca de Álgebra Matricial (Parte I)
O autor familiariza os leitores com uma simples biblioteca de álgebra matricial e fornece descrições e peculiaridades das principais funções.
Alert e Comment para Indicadores Externos. Análise de Multimoedas Através de Varredura Externa Alert e Comment para Indicadores Externos. Análise de Multimoedas Através de Varredura Externa
Alerta para análise de multimoedas e múltiplos timeframes para indicadores externos. O artigo trata de um método para obter informações sobre o evento em relação aos acontecimentos com indicadores externos, sem a necessidade de anexar indicadores a um gráfico ou aos próprios gráficos abertos. Vamos chamá-lo de varredura externa.
Sistema de Negociação Mecânica "Triângulo de Chuvashov's" Sistema de Negociação Mecânica "Triângulo de Chuvashov's"
Deixe-me oferecer-lhe uma visão geral e um código de programa do sistema de negociação mecânica baseado nas ideias de Stanislav Chuvashov. A construção do triângulo é baseada na intersecção de duas linhas de tendência construídas pelos fractais de alta e de baixa.