【MQL5】SymbolInfoSessionTrade関数について

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

SymbolInfoSessionTrade関数の働き・役割

SymbolInfoSessionTrade関数は、指定された銘柄と曜日に対して、特定の取引セッションの開始時間と終了時間を取得するために使用されます。
この関数を使用することで、特定の銘柄がどの時間帯に取引可能であるかを詳細に知ることができます。例えば、月曜日から金曜日までの各曜日について、取引セッションの時間を取得して表示することが可能です。

SymbolInfoSessionQuote関数との違い

SymbolInfoSessionTrade関数と似た関数SymbolInfoSessionQuote関数があります。これらの関数は、どちらも銘柄の取引時間に関する情報を取得するために使用されますが、取得する情報の内容が秒に異なります。

  • SymbolInfoSessionTrade関数:この関数は取引セッションの開始時間と終了時間を取得します。つまり、実際に取引が行われる時間帯を示します。
  • SymbolInfoSessionQuote関数:この関数はクォートセッションの開始時間と終了時間を取得します。クォートセッションは、価格の更新や提供が行われる時間帯を示します。取引が行われない時間帯でも、価格情報が更新される場合があります。

具体的には、SymbolInfoSessionTrade関数は取引可能な時間帯を知るために使用され、SymbolInfoSessionQuote関数は価格情報の提供時間帯を知るために使用されます。

SymbolInfoSessionTrade関数の引数について

SymbolInfoSessionTrade関数引数構成は以下の通りです。

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

第1引数:name

銘柄名を指定します。これは、取引セッションの情報を取得したい銘柄の名前を示します。例えば、「EURUSD」や「GBPUSD」などです。

第2引数:day_of_week

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

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

第3引数:session_index

セッションインデックスを指定します。これは、取得したいセッションの番号を示します。セッションの番号付けは0から始まります。例えば、0は最初のセッション、1は次のセッションを指します。

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

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

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

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

第4引数:from

セッションの開始時刻を受け取るための変数です。この変数には、指定された銘柄と曜日の取引セッションの開始時刻が格納されます。時刻は00時00分からの経過秒数で示され、日付部分は無効です。

第5引数:to

セッションの終了時刻を受け取るための変数です。この変数には、指定された銘柄と曜日の取引セッションの終了時刻が格納されます。時刻は00時00分からの経過秒数で示され、日付部分は無効です。

SymbolInfoSessionTrade関数の戻り値について

SymbolInfoSessionTrade関数は、指定されたセッションのデータが正常に取得できた場合にtrueを返し、取得できなかった場合にfalseを返します。この関数戻り値は、以下のように使用されます。

  • true:指定された銘柄と曜日に対する取引セッションの開始時刻と終了時刻が正常に取得できたことを示します。
  • false:データの取得が失敗した場合や、指定された銘柄やセッションインデックスが無効な場合に返されます。falseが返された場合、エラーコードを取得して問題の詳細を確認することが推奨されます。

例外処理

データの取得が失敗した場合には、GetLastError関数を使用してエラーコードを確認し、問題の原因を特定することができます。エラーコードに基づいて適切な対応を行うことが重要です。

SymbolInfoSessionTrade関数を使う際の注意点

曜日の指定

曜日はENUM_DAY_OF_WEEK列挙型を使用して指定します。ENUM_DAY_OF_WEEK列挙型の値は固定されているため、誤った値を使用しないように注意が必要です。

セッションインデックスの範囲

セッションインデックスは0から始まる連続した数値で指定します。
指定した銘柄の取引セッション数を超えるインデックスを指定すると、関数はfalseを返します。例えば、特定の銘柄が1日あたり2つの取引セッションしかない場合、セッションインデックスとして2以上を指定するとエラーになります。

datetime型変数の使用

セッションの開始時刻と終了時刻はdateTime変数に格納されます。これらの変数は、00時00分からの経過秒数で表され、日付部分は無効です。このため、セッションの時間を扱う際には、この点に留意する必要があります。

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

このサンプルコードでは、指定されたシンボルとセッションインデックスに対して、月曜日から金曜日までの取引セッションとクォートセッションの開始時刻と終了時刻を操作ログに出力します。

#define SYMBOL_NAME   Symbol()
#define SESSION_INDEX 0

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

   //--- 月曜日から金曜日までの曜日ごとのループを実行します。
   for(int i=MONDAY; i<SATURDAY; i++)
     {
      //--- 各曜日の取引セッション情報を操作ログに出力する関数を呼び出します。
      SymbolInfoSessionTradePrint(SYMBOL_NAME, (ENUM_DAY_OF_WEEK)i, SESSION_INDEX);
      //--- 各曜日のクォートセッション情報を操作ログに出力する関数を呼び出します。
      SymbolInfoSessionQuotePrint(SYMBOL_NAME, (ENUM_DAY_OF_WEEK)i, SESSION_INDEX);
     }
  }
//+------------------------------------------------------------------+
//| 指定されたシンボルと曜日の指定された取引セッションの           |
//| 開始時刻と終了時刻を操作ログに送信する関数                     |
//+------------------------------------------------------------------+
void SymbolInfoSessionTradePrint(const string symbol, const ENUM_DAY_OF_WEEK day_of_week, const uint session_index)
  {
   //--- 取引セッションの開始時刻と終了時刻を記録する変数を宣言します。
   datetime date_from; // 取引セッションの開始時刻
   datetime date_to;   // 取引セッションの終了時刻

   //--- 指定されたシンボルと曜日の取引セッションからデータを取得します。
   if(!SymbolInfoSessionTrade(symbol, day_of_week, session_index, date_from, date_to))
     {
      //--- 関数が失敗した場合、エラーメッセージを操作ログに出力し、関数を終了します。
      Print("SymbolInfoSessionTrade() 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("- Trade %-10s %s - %s", week_day, TimeToString(date_from, TIME_MINUTES), TimeToString(date_to, TIME_MINUTES));
  }
//+------------------------------------------------------------------+
//| 指定されたシンボルと曜日の指定されたクォートセッションの        |
//| 開始時刻と終了時刻を操作ログに送信する関数                     |
//+------------------------------------------------------------------+
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("- Quote %-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++)
     {
      //--- 各曜日の取引セッション情報を操作ログに出力する関数を呼び出します。
      SymbolInfoSessionTradePrint(SYMBOL_NAME, (ENUM_DAY_OF_WEEK)i, SESSION_INDEX);
      //--- 各曜日のセッション情報を操作ログに出力する関数を呼び出します。
      SymbolInfoSessionQuotePrint(SYMBOL_NAME, (ENUM_DAY_OF_WEEK)i, SESSION_INDEX);
     }

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

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

サンプルコード解説2: SymbolInfoSessionTradePrint関数

SymbolInfoSessionTradePrint関数は、指定されたシンボルと曜日に対して、特定の取引セッションの開始時刻と終了時刻を操作ログに出力します。

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

   //--- 指定されたシンボルと曜日の取引セッションからデータを取得します。
   if(!SymbolInfoSessionTrade(symbol, day_of_week, session_index, date_from, date_to))
     {
      //--- 関数が失敗した場合、エラーメッセージを操作ログに出力し、関数を終了します。
      Print("SymbolInfoSessionTrade() 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("- Trade %-10s %s - %s", week_day, TimeToString(date_from, TIME_MINUTES), TimeToString(date_to, TIME_MINUTES));
  }

関数の目的

SymbolInfoSessionTradePrint関数は、指定されたシンボルと曜日に対する取引セッションの開始時刻と終了時刻を取得し、それらの情報を操作ログに出力するために使用されます。

引数の説明

  • symbol:シンボル(銘柄名)を示す文字列。このシンボルに対する取引セッションの情報を取得します。
  • day_of_week:曜日を示すENUM_DAY_OF_WEEK列挙型の値。例えば、月曜日ならMONDAY、水曜日ならWEDNESDAYなどです。
  • session_index:セッションのインデックス(通し番号)。複数の取引セッションが存在する場合に、どのセッションの情報を取得するかを指定します。インデックスは0から始まります。

関数の処理手順

  1. 変数の宣言
  • dateTime型の変数date_fromとdate_toを宣言します。これらの変数は、それぞれ取引セッションの開始時刻と終了時刻を格納するために使用されます。
  1. SymbolInfoSessionTrade関数の呼び出し
  • SymbolInfoSessionTrade関数を呼び出し、指定されたシンボル、曜日、セッションインデックスに対する取引セッションの開始時刻と終了時刻を取得します。取得に成功した場合、date_fromとdate_toにそれぞれ時刻が格納されます。
  • 関数が失敗した場合は、エラーメッセージを操作ログに出力し、関数を終了します。
  1. 曜日名の取得と変換
  • day_of_week列挙型の値から曜日名を文字列として取得します。この文字列の最初の文字を大文字に変換します。
  1. 操作ログへの出力
  • PrintFormat関数を使用して、取引セッションの開始時刻と終了時刻を操作ログに出力します。曜日名、開始時刻、終了時刻をフォーマットして出力します。

%-10sというフォーマット指定子は、フォーマットされた出力の際に文字列形式を指定するためのものです。詳細は以下の通りです:

  • %フォーマット指定子の始まりを示します。
  • -:左揃えを示します。通常、フォーマットされたフィールドは右揃えですが、-を使うことで左揃えになります。
  • 10:フィールドの幅を示します。この場合、フィールドの幅は10文字です。文字列が10文字より短い場合、残りのスペースは空白で埋められます。
  • s文字列を示します。

つまり、%-10sは、幅10文字のフィールドに文字列を左揃えで表示することを意味します。

サンプルコード解説3: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. データ取得の成否の確認:

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

サンプルコード解説4: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をコピーしました