MT4で「initialization failed on the pass〇」というエラーが発生する

MT4
スポンサーリンク

EAの開発依頼を受けて納品した際に、最適化でバックテスト確認すると「initialization failed on the pass〇」というエラーが発生し最適化でのバックテストが出来ないという報告を受けました。
※普通のバックテストはできる

今回は、その問題の解決策をメモとして残したいと思います。

ラベルオブジェクトの作成が失敗している

単刀直入にこのエラーの原因は、ラベルオブジェクトの作成で失敗しているのが原因でした。

int OnInit()
  {

//---
   //ラベルオブジェクトの作成
   if(!ObjectCreate(0, objectName, OBJ_LABEL, 0, 0, 0))
   {
      return(INIT_FAILED);
   }
   ~省略~

   return(INIT_SUCCEEDED);
  }

こんな感じで、問題となったソースコードはOnInit()でラベルオブジェクトの作成を行っていました。ラベルオブジェクトの作成に失敗したら「INIT_FAILED」を返すように作っていたのですが、どうやらここで「initialization failed on the pass〇」となっているようでした。

こんな感じで最適化するとエラーが出てバックテストが失敗している状態でした。RIKAKU=25~の所は実際に最適化でチェックしたパラメータです。

しかも最適化ではない普通のバックテストでは問題は発生せず、最適化のバックテストの場合のみ発生するので最適化のバックテストは何かロジックが違うのかな?という感じでした。

エラー内容としては、何かパラメータの値が悪いのかどうかという感じなので謎のエラーでした。

解決策

解決策は、ざっくりとした仮修正になりますが

オブジェクトの作成に失敗してもreturn(INIT_FAILED);をしない事

です。この修正方法は根本修正ではないためプログラマ的には怒られそうな修正ですがとりあえず暫定の修正としました。これで、最適化をしてもエラー無くバックテストする事が可能となりました。

オブジェクトの有無をチェックしてもNG

試しに、オブジェクトの有無をチェックしてみましたが結果は変わらずエラーとなりました。

int OnInit()
  {

//---
   //ラベルオブジェクトのチェック
   if(ObjectFind(objectName) < 0){

      if(!ObjectCreate(0, objectName, OBJ_LABEL, 0, 0, 0))
      {
         return(INIT_FAILED);
      }   
   }
   ~省略~

   return(INIT_SUCCEEDED);
  }

最適化の時って一体どうなってるんだろう・・・。

さいごに

エラー解決方法は以上になります。

根本の解決策ではありませんが、もし上記のエラーで困っている方がおられましたらOninit()の箇所でオブジェクト生成等で失敗していないかを確認してみると解決するかもしれません。

そもそも、「initialization failed ~」はOnInit()での失敗なので、return(INIT_FAILED);等で返しているとこのエラーとなります。最適化でのエラーはプラス「on the pass〇」が付くのでエラーを見てもすこし謎のエラーという形でした。

調べても殆ど情報が無いエラーでしたので、私の作りがおかしいという可能性も十二分にあります・・・!

※ MT4・EAが使えるFX会社のおすすめ

※ EAのサンプルソースを一覧表にまとめました


コメント