Indikátor vypadá takto:
Zde je seznam požadavků na indikátor:
- Indikátor by měl samostatně (bez pomoci uživatele) stáhnout potřebné soubory událostí kalendáře pro aktuální týden.
- Indikátor by měl zobrazit všechny události (jak minulé tak budoucí) z tohoto souboru v podobě svislých čar s událostními titulky.
- Indikátor by měl průběžně aktualizovat události z externího zdroje.
Poté, co jsme zadali úkol, můžeme analyzovat některé technické detaily.
Technická část
Zkusme použít stránky http://www.dailyfx.com/calendar/ jako externí zdroj. Výhodou tohoto zdroje je, že umožňuje stahovat kalendář ekonomických zpráv s rozšířenim .csv, a tak se vyhnout potížím s prácí s html soubory. Zde je odkaz na kalendář ekonomických zpráv pro aktuální týden: http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv.
Nyní se zaměříme na proces stahování souborů z internetu. To lze provést pomocí dobře známého program GetRight. Ten lze stáhnout na adrese: http://www.getright.com/get.html nebo ze seznamu příloh k tomuto článku.
Poté, co jste si stáhli program, nastavte GetRight pro stahování souborů do potřebného adresáře. Je to do \ files \ html \ directory ve složce vašeho obchodního terminálu. K tomu účelu stiskněte klávesu F8 a zapište údaje, jak je popsáno níže:
Psaní zdrojového kódu indikátoru
Nyní, když jsme si zodpověděli pár otázek, můžeme začít psát indikátor.
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);
Existují pouze dvě externí proměnné: adresa externího zdroje (ve skutečnosti, nemusíte měnit tento parametr), a adresa programu GetRight (pokud jste si stáhli program do jiného adresáře, doporučuji změnit výchozí hodnoty v indikátoru, aby nedošlo ke změně hodnoty proměnné ukazující na návěští start). Chcete-li spustit soubor GetRight.exe budete muset použít funkci WinExec, která může být natažena z knihovny Kernel32.dll. Knihovna Time.mqh obsahuje funkce pro práci s GMT.
void DownloadCalendar()
{
Print("Downloading "+HtmlAdress+" to C:\MetaTrader4\experts\files\html\Calendar.csv");
WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /C:\MetaTrader4\experts\files\html\Calendar.csv /W /O",0);
}
Jak je vidět, díky využití programu GetRight stahování souborů z externích zdrojů je velmi jednoduché. Parametr / W označuje, že proces nebude vrácen do programu, dokud stažení souboru není dokončeno. Parametr / O znamená, že pokud existuje soubor se stejným názvem, bude přepsán. Pamatujte si, že pokud jste změnili nastavení GetRight správně, bude kalendář stáhnut do \ files \ html \. A tady jsou dvě další funkce:
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);
}
Funkce PerviousMonday () vrací datum zahájení běžného týdne. Funkce ToDate () převádí datum a čas z kalendáře do formátu datatime.
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))
{
Print("313");
string stDate="";
while (!FileIsEnding(file)&&stDate=="")
// Print("314");
stDate = FileReadString(file);
//Print("314");
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);
}
Hlavní procedura GrabNews () otevře stažený soubor \ Html \ Calendar. csv, načte všechny událostní parametry a vytvoří dva objekty pro každou zprávu: svislou čáru a text. Kalendář událostí je aktualizován každých 15 minut:
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);
}
Závěr
Tento článek vysvětluje, jak zobrazit Kalendář událostí z vnějších zdrojů na pracovní plochu v podobě vertikálních linek. Tento indikátor byl záměrně napsán bez nadměrných parametrů, jako je filtrování zpráv podle jejich významu, nebo korespondence události a symbolu aktuálního okna.
Závěrečné poznámky:
Chtěl bych poukázat na chybu v kalendáři operací na http://www.dailyfx.com/calendar/. Upozorňuji, že někdy události v souboru .csv z adresy
http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv
nejsou totožné s událostmi na stránce
http://www.dailyfx.com/calendar/.
K tomu může dojít tak, že zprávy jsou zveřejněny od 00:00 do 01:00 (GMT). V souboru .csv jsou takové zprávy indikovány o12 hodin později.
Rovněž upozorňujeme, že indikátor používá externí dll (kernell32.dll), takže nezapomeňte na odpovídající parametr v nastavení indikátoru.
Soubor CalendarArticle.mq4 by měl být uložen ve složce \ experts \ indicators. Time.mq4 by měl být uložen v experts\ library, Time.mqh - v experts \ include.
Překlád z ruštiny pro MetaQuotes Software Corp.
Původní článek: http://articles.mql4.com/ru/520
Přílohy:
CalendarArticle.mq4 (4.9 Kb)
getright_setup.zip (4.7 Mb)
Time.mq4 (2.0 Kb)
Time.mqh (750 bytes)