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

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

MQL5のTesterStatistics関数は、ストラテジーテスターで実行したバックテストや最適化の結果から、特定の統計指標(純益、プロフィットファクター、最大ドローダウンなど)を取得するための関数です。

実務開発において、初心者の多くは「バックテストの結果をMT5の画面上で眺める」だけで終わってしまいがちです。しかし、中級以上のクオンツエンジニアを目指すなら、この関数を使って「独自の評価指標(カスタム・フィットネス関数)」を構築することが不可欠です。

例えば、単純な利益額(STAT_PROFIT)だけでなく、「利益をドローダウンで割ったリカバリーファクター」や「シャープ比」を自動計算し、EA(エキスパートアドバイザー)の最適化プロセスの判断基準に組み込むことで、カーブフィッティング(過剰適合)を抑えた、真に頑健なロジックを抽出できるようになります。

2. 構文と戻り値

TesterStatistics関数の基本構文は非常にシンプルです。

double TesterStatistics(
   ENUM_STATISTICS statistic_id      // 取得したい統計指標のID
);

パラメーター

  • statistic_id: 取得したい指標をENUM_STATISTICS列挙型の中から指定します。代表的なものは以下の通りです。
    • STAT_PROFIT: 総純益
    • STAT_PROFIT_FACTOR: プロフィットファクター
    • STAT_RECOVERY_FACTOR: リカバリーファクター
    • STAT_SHARPE_RATIO: シャープ比
    • STAT_EQUITY_DDREL_PERCENT: 相対ドローダウン(%)
    • STAT_TRADES: 総取引数

戻り値

  • 指定した統計指標の値をdouble型(浮動小数点数)で返します。

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

この関数は、バックテスト終了時に自動的に呼び出されるイベントハンドラ OnTester() 内で使用するのが一般的です。以下は、利益とリカバリーファクターを掛け合わせた独自の評価値を返すサンプルです。

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
{
   // 1. バックテストの結果から必要な指標を取得
   double profit = TesterStatistics(STAT_PROFIT);               // 純利益
   double rf     = TesterStatistics(STAT_RECOVERY_FACTOR);      // リカバリーファクター
   double trades = TesterStatistics(STAT_TRADES);               // 取引回数

   // 2. 評価のフィルタリング(例:取引数が30回未満なら評価を0にする)
   if(trades < 30)
   {
      Print("取引数が不十分なため、このパラメータは除外します。");
      return(0.0);
   }

   // 3. カスタム指標の計算(利益 × リカバリーファクター)
   // これにより「利益が大きく、かつドローダウンからの復帰が早い」設定が優先される
   double custom_fitness = profit * rf;

   PrintFormat("Custom Fitness: %.2f (Profit: %.2f, RF: %.2f)", custom_fitness, profit, rf);

   // 4. 計算した値を返す。最適化の「カスタム基準」としてこの値が使われる。
   return(custom_fitness);
}

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

1. ストラテジーテスター専用である

TesterStatisticsは、バックテストまたは最適化中のみ値を返します。リアルタイムのチャート上(ライブトレード中)で実行しても、正しい値を取得することはできず、常に 0 を返します。

2. データが生成されるタイミング

指標はバックテストの全工程が完了した後に確定します。そのため、OnTick() 内でリアルタイムに統計を取得しようとしても、その時点までの不完全なデータしか得られません。統計評価には必ず OnTester() または OnDeinit() を活用しましょう。

3. 取引回数の不足によるノイズ

最適化を行う際、数回だけのトレードで「たまたま」驚異的なプロフィットファクターを出す設定が紛れ込むことがあります。サンプルコードのように、必ず STAT_TRADES で一定以上の母数があるかを確認するガードロジックを入れるのが実務上の定石です。

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

アルゴリズムの性能を最大限に引き出すために、ロジックと同じくらい重要なのが「実行環境」です。自宅のPCでMT5を動かし、家庭用光回線で自動売買を行うことは、プロの視点から見ると非常にリスクが高いと言わざるを得ません。ネットワークの遅延(レイテンシ)はミリ秒単位で蓄積され、バックテストでは発生しなかった「スリッページ」を引き起こし、期待期待値を根底から破壊します。

特に、一瞬の価格変動を取りに行くスキャルピングや高頻度トレードに近いロジックの場合、物理的な距離による遅延は致命的です。約定スピードを極限まで高め、安定した24時間稼働を実現するには、ブローカーのサーバーに近いデータセンターに設置された専用のVPS(仮想専用サーバー)を利用することが必須条件となります。インフラへの投資を惜しむことは、シストレ開発における「最大のコスト」であることを忘れないでください。

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

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

コメント

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