OnDeinit関数はEAを削除した時だけに呼ばれるもの?
未だに凡ミスする1つにOnDeinit関数の呼び出しタイミングがあります。
OnDeinit関数はEAを削除した時に呼ばれるものだ!って、ついつい思ってしまうんですね。
でも違います。
OnDeinit関数の引数reasonに注目してください。
reasonにはOnDeinit関数が呼ばれた時の理由を識別する番号が格納されます。
ということは、OnDeinit関数が呼ばれるタイミングは複数あるということですね。
どんな時に呼ばれるか、早速見てみましょう。
//+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { /* REASON_PROGRAM 0 EAがExpertRemove関数を呼び出して操作を終了しました。 REASON_REMOVE 1 プログラムがチャートから削除されました。 REASON_RECOMPILE 2 プログラムが再コンパイルされました。 REASON_CHARTCHANGE 3 通貨ペアか時間足が変更されました。 REASON_CHARTCLOSE 4 チャートが閉じられました。 REASON_PARAMETERS 5 パラメータがユーザ—によって変更されました。 REASON_ACCOUNT 6 別のアカウントが有効化されるか、アカウントの設定変更によってサーバへの再接続が発生しました。 REASON_TEMPLATE 7 新しいテンプレートが適用されました。 REASON_INITFAILED 8 OnInit関数がゼロ以外の値を返しました。 REASON_CLOSE 9 MT4のターミナルが閉じられた。 */ // 使い方の一例 if(reason == REASON_REMOVE || reason == REASON_CHARTCLOSE){ // 何らかの処理 } }
こんなにあるんですね。ちなみに、reasonの正式名は初期化解除の理由のコードと言うそうです。
まぁでも、6~8はそうそう使わないかなぁと思います。
私の場合、オブジェクトを削除する時とかMT4内に記憶されるグローバル変数を削除する時など、何かをお掃除する時にお世話になることが殆どです。
立つ鳥跡を濁さず、です。こういうことに意識が向くようになれば、初心者脱却ですね。