リリースノート(Build 2005)
スポンサーリンク

経済指標カレンダーのデータ取得が可能に!

https://www.metatrader5.com/ja/releasenotes

ここ最近は案件が立込んでいて、リリースノートをチェックしていませんでしたが、
ずっと欲しかった経済指標カレンダー機能が追加されていました!!!

元々、MQL5.com のWebサイト上で表示されていたカレンダーが、MT5のターミナルに統合されました。
これは本当にありがたいです。 指標前後のトレードを自動制御するには、どこかのWebサイトから
指標情報をスクレーピングし、独自管理をしなければならなかったのですが、それをする必要がなくなります。

しかも、MQLからのデータ取得に対応したため、プログラム上から

・売買通貨ペアに関連する経済指標の内、重要度が高いイベントのみを取得する
・特定イベントの前にはトレードを実施しないよう制御する
・予想値と結果を対比し、良い結果であれば買/売エントリーする

といったことが可能になりそうです。

 

CalendarEventByCurrency

指定された通貨でカレンダーで利用可能なすべてのイベントの説明の配列を取得します。

int  CalendarEventByCurrency( 
  const string         currency,    // 国の通貨のコード名 
  MqlCalendarEvent&    events[]     // 説明配列を受け取るための変数 
  );
//+------------------------------------------------------------------+ 
//| スクリプトプログラム開始関数                                              | 
//+------------------------------------------------------------------+ 
void OnStart() 
 { 
//--- 経済指標カレンダーを受け取るための配列を宣言する 
    MqlCalendarEvent events[]; 
//--- EU通貨イベントを取得する       
    int count = CalendarEventByCurrency("EUR",events); 
    Print("count = ", count); 
//--- この例では10イベントで足りる 
    if(count>10) 
        ArrayResize(events,10); 
//--- 操作ログにイベントを表示する         
    ArrayPrint(events); 
 } 
/* 
  結果: 
            [id] [type] [country_id] [unit] [importance]                                        [source_url]                                 [event_code]                                    [name] 
  [0] 999010001      0          999      0            2 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-non-monetary-policy-meeting"           "ECB Non-monetary Policy Meeting"                 
  [1] 999010002      0          999      0            2 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-monetary-policy-meeting-accounts"       "ECB Monetary Policy Meeting Accounts"           
  [2] 999010003      0          999      0            3 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-monetary-policy-press-conference"       "ECB Monetary Policy Press Conference"           
  [3] 999010004      0          999      0            3 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-president-draghi-speech"               "ECB President Draghi Speech"                     
  [4] 999010005      0          999      0            2 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-vice-president-vitor-constancio-speech" "ECB Vice President Constancio Speech"           
  [5] 999010006      1          999      1            3 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-deposit-rate-decision"                 "ECB Deposit Facility Rate Decision"             
  [6] 999010007      1          999      1            3 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-interest-rate-decision"                 "ECB Interest Rate Decision"                     
  [7] 999010008      0          999      0            2 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-economic-bulletin"                     "ECB Economic Bulletin"                           
  [8] 999010009      1          999      2            2 "https://www.ecb.europa.eu/home/html/index.en.html" "targeted-ltro"                             "ECB Targeted LTRO"                               
  [9] 999010010      0          999      0            2 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-executive-board-member-praet-speech"   "ECB Executive Board Member Praet Speech"         
*/  

importance で、指標の重要度判定ができそうです。

 

CalendarValueById

IDによってイベントの値を取得します。

bool  CalendarValueById( 
  ulong                value_id,    // イベント値ID 
  MqlCalendarValue&    value       // イベント値を受け取るための変数 
  );
