【MQL5】FrameNext関数について

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

FrameNext関数の働き・役割

FrameNext関数は、データフレームを読み込んだ後、ポインタを次のフレームに移動するための関数です。この関数には2つの書式があり、シンプルに1つの数値を取得する場合と、フレームの全データを配列として取得する場合とで使い分けができます。
最適化の際にフレームごとに異なるデータを読み取り、パフォーマンスや特定の数値に基づいた分析を行う際に使用されます。FrameNext関数を活用することで、各フレームに格納されているパラメータや値を効率的に取得できます。

FrameNext関数の引数について

bool FrameNext(
   ulong& pass,     // フレームが追加された最適化でのパスの番号
   string& name,    // 識別子の名称・レベル
   long& id,        // パブリックID
   double& value    // 単一の数値
);

書式1

FrameNext関数の1つ目の書式は、指定されたフレームに関連付けられたパス番号や識別子の名称、ID、単一の数値を読み取ります。パス番号や識別子の情報に基づいたデータ取得が可能です。

書式2

bool FrameNext(
   ulong& pass,     // フレームが追加された最適化でのパスの番号
   string& name,    // 識別子の名称・レベル
   long& id,        // パブリックID
   double& value,   // 単一の数値
   void& data[]     // 任意型の配列
);

FrameNext関数の2つ目の書式は、フレームの全データを受け取るため、上記のパラメータに加えて任意型の配列も取得します。配列dataには、フレームの詳細なデータが格納されるため、個別の情報を取得する場面で有用です。

FrameNext関数の戻り値について

FrameNext関数は、フレームのデータ取得とポインタの移動が成功した場合にtrueを返します。フレームのデータを読み取る際、次のフレームへのポインタ移動やデータの処理が適切に行われない場合、falseが返されます。falseが返された場合には、GetLastError関数を使用して、エラーの詳細情報を確認することが推奨されます。エラーの原因には、フレームデータの欠損やポインタ操作の失敗などが考えられます。

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

// 最適化の各パスで新しいフレームが到着した際に自動的に呼び出される関数
void OnTesterPass()
{
    // フレームのパスIDを格納するための変数。最適化の各パス(試行)ごとに一意のIDが付与される
    ulong pass_id;

    // フレームの名前を格納するための変数。FrameAdd関数を使って送信される際に設定された名前が入る
    string frame_name;

    // フレームの識別IDを格納する変数。FrameAdd関数で設定した識別番号が保持される
    long frame_id;

    // フレームの値(数値データ)を格納するための変数。FrameAddで指定された数値情報が入る
    double frame_value;

    // FrameNext関数は、次のフレームが存在する限りtrueを返し、フレームデータを変数に格納する
    // フレームがなくなるまでループを継続
    while(FrameNext(pass_id, frame_name, frame_id, frame_value))
    {
        // 取得したフレームデータをエキスパートログに出力
        // Print関数を使用し、Pass ID、フレーム名、識別ID、値の情報を表示
        Print("Pass ID: ", pass_id,           // 最適化のパスIDを表示
              " Name: ", frame_name,          // フレームの名前を表示
              " ID: ", frame_id,              // フレームの識別IDを表示
              " Value: ", DoubleToString(frame_value, 2)); // 数値データを小数点2桁で表示
    }
}

// 最適化が終了した後に未処理のフレームを処理するための関数
void OnTesterDeinit()
{
    // 最適化パスID、フレーム名、識別ID、値を保持する変数を定義
    ulong pass_id;
    string frame_name;
    long frame_id;
    double frame_value;

    // FrameFirst関数を呼び出してフレームの最初の位置に移動
    // 最適化完了後、すべてのフレームを再確認する準備を行う
    FrameFirst();

    // 未処理のフレームがある限り、次のフレームを取得して処理を繰り返す
    while(FrameNext(pass_id, frame_name, frame_id, frame_value))
    {
        // 未処理のフレームデータをエキスパートログに出力して確認
        Print("Deinit - Pass ID: ", pass_id,        // 最適化パスIDを表示
              " Name: ", frame_name,               // フレームの名前を表示
              " ID: ", frame_id,                   // フレームの識別IDを表示
              " Value: ", DoubleToString(frame_value, 2)); // 数値データを小数点2桁で表示
    }
}

サンプルコードに使われた関数や変数の詳細な解説

  • OnTesterPass関数
    最適化中にテストエージェントから新しいデータフレームが送信された際に自動的に呼び出され、フレーム内容の受け取りと処理を行う関数です。
  • OnTesterDeinit関数
    最適化が完了した後に呼び出され、未処理のフレームを確認・処理するために使用されます。
  • pass_id
    各最適化パス(試行)ごとに一意のIDを格納するための変数で、FrameNext関数で取得されます。
  • frame_name
    フレームの名前を格納する変数で、FrameAdd関数で設定した名前が入ります。識別名として利用することができます。
  • frame_id
    フレームの識別IDを保持する変数で、各フレームの特定情報として設定されます。
  • frame_value
    フレームに含まれる数値データを格納する変数です。最適化の結果や評価指標などを受け取ります。
  • while文
    while文は、条件が満たされている限り繰り返し処理を実行する構文です。このコードでは、FrameNext関数がtrueを返す間、つまり未処理のフレームがある限りループが続きます。while文の内部でFrameNext関数が新たなフレームデータを取得し、変数に格納して処理を繰り返します。
  • FrameNext関数
    次のフレームが存在するかを確認し、存在する場合にはそのデータを取得して指定の変数に格納します。未処理のフレームを順次処理する際に使用します。
  • FrameFirst関数
    最初のフレームに移動するために使用します。OnTesterDeinit関数で、フレームの再処理を行う際に利用されます。
  • Print関数
    取得したデータをエキスパートログに表示するための関数です。このサンプルでは各フレームのID、名前、識別ID、数値データを表示しています。
  • DoubleToString関数
    DoubleToString関数は、数値を文字列に変換する関数です。このコードではframe_valueを小数点以下2桁に指定して文字列化し、エキスパートログに出力しています。
タイトルとURLをコピーしました