【MQL5】FrameInputs関数の使い方と自動売買実装コード

1. FrameInputs関数の概要と実務での活用法

MQL5での戦略開発において、バックテストの「最適化(Optimization)」は避けて通れない工程です。しかし、数千〜数万通りの組み合わせをテストする際、「どのパラメーター設定が、具体的にどのような結果をもたらしたか」をリアルタイムで集計・分析するのは容易ではありません。

FrameInputsは、最適化の各パス(実行単位)で使用された入力パラメーターを取得するための関数です。

通常、最適化の結果はストラテジーテスターの「最適化結果」タブで確認できますが、自作の集計ロジックを組み込みたい場合や、特定の条件を満たしたパスの設定値だけをファイルに書き出したい場合、この関数の出番となります。

実務レベルの開発では、OnTesterPass()イベントハンドラ内で使用されます。最適化の計算を行う「エージェント」からターミナルへデータが送られてくるたびに、そのパスで使われたパラメーター構成を動的に取得できるため、「高収益かつ低ドローダウンな設定値だけを抽出して独自データベースに保存する」といった高度な自動分析が可能になります。


2. 構文と戻り値

FrameInputs関数の基本的な構文は以下の通りです。

bool  FrameInputs(
   long    pass,           // パス番号(OnTesterPassで取得)
   string  &parameters[],  // パラメーターを格納する文字列配列
   uint    &parameters_count // 取得されたパラメーターの数
);

パラメーター解説

  • pass: 最適化における特定の実行回数(パス)を指すIDです。後述するサンプルのように、FrameNext関数などで取得した値を使用します。
  • parameters[]: 入力パラメーターの「名前」と「値」が格納される動的配列です。書式は通常 "変数名=値" という文字列形式で格納されます。
  • parameters_count: 配列に格納されたパラメーターの総数が代入されます。

戻り値

  • 成功した場合は true、失敗した場合は false を返します。

3. 具体的な使い方・実践サンプルコード

このコードは、最適化中に各パスが完了するたび、その時使われたパラメーター一覧をエキスパートログに出力する例です。

//+------------------------------------------------------------------+
//|                                              FrameInputs_Sample  |
//+------------------------------------------------------------------+
input int      FastMA = 10;    // 短期移動平均線
input int      SlowMA = 20;    // 長期移動平均線
input double   LotSize = 0.1;  // ロット数

// 最適化の各パス終了時に呼び出されるイベント
void OnTesterPass()
{
   string name;      // フレーム名
   long   id;        // フレームID
   long   pass;      // パス番号
   double value;     // 評価値
   uchar  data[];    // カスタムデータ用配列

   // フレーム(各パスの結果データ)を順次読み込む
   while(FrameNext(pass, name, id, value, data))
   {
      string params[];      // パラメーター格納用
      uint   params_count;  // パラメーター数

      // 該当パスの入力パラメーターを取得
      if(FrameInputs(pass, params, params_count))
      {
         PrintFormat("--- パス番号: %d の設定値一覧 ---", pass);

         // 取得したパラメーターをループで表示
         for(uint i = 0; i < params_count; i++)
         {
            PrintFormat("パラメータ[%d]: %s", i, params[i]);
         }
      }
      else
      {
         Print("パラメーターの取得に失敗しました。");
      }
   }
}

// 最適化が完全に終了した時の処理
void OnTesterDeinit()
{
   Print("最適化プロセスが終了しました。");
}

4. 使用上の注意点とよくあるエラー

  1. OnTesterPass以外では動作しない
    FrameInputsは、最適化中のデータフレーム操作を前提としています。通常のバックテスト中や、実際のチャート上での稼働中に呼び出しても意味をなさず、エラーとなります。
  2. 配列の動的確保
    引数に渡す string &parameters[] は、内部で自動的にリサイズされます。事前にサイズを指定する必要はありませんが、動的配列として宣言しておく必要があります。
  3. パス番号の正確性
    pass 引数には、FrameNextFrameFilter で取得した有効なパス番号を渡さなければなりません。無効な番号を渡すと false が返されます。
  4. 文字列解析のコスト
    パラメーターは "FastMA=10" のような文字列で取得されるため、数値として計算に使いたい場合は、StringSubstrStringFind を用いて等号(=)の右側を抽出し、StringToInteger などで変換する手間が発生します。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムのロジックが完璧であっても、それを実行する「環境」が貧弱であれば、実運用で利益を出すことは不可能です。自宅のPCや一般的な光回線を利用した自動売買には、目に見えない「ネットワーク遅延(レイテンシ)」という致命的なリスクが潜んでいます。相場が激しく動く局面では、ミリ秒単位の遅延が原因でスリッページが発生し、バックテスト通りの価格で約定しない「負けトレード」を量産することになります。

プロのクオンツエンジニアが、自宅PCではなく専用のVPS(仮想専用サーバー)を必須とするのは、物理的な距離による遅延を極限まで排除するためです。FX業者のサーバーと同じデータセンター、あるいは極めて近い距離に位置するVPSを利用することで、注文から約定までのスピードを最速化できます。このわずかな速度差が、年間収支における「利益」と「損失」を分ける境界線となるのです。安定した電源、24時間の稼働保証、そして圧倒的な低遅延環境を整えることは、手法の開発と同じくらい重要な投資と言えます。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました