OnDeinit関数は、自動売買終了時に実行されるイベント関数です。しかし実際には、自動売買を終了するとき以外にも、実行されるタイミングがあります。
OnDeinit関数とは
「自動売買を終了するときにオブジェクトを削除したい!」
という方は、OnDeinit関数を使ってみましょう!
OnDeinit関数は、イベント関数の一つで、自動売買を終了するときなどに、自動的に一度だけ実行される関数です。
そのため、自動売買開発者の多くの方が、オブジェクトの削除や、メモリの開放などに使っています。
また、OnDeinit関数は、自動売買(エキスパートアドバイザ)を新規作成すると、自動的にプログラミングされています。
自動的にプログラミングされているのは、主に以下の3つなので、確認しておくと良いでしょう。
今回は、OnDeinit関数に注目して解説していきます。
自動売買を新規作成したときのプログラム
自動売買を新規作成すると、以下のようなプログラムが自動作成されます。
//+------------------------------------------------------------------+
//| newExpertAdviser.mq4 |
//| Copyright 2022, Asahina Risa |
//| https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Asahina Risa"
#property link "https://mql-programing.com/"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
このように、すでにOnInit関数・OnDeinit関数・OnTick関数が記述されています。
OnDeinit関数は、23行目にあります。
OnDeinit関数の特徴
OnDeinit関数はイベント関数なので、イベントが起こったときに実行されます。
そのイベントとは、「アンイニシャルコードが発生したとき」です。
先程、OnDeinit関数は「自動売買を終了するときに実行されるイベント関数」と、解説しましたが、実際はそのタイミング以外にも実行されます。
つまり、自動売買がアンイニシャルコードを発生させたときに、一度だけ実行される関数ということになります。
そのため、OnDeinit関数は、さまざまなタイミングで実行されますので、アンイニシャルコードも確認しておくと良いでしょう。
別名「初期化解除関数」(deinitialization function)とも呼ばれる関数です。
OnDeinit関数の書き方
OnDeinit関数の使い方は、基本的な関数と同じです。
関数をマスターしていない方はこちらの記事が参考になります。
基本的な書き方
OnDeinit関数はとてもシンプルな関数です。
引数はint型で、reason(アンイニシャルコード)で実行できます。
また、OnDeinit関数内で reason を変更できないように、const属性がついております。
戻り値はvoid型です。
OnDeinit関数の基本的な書き方は以下の通りです。
void OnDeinit(const int reason)
{
}
戻り値はvoid型なので、特にreturnは必要ありません。
戻り値
なし
引数
const int型 (アンイニシャルコード)
OnDeinit関数のサンプルプログラム
サンプルプログラムは、こちらになります。
アンイニシャルコードを網羅しておりますので、テンプレートとしても使えます。
void OnDeinit(const int reason)
{
//アンイニシャルコード(数値)を表示
Print("アンイニシャルコード = ", reason);
//アンイニシャルコードの詳細を表示
//getUninitReasonText関数は、下に記述
Print("アンイニシャルリーズン1 = ", getUninitReasonText(_UninitReason));
//アンイニシャルコードの詳細を表示するもう一つの方法
//getUninitReasonText関数は、下に記述
Print("アンイニシャルリーズン2 = ", getUninitReasonText(UninitializeReason()));
}
//+------------------------------------------------------------------+
//| 初期化理由コードのテキスト記述を返す |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
{
string text = "";
switch(reasonCode)
{
case REASON_PROGRAM:
text = "ExpertRemove関数で終了した";
break;
case REASON_REMOVE:
text = "プログラムがチャートから削除された";
break;
case REASON_RECOMPILE:
text = "プログラムが再コンパイルされた";
break;
case REASON_CHARTCHANGE:
text = "通貨ペアまたは時間軸が変更された";
break;
case REASON_CHARTCLOSE:
text = "チャートが閉じられた";
break;
case REASON_PARAMETERS:
text = "ユーザーによって入力パラメータが変更された";
break;
case REASON_ACCOUNT:
text = "トレードサーバーへの再接続が発生した。または別アカウントに変更された";
break;
case REASON_TEMPLATE:
text = "新しいテンプレートが適用された";
break;
case REASON_INITFAILED:
text = "OnInit関数が0以外の値を返した";
break;
case REASON_CLOSE:
text = "ターミナルが閉じられた";
break;
default:
text = "その他の理由";
}
return text;
}
まとめ
OnDeinit関数は、「アンイニシャルコードが発生したとき」に実行されるイベント関数です。
感覚的には、自動売買を終了したとき以外は、分かりにくいと思いますが、さまざまなタイミングで実行されています。
例えば、自動売買のパラメータを変更したときや、表示する時間足を変更したときなどです。
プログラムによっては、このタイミングでオブジェクトを削除したい場合がありますので、OnDeinit関数に記述してみてください。