CalendarCountries関数の働き・役割
CalendarCountries関数は、カレンダーで利用可能な国の一覧を取得するために使用されます。この関数は、MqlCalendarCountry構造体の配列を引数に取り、経済指標カレンダーに関連する国情報をその配列に格納します。
取得した国情報には、国のID、国名、国コード、通貨コード、通貨シンボル、ウェブサイト上で使用される国名が含まれています。この関数の戻り値として、受け取った国の数が返されます。
CalendarCountries関数の引数について
int CalendarCountries(
MqlCalendarCountry& countries[] // カレンダーの国の説明を受け取る配列
);
CalendarCountries関数には、カレンダーから取得する国の説明を格納するための配列が引数として指定されます。この配列には、各国の詳細情報が格納され、以下の引数で構成されています。
countries
この引数には、MqlCalendarCountry構造体型の配列が指定されます。関数が実行されると、カレンダーで利用可能なすべての国の情報がこの配列に格納されます。配列には、各国のID、国名、ISOコード(2文字の国コード)、通貨コード、通貨シンボル、ウェブサイト用の国名などが含まれます。この配列は、関数実行後に情報が格納されるため、事前に宣言しておく必要があります。
CalendarCountries関数の戻り値について
CalendarCountries関数の戻り値は、取得された国の説明の数を表す整数です。この戻り値により、取得できた国の数を確認できます。関数の実行が成功すると、指定したMqlCalendarCountry構造体型の配列に国情報が格納されます。
取得に失敗した場合、戻り値は0となり、詳細なエラー内容はGetLastError関数で確認できます。
以下は、考えられるエラーとそのコードです:
- エラーコード 4001: ERR_INTERNAL_ERROR
一般的なランタイムエラーが発生したことを意味します。 - エラーコード 5402: ERR_CALENDAR_NO_DATA
無効な国IDが指定された場合に発生します。指定した国IDに対応する国の情報が存在しない場合です。 - エラーコード 5401: ERR_CALENDAR_TIMEOUT
リクエストの処理が制限時間を超えた場合に発生します。
CalendarCountries関数を使ったサンプルコード
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 経済指標カレンダーから国のリストを取得するための配列を宣言する
MqlCalendarCountry countries[];
//--- CalendarCountries関数を使って国のリストを取得し、結果をcountに格納する
int count = CalendarCountries(countries);
//--- 国のリスト取得結果を確認する
// countが0の場合、リストが取得できなかったと判断し、エラー内容を表示する
if(count == 0)
PrintFormat("CalendarCountries() returned 0! Error: %d", GetLastError());
//--- 国が2つ以上存在する場合に処理を続ける
if(count >= 2)
{
//--- MqlCalendarCountry型の変数countryを宣言して、特定の国の情報を格納する準備をする
MqlCalendarCountry country;
//--- CalendarCountryById関数を使って、特定の国IDに基づく国の情報を取得する
// countries[1].id はリスト内の2番目の国のIDを示している
if(CalendarCountryById(countries[1].id, country))
{
//--- 国の説明を文字列として準備する
// IntegerToString関数を使ってIDを文字列に変換し、情報を順に追加していく
string descr = "id = " + IntegerToString(country.id) + "\n";
descr += ("name = " + country.name + "\n"); // 国の名前
descr += ("code = " + country.code + "\n"); // 国のコード
descr += ("currency = " + country.currency + "\n"); // 国の通貨コード
descr += ("currency_symbol = " + country.currency_symbol + "\n"); // 通貨のシンボル
descr += ("url_name = " + country.url_name); // ウェブサイトURLに使用される国名
//--- 準備した国の説明をエキスパートログに表示する
Print(descr);
}
else
//--- CalendarCountryById関数が失敗した場合、エラー内容をエキスパートログに表示する
Print("CalendarCountryById() failed. Error: ", GetLastError());
}
//--- 以上でスクリプトの処理を終了
}
/*
実行結果の例:
id = 999
name = European Union
code = EU
currency = EUR
currency_symbol = €
url_name = european-union
*/
このコードは、経済指標カレンダーから国情報を取得し、特定の国の詳細を表示します。
まず、国の一覧を取得し、2つ以上の国が存在する場合は、そのうち2番目の国の情報を「IDで指定して」取得します。そして、その国の名前や通貨コード、通貨のシンボル、ウェブサイトURLなどの情報をエキスパートログに出力します。
もし情報取得が失敗した場合は、エラーメッセージをエキスパートログに表示します。
サンプルコード解説1
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 経済指標カレンダーから国のリストを取得するための配列を宣言する
MqlCalendarCountry countries[];
//--- CalendarCountries関数を使って国のリストを取得し、結果をcountに格納する
int count = CalendarCountries(countries);
このセクションでは、OnStart関数の冒頭部分について詳しく解説します。
OnStart関数の開始部分
OnStart関数は、スクリプトで実行が開始されると自動的に呼び出されるメインの関数です。この関数内にコードを記述することで、スクリプトの動作を制御します。以下のコードは、経済指標カレンダーから国のリストを取得する準備を行っています。
MqlCalendarCountry型配列 countries の宣言
MqlCalendarCountry構造体型の配列countries を宣言しています。この配列は、後ほど CalendarCountries関数を使って取得する国情報を格納するためのものです。MqlCalendarCountry構造体は、国に関する情報を保持するための構造体で、国名や国コード、通貨コードなどが格納されます。
CalendarCountries関数で国リストを取得
次に、CalendarCountries関数を呼び出し、経済指標カレンダーから利用可能な国の一覧を取得しています。この関数は、countries配列に国情報を格納し、配列に格納された国の数を整数として返します。この結果を count 変数に代入することで、取得した国の総数を後で確認できるようにしています。
以上のコードは、次の処理に備えて、国のリストを取得するための準備を整える役割を果たしています。
サンプルコード解説2
//--- 国のリスト取得結果を確認する
// countが0の場合、リストが取得できなかったと判断し、エラー内容を表示する
if(count == 0)
PrintFormat("CalendarCountries() returned 0! Error: %d", GetLastError());
//--- 国が2つ以上存在する場合に処理を続ける
if(count >= 2)
{
//--- MqlCalendarCountry型の変数countryを宣言して、特定の国の情報を格納する準備をする
MqlCalendarCountry country;
このセクションでは、取得した国のリストの結果を確認し、特定の条件に応じた処理を行うコード部分について解説します。
国のリスト取得結果を確認
まず、国のリスト取得結果が0であるかどうかを確認します。countが0の場合、国のリストが取得できなかったことを意味します。そのため、エラー内容を確認するために、PrintFormat関数とGetLastError関数を使用し、エラーコードをエキスパートログに出力しています。
国が2つ以上存在する場合の処理
次に、取得した国の数が2つ以上であることを確認します。この条件を満たす場合にのみ、後続の処理を続けます。countが2以上であることは、少なくとも2つ以上の国のデータが取得できていることを意味します。
MqlCalendarCountry型変数 country の宣言
次に、MqlCalendarCountry構造体型のインスタンスcountry を宣言しています。このインスタンスは、特定の国IDを基に取得した国の詳細情報を格納するためのものです。
サンプルコード解説3
//--- CalendarCountryById関数を使って、特定の国IDに基づく国の情報を取得する
// countries[1].id はリスト内の2番目の国のIDを示している
if(CalendarCountryById(countries[1].id, country))
{
//--- 国の説明を文字列として準備する
// IntegerToString関数を使ってIDを文字列に変換し、情報を順に追加していく
string descr = "id = " + IntegerToString(country.id) + "\n";
descr += ("name = " + country.name + "\n"); // 国の名前
descr += ("code = " + country.code + "\n"); // 国のコード
descr += ("currency = " + country.currency + "\n"); // 国の通貨コード
descr += ("currency_symbol = " + country.currency_symbol + "\n"); // 通貨のシンボル
descr += ("url_name = " + country.url_name); // ウェブサイトURLに使用される国名
//--- 準備した国の説明をエキスパートログに表示する
Print(descr);
}
else
//--- CalendarCountryById関数が失敗した場合、エラー内容をエキスパートログに表示する
Print("CalendarCountryById() failed. Error: ", GetLastError());
}
//--- 以上でスクリプトの処理を終了
}
/*
実行結果の例:
id = 999
name = European Union
code = EU
currency = EUR
currency_symbol = €
url_name = european-union
*/
ここでは、CalendarCountryById関数を使って取得した国の情報をエキスパートログに表示する部分について、使用されている文法や関数、countryのメンバ呼び出しの文法についても解説します。
CalendarCountryById関数で特定の国情報を取得
まず、CalendarCountryById関数を使って、特定の国IDに基づいた国情報を取得します。countries[1].idはリスト内の2番目の国のIDを示しています。
CalendarCountryById関数は、このIDに基づいて該当する国の詳細情報をMqlCalendarCountry構造体のインスタンスであるcountryに格納します。情報の取得に成功すると、次のステップでこの情報を整えて出力します。
情報を文字列として準備する
取得した国の情報を見やすい形式に整え、descrという名前の文字列に格納していきます。この部分で使われている文法要素について解説します。
IntegerToString関数
まず、国ID(数値データ)を文字列に変換するために、IntegerToString関数が使われています。国IDは数値のため、文字列として他の情報と一緒に表示するには変換が必要です。この関数を使うことで、数値を簡単に文字列に変えることができます。
改行文字「\n」
各情報の最後に「\n」という文字が追加されています。これは改行文字と呼ばれ、ログに出力される際に次の行に改行するために使用されます。これによって、IDや名前、コードなどの情報が別々の行に表示され、見やすく整えられます。
複合代入演算子「+=」
descrには最初に国IDを格納し、その後「+=」という記号を使って他の情報を順番に追加していきます。この「+=」は、現在の内容に新しい文字列を追加するための「複合代入演算子」と呼ばれるものです。これを使うことで、descrという文字列に次々と情報を追加できます。
MqlCalendarCountry構造体のインスタンス country からのメンバ呼び出し
MqlCalendarCountry構造体のインスタンスであるcountryから、各メンバの情報(id、name、code、currency、currency_symbol、url_name)が呼び出されています。
ここでの「country.id」や「country.name」のような表記は、インスタンスcountryが持っている各メンバを示すための文法です。具体的には、以下のようにしてメンバが呼び出されます。
- MqlCalendarCountry構造体に定義されたメンバには、それぞれ国ID、国名、国コード、通貨コード、通貨シンボル、ウェブサイト用のURL名が含まれます。
- MqlCalendarCountry構造体のインスタンスcountryにドット「.」を使ってメンバを指定することで、そのインスタンス内のデータ(この場合は特定の国の情報)を呼び出すことができます。
- たとえば、country.nameとすると、MqlCalendarCountry構造体のnameメンバに格納された国名データが呼び出されます。
これによって、MqlCalendarCountry構造体のインスタンスから必要な情報を取り出し、各情報を適切に表示することが可能になります。
Print関数で情報をエキスパートログに表示
最後に、準備したdescrをPrint関数を使ってエキスパートログに表示します。Print関数は、指定した内容をエキスパートログに出力するための関数で、ログに出力された内容を確認できるようにするために使われます。
CalendarCountryById関数が失敗した場合の処理
もしCalendarCountryById関数が失敗した場合には、else文内でGetLastError関数を使ってエラーコードを取得し、Print関数でエラー内容を表示します。エラーコードを確認することで、なぜ取得に失敗したかを把握することができます。
CalendarCountries関数を使ってEAを作る際のアイディア
CalendarCountries関数を使用することで、経済指標カレンダーの国情報を活用したエキスパートアドバイザー(EA)を作成できます。以下に、EAでの活用アイディアをいくつか紹介します。
国ごとの経済イベントを活用した取引フィルタ
CalendarCountries関数で取得した国の情報を元に、各国の経済イベントに注目した取引フィルタを作成できます。たとえば、米国や日本などの主要国の経済指標イベントが近づいている場合に、ポジションの取り方を変更するEAを構築できます。これにより、重要な経済イベントに合わせた取引戦略を実現できます。
通貨ペアの選定に基づく取引戦略
取得した国の通貨情報を利用し、通貨ペアを国ごとに特定し、適切な取引タイミングを設定するEAを作成することが可能です。たとえば、カナダ(CAD)やオーストラリア(AUD)の通貨を含むペアに対して、その国の経済ニュースに基づいた取引を行う設定が可能です。
国ごとの取引制限や設定のカスタマイズ
各国ごとの取引に対して異なる設定を行うEAも作成できます。たとえば、特定の国の経済状況やカレンダーイベントに応じて、レバレッジや取引量を自動的に調整することが可能です。また、リスク管理を重視して、特定の国に関連する取引を一時的に制限する機能も追加できます。
経済カレンダーの可視化
取得した国情報を使って、経済カレンダーを視覚的に表示するダッシュボード付きのEAも考えられます。各国ごとに経済イベントの日時や内容を表示し、トレーダーがリアルタイムに情報を把握できるようにすることで、イベントに基づいた取引の参考にできます。