【MQL4変数】システム変数(_○○)

【辞書】MQLリファレンス

システム変数(_○○)とは

システム変数(_○○)とは、システムが自動的に取り扱う変数のことで、チャートの情報などが格納されます。

そのため、特に宣言しなくても使える変数が、システム変数と呼ばれます。

逆に言えば、システム変数に何かを代入することはできませんので、ご注意ください。

システム変数と似た変数で、チャート変数という変数があります。

こちらの記事が参考になりますので、ご一読ください。

システム変数(_○○)

変数説明
_Digits現在のチャートの価格の小数点以下の桁数
_Point現在のチャートの価格の小数点値
_LastError直近のエラーコード
_Period現在のチャートの時間軸
_RandomSeed整数の疑似乱数
_StopFlagプログラム停止フラグ
_Symbol現在のチャートの通貨ペア名
_UninitReasonアンイニシャル理由コード

システム変数(_○○)の使い方

システム変数を使うときは、他の変数と同じように使います。

例えば、以下のようなプログラムです。

void OnInit(){
    Print("価格の小数点以下桁数  = ",_Digits);
    Print("価格の小数点値       = ",DoubleToStr(_Point , _Digits ));
    Print("直近エラーコード      = ",_LastError);
    Print("時間軸              = ",_Period);
    Print("乱数整数            = ",_RandomSeed);
    Print("ストップフラグ       = ",_StopFlag);
    Print("通貨ペア名          = ",_Symbol);
    Print("UnInit理由コード    = ",_UninitReason);   
}

上記のように記述することで、以下のような出力を得ることができます。

価格の小数点以下桁数= 5
価格の小数点値 = 0.00001
直近エラーコード = 0
時間軸 = 5
乱数整数 = 8995064
ストップフラグ = 0
通貨ペア名 = EURAUD
UnInit理由コード = 0

各システム変数の補足

各システム変数について、簡単に補足します。

_Digits_Point は、通貨ペアの価格精度に関する変数です。例えばUSDJPYなら _Digits は3(小数点以下3桁)、_Point は0.001となります。

_LastError は、直近で発生したエラーのコードを保持します。エラーが無い場合は0が返ります。

_Period は、現在のチャートの時間軸を分単位で返します。例えば5分足なら5、1時間足なら60となります。

_Symbol は、現在のチャートの通貨ペア名を文字列で返します。例えば「EURAUD」「USDJPY」などです。

_StopFlag は、プログラムの停止が要求されているかどうかを示すフラグです。通常は0ですが、停止要求があると1になります。

_UninitReason は、プログラムが終了(アンイニシャライズ)された理由を示すコードです。

実用的なプログラム例

システム変数は、EAやインジケーターの中で頻繁に使われます。以下は、_Pointを使ってストップロスやテイクプロフィットを設定する実用的な例です。

void OnInit(){
    // 現在のチャート情報をログに出力
    Print("通貨ペア: ", _Symbol);
    Print("時間軸: ", _Period, "分足");
    Print("小数点以下桁数: ", _Digits);
    Print("1ポイントの値: ", DoubleToStr(_Point, _Digits));
}

void OnTick(){
    // _Pointを使ったストップロス・テイクプロフィットの計算例
    double sl = 50 * _Point;  // 50ポイント分のストップロス幅
    double tp = 100 * _Point; // 100ポイント分のテイクプロフィット幅

    double ask = MarketInfo(_Symbol, MODE_ASK);
    double bid = MarketInfo(_Symbol, MODE_BID);

    // 買い注文の場合
    double buyStopLoss   = ask - sl;
    double buyTakeProfit = ask + tp;

    Print("買いSL: ", DoubleToStr(buyStopLoss, _Digits));
    Print("買いTP: ", DoubleToStr(buyTakeProfit, _Digits));
}

上記のように、_Point を使うことで通貨ペアの桁数に依存しない汎用的なコードを書くことができます。

まとめ

システム変数は、システムが自動的に取り扱う変数です。

こちらから何か操作することはできません。

しかし、通貨ペアごとに一定の値になる変数なので、定数として扱っても問題ないと思います。

システム変数といっても、他の変数と同じように使えるので、難しく考えず、とりあえず書いてみましょう!