MT4でEAのバックテストを行うと通常テストでは取引が発生するのに、 最適化を実行すると取引数が0回になってしまう── そんな現象に悩んだことはありませんか?
実はこの問題、EAのロジックが間違っているのではなく、 MT4ストラテジーテスターの「最適化時の仕様」が原因で起きているケースがほとんどです。
本記事では、 EA最適化で取引数が0になる代表的な原因と、 ObjectFind・ObjectCreate を使ったEAで最適化できない理由と対処法を、 実例付きで分かりやすく解説します。
最適化とは?
まず、最適化についてです。最適化とはバックテストをする際に自分で設定した値の範囲内で連続してテストを行ってくれる機能です。
詳しくは以下の記事に記載していますので、最適化がよくわからないよという方は参考にしてみてください。
ObjectFind()を使ったEAが最適化で取引数0になる原因
まず、最適化ができないパターンとして、ObjectFind()関数を用いてエントリーするようなEAです。
もっと簡単にいえば、EAで水平線やトレンドラインを引いてブレイクでエントリーといった感じのEAは最適化が行えません。これはMT4のストラテジーテスターの仕様によるものです。
原因
ObjectFind()関数 は、チャート上に存在する描画オブジェクト(ライン、テキスト、矢印など)を検索する関数です。しかし、最適化中はグラフィカルなチャートが描画されないため、オブジェクトそのものが存在しません。その結果、ObjectCreate() や ObjectFind() を実行しても、常に -1(見つからない)を返しますのでエントリー条件に合わないという事が起きます。
チャートオブジェクトを使わないロジックに変更しましょう
※配列等で管理していく方法にり複雑化するため、今回詳細は割愛します
その他最適化では使えない関数
最適化では使えない主な関数を列挙します。
❌ ObjectCreate()
❌ ObjectFind()
❌ ObjectSet(), ObjectSetText()
❌ Comment(),Alert()(ストラテジーテスターでは表示されない)
✅ Print()(操作履歴には出ないが、ログに出力される)
ObjectCreate()を使ったEAが最適化で動かない理由
最適化ができないよくあるパターンとして、ObjectCreate()もあります。以下は私がハマった内容です。
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//ラベルオブジェクトの作成
if(!ObjectCreate(0, objectName, OBJ_LABEL, 0, 0, 0))
{
return(INIT_FAILED);
}
こんな感じでオブジェクト作成チェックを最初にやっていたのですが、これも取引数が0になってしまいます。
原因
ObjectCreate()が必ず失敗するため、return(INIT_FAILED);になります。
最適化中かどうかを判定して、最適化中の場合はオブジェクト作成チェックを行わない
最適化中かどうかを判定する方法として、『define IS_OPTIMIZATION_MODE』があります。
#define IS_OPTIMIZATION_MODE (!IsVisualMode())
int OnInit()
if(!IS_OPTIMIZATION_MODE){
//ラベルオブジェクトの作成
if(!ObjectCreate(0, objectName, OBJ_LABEL, 0, 0, 0))
{
return(INIT_FAILED);
}
}
さいごに
以上が、『EAバックテストの最適化で取引数が0回になる現象と解決法』でした。
普通のバックテストはうまくいくのに、最適化だけうまくいかないってなったら焦りますよね。でも最適化の仕様を理解すれば問題が起きなくなりますので是非この機会に覚えておきましょう。
どうしても最適化が必要な場合は、EAの作り込みの部分から気をつけておく必要がありますね!
今回解説した「EA最適化で取引数が0になる問題」は、 MT4バックテスト全体の仕様を理解していないと 再びハマりやすいポイントでもあります。
バックテストの基本から最適化の考え方、 ヒストリカルデータの扱いまで体系的に知りたい方は、 以下のまとめ記事も参考にしてください。








コメント