アンイニシャル定数(REASON_○○)
アンイニシャル定数は、プログラムが終了した理由を定数にしたものです。
エラーコード定数と似ていますが、アンイニシャル定数はプログラムが正常に終了したときに使用されます。
作成したプログラムがうまくロードされないとき、デバッグするために使用すると良いでしょう。
特に、エラーが出ない場合に、アンイニシャル定数を確認して見ることをオススメします。
アンイニシャル定数を取得するには、UninitializeReason関数を使用します。
UninitializeReason関数を使用することで、最近のアンイニシャル定数を取得することができます。
また、アンイニシャル定数は、OnDeinit関数の引数としても使われています。
OnDeinit関数は、プログラムが自動的に使う関数なので、特に意識する必要はありませんが知っておくと良いでしょう。
アンイニシャル定数(REASON_○○)
| 定数 | 数値 | 説明 |
| REASON_PROGRAM | 0 | 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関数が0以外の値を返した |
| REASON_CLOSE | 9 | ターミナルが閉じられた |
アンイニシャル定数(REASON_○○)の使い方
アンイニシャル定数は、_UninitReasonという変数に格納されます。
_UninitReason変数は、アンイニシャルされたときに自動的にアンイニシャル定数が格納されます。
最近のアンイニシャル変数を取得したい場合は、UninitializeReason関数を使用します。
UninitializeReason関数を使うことにより、_UninitReason変数の値を取得することができます。
例えば、以下のように使用します。
void OnStart() {
ExpertRemove();
Print(UninitializeReason());
}
上記のように記述することで、以下のような出力を得ることができます。
0
プログラム例:アンイニシャル定数を活用したデバッグ
以下は、OnDeinit関数内でアンイニシャル定数を使い、プログラムが終了した理由をログに出力するサンプルプログラムです。
//+------------------------------------------------------------------+
//| アンイニシャル定数を活用したデバッグ例
//+------------------------------------------------------------------+
int OnInit()
{
Print("EA が初期化されました。");
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
// アンイニシャル定数に応じてメッセージを出力
switch(reason)
{
case REASON_PROGRAM:
Print("終了理由: ExpertRemove関数で終了しました");
break;
case REASON_REMOVE:
Print("終了理由: チャートから削除されました");
break;
case REASON_RECOMPILE:
Print("終了理由: 再コンパイルされました");
break;
case REASON_CHARTCHANGE:
Print("終了理由: 通貨ペアまたは時間軸が変更されました");
break;
case REASON_CHARTCLOSE:
Print("終了理由: チャートが閉じられました");
break;
case REASON_PARAMETERS:
Print("終了理由: 入力パラメータが変更されました");
break;
case REASON_ACCOUNT:
Print("終了理由: アカウントが変更されました");
break;
case REASON_TEMPLATE:
Print("終了理由: テンプレートが適用されました");
break;
case REASON_INITFAILED:
Print("終了理由: OnInit関数が失敗しました");
break;
case REASON_CLOSE:
Print("終了理由: ターミナルが閉じられました");
break;
default:
Print("終了理由: 不明(コード: ", reason, ")");
break;
}
// UninitializeReason関数でも取得可能
Print("UninitializeReason() の戻り値: ", UninitializeReason());
}
void OnTick()
{
// 通常のティック処理
}
このプログラムでは、OnDeinit関数の引数reasonにアンイニシャル定数が渡されます。switch文を使って各定数に対応するメッセージをログに出力しています。
プログラムが意図せず終了してしまう場合、このようにアンイニシャル定数を確認することで原因を特定しやすくなります。




