【MQL5】SymbolInfoSessionQuote関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

SymbolInfoSessionQuote関数の働き・役割

SymbolInfoSessionQuote関数は、指定された銘柄と曜日における特定の相場セッションの開始時刻と終了時刻を取得するために使用されます。
相場セッションとは、金融市場で特定の取引が行われる期間を指します。これにより、特定の銘柄が取引される時間帯を正確に把握することができます。

たとえば、月曜日から金曜日までの各曜日において、ある銘柄の取引がいつ開始し、いつ終了するのかを調べる際に非常に有用です。

SymbolInfoSessionQuote関数の引数について

bool SymbolInfoSessionQuote(
  string            name,                // 銘柄名
  ENUM_DAY_OF_WEEK  day_of_week,         // 曜日
  uint              session_index,       // セッションインデックス
  datetime&         from,                // セッション開始時刻
  datetime&         to                   // セッション終了時刻
);

第1引数: name

銘柄名を指定します。たとえば、「EURUSD」のように、通貨ペアの名前を指定します。

第2引数: day_of_week

曜日を指定します。この引数ENUM_DAY_OF_WEEKの値を使用します。ENUM_DAY_OF_WEEKは以下のような値を持ちます。

ENUM_DAY_OF_WEEKについての詳細は↓の記事をご参照ください。

第3引数: session_index

開始と終了時刻を取得したいセッションのインデックス(通し番号)を指定します。セッションの番号付けは0から始まります。

セッションインデックスとは

セッションインデックスとは、取引セッションの順番を示す番号のことです。金融市場では、1日に複数の取引セッションが設定されている場合があります。これらのセッションは、取引が行われる時間帯を複数に分割することで、市場の動きをより細かく管理するために使用されます。

たとえば、ある市場が以下のような3つの取引セッションを持っているとします。

  1. セッション1: 09:00 – 11:00
  2. セッション2: 13:00 – 15:00
  3. セッション3: 17:00 – 19:00

この場合、各セッションにはインデックス番号が付けられます。

SymbolInfoSessionQuote関数を使用して特定のセッションの開始時刻と終了時刻を取得する場合、セッションインデックスとして0、1、または2を指定します。このようにして、特定のセッションの時間情報を取得できるようになります。

第4引数: from

相場セッションの開始時刻を受け取るための変数を指定します。この変数には、00時00分から経過した秒数でのセッション開始時刻が格納されます。

第5引数: to

相場セッションの終了時刻を受け取るための変数を指定します。この変数には、00時00分から経過した秒数でのセッション終了時刻が格納されます。

SymbolInfoSessionQuote関数の戻り値について

SymbolInfoSessionQuote関数戻り値は、関数の実行が成功したかどうかを示します。

戻り値の型: bool

戻り値はブール型(true または false)です。

true

指定された銘柄、曜日、およびセッションインデックスに対応する相場セッションのデータが正常に取得された場合にtrueを返します。

false

指定された条件に該当するデータが取得できなかった場合、またはエラーが発生した場合にfalseを返します。エラーが発生した場合は、GetLastError関数を使用してエラーコードを取得し、詳細なエラー情報を確認することができます。

SymbolInfoSessionQuote関数を使う際の注意点

正しいパラメータの指定

銘柄名、曜日、セッションインデックスを正しく指定する必要があります。これらのパラメータが不正確である場合、関数は正しいデータを返しません。

セッションの存在確認

セッションインデックスは0から始まりますが、指定したインデックスが存在しない場合、関数はfalseを返します。そのため、銘柄や曜日に対して有効なセッションインデックスを事前に確認しておくことが重要です。

戻り値のチェック

関数戻り値がfalseの場合、データの取得に失敗したことを示します。この場合、GetLastError関数を使用してエラーコードを確認し、適切なエラーハンドリングを行うことが推奨されます。

時刻の形式

fromとtoに格納されるセッション開始時刻と終了時刻は、00時00分からの経過秒数で表されます。これを使用する際には、適切な変換を行う必要があります。

市場休業日

指定された曜日が市場の休業日に該当する場合、セッション情報が存在しない可能性があります。この場合、関数はfalseを返しますので、休業日かどうかを事前に確認することも有用です。

SymbolInfoSessionQuote関数を使ったサンプルコード

#define SYMBOL_NAME   Symbol()
#define SESSION_INDEX 0

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   //--- シンボルとSESSION_INDEXを含むヘッダーを操作ログに出力します。
   PrintFormat("Symbol %s, Quote session %d:", SYMBOL_NAME, SESSION_INDEX);

   //--- 月曜日から金曜日までの曜日ごとのループを実行します。
   for(int i=MONDAY; i<SATURDAY; i++)
     {
      //--- 各曜日のセッション情報を操作ログに出力する関数を呼び出します。
      SymbolInfoSessionQuotePrint(SYMBOL_NAME, (ENUM_DAY_OF_WEEK)i, SESSION_INDEX);
     }
   /*
   結果:
   Symbol EURUSD, Quote session 0:
   - Monday     06:45 - 00:00
   - Tuesday    06:45 - 00:00
   - Wednesday  06:45 - 00:00
   - Thursday   06:45 - 00:00
   - Friday     06:45 - 00:00
   */
  }