//+------------------------------------------------------------------+ 
//| スクリプトプログラム開始関数                                              | 
//+------------------------------------------------------------------+ 
void OnStart() 
 { 
//--- 日本の国コード(ISO 3166-1 Alpha-2) 
  string japan_code="JP"; 
//--- イベントを取得する期間の境界を設定する 
  datetime date_from=D'01.01.2018'; // 2018のすべてのイベントを取得する 
  datetime date_to=0;               // 0はすべての既知イベント(今後起こるものを含む) 
//--- 日本のイベント値の配列を取得する 
  MqlCalendarValue values[]; 
  int values_count=CalendarValueHistory(values,date_from,date_to,japan_code); 
//--- 検知されたイベント値とともに移動する 
  if(values_count>0) 
    { 
    PrintFormat("Number of values for Japan events: %d",values_count); 
    //--- すべての「空の」値を削除する(actual_value==-9223372036854775808)       
    for(int i=values_count-1;i>=0;i--) 
       { 
        if(values[i].actual_value==-9223372036854775808) 
          ArrayRemove(values,i,1); 
       } 
    PrintFormat("Number of values after deleting empty ones: %d",ArraySize(values)); 
    } 
  else 
    { 
    PrintFormat("Failed to receive events for the country code %s, error %d", 
                 japan_code,GetLastError()); 
    //--- スクリプトが完了した 
    return; 
    } 
//--- values[]配列に10以上の値を残さない 
  if(ArraySize(values)>10) 
    { 
    PrintFormat("Reduce the list of values to 10 and display them"); 
    ArrayRemove(values,0,ArraySize(values)-10); 
    } 
  ArrayPrint(values); 
  
//--- 既知のvalue_idに基づいてイベント値の説明を取得する方法を表示する 
  for(int i=0;i<ArraySize(values);i++) 
    { 
    MqlCalendarValue value; 
    CalendarValueById(values[i].id,value); 
    PrintFormat("%d: value_id=%d value=%d impact=%s", 
                 i,values[i].id,value.actual_value,EnumToString(ENUM_CALENDAR_EVENT_IMPACT(value.impact_type))); 
    } 
//--- 
 } 
