【MQL4定数】アンイニシャル定数(REASON_○○)

【辞書】MQLリファレンス

アンイニシャル定数(REASON_○○)

アンイニシャル定数は、プログラムが終了した理由を定数にしたものです。

エラーコード定数と似ていますが、アンイニシャル定数はプログラムが正常に終了したときに使用されます。

作成したプログラムがうまくロードされないとき、デバッグするために使用すると良いでしょう。

特に、エラーが出ない場合に、アンイニシャル定数を確認して見ることをオススメします。

アンイニシャル定数を取得するには、UninitializeReason関数を使用します。

UninitializeReason関数を使用することで、最近のアンイニシャル定数を取得することができます。

また、アンイニシャル定数は、OnDeinit関数の引数としても使われています。

OnDeinit関数は、プログラムが自動的に使う関数なので、特に意識する必要はありませんが知っておくと良いでしょう。

アンイニシャル定数(REASON_○○)

定数数値説明
REASON_PROGRAM0ExpertRemove関数で終了した
REASON_REMOVE1プログラムがチャートから削除された
REASON_RECOMPILE2プログラムが再コンパイルされた
REASON_CHARTCHANGE3通貨ペアまたは時間軸が変更された
REASON_CHARTCLOSE4チャートが閉じられた
REASON_PARAMETERS5ユーザーによって入力パラメータが変更された
REASON_ACCOUNT6トレードサーバーへの再接続が発生した
または別アカウントに変更された
REASON_TEMPLATE7新しいテンプレートが適用された
REASON_INITFAILED8OnInit関数が0以外の値を返した
REASON_CLOSE9ターミナルが閉じられた

アンイニシャル定数(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文を使って各定数に対応するメッセージをログに出力しています。

プログラムが意図せず終了してしまう場合、このようにアンイニシャル定数を確認することで原因を特定しやすくなります。