int OnInit() { return(INIT_FAILED); } で void OnTick() の動作を制限する

int OnInit() では、初期化するための処理を記述しますが、自作の逆張りEA「BATTLE BONUS」では
チャートの通貨ペア・時間足などが間違っている場合は、誤動作しないよう制限(停止)しています。

その際、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_SUCCEEDED0初期化成功
INIT_FAILED1初期化失敗
INIT_PARAMETERS_INCORRECT32767パラメーター不正
INIT_AGENT_NOT_SUITABLE65535初期化エラー(メモリー不足によるリソース上の問題など)


MT4 Build 509 以前からこのような処理はできていたとは思いますが、あまり意識していませんでした。
というわけで、fx-on.comに出品中のEAについては、無駄な処理が入っています。。。

MT4 EA開発・運用ブログ:カテゴリー

MT4 EA開発・運用ブログ:人気記事ランキング(直近1ヶ月)

MT4 EA開発・運用ブログ:最新記事一覧

もっと見る...