1. OnTesterPass関数の概要と実務での活用法
MQL5を用いたバックテストや最適化(最適化ツール)において、OnTesterPassは「最適化の各パス(各組み合わせのテスト)が終了するたびに、ターミナル側で呼び出されるイベントハンドラ」です。
実務レベルの開発では、標準のバックテスト結果(プロフィットファクターや期待利得など)だけでは、戦略の優位性を十分に評価できないことが多々あります。例えば、「特定の期間における最大ドローダウン」や「独自のリカバリーファクター」などをリアルタイムで集計し、最適化の実行中にグラフ化したり、上位の結果だけを独自にフィルタリングしたい場合にこの関数が活躍します。
初心者がつまずきやすいポイント:
多くの開発者が、個別のテスト結果を処理する「OnTester」と混同しがちです。
* OnTester: 「エージェント(計算エンジン)」側で動作し、各テストのスコア(double型)を返す。
* OnTesterPass: 「クライアントターミナル(メイン画面)」側で動作し、全エージェントから送られてくるフレームデータを受信・処理する。
この役割分担を理解することで、数万通りのパラメータ組み合わせの中から、真に堅牢な設定を効率よく見つけ出すシステムを構築できるようになります。
2. 構文と戻り値
OnTesterPass関数の定義は非常にシンプルで、引数も戻り値も持ちません。
void OnTesterPass();
仕様の解説:
– 戻り値: なし(void)。
– 呼び出しタイミング: 最適化中、一つのパス(1つのパラメータセットでのテスト)が完了し、エージェントからデータフレーム(FrameAddで送信されたデータ)がターミナルに届いた瞬間に実行されます。
– 重要な関連関数: この関数内では、送られてきたデータを取り出すために FrameNext() や FrameInputs() といったフレーム操作関数を組み合わせて使用するのが一般的です。
3. 具体的な使い方・実践サンプルコード
以下のコードは、最適化中に「純利益」と「独自のカスタム指標」をエージェントから送信し、ターミナル側の OnTesterPass でそれらを受信してエキスパートログに表示する最小限の実装例です。
//--- 入力パラメータ
input double Lots = 0.1;
input int TP = 100;
input int SL = 50;
//+------------------------------------------------------------------+
//| OnTester: 各テスト終了時にエージェント側で実行 |
//+------------------------------------------------------------------+
double OnTester()
{
// 1. カスタム指標の計算(例:純利益とトレード回数の比率)
double profit = TesterStatistics(STAT_PROFIT);
double trades = TesterStatistics(STAT_TRADES);
double custom_score = (trades > 0) ? profit / trades : 0;
// 2. フレームデータとしてターミナルへ送信
// FrameAdd(データ名, ID, 数値データ, バッファ)
FrameAdd("CustomResult", 1, custom_score, NULL);
return(profit); // 標準の最適化基準として利益を返す
}
//+------------------------------------------------------------------+
//| OnTesterPass: データ受信時にターミナル側で実行 |
//+------------------------------------------------------------------+
void OnTesterPass()
{
string name; // データ名
long id; // ID
double value; // 送信された数値(custom_score)
uchar data[]; // 配列データ(今回は未使用)
// フレームを1つずつ読み取って処理
while(FrameNext(name, id, value, data))
{
// 最適化の進捗に合わせて、受信したカスタムスコアをログに表示
PrintFormat("パス受信: ID=%d, スコア=%.2f, 名前=%s", id, value, name);
// 実務ではここでファイルに書き出したり、上位の結果を配列に保持したりする
}
}
4. 使用上の注意点とよくあるエラー
-
最適化モード時のみ動作する
OnTesterPassは「最適化(Optimization)」を実行している時だけ呼び出されます。通常の単体バックテスト(Visual Modeなど)では動作しないため、デバッグ時には注意が必要です。 -
FrameAddとのセット運用が必須
エージェント側(OnTester内など)でFrameAdd関数を使用してデータを送信しない限り、OnTesterPassは発火しません。「関数を書いたのに動かない」という原因の多くは、データの送信漏れです。 -
処理の重さに注意
OnTesterPassはターミナルのメインスレッドに影響を与えることがあります。ここで非常に重い計算や複雑なファイル操作を行うと、最適化全体のスピードが低下したり、MT5自体の操作が重くなる「GUIのフリーズ」を引き起こす可能性があります。 -
データの取りこぼし
非常に高速な最適化(数ミリ秒で終わるパスが大量にある場合)では、フレームが連続して届きます。必ずwhile(FrameNext(...))を使用して、キューに溜まった全てのフレームを処理するようにループさせてください。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムのバックテストにおいて、OnTesterPass を使いこなし理想的なパラメータを見つけたとしても、実際の運用環境が不適切であればその努力は水の泡となります。自動売買における最大の敵は、ネットワーク遅延(レイテンシ)です。
自宅のPCから一般的なインターネット回線を通じて注文を出す場合、物理的な距離やプロバイダーの経由地によって、パケットが証券会社のサーバーに届くまでに数十〜数百ミリ秒の遅延が発生します。このわずかな遅延が、相場急変時の「スリッページ」を引き起こし、バックテストでは利益が出ていた場面でも実運用では致命的な損失を招く原因となります。プロレベルの約定スピードと24時間365日の安定稼働を確保するためには、証券会社のサーバーに近いロケーションに設置された「自動売買専用のVPS(仮想専用サーバー)」の導入が不可欠です。インフラを最適化することは、優れたアルゴリズムを書くことと同等、あるいはそれ以上に重要なクオンツエンジニアの仕事と言えます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント