チャートの通貨ペア・時間足などが間違っている場合は、誤動作しないよう制限(停止)しています。
その際、OnInit() と OnTick() に、誤動作しないよう処理を記述していたのですが
OnInit() のみ処理をいれるだけで、誤動作しないということが最近判明しました。^^;
その方法は、下記のように OnInit() 関数内で戻り値を 0 以外にすることです。
そうすると、OnTick() が動作することなく、OnDeinit() が即実行されて強制終了します。
//+------------------------------------------------------------------+
//| INIT_FAILED.mq4 |
//| Copyright 2015, BLT. |
//| http://mt4ordersenderror.blog.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, BLT."
#property link "http://mt4ordersenderror.blog.fc2.com/"
#property version "1.00"
#property description "OnInit, OnDeinit, OnTick 動作確認用のEAです。"
#property description " "
#property description "各関数の動作時に関数名と引数を警告表示します。"
#property description " "
#property description "INIT_FAILED.mq4 は MT4 Build 765 で動作確認をしました。"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Alert(__FUNCTION__);
Alert("INIT_AGENT_NOT_SUITABLE:"+DoubleToStr(INIT_AGENT_NOT_SUITABLE,0));
Alert("INIT_FAILED:"+DoubleToStr(INIT_FAILED,0));
Alert("INIT_PARAMETERS_INCORRECT:"+DoubleToStr(INIT_PARAMETERS_INCORRECT,0));
Alert("INIT_SUCCEEDED:"+DoubleToStr(INIT_SUCCEEDED,0));
return(INIT_FAILED);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Alert(__FUNCTION__ + " " + DoubleToStr(reason,0));
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
Alert(__FUNCTION__);
}
//+------------------------------------------------------------------+
それでは、実際に動作させてみましょう。
動作させると、以下のようなポップアップが表示されます。

そして、エキスパートログには以下の内容が表示されます。
initialization failed (1) がありますので、初期化に失敗しているのがわかるかと思います。

前回の記事「uninit reason 5 のエキスパートログは無視してOK。uninit reason 8 は要注意!」で
記載した uninit reason 8 が表示されています。意図的に再現することができました。
本日は土曜日なのでレートは動いていないのですが、平日に動作させても OnTick() は動作しません。
バックテストでも同様に初期化に失敗しますので動作しません。
戻り値は 0 以外ですので、INIT_FAILED でも INIT_PARAMETERS_INCORRECT でも結果は同じです。
この定数の説明については、以下をご覧ください。
MT4定数 | 値 | 内容 |
---|---|---|
INIT_SUCCEEDED | 0 | 初期化成功 |
INIT_FAILED | 1 | 初期化失敗 |
INIT_PARAMETERS_INCORRECT | 32767 | パラメーター不正 |
INIT_AGENT_NOT_SUITABLE | 65535 | 初期化エラー(メモリー不足によるリソース上の問題など) |
MT4 Build 509 以前からこのような処理はできていたとは思いますが、あまり意識していませんでした。
というわけで、fx-on.comに出品中のEAについては、無駄な処理が入っています。。。