はじめに
ここでは、MT4で普通のバックテストだと取引数があるのに最適化でのバックテストだと取引数が0件になってしまう例についていくつか解説しています。
最適化はEAの可能性を最大限引き出す事のできる重要な機能ですが、どういった場合に使えなくなるのでしょうか。
最適化とは?
まず、最適化についてです。最適化とはバックテストをする際に自分で設定した値の範囲内で連続してテストを行ってくれる機能です。
詳しくは以下の記事に記載していますので、最適化がよくわからないよという方は参考にしてみてください。
ObjectFind()で最適化ができないパターン
まず、最適化ができないパターンとして、ObjectFind()関数を用いてエントリーするようなEAです。
もっと簡単にいえば、EAで水平線やトレンドラインを引いてブレイクでエントリーといった感じのEAは最適化が行えません。これはMT4のストラテジーテスターの仕様によるものです。
原因
ObjectFind()関数 は、チャート上に存在する描画オブジェクト(ライン、テキスト、矢印など)を検索する関数です。しかし、最適化中はグラフィカルなチャートが描画されないため、オブジェクトそのものが存在しません。その結果、ObjectCreate() や ObjectFind() を実行しても、常に -1(見つからない)を返しますのでエントリー条件に合わないという事が起きます。
チャートオブジェクトを使わないロジックに変更しましょう
※配列等で管理していく方法にり複雑化するため、今回詳細は割愛します
その他最適化では使えない関数
最適化では使えない主な関数を列挙します。
❌ ObjectCreate()
❌ ObjectFind()
❌ ObjectSet(), ObjectSetText()
❌ Comment(),Alert()(ストラテジーテスターでは表示されない)
✅ Print()(操作履歴には出ないが、ログに出力される)
ObjectCreate()で最適化ができないパターン
最適化ができないよくあるパターンとして、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の作り込みの部分から気をつけておく必要がありますね!
コメント