1. OnTester関数の概要と実務での活用法
MQL5におけるOnTester関数は、バックテストや最適化(オプティマイゼーション)のプロセスが終了した瞬間に一度だけ呼び出される特別なイベントハンドラです。この関数の主な役割は、「そのバックテストがどれだけ優秀だったか」を示す独自の評価指標(カスタム・スコア)をテスターに返すことにあります。
実務開発において、初心者の多くはMT5標準の「最大利益」や「最小ドローダウン」だけで最適化を行い、結果として「過去のデータに過剰に適合した(カーブフィッティングした)使い物にならないEA」を作ってしまいがちです。
プロのクオンツは、利益だけでなく、リカバリーファクター(回復係数)、シャープレシオ、プロフィットファクター、さらには独自の「取引回数と勝率のバランス」を組み合わせた複雑な数式を用いてEAを評価します。OnTesterを活用することで、自分だけの「最強の評価基準」を定義でき、より堅牢で実戦向きなパラメータ選定が可能になります。
2. 構文と戻り値
OnTester関数の構造は非常にシンプルです。引数はなく、戻り値として評価スコアとなるdouble型の値を返します。
double OnTester();
- 型:
double - 戻り値: 最適化の際に比較対象となる数値。この値が大きければ大きいほど(または設定により小さければ小さいほど)、MT5の最適化結果リストの上位に表示されます。
- 実行タイミング: バックテスト完了時。リアル稼働(実運用)時には呼び出されません。
3. 具体的な使い方・実践サンプルコード
以下のサンプルは、単なる利益ではなく、「純利益 ÷ 最大ドローダウン(リカバリーファクター)」をカスタム指標として計算し、最適化の基準とするコードです。
//+------------------------------------------------------------------+
//| OnTester_Sample.mq5 |
//+------------------------------------------------------------------+
#property strict
// 非常に簡易的なエントリーロジック(例示用)
void OnTick()
{
// 本来はここにロジックを記述
}
//+------------------------------------------------------------------+
//| テスターイベント関数:バックテスト終了時に呼び出される |
//+------------------------------------------------------------------+
double OnTester()
{
// 1. 統計情報を取得するための準備
// MT5の内部統計データにアクセスします
double net_profit = TesterStatistics(STAT_PROFIT); // 純利益
double max_drawdown = TesterStatistics(STAT_EQUITY_DDREL_PERCENT); // 最大相対ドローダウン(%)
double trades = TesterStatistics(STAT_TRADES); // 取引回数
// 2. 独自の評価ロジックを構築
// 例:取引回数が少なすぎる(30回未満)場合は評価を0にする(信頼性不足)
if(trades < 30) return(0.0);
// 3. スコア計算:リカバリーファクターの算出
// ドローダウンが0の場合のゼロ除算を防止
double score = 0.0;
if(max_drawdown > 0)
{
// 純利益を最大ドローダウンで割ることで、リスクに見合ったリターンを算出
score = net_profit / max_drawdown;
}
// 4. 計算したスコアを返す
// 最適化設定の「最適化基準」で「Custom max」を選択すると、この値が最大になる設定が探されます
return(score);
}
4. 使用上の注意点とよくあるエラー
OnTesterを使いこなす上で、以下のポイントに注意してください。
- 最適化設定の変更:
OnTesterで返した値を利用するには、MT5のストラテジーテスターの設定タブにある「最適化基準」を 「Custom max(カスタム最大値)」 に変更する必要があります。これを行わないと、関数を書いても無視されます。 - ゼロ除算の回避: サンプルコードにある通り、ドローダウンや取引回数などが 0 になる可能性があります。これらで除算を行うとランタイムエラーが発生し、最適化が止まるため、必ず
if文でチェックしてください。 - リアル稼働では無視される: この関数はバックテスト専用です。
OnTick内で使うようなトレードロジックをここに書いても、実際の取引(ライブ口座)では一切動作しません。 - 統計データの精度:
TesterStatisticsで取得できるデータは、バックテストの設定(全ティックか、始値のみか等)に依存します。精度の高いスコアを得るには、適切なバックテストモードを選択してください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの優位性と同じくらい、あるいはそれ以上に重要なのが「実行環境」です。多くの開発者が自宅のPCでバックテストを行い、そのまま自宅のインターネット回線でEAを稼働させようとしますが、これはプロの視点から見ると極めてリスクの高い行為です。
FXのマーケットはミリ秒単位で価格が変動しています。自宅のPCから海外にある証券会社のサーバーへ注文を送る際、一般的な光回線では数十から数百ミリ秒の「レイテンシ(通信遅延)」が発生します。この遅延の間に価格が滑り(スリッページ)、バックテストでは利益が出ていたポイントでも実運用では損失に変わる、いわゆる「約定スピードの罠」に陥ります。
この技術的課題を解決し、極限まで約定スピードを高めるには、証券会社のサーバーに物理的に近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。24時間安定した稼働環境と、一桁ミリ秒台の低レイテンシを確保することこそが、システムトレーダーが最初に投資すべき「勝つためのインフラ」なのです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント