ChartFirst関数の働き・役割
ChartFirst関数は、開かれている最初のチャートの識別子を取得するために使用されます。この識別子は長整数型(long)で返され、以降のチャートを取得するためにChartNext関数と併用されます。複数のチャートが開かれている場合に、それぞれのチャートに対して操作を行いたいときに特に有用です。
最初のチャートとは何か?
MetaTrader5では、クライアントターミナルに開かれているすべてのチャートを内部的にリストとして管理しています。
この内部リストの順序は、画面上で見えるウィンドウタブの順序とは異なる場合があります。
特に、タブのドラッグ、ウィンドウのドッキングやアンロックによってリストの順序が変更されることがあります。
しかし、ターミナルのロード直後は、見た目の順序と内部リストの順序が一致します。ChartFirst関数が返す最初のチャートとは、この内部リストの最初に位置するチャートを指します。このため、画面上のタブの順序が変更されても、内部リストの順序に基づいて最初のチャートが決定されます。
ChartFirst関数は、この内部リストの最初のチャートを特定し、その識別子を返します。これにより、プログラムは内部リストに従ってチャートを順番に処理することが可能となります。
ChartFirst関数の引数について
ChartFirst関数は引数を取らずに呼び出されます。
long ChartFirst();
ChartFirst関数の戻り値について
ChartFirst関数の戻り値は、長整数型(long)のチャート識別子です。この識別子を使って、後続のチャートを取得するためのChartNext関数に渡すことができます。また、特定のチャートに対する操作を行う際にも、この識別子を使用します。
ChartFirst関数を使う際の注意点
ChartFirst関数を使用する際には、以下の点に注意してください。
- 複数のチャートを順に操作する場合は、ChartNext関数と組み合わせて使用します。
- MetaTrader5の内部リストの順序は、タブのドラッグやウィンドウのドッキング・アンロックなどで変わることがあるため、見た目の順序と一致しない場合があります。内部リストの順序に基づいて処理を行うことを前提として使用する必要があります。
ChartFirst関数を使ったサンプルコード
以下のサンプルコードは、開かれているすべてのチャートの識別子を取得し、各チャートの情報をエキスパートログに出力するものです。
void OnStart()
{
// チャート一覧を取得する関数を呼び出します
ChartList();
}
void ChartList()
{
// 現在のチャートの識別子を取得します
const long me = ChartID();
// 最初のチャートの識別子を取得します
long id = ChartFirst();
// チャートの数をカウントするための変数
int count = 0;
// ヘッダー情報をエキスパートログに出力します
Print("Chart List\nN, ID, *active");
// チャートが存在する間ループを続けます
while(id != -1)
{
// チャートの情報をフォーマットして文字列を作成します
// id == meが真の場合、アスタリスクを追加します
const string header = StringFormat("%d %lld %s",
count, id, (id == me ? " *" : ""));
// チャート情報をエキスパートログに出力します
Print(header);
// 現在のチャートのカウントを増加させます
count++;
// 次のチャートの識別子を取得します
id = ChartNext(id);
}
// 総チャート数をエキスパートログに出力します
Print("Total chart number: ", count);
}
サンプルコードに使われた関数や文法要素の簡単な解説
上から順に小分けにして解説していきます。
OnStart関数部分
OnStart関数は、スクリプトが実行されたときに自動的に呼び出される関数です。この関数は、MetaTrader5でスクリプトを実行する際のエントリーポイントとして機能します。スクリプトが開始されると、この関数内のコードが順次実行されます。
このサンプルコードでは、OnStart関数内でChartList関数を呼び出しています。ChartList関数は、開かれているすべてのチャートの一覧を取得してエキスパートログに出力するためのオリジナル関数です。
ChartList関数の定義部分その1
ChartList関数は、開かれているすべてのチャートの識別子を取得し、その情報をエキスパートログに出力するために定義されています。この関数の最初の部分について解説します。
void ChartList()
{
// 現在のチャートの識別子を取得します
const long me = ChartID();
// 最初のチャートの識別子を取得します
long id = ChartFirst();
// チャートの数をカウントするための変数
int count = 0;
// ヘッダー情報をエキスパートログに出力します
Print("Chart List\nN, ID, *active");
まず、現在のチャートの識別子を取得するために、ChartID関数を使用しています。ここで取得した識別子は、後で現在のチャートがどれかを判別するために使用されます。constキーワードは、この変数が変更されないことを示します。これは、me変数が関数の中で一定であることを保証するために使用されます。
次に、最初のチャートの識別子を取得するためにChartFirst関数を使用します。ChartFirst関数は、MetaTrader5で開かれているチャートの内部リストの最初のチャートを返します。
その後、開かれているチャートの数をカウントするための変数countを初期化します。この変数は、後でチャートの数を数えるために使用されます。
最後に、エキスパートログにヘッダー情報を出力します。このヘッダーは、後で出力される各チャートの情報が何を意味するかを示すためのものです。出力されるヘッダー情報には、チャートの番号(N)、チャートの識別子(ID)、および現在のチャートを示すアスタリスク(*active)が含まれます。
これらの初期設定により、ChartList関数は開かれているチャートの情報を正確に取得し、後続の処理を行うための準備を整えています。
ChartList関数の定義部分その2
// チャートが存在する間ループを続けます
while(id != -1)
{
// チャートの情報をフォーマットして文字列を作成します
// id == meが真の場合、アスタリスクを追加します
const string header = StringFormat("%d %lld %s",
count, id, (id == me ? " *" : ""));
// チャート情報をエキスパートログに出力します
Print(header);
// 現在のチャートのカウントを増加させます
count++;
// 次のチャートの識別子を取得します
id = ChartNext(id);
}
// 総チャート数をエキスパートログに出力します
Print("Total chart number: ", count);
}
チャートが存在する間、ループを続けるためにwhileループを使用しています。idが-1でない限り、ループは継続します。これは、ChartNext関数がチャートの識別子を取得できる限り、ループが続くことを意味します。
次に、チャートの情報をフォーマットして文字列を作成するために、StringFormat関数を使用しています。この関数は、指定されたフォーマット指定子に従って文字列を生成します。ここでは、以下のフォーマット指定子を使用しています。
%d
:整数を表示するためのフォーマット指定子です。ここでは、チャートのカウントを表示します。%lld
: 長整数(long long int)を表示するためのフォーマット指定子です。ここでは、チャートの識別子を表示します。%s
:文字列を表示するためのフォーマット指定子です。ここでは、現在のチャートを示すアスタリスクを表示します。
三項演算子は、条件式が真の場合と偽の場合で異なる値を返すために使用されます。このコードでは、id == meが真の場合はアスタリスクを追加し、偽の場合は空文字列を追加します。これにより、現在のチャートである場合にアスタリスクを表示するようになります。
次に、フォーマットされたチャート情報をエキスパートログに出力するためにPrint関数を使用します。Print関数は、指定された文字列をエキスパートログに出力します。
その後、現在のチャートのカウントを増加させるためにcountをインクリメントします。これにより、次のチャートが見つかったときにカウントが更新されます。
次に、次のチャートの識別子を取得するためにChartNext関数を使用します。ChartNext関数は、現在のチャートの次のチャートの識別子を返します。これにより、ループが次のチャートに進むことができます。
最後に、総チャート数をエキスパートログに出力するためにPrint関数を使用します。count変数には、開かれているすべてのチャートの数が含まれています。
コメント