/* 
  結果: 
  Number of values for Japan events: 1734 
  Number of values after deleting empty ones: 1017 
  Reduce the list of values to 10 and display them 
       [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value] [forecast_value] [impact_type] [reserved] 
  [0] 56500  392030004 2019.03.28 23:30:00 2019.03.01 00:00:00          0         900000       600000 -9223372036854775808           500000             1          0 
  [1] 56501  392030005 2019.03.28 23:30:00 2019.03.01 00:00:00          0         700000       700000 -9223372036854775808           700000             0          0 
  [2] 56502  392030006 2019.03.28 23:30:00 2019.03.01 00:00:00          0        1100000      1100000 -9223372036854775808           900000             1          0 
  [3] 56544  392030007 2019.03.28 23:30:00 2019.02.01 00:00:00          0        2300000      2500000 -9223372036854775808          2200000             2          0 
  [4] 56556  392050002 2019.03.28 23:30:00 2019.02.01 00:00:00          0        1630000      1630000              1610000          1620000             1          0 
  [5] 55887  392020003 2019.03.28 23:50:00 2019.02.01 00:00:00          0         400000       600000 -9223372036854775808          1300000             2          0 
  [6] 55888  392020004 2019.03.28 23:50:00 2019.02.01 00:00:00          0       -1800000     -3300000 -9223372036854775808         -2000000             1          0 
  [7] 55889  392020002 2019.03.28 23:50:00 2019.02.01 00:00:00          0         200000     -2300000             -1800000           300000             2          0 
  [8] 55948  392020006 2019.03.28 23:50:00 2019.02.01 00:00:00          1        1400000     -3400000 -9223372036854775808          -300000             1          0 
  [9] 55949  392020007 2019.03.28 23:50:00 2019.02.01 00:00:00          1       -1000000       300000 -9223372036854775808          -100000             2          0 
  Display brief data on event values based on value_id 
  0: value_id=56500 value=900000 impact=CALENDAR_IMPACT_POSITIVE 
  1: value_id=56501 value=700000 impact=CALENDAR_IMPACT_NA 
  2: value_id=56502 value=1100000 impact=CALENDAR_IMPACT_POSITIVE 
  3: value_id=56544 value=2300000 impact=CALENDAR_IMPACT_NEGATIVE 
  4: value_id=56556 value=1630000 impact=CALENDAR_IMPACT_POSITIVE 
  5: value_id=55887 value=400000 impact=CALENDAR_IMPACT_NEGATIVE 
  6: value_id=55888 value=-1800000 impact=CALENDAR_IMPACT_POSITIVE 
  7: value_id=55889 value=200000 impact=CALENDAR_IMPACT_NEGATIVE 
  8: value_id=55948 value=1400000 impact=CALENDAR_IMPACT_POSITIVE 
  9: value_id=55949 value=-1000000 impact=CALENDAR_IMPACT_NEGATIVE

 

結果に対する影響(CALENDAR_IMPACT_NEGATIVE / CALENDAR_IMPACT_NEGATIVE ) という戻り値もあるんですね。
これで判定条件が書けそうです。

 

CalendarValueHistoryByEvent

イベントIDによって、指定された期間のすべてのイベントの値の配列を取得します。

bool  CalendarValueHistoryByEvent( 
  ulong              event_id,          // イベントID 
  MqlCalendarValue& values[],         // 値の説明の配列 
  datetime          datetime_from,    // 期間の左の境界 
  datetime          datetime_to=0     // 期間の右の境界 
  );

datetime_to=0

[in] 指定されたIDによって選択された期間内のイベントの終了日。datetime_to が設定されていない場合(または0の場合)、指定されたdatetime_from以降のカレンダーデータベースのすべてのイベント値が返されます(将来のイベントを含む)。

→将来のイベント判定もできる。素晴らしいですね。

//+------------------------------------------------------------------+ 
//| スクリプトプログラム開始関数                                              | 
//+------------------------------------------------------------------+ 
void OnStart() 
 { 
//--- EUの国コード(ISO 3166-1 Alpha-2) 
  string EU_code="EU"; 
//--- EUイベントを取得する 
  MqlCalendarEvent events[]; 
  int events_count=CalendarEventByCountry(EU_code,events); 
//--- EUイベントを操作ログに表示する 
  if(events_count>0) 
    { 
    PrintFormat("EU events: %d",events_count); 
    //--- 分析には10イベントで十分であるため、イベントリストを減らす 
    ArrayResize(events,10); 
    ArrayPrint(events); 
    } 
//--- "ECB Interest Rate Decision"イベントがevent_id=999010007であることを確認する 
  ulong event_id=events[6].id;       // イベントのIDはカレンダーで変わる可能性があるので、必ず確認する 
  string event_name=events[6].name;   // カレンダーイベントの名前 
  PrintFormat("Get values for event_name=%s event_id=%d",event_name,event_id); 
//--- "ECB Interest Rate Decision"イベントのすべての値を取得する 
  MqlCalendarValue values[]; 
//--- イベントを取得する期間の境界を設定する 
  datetime date_from=0;           // 利用可能な履歴の初めからのすべてのイベントをとる 
  datetime date_to=D'01.01.2016'; // 2016以降のイベントをとる 
  if(CalendarValueHistoryByEvent(event_id,values,date_from,date_to)) 
    { 
    PrintFormat("Received values for %s: %d", 
                 event_name,ArraySize(values)); 
    //--- 分析には10イベントで十分であるため、値リストを減らす 
    ArrayResize(values,10); 
    ArrayPrint(values); 
    } 
  else 
    { 
    PrintFormat("Error!Failed to get values for event_id=%d",event_id); 
    PrintFormat("Error code: %d",GetLastError()); 
    } 
 } 
//--- 
/* 
  結果: 
  EU events: 56 
           [id] [type] [sector] [frequency] [time_mode] [country_id] [unit] [importance] [multiplier] [digits]                                        [source_url]                                 [event_code]                                    [name] [reserv 
  [0] 999010001      0        5           0           0          999      0            2            0        0 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-non-monetary-policy-meeting"           "ECB Non-monetary Policy Meeting"                 
  [1] 999010002      0        5           0           0          999      0            2            0        0 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-monetary-policy-meeting-accounts"       "ECB Monetary Policy Meeting Accounts"           
  [2] 999010003      0        5           0           0          999      0            3            0        0 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-monetary-policy-press-conference"       "ECB Monetary Policy Press Conference"           
  [3] 999010004      0        5           0           0          999      0            3            0        0 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-president-draghi-speech"               "ECB President Draghi Speech"                     
  [4] 999010005      0        5           0           0          999      0            2            0        0 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-vice-president-vitor-constancio-speech" "ECB Vice President Constancio Speech"           
  [5] 999010006      1        5           0           0          999      1            3            0        2 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-deposit-rate-decision"                 "ECB Deposit Facility Rate Decision"             
  [6] 999010007      1        5           0           0          999      1            3            0        2 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-interest-rate-decision"                 "ECB Interest Rate Decision"                     
  [7] 999010008      0        5           0           0          999      0            2            0        0 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-economic-bulletin"                     "ECB Economic Bulletin"                           
  [8] 999010009      1        5           0           0          999      2            2            3        3 "https://www.ecb.europa.eu/home/html/index.en.html" "targeted-ltro"                             "ECB Targeted LTRO"                               
  [9] 999010010      0        5           0           0          999      0            2            0        0 "https://www.ecb.europa.eu/home/html/index.en.html" "ecb-executive-board-member-praet-speech"   "ECB Executive Board Member Praet Speech"         
  Get values for event_name=ECB Interest Rate Decision event_id=999010007 
  Received ECB Interest Rate Decision event values: 102 
      [id] [event_id]              [time]            [period] [revision] [actual_value] [prev_value] [revised_prev_value]     [forecast_value] [impact_type] [reserved] 
  [0] 2776  999010007 2007.03.08 11:45:00 1970.01.01 00:00:00          0        3750000      4250000 -9223372036854775808 -9223372036854775808             0          0 
  [1] 2777  999010007 2007.05.10 11:45:00 1970.01.01 00:00:00          0        3750000      3750000 -9223372036854775808 -9223372036854775808             0          0 
  [2] 2778  999010007 2007.06.06 11:45:00 1970.01.01 00:00:00          0        4000000      3750000 -9223372036854775808 -9223372036854775808             0          0 
  [3] 2779  999010007 2007.07.05 11:45:00 1970.01.01 00:00:00          0        4000000      4000000 -9223372036854775808 -9223372036854775808             0          0 
  [4] 2780  999010007 2007.08.02 11:45:00 1970.01.01 00:00:00          0        4000000      4000000 -9223372036854775808 -9223372036854775808             0          0 
  [5] 2781  999010007 2007.09.06 11:45:00 1970.01.01 00:00:00          0        4000000      4000000 -9223372036854775808 -9223372036854775808             0          0 
  [6] 2782  999010007 2007.10.04 11:45:00 1970.01.01 00:00:00          0        4000000      4000000 -9223372036854775808 -9223372036854775808             0          0 
  [7] 2783  999010007 2007.11.08 12:45:00 1970.01.01 00:00:00          0        4000000      4000000 -9223372036854775808 -9223372036854775808             0          0 
  [8] 2784  999010007 2007.12.06 12:45:00 1970.01.01 00:00:00          0        4000000      4000000 -9223372036854775808 -9223372036854775808             0          0 
  [9] 2785  999010007 2008.01.10 12:45:00 1970.01.01 00:00:00          0        4000000      4000000 -9223372036854775808 -9223372036854775808             0          0 
*/

 

イベントの時刻も取得できるので、細かい制御もできそうです。

まとめ

他にも、R言語連携等、気になるリリースがあったようですが、今回はここまでとします。
やはり、新機能はMT5のみの実装のようで。 ますますMT4を使う意味がなくなってきました。

MT5、海外FXでのトレードを主体として、資金効率が上がる方式を考えていった方が良いかも知れないと感じました。

 

スポンサーリンク

関連記事

スポンサーリンク
おすすめの記事