その中でも「int init(), int deinit(), int start() の動作タイミングを理解しよう」で記載した
3つの関数は、それぞれ「int OnInit, void OnDeinit, void OnTick」に関数名が変更となりました。
動作タイミングについては、Build 509 と変わりませんが、OnDeinit には引数が追加されています。
そこで今回は、各関数の動作タイミング(Build 745)と、この引数 reason について、ご説明します。
1.OnInit, OnDeinit, OnTick 関数の動作タイミング(Build 745)
各関数の動作タイミングは、Alert関数を挿入して簡単に確認することができます。
下記mq4のソースコードをコンパイルして、チャートに適用してみてください。(ダブルクリックで全選択)
//+------------------------------------------------------------------+
//| Alert.mq4 |
//| Copyright 2014, BLT. |
//| http://mt4ordersenderror.blog.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, 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 "Alert.mq4 は MT4 Build 745 で動作確認をしました。"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Alert(__FUNCTION__);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Alert(__FUNCTION__ + " " + DoubleToStr(reason,0));
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
Alert(__FUNCTION__);
}
//+------------------------------------------------------------------+
アラート音が鳴って、下記のようにポップアップ表示されましたか?

OnInit関数は、初期化処理をするための関数です。EAをチャートに適用した際に1度だけ動作します。
OnDeinit関数は、終了処理をするための関数です。EAをチャートから削除した際に1度だけ動作します。
OnTick関数は、メイン処理関数です。適用チャート(通貨ペア)のレートが配信されるタイミングで動作します。
OnInit関数, OnDeinit関数については、1度だけ動作しますが、タイミングはいくつもあります。(次項参照)
2.OnDeinit(const int reason) の引数について
void OnDeinit(const int reason) の引数 reason は、UninitializeReason() の値です。
UninitializeReason() は、未初期化原因(EAが稼働停止状態になった原因)のコードを返却する関数で
以下のように 0 から 9 まであります。
MT4定数 | 値 | 未初期化原因 |
---|---|---|
REASON_PROGRAM | 0 | ExpertRemove()関数を実行して稼働中のEAが削除された。 |
REASON_REMOVE | 1 | チャートから稼働中のEAが削除された。 |
REASON_RECOMPILE | 2 | EA稼働中にリコンパイル(再コンパイル)された。 |
REASON_CHARTCHANGE | 3 | EA稼働中にタイムフレーム(時間足)が変更された。 |
REASON_CHARTCLOSE | 4 | EA稼働中にチャートが閉じられた。 |
REASON_PARAMETERS | 5 | EA稼働中にパラメーターが変更された。 |
REASON_ACCOUNT | 6 | EA稼働中にサーバーへの再接続が発生した。 |
REASON_TEMPLATE | 7 | EA稼働中に新しいテンプレートが適用された。 |
REASON_INITFAILED | 8 | EAの初期化に失敗した。(OnInitの戻り値が0以外) |
REASON_CLOSE | 9 | MT4のターミナルが閉じられた。 |
OnInit関数, OnDeinit関数は、EA適用・削除時に1度だけ動作しますが、そのタイミングは意外と多いですね。
運用中に発生しそうなのは、パラメーターの再設定・回線不通によるサーバーへの再接続・MT4の再起動です。
値が 2, 3, 5, 6, 7 の場合は、OnDeinit 後に OnInit が即実行され、EA稼動状態となりますのでご安心ください。
OnDeinit関数は、あまり私は使わないのですが、異なるタイミングでいろいろ制御可能ですので
普段使用している方は、さらに細かく制御できるかと思いますので、ぜひ参考にしてみてください。