//+------------------------------------------------------------------+
//| 指定されたシンボルと曜日の指定された相場セッションの           |
//| 開始時刻と終了時刻を操作ログに送信する関数                     |
//+------------------------------------------------------------------+
void SymbolInfoSessionQuotePrint(const string symbol, const ENUM_DAY_OF_WEEK day_of_week, const uint session_index)
  {
   //--- セッションの開始時刻と終了時刻を記録する変数を宣言します。
   datetime date_from; // セッションの開始時刻
   datetime date_to;   // セッションの終了時刻

   //--- 指定されたシンボルと曜日の相場セッションからデータを取得します。
   if(!SymbolInfoSessionQuote(symbol, day_of_week, session_index, date_from, date_to))
     {
      //--- 関数が失敗した場合、エラーメッセージを操作ログに出力し、関数を終了します。
      Print("SymbolInfoSessionQuote() failed. Error ", GetLastError());
      return;
     }

   //--- 列挙定数から曜日名を取得し、最初の文字を大文字に変換します。
   string week_day = EnumToString(day_of_week);
   if(week_day.Lower())
     week_day.SetChar(0, ushort(week_day.GetChar(0)-32));

   //--- 指定された相場セッションのデータを操作ログに出力します。
   PrintFormat("- %-10s %s - %s", week_day, TimeToString(date_from, TIME_MINUTES), TimeToString(date_to, TIME_MINUTES));
  }

サンプルコード解説1:グローバル領域定義とOnStart関数

グローバル領域の定義

#define SYMBOL_NAME   Symbol()
#define SESSION_INDEX 0

ここでは、2つの定義がされています。プリプロセッサディレクティブを使用して定数を定義しています。

  1. SYMBOL_NAME:
  • 関数を呼び出し、現在アクティブなシンボル(例えば、EURUSDなど)を取得します。
  • これにより、コード内でSYMBOL_NAMEを使用すると、常に現在のシンボルが返されます。
  1. SESSION_INDEX:

OnStart関数

void OnStart()
  {
   //--- シンボルとSESSION_INDEXを含むヘッダーを操作ログに出力します。
   PrintFormat("Symbol %s, Quote session %d:", SYMBOL_NAME, SESSION_INDEX);

OnStart関数スクリプトが実行されるときに最初に呼び出される関数です。ここでは、主に以下の処理が行われます。

  1. ヘッダーの操作ログ出力:

曜日ごとのループ

   //--- 月曜日から金曜日までの曜日ごとのループを実行します。
   for(int i=MONDAY; i<SATURDAY; i++)
     {
      //--- 各曜日のセッション情報を操作ログに出力する関数を呼び出します。
      SymbolInfoSessionQuotePrint(SYMBOL_NAME, (ENUM_DAY_OF_WEEK)i, SESSION_INDEX);
     }

ここでは、月曜日から金曜日までの各曜日についてループを実行します。

  1. ループの開始:
  1. セッション情報の取得と出力:
  • ループ内で関数を呼び出し、各曜日のセッション情報を取得して操作ログに出力します。
  • SYMBOL_NAME、曜日、ENUM_DAY_OF_WEEK、i、およびSESSION_INDEXを引数として渡しています。

出力結果

   /*
   結果:
   Symbol EURUSD, Quote session 0:
   - Monday     06:45 - 00:00
   - Tuesday    06:45 - 00:00
   - Wednesday  06:45 - 00:00
   - Thursday   06:45 - 00:00
   - Friday     06:45 - 00:00
   */
  }

最後に、コメントとしてサンプル出力結果が示されています。これにより、各曜日のセッション開始時刻と終了時刻がどのように表示されるかを確認できます。

サンプルコード解説2:SymbolInfoSessionQuotePrint関数その1

SymbolInfoSessionQuotePrint関数

//+------------------------------------------------------------------+
//| 指定されたシンボルと曜日の指定された相場セッションの           |
//| 開始時刻と終了時刻を操作ログに送信する関数                     |
//+------------------------------------------------------------------+
void SymbolInfoSessionQuotePrint(const string symbol, const ENUM_DAY_OF_WEEK day_of_week, const uint session_index)
  {
   //--- セッションの開始時刻と終了時刻を記録する変数を宣言します。
   datetime date_from; // セッションの開始時刻
   datetime date_to;   // セッションの終了時刻

   //--- 指定されたシンボルと曜日の相場セッションからデータを取得します。
   if(!SymbolInfoSessionQuote(symbol, day_of_week, session_index, date_from, date_to))
     {
      //--- 関数が失敗した場合、エラーメッセージを操作ログに出力し、関数を終了します。
      Print("SymbolInfoSessionQuote() failed. Error ", GetLastError());
      return;
     }

SymbolInfoSessionQuotePrint関数は、指定されたシンボルと曜日に対して、特定の取引セッションの開始時刻と終了時刻を取得し、それを操作ログに出力する関数です。以下の手順で動作します。

  1. セッションの開始時刻と終了時刻を記録する変数の宣言:
  • dateTime型変数date_fromとdate_toを宣言します。これらの変数は、それぞれセッションの開始時刻と終了時刻を格納します。
  1. 指定されたシンボルと曜日の相場セッションからデータを取得:
  1. データ取得の成否の確認:

このようにして、指定されたシンボルと曜日の取引セッション情報を取得し、必要に応じてエラーメッセージを出力します。次に、取得したデータをどのように操作ログに出力するかについて説明します。

サンプルコード解説3:SymbolInfoSessionQuotePrint関数その2

SymbolInfoSessionQuotePrint関数の残りの部分

   //--- 列挙定数から曜日名を取得し、最初の文字を大文字に変換します。
   string week_day = EnumToString(day_of_week);
   if(week_day.Lower())
     week_day.SetChar(0, ushort(week_day.GetChar(0)-32));

   //--- 指定された相場セッションのデータを操作ログに出力します。
   PrintFormat("- %-10s %s - %s", week_day, TimeToString(date_from, TIME_MINUTES), TimeToString(date_to, TIME_MINUTES));
  }

この部分では、取得したデータを操作ログに出力するための処理が行われています。

  1. 列挙定数から曜日名を取得し、最初の文字を大文字に変換:
  • EnumToString関数を使用して、曜日を表す列挙型の値を文字列に変換します。たとえば、MONDAYが”Monday”という文字列になります。
  • Lower関数を呼び出して文字列を小文字に変換し、最初の文字が大文字かどうかを確認します。
  • もし小文字なら、SetChar関数を使って最初の文字を大文字に変換します。この処理により、曜日名が常に適切な形式で表示されます。
  1. 指定された相場セッションのデータを操作ログに出力:
  • PrintFormat関数を使用して、曜日名とセッションの開始時刻および終了時刻をフォーマットして操作ログに出力します。
  • PrintFormat関数フォーマット指定子は、出力する値の形式を指定するための記号です(表示されるデータの位置と形式を決めるためのもの)。指定子は % から始まり、その後に形式を表す文字が続きます。
    例えば、PrintFormat(“- %-10s %s – %s”, week_day, TimeToString(date_from, TIME_MINUTES), TimeToString(date_to, TIME_MINUTES)) では、以下の指定子が使用されています。
    %-10s(文字列を左揃えで幅10で表示) は、week_day の値がここに挿入されます。
    %s(文字列を表示) は、TimeToString(date_from, TIME_MINUTES) の結果がここに挿入されます。
    %s(文字列を表示) は同じく、TimeToString(date_to, TIME_MINUTES) の結果がここに挿入されます。
  • これにより、曜日名とセッションの開始・終了時刻がフォーマットされた形で出力されます。
  • TimeToString関数を使って、date_fromとdate_toの値を”時:分”の形式の文字列に変換します。
  • 曜日名、セッション開始時刻、セッション終了時刻を指定したフォーマットに従って出力します。

このようにして、取得した取引セッションの情報を見やすい形式で操作ログに出力することができます。これにより、特定のシンボルと曜日に対する取引セッションの時間帯を簡単に確認できるようになります。

かしこまりました。この部分のコードについて詳しく解説します。

補足解説:「 week_day.SetChar(0, ushort(week_day.GetChar(0)-32))」の部分について

この部分、やや複雑なので補足解説させていただきます。

背景

このコードは、文字列の最初の文字を大文字に変換するために使用されています。具体的には、曜日名の文字列(例えば、monday)を適切な形式(Monday)にするための操作です。

詳細な処理

  1. week_day.GetChar(0):
  • week_day文字列の最初の文字を取得します。
  • GetChar(0)は、week_dayの0番目の文字(最初の文字)を返します。
  • 例えば、week_dayがmondayの場合、GetChar(0)は’m’を返します。
  1. -32:
  • ASCIIコードでは、アルファベットの小文字と大文字は32の差があります。
  • 例えば、小文字のmのASCIIコードは109、大文字のMのASCIIコードは77です。その差は32です。
  • week_day.GetChar(0)-32の部分は、小文字の文字を大文字に変換するために、ASCIIコードを32減らしています。
  • 例えば、’m’ – 32は、109 – 32 = 77になり、77は大文字のMのASCIIコードです。
  1. ushortキャスト:
  • ushortは、符号なし16ビット整数型です。これは、文字のASCIIコードを表すために使われます。
  • 結果として得られる整数値を文字コードとして扱うために、ushortキャストしています。
  1. week_day.SetChar(0, ...):
  • SetChar関数を使用して、week_dayの0番目の文字を変換後の文字に置き換えます。
  • SetChar(0, 77)は、week_dayの最初の文字をMに置き換えます。

まとめ

この一行のコードは、以下のような処理を行います。

  • week_dayの最初の文字を取得し、その文字が小文字の場合、ASCIIコードを32減らして大文字に変換します。
  • 変換された文字をushortキャストして、week_dayの最初の文字をその大文字に置き換えます。

この処理により、曜日名の最初の文字が大文字に変換され、適切な形式で表示されるようになります。

タイトルとURLをコピーしました