新しいカレンダーの表示
はじめに
- インディケータは独立して(ユーザーの助けなしに)当週についてのイベントカレンダーの必要なファイルをダウンロードします。
- インディケータは、このファイルからニュースの見出しを持つ縦線の形式でこのファイルからすべてのイベント(過去および将来)を表示します。
- インディケータは外部リソースでイベントの更新を追跡します。
技術部分
これからインターネットからファイルをダウンロードする手順について説明します。これはよく知られるプログラム GetRight によって行えます。http://www.getright.com/get.html から、または本稿添付のリストからダウンロードできます。
プログラムをダウンロードしたら、ダウンロードファイルに対し GetRight を必要なディレクトリに設定します。それはトレーディングターミナルのフォルダ内の \files\html\ ディレクトリです。このために、F8 を押し、フィールド内の記述を以下の記載通りに変更します。:
インディケータのプログラミング
いくつかの疑問にお答えしたので、これでインディケータのプログラミングを始めます。
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);
外部変数は2つだけです。外部リソースのアドレス(実際、このパラメータは変更する必要がありません)と GetRight プログラムのアドレス(プログラムを別のファイルにダウンロードするなら、インディケータを起動するたびに変数値を絶えず変更することのないように、インディケータの初期値を変更することをお薦めします)。ファイル GetRight.exe を起動するには、Kernel32.dll ライブラリからインポートできる関数 WinExec を使用する必要があります。ライブラリ Time.mqh には GMT と連携する関数が入っています。
void DownloadCalendar() { Print("Downloading "+HtmlAdress+" to experts\files\html\Calendar.csv"); WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0); }
ごらんのように、GetRight プログラムの使用により、外部リソースからファイルをダウンロードする関数はひじょうにシンプルです。パラメータ /W はファイルのダウンロードが管廊しない限りプログラム内で手順が戻されないことを示します。パラメータ /O は、同名ファイルがある場合、上書きされることを示します。GetRight の設定を正しく変更したら、カレンダーは \files\html\ にダウンロードされることを覚えておいてください。以下は追加の関数2つです。
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); }
関数PerviousMonday() は当週の開始日付を返します。関数 ToDate() は日付と時刻をカレンダー形式から 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)) { 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); }
メインの手順 GrabNews() はダウンロード済みファイル\Html\Calendar. csv を開き、すべてのイベントパラメータを読み出し、各ニュースに対してオブジェクトを2つ作成します。それは縦線とテキストです。イベントカレンダーは15分ごとに更新されます。
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); }
おわりに
追記 カレンダー処理 http://www.dailyfx.com/calendar/のエラーを指摘したいと思います。アドレス http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv からのファイル .csv 内イベントはページ http://www.dailyfx.com/calendar/と一致していないことがあることにご注意ください。これは 00:00~ 01:00 (GMT)に発表されるニュースに起こる可能性があります。ファイル .csv ではそのようなニュースは12時間遅れて入れられます。
また、インディケータは外部 dll (kernell32.dll)を使っていることにも留意ください。そのためインディケータ設定で対応するパラメータを有効にすることを忘れないでください。
ファイルCalendarArticle.mq4 はフォルダ \experts\indicators に格納する必要があります。Time.mq4 は expers\library に、Time.mqh は experts\include に格納します。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1502
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索