Die Anzeige eines Nachrichtenkalenders
Slobodov Gleb | 9 Februar, 2016
Einführung
- Der Indikator sollte unabhängig (d.h. ohne die Hilfe des Nutzers) eine benötigte Datei des Veranstaltungskalenders für die laufende Woche herunterladen.
- Der Indikator sollte alle Ereignisse und Veranstaltungen (sowohl in der Vergangenheit als auch in der Zukunft) aus dieser Datei in Form von vertikalen Linien mit den Schlagzeilen der einzelnen Nachrichten anzeigen.
- Der Indikator sollte die Aktualisierung eines Ereignisses oder einer Veranstaltung auf die externe Ressource zurückverfolgen.
Technischer Teil
Jetzt wollen wir uns einmal den Prozess des Herunterladens der Datei aus dem Internet genauer anschauen. Dies kann man durch die Benutzung eines wohlbekannten Programms erledigen, und zwar GetRight. Dieses Programm können Sie unter diesem Link herunterladen: http://www.getright.com/get.html oder alternativ auch aus der Liste von Anhängen zu diesem Artikel.
Nachdem Sie das Programm heruntergeladen und installiert haben, sollten Sie GetRight so einstellen, dass man damit die Dateien in ein zu diesem Zwecke zu erstellendes Verzeichnis herunterladen kann. Hierbei handelt es sich um den folgenden Ordner in Ihrem Handelsterminal:\files\html\. Um dies zu tun, drücken Sie F8 und ändern Sie den Eintrag in dem Feld wie unten beschrieben:
Das Erstellen des Indikators
Jetzt, da wir einige vorbereitende Fragen beantwortet haben, können wir mit der Erstellung des Indikators beginnen.
extern string HtmlAdress = "http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv"; extern string GetrightAdress = "c:\progra~1\getright\getright.exe"; #include <Time.mqh> #import "kernel32.dll" int WinExec(string NameEx, int dwFlags);
Es gibt lediglich zwei externe Variablen: Die Adresse der externen Ressource (tatsächlich müssen Sie diesen Parameter überhaupt nicht verändern), und die Adresse des Programms GetRight (falls Sie das Programm in ein anderes Verzeichnis heruntergeladen haben sollten, so empfehle ich Ihnen, den ursprünglichen Wert in Indikator zu ändern, damit nicht der Wert der Variable jedes Mal beim Start des Indikators verändert wird). Um die Datei GetRight.exe auszuführen, müssen wir auf die Funktion WinExec zurückgreifen, die wir aus der Kernel32.dll-Bibliothek importieren können. Die Bibliothek Time.mqh enthält Funktionen zur Arbeit mit GMT.
void DownloadCalendar() { Print("Downloading "+HtmlAdress+" to experts\files\html\Calendar.csv"); WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0); }
Wie Sie sehen können, gestaltet sich die Programmfunktion des Herunterladens der Datei von der externen Ressource dank der Verwendung des Programms GetRight denkbar einfach. Der Parameter /W bedeutet, dass dieser Prozess nicht in das Programm zurückgeführt werden wird, solange das Herunterladen der Datei nicht erfolgreich abgeschlossen wurde. Der Parameter /O bedeutet, dass im Falle, dass es eine Datei mit demselben Namen im Zielverzeichnis geben sollte, diese Datei überschrieben werden wird. Beachten Sie hierbei, dass die Kalender-Datei in das Verzeichnis \files\html\ heruntergeladen werden wird, falls Sie die Einstellungen von GetRight vorschriftsgemäß geändert haben sollten. Und hier sind noch zwei zusätzliche Funktionen :
datetime PerviousMonday(datetime d) { datetime res = d - (TimeDayOfWeek(d)-1)*24*60*60; return(res); } datetime ToDate(string stDate,string stTime) { string WeekDay = StringSubstr(stDate,0,3); int WeekPlus = 0; if (WeekDay=="Mon") WeekPlus=0; if (WeekDay=="Tue") WeekPlus=1; if (WeekDay=="Wed") WeekPlus=2; if (WeekDay=="Thu") WeekPlus=3; if (WeekDay=="Fri") WeekPlus=4; if (WeekDay=="Sat") WeekPlus=5; if (WeekDay=="Sun") WeekPlus=-1; datetime Res = PerviousMonday(GetTimeGMT())+WeekPlus*24*60*60; datetime Tm = StrToTime(stTime); Res=Res+TimeHour(Tm )*60*60+TimeMinute(Tm )*60+TimeSeconds(Tm ) -TimeHour(Res)*60*60-TimeMinute(Res)*60-TimeSeconds(Res); if (StringFind(stTime,"PM")>=0) Res+=12*60*60; Res=Res-GetShiftGMT(); return (Res); }
Die Funktion PerviousMonday() gibt das Startdatum der aktuellen Woche aus. Die Funktion ToDate() transferiert das Datum und die Zeit aus dem Kalenderformat in Daten-Zeit.
void GrabNews() { int file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,','); if (file==-1||FileSize(file)==0) return; int i=0; while (!FileIsEnding(file)) { string stDate=""; while (!FileIsEnding(file)&&stDate=="") stDate = FileReadString(file); string stTime = FileReadString(file); string stTimeZone = FileReadString(file); string stCurrency = FileReadString(file); string stDescription = FileReadString(file); string stImportance = FileReadString(file); string stActual = FileReadString(file); string stForecast = FileReadString(file); string stPrevious = FileReadString(file); datetime Date = ToDate(stDate,stTime); color c=Green; if (stImportance=="Low") c = Yellow; if (stImportance=="Medium") c = Orange; if (stImportance=="High") c = Red; ObjectCreate("CalendarText"+i, OBJ_TEXT, 0, Date, Close[0]); ObjectSet("CalendarText"+i, OBJPROP_COLOR, c); ObjectSetText("CalendarText"+i, stDate + " : "+ stDescription, 8); ObjectSet("CalendarText"+i, OBJPROP_ANGLE, 90); ObjectCreate("CalendarLine"+i, OBJ_VLINE, 0, Date, Close[0]); ObjectSet("CalendarLine"+i, OBJPROP_COLOR, c); ObjectSet("CalendarLine"+i, OBJPROP_STYLE, STYLE_DOT); ObjectSet("CalendarLine"+i, OBJPROP_BACK, true); ObjectSetText("CalendarLine"+i, stDescription, 8); i++; } Max = i; if (file!=-1) FileClose(file); }
Der Hauptprozess GrabNews() öffnet die heruntergeladene Datei\Html\Calendar.csv, liest alle Veranstaltung- und Ereignisparameter aus, und erstellt zwei Objekte für jede neue Nachricht: Eine vertikale Linie und einen Text. Der Veranstaltungskalender wird automatisch alle 15 Minuten aktualisiert :
int start() { int counted_bars=IndicatorCounted(); //---- if (TimeCurrent()>LastTimeDownloading+15*60) { DeleteObjects(); DownloadCalendar(); LastTimeDownloading = TimeCurrent(); int file=-1; while (file==-1) file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,','); FileClose(file); GrabNews(); } //---- return(0); }
Fazit
PS: Ich möchte Sie hiermit auf einen Fehler in der Kalender-Funktion aufmerksam machen: http://www.dailyfx.com/calendar/. Bitte beachten Sie, dass manchmal Veranstaltungen in der .csv-Datei von der Adresse http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv nicht identisch sind mit der Seite http://www.dailyfx.com/calendar/. Dies kann bei Nachrichten der Fall sein, die zwischen 0:00 Uhr und 1:00 Uhr (GMT) veröffentlicht werden. In der.csv-Datei sind solche Nachrichten dann so angegeben, als ob sie erst 12 Stunden später herausgekommen wären.
Beachten Sie bitte ebenfalls, dass der Indikator eine externe dll (kernell32.dll) verwendet – vergessen Sie also nicht, den korrespondierenden Parameter in den Indikatoreinstellungen zu aktivieren.
Die Datei CalendarArticle.mq4 sollte im Ordner \experts\indicators abgespeichert werden. Time.mq4 sollte im Ordner expers\library abgespeichert werden, und die Datei Time.mqh im Ordner experts\include.