English Русский 中文 Español Deutsch Português
新しいカレンダーの表示

新しいカレンダーの表示

MetaTrader 4 | 15 3月 2016, 14:10
519 0
Slobodov Gleb
Slobodov Gleb

はじめに


本稿では、外部インターネットリソースからの主要な経済的イベントを作業エリアに表示するシンプルで便利なインディケータを書くことについて説明します。インディケータの動作は以下のようなものです。


次はインディケータに対する要件リストです。
  • インディケータは独立して(ユーザーの助けなしに)当週についてのイベントカレンダーの必要なファイルをダウンロードします。
  • インディケータは、このファイルからニュースの見出しを持つ縦線の形式でこのファイルからすべてのイベント(過去および将来)を表示します。
  • インディケータは外部リソースでイベントの更新を追跡します。
タスク特定後、技術的な詳細次項の一部を分析します。


技術部分


外部情報源としてウェブサイト http://www.dailyfx.com/calendar/ を利用します。このリソースが便利な点は、.csv 拡張子を持つカレンダーをダウンロードし、 html ファイルで作業するむつかしさを避けることができることです。以下は当週のニュースへのリンクです:http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv

これからインターネットからファイルをダウンロードする手順について説明します。これはよく知られるプログラム 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

添付されたファイル |
getright_setup.zip (4763.33 KB)
Time.mq4 (2.03 KB)
Time.mqh (0.73 KB)
等量チャート再訪 等量チャート再訪
本稿では、チャート構築方法を詳しく説明します。それらチャートでは、各バーが同数のティックで構成されています。
インディケータTaichi - 一目均衡表の値を公式化するシンプルな考え方 インディケータTaichi - 一目均衡表の値を公式化するシンプルな考え方
一目の信号を解釈するのはむつかしいですか?本稿では、一目均衡表の値と信号を公式化する基本をいくつか紹介します。その使用を可視化するために、私は自分の好みに応じて通貨ペア EURUSD を選択しました。ただしインディケータはどんな通貨ペアにも使用可能です。
時間に基づくパターン分析への MetaTrader 4 利用 時間に基づくパターン分析への MetaTrader 4 利用
時間を基にしたパターン分析は、トレードに参入するより適した時刻または取引を完全に避けるべき時間を判断するために通貨市場で利用されます。ここでは、MetaTrader 4 を利用して、履歴市場データを分析し、自動取引システムに適用するのに便利な最適化結果を導きます。
自分の最適化基準を実装する方法 自分の最適化基準を実装する方法
本稿では、ファイルに元される結果を伴う利益/ドローダウン基準による最適化例を標準的 Expert Advisor-移動平均、向けに作成します。