int OnInit(), void OnDeinit(const int reason), void OnTick() を理解しよう

MT4 Build 745(Build 600以降)で、Build 509 から名前・処理が変わった関数があります。

その中でも「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_PROGRAM0ExpertRemove()関数を実行して稼働中のEAが削除された。
REASON_REMOVE1チャートから稼働中のEAが削除された。
REASON_RECOMPILE2EA稼働中にリコンパイル(再コンパイル)された。
REASON_CHARTCHANGE3EA稼働中にタイムフレーム(時間足)が変更された。
REASON_CHARTCLOSE4EA稼働中にチャートが閉じられた。
REASON_PARAMETERS5EA稼働中にパラメーターが変更された。
REASON_ACCOUNT6EA稼働中にサーバーへの再接続が発生した。
REASON_TEMPLATE7EA稼働中に新しいテンプレートが適用された。
REASON_INITFAILED8EAの初期化に失敗した。(OnInitの戻り値が0以外)
REASON_CLOSE9MT4のターミナルが閉じられた。


OnInit関数, OnDeinit関数は、EA適用・削除時に1度だけ動作しますが、そのタイミングは意外と多いですね。
運用中に発生しそうなのは、パラメーターの再設定・回線不通によるサーバーへの再接続・MT4の再起動です。

値が 2, 3, 5, 6, 7 の場合は、OnDeinit 後に OnInit が即実行され、EA稼動状態となりますのでご安心ください。

OnDeinit関数は、あまり私は使わないのですが、異なるタイミングでいろいろ制御可能ですので
普段使用している方は、さらに細かく制御できるかと思いますので、ぜひ参考にしてみてください。

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

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

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

もっと見る...