ChartNext関数の働き・役割
ChartNext関数は、現在のチャートの次のチャートの識別子を取得するために使用されます。複数のチャートが開かれている場合に、各チャートを順次処理する際に便利です。ChartFirst関数と組み合わせて使用することで、すべてのチャートに対して順番にアクセスすることができます。
ChartNext関数の引数について
ChartNext関数は、次のチャートの識別子を取得するために、チャートの識別子を引数として取ります。戻り値は次のチャートの識別子です。
mql5コードをコピーするlong ChartNext(
long chart_id // チャートの識別子
);
ChartNext関数の戻り値について
ChartNext関数の戻り値は、長整数型(long)で、次のチャートの識別子です。もし、指定されたチャートの次のチャートが存在しない場合は、-1を返します。
ChartNext関数を使う際の注意点
ChartNext関数を使用する際には、以下の点に注意してください。
- ChartNext関数は、指定されたチャートの次のチャートの識別子を返しますが、最後のチャートに達した場合は-1を返します。したがって、whileループなどで使用する際は、戻り値が-1であるかどうかを確認する必要があります。
- ChartFirst関数と組み合わせて使用することで、開かれているすべてのチャートを順次処理することができます。
- MetaTrader5の内部リストの順序は、タブのドラッグやウィンドウのドッキング・アンロックなどで変わることがあるため、見た目の順序と一致しない場合があります。内部リストの順序に基づいて処理を行うことを前提として使用する必要があります。
ChartNext関数を使ったサンプルコード
以下のサンプルコードは、ChartFirst関数とChartNext関数を組み合わせて、開かれているすべてのチャートの識別子を取得し、各チャートの情報をエキスパートログに出力するものです。
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変数には、開かれているすべてのチャートの数が含まれています。