UninitializeReason関数の役割・働き
UninitializeReason関数はMQL5プログラムが終了した理由(=初期化解除理由)を取得する役割を持ちます。
「MQL5プログラムが終了した理由」には事前に定義された定数リスト(=初期化解除の理由コード)があり、UninitializeReason関数はそれを取得して戻り値として返します。
※初期化解除の理由コードについての詳細は↓の記事をご参照ください
OnDeinit関数が呼び出されるたびに、UninitializeReason関数が初期化解除の理由コードを取得し、その値がOnDeinit関数の引数「reason」に格納される仕様になっています。
※OnDeinit関数についての詳細は↓の記事をご参照ください
UninitializeReason関数の引数と戻り値について
int UninitializeReason();
UninitializeReason関数は引数を持ちません。呼び出すだけで使えます。
戻り値に関しては記事冒頭にも書きましたが、事前に定義された「プログラムが終了した理由」の定数リスト(=初期化解除の理由コード)を返します。
終了理由に応じて以下の値を取得します。
REASON_PROGRAM
値: 0
説明: エキスパートアドバイザーがExpertRemove関数を呼び出して操作を終了した場合にこのコードが使用されます。
※ExpertRemove関数についての詳細は↓の記事をご参照ください
REASON_REMOVE
- 定数名: REASON_REMOVE
- 値: 1
- 説明: プログラムがユーザーによってチャートから直接削除された場合に返されます。
REASON_RECOMPILE
- 定数名: REASON_RECOMPILE
- 値: 2
- 説明: プログラムが再コンパイルされたことを示します。
※コンパイルについての詳細は↓の記事をご参照ください
REASON_CHARTCHANGE
- 定数名: REASON_CHARTCHANGE
- 値: 3
- 説明: シンボルまたはチャートの時間枠が変更された場合に指定されます。
REASON_CHARTCLOSE
- 定数名: REASON_CHARTCLOSE
- 値: 4
- 説明: チャートが閉じられたときにこの理由が設定されます。
REASON_PARAMETERS
- 定数名: REASON_PARAMETERS
- 値: 5
- 説明: ユーザーによって入力パラメータが変更された場合に使用されます。
REASON_ACCOUNT
- 定数名: REASON_ACCOUNT
- 値: 6
- 説明: アカウントが変更されたり、取引サーバへの再接続が必要になった場合に返されます。
REASON_TEMPLATE
- 定数名: REASON_TEMPLATE
- 値: 7
- 説明: 新しいテンプレートがチャートに適用されたことを示します。
REASON_INITFAILED
- 定数名: REASON_INITFAILED
- 値: 8
- 説明: OnInit関数がゼロ以外の値を返した場合に設定されます。
※OnInit関数についての詳細は↓の記事をご参照ください
REASON_CLOSE
- 定数名: REASON_CLOSE
- 値: 9
- 説明: MT5端末が閉じられたときに使用されます。
UninitializeReason関数を使う際の注意点
UninitializeReason関数はプログラム終了理由を取得する事を目的としているので、OnDeinit関数以外の場所でUninitializeReason関数を使用しても、正確な終了理由を得ることはできません。
※なお、定義済み変数「_UninitReason」にはUninitializeReason関数が取得した情報が格納されているので、「_UninitReason」を使っても同じ情報を取得する事ができます。
※定義済み変数についての詳細は↓の記事をご参照ください
※「_UninitReason」についての詳細は↓の記事をご参照ください
UninitializeReason関数を使ったサンプルコード
// 初期化解除理由を取得し、理由をテキストで出力する関数
string getUninitReasonText(int reasonCode) {
string text = "";
switch(reasonCode) {
case REASON_ACCOUNT:
text = "アカウントが変更されました";
break;
case REASON_CHARTCHANGE:
text = "シンボルまたは時間枠が変更されました";
break;
case REASON_CHARTCLOSE:
text = "チャートが閉じられました";
break;
case REASON_PARAMETERS:
text = "入力パラメータが変更されました";
break;
case REASON_RECOMPILE:
text = "プログラムが再コンパイルされました";
break;
case REASON_REMOVE:
text = "プログラムがチャートから削除されました";
break;
case REASON_TEMPLATE:
text = "新しいテンプレートが適用されました";
break;
default:
text = "その他の理由";
}
return text;
}
// エキスパートの初期化解除時に呼び出される関数
void OnDeinit(const int reason) {
// 初期化解除の理由のコードを取得し、コンソールに出力
Print(__FUNCTION__, " 初期化解除の理由コード = ", UninitializeReason());
Print(__FUNCTION__, " 初期化解除の理由 = ", getUninitReasonText(reason));
}
上記はUninitializeReason関数を使ったサンプルコードになります。
上記のコードは、エキスパートアドバイザーがチャートから削除される際に発生する初期化解除の理由コードを取得し、それを理解するためのものです。
オリジナル関数であるgetUninitReasonText
関数では、整数で指定された初期化解除の理由コードを受け取り、対応するテキスト説明に変換して返します。
この関数内でswitch文を使用し、各理由コードに応じて異なるテキストを割り当てています。
例えば、REASON_ACCOUNTの場合は”アカウントが変更されました”というテキストが割り当てられます。
※switch文についての詳細は↓の記事をご参照ください
OnDeinit関数は、プログラムがチャートから削除された際に自動的に呼び出される関数です。OnDeinit関数では、初期化解除の理由コードをエクスパートログに出力するためにPrint関数の第2引数にUninitializeReason関数を記述することによって、どの理由でプログラムが終了したのかをログに記録します。
これによりプログラムの終了理由を把握することができます。
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。