RSS News Feeds lesen mit Mitteln von MQL4

vgs | 29 April, 2016

Einführung

Dieser Artikel befasst sich mit einem Beispiel des Lesens von RDD-Markup durch Mittel von MQL4 mit den Funktionen aus dem Artikel HTML Komplettlösung mit MQL4. Es wird angenommen, dass der Lese diesen Artikel gelesen hat und über ein allgemeines Verständnis der dort vorgestellten Ideen verfügt.



Was ist RSS und Warum Brauchen Wir Es in MQL4?

RSS ist ein XML-Format zum übertragen von Daten von einer Quelle zu einer anderen.

RSS wird aktiv verwendet von Nachrichtenagenturen, Unternehmen, sowie verschiedenen News-Webseiten.

RSS kann aggregiert (oder gelesen) werden durch eine Vielzahl spezieller Anwendungen (Reader), und in einer komfortablen Form an Nutzer ausgeliefert werden. In diesem Artikel werden wir versuchen ein Arbeitsstück anzufertigen, das in einen News-Indikator oder einfach in einen RSS-Reader in MQL4 Sprache geändert werden kann. Welche Arten an Informationen interessieren uns in RSS? Es sind die Nachrichten, natürlich.

Wie oben bereits erwähnt, ist RSS ein XML-Dokument. also, was ist XML?

XML (eXtensible Markup Language) ist ein Textformat zum Speichern strukturierter Daten. Die Daten können visuell als ein Baum aus Elementen dargestellt werden. XML-Elemente werden durch die Tags beschrieben.

Im Folgenden ist ein einfaches XML-Dokument:

<!--?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>


Umsetzung

Wie wir in dem obigen Beispiel sehen können, ähnelt XML in gewisser Weise HTML. Deshalb, und um "das Rad nicht neu zu erfinden", werden wir den Code aus dem Artikel HTML Komplettlösung mit MQL4 verwenden.

Das erste, was wir machen müssen, ist die HTML-Walkthough Funktionen mit unserm Projekt (Indikator) zu verbinden. Dafür laden Sie die ReportHTMLtoCSV-2.mq4 Datei herunter und platzieren sie in den experts/include Ordner. Da wir diese Datei als Funktionsbibliothek verwenden werden, sollte die start() Funktion in ihr auskommentiert werden.

Ich möchte außerdem vorschlagen die Datei umzubenennen (zum Beispiel in HTMLTagsLib.mq4) für mehr Klarheit.

Die Datei ist fertig. Jetzt verbinden Sie sie mit dem Indikator (die Arbeitsstück-Datei ist unten an den Artikel angehangen):

#include <htmltagslib.mq4>

Nun müssen wir die wininet.dll Windows Standard-Bibliothek einfügen, um mit den Links zu arbeiten:

#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

Wir werden die ReadWebResource(String url) zum Lesen der URL verwenden. Die Arbeitsweise des Funktion ist kein Thema in diesem Artikel. Daher werden wir nicht näher auf sie eingehen.

Wir sind nur an den Eingabe- und Ausgabe-Argumenten interessiert. Die Funktion empfängt einen Link zum Lesen und gibt den Inhalt der Ressource als String zurück.

Um die Tags zu analysieren, verwenden wir zwei Funktionen von der HTMLTagsLib.mq4 Datei - FillTagStructure() und GetContent(). Diese Funktionen werden ausführlich beschrieben in dem Artikel HTML Komplettlösung mit MQL4. Es ist zu beachten, dass Eingabedaten für die Analyse als ein Array übergeben werden. daher müssen sie, nachdem sie empfangen wurden, mit der Funktion ReadWebResource(string url) in ein Array konvertiert werden.

Die ArrayFromString() wird uns dabei behilflich sein:

//+------------------------------------------------------------------+
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);
}

Drei Argumente werden an die Eingabe der Funktion übergeben. Das erste ist der Link zu dem Array, wo das Betriebsergebnis der Funktion gespeichert wird. Das zweite ist ein String, der in ein Array konvertiert werden muss und das dritte ist ein Trennzeichen, durch welches der String unterteilt wird. Die Funktion gibt die Anzahl der Zeilen des resultierenden Arrays zurück.

Jetzt sind unsere Daten fertig für die Analyse.

In dem nächsten Fragment analysieren wir Daten und zeigen die Werte von Title- und Country-Tags in der Terminal-Konsole an:

   string webRss = ReadWebResource(rssUrl);
   int i, stringsCount = ArrayFromString(webResData, webRss, ">");      
            
   string tags[];    // array for storing the tags
   int startPos[][2];// tag start coordinates
   int endPos[][2];  // tag end coordinates
   
   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>")
         {// coordinates of the initial position for selecting the content between the tags
            start[0][0] = endPos[i][0];
            start[0][1] = endPos[i][1];
         }
                 
      if (currTag == "</title>")
         {// coordinates of the end position for selecting the contents between the tags
            end[0][0] = startPos[i][0];
            end[0][1] = startPos[i][1];
            text = text + GetContent(webResData, start, end) + ";";
         }

      if (currTag == "<country>")
         {// coordinates of the initial position for selecting the content between the tags
            start[0][0] = endPos[i][0];
            start[0][1] = endPos[i][1];
         }
                       
      if (currTag == "</country>")
         {// coordinates of the end position for selecting the contents between the 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;");
         }

      }

Mit der FillTagStructure() Funktion empfangen wir die Anzahl und die Struktur der Tags, während die GetContent() Funktion und die Werte bereitstellt.

Skript Betriebsergebnisse:

Script operation results

Abb. 1. NewsRss Skript Betriebsergebnisse

In den Ergebnissen sehen wir den Nachrichten-Titel und das Währungs-Symbol des Landes, auf das die Nachrichten sich beziehen.



Fazit

Wir haben die Möglichkeit des Lesens von RSS mit den Mittel von MQL4, mit der Funktion für die HTML-Tags Analyse, untersucht. Die Nachteile dieses Verfahrens sind in dem Artikel HTML Komplettlösung mit MQL4. ich möchte nch hinzufügen, dass einer der Nachteile der Methode eine "Unannehmlichkeit" der Verwendung von Funktionen im Code ist, im Gegensatz zu anderen Standard-Bibliotheken zum Lesen von XML.

Nun, da der Artikel und das Skript abgeschlossen sind, werde ich die Verbindung der externen Bibliothek für die Arbeit mit XML betrachten. Was die Vorteile angeht, würde ich die Umsetzungsgeschwindigkeit als einen von ihnen nennen.