定義済み変数

✅ 定義済み変数とは?

MQL4 には、プログラマが宣言しなくても最初から使える変数 がいくつか用意されています。
これを 定義済み変数 と呼びます。

つまり、externint などで宣言しなくても、チャート上での EA/インジケーターの状態や環境情報を自動的に参照できる「組み込み変数」です。


✅ 主な定義済み変数一覧

MetaQuotes公式ドキュメントでは次の変数が「定義済み変数」とされています:

変数名内容
_Digitsint現在の銘柄の小数点桁数(例:EURUSD = 5、USDJPY = 3)
_Pointdouble1ポイントの大きさ(0.00001 など)
_Symbolstring現在の銘柄名(”EURUSD” など)
_Periodint現在の時間足(M1=1, H1=60, D1=1440 など)
_LastErrorint直近のエラーコード
_UninitReasonintOnDeinit() が呼ばれた理由
_StopFlagboolEA/インジケータが停止要求を受けているかどうか
_IsTestingboolストラテジーテスター内で実行中か
_IsOptimizationbool最適化中か
_IsVisualModeboolビジュアルモードで実行中か
_AppliedPriceintインジケータで使用される価格種類(PRICE_CLOSEなど)
_PeriodSecondsint現在の時間足の秒数(M1=60, H1=3600など)

✅ 使い方の例

int start()
  {
   Print("現在のシンボル: ", _Symbol);
   Print("時間足: ", _Period);
   Print("桁数: ", _Digits, " 桁, ポイント: ", _Point);
   if(_IsTesting) Print("テストモードで実行中です");
   return(0);
  }

実行すると、チャートにこんなログが出ます:

現在のシンボル: EURUSD
時間足: 60
桁数: 5 桁, ポイント: 0.00001

✅ システム変数との違いは?

  • 定義済み変数
    → MQL4コンパイラがあらかじめ「特別な意味」を持つ変数として提供しているもの
    (例:_Symbol, _Period
  • システム関数
    → MQL4が提供している「呼び出して使う」関数群
    (例:OrderSend(), iMA(), MarketInfo()

👉 つまり、「変数」か「関数」かの違いです。


🔹 まとめると、定義済み変数は環境情報を自動で保持している便利な変数で、宣言不要ですぐ使える という特徴があります。



📘 MQL4 定義済み変数(Predefined Variables)完全版

✅ 1. シンボル・時間足に関する変数

変数名説明実用例
_Symbolstring現在のチャートの銘柄名(”EURUSD” など)EAを複数通貨で動かす時に「どの銘柄か」を判別
_Periodint現在の時間足(分単位:M1=1, H1=60, D1=1440)マルチタイムフレーム分析で利用
_Digitsint現在の銘柄の小数点桁数(例:EURUSD=5, USDJPY=3)損切り・利確の計算時に使用
_Pointdouble1ポイントの大きさ(例:0.00001, 0.01)pips換算やスリッページ計算で利用
_PeriodSecondsint現在の時間足の秒数(M1=60, H1=3600, D1=86400)タイマー計算、インジの時間管理に利用

✅ 2. 実行環境に関する変数

変数名説明実用例
_LastErrorint直近のエラーコード(GetLastError() と同等)注文失敗時の原因確認
_StopFlagboolEAやインジが停止要求を受けているか無限ループ回避や安全停止処理
_UninitReasonintOnDeinit() が呼ばれた理由を示すコードEA終了時の後処理
_IsTestingboolストラテジーテスター内で実行中かバックテスト時のみログを出す
_IsOptimizationboolストラテジーテスターの最適化中か最適化時だけ軽量処理に切り替え
_IsVisualModeboolテスターのビジュアルモードで実行中か可視化用ログを出すか制御
_AppliedPriceintインジケータが使っている価格種別(PRICE_CLOSE 等)カスタムインジ作成で利用

✅ 3. 使用例まとめ

例1:シンボルと時間足を判別

Print("現在のシンボル: ", _Symbol, 
      " 時間足: ", _Period, "分");

例2:スプレッド計算(pips換算)

double spread_pips = (Ask - Bid) / _Point;
Print("スプレッド: ", spread_pips, " pips");

例3:バックテスト時だけログを出す

if(_IsTesting)
   Print("テスト中: 銘柄=", _Symbol, " TF=", _Period);

例4:EA終了理由を表示

void OnDeinit(const int reason)
{
   Print("終了理由コード: ", _UninitReason);
}

✅ まとめ

  • 定義済み変数は MQL4 に最初から用意されている「宣言不要で使える特別な変数」
  • 大きく分けると
    1. シンボル・時間足関連
    2. 実行環境関連
  • 実運用・テスト・ファイル処理・安全停止などで大活躍


📘 定義済み変数とシステム関数の対応表(MQL4)

✅ 1. シンボル・時間足関連

定義済み変数対応するシステム関数違い・使い分け
_SymbolSymbol()_Symbol は常に「現在のチャートの銘柄」。Symbol() は EA/インジ内から呼び出して取得。どちらも同じ結果。
_PeriodPeriod()_Period は「現在の時間足」を保持。Period() を呼んでも同じ値を返す。
_DigitsDigits (グローバル変数) / MarketInfo(Symbol(), MODE_DIGITS)_Digits は現在チャートの小数桁数を即取得。MarketInfo は任意シンボルの桁数を取得可能。
_PointPoint (グローバル変数) / MarketInfo(Symbol(), MODE_POINT)_Point は現在チャート専用。複数シンボルを扱うときは MarketInfo を推奨。
_PeriodSecondsPeriodSeconds()_PeriodSeconds は定義済み変数、PeriodSeconds() は関数。どちらも現在時間足の秒数を返す。

✅ 2. 実行環境関連

定義済み変数対応するシステム関数違い・使い分け
_LastErrorGetLastError()_LastError は常に「最後のエラーコード」を保持。GetLastError() は呼び出した瞬間に取得し、その後 0 にリセット。
_StopFlagIsStopped()_StopFlag は「停止要求中か」をリアルタイムに保持。IsStopped() は関数として確認できる。
_UninitReasonUninitializeReason()_UninitReason は EA/インジ終了理由のコードを格納。UninitializeReason() で同じ値を取得可能。
_IsTestingIsTesting()どちらも「テスト中か」を判別。変数で直接見るか、関数で呼ぶかの違い。
_IsOptimizationIsOptimization()最適化モードかを判別。同等の機能。
_IsVisualModeIsVisualMode()テストのビジュアルモード中かを判別。同等の機能。

✅ 3. 実用的な使い分け

  • 変数版(_Symbol, _Period, _Digits など)
    → そのまま即座に使えて高速。EAのメイン銘柄や現在のチャートだけ見るなら十分。
  • 関数版(Symbol(), MarketInfo(), GetLastError() など)
    → 他の銘柄や過去の状態など柔軟に取得できる。マルチシンボル・マルチタイムフレーム対応EAには必須。

✅ 4. コード例:両者の違いを実演

// 現在のチャートの銘柄と時間足
Print("変数版: ", _Symbol, " / ", _Period);
Print("関数版: ", Symbol(), " / ", Period());

// 現在の桁数とポイント
Print("変数版: Digits=", _Digits, " Point=", _Point);
Print("関数版: Digits=", MarketInfo(Symbol(), MODE_DIGITS),
      " Point=", MarketInfo(Symbol(), MODE_POINT));

// エラー確認
int ticket = OrderSend("EURUSD", OP_BUY, 0.1, Ask, 3, 0, 0);
if(ticket < 0)
{
   Print("変数版 LastError=", _LastError);
   Print("関数版 LastError=", GetLastError());
}

✅ まとめ

  • 定義済み変数とシステム関数は ほぼ同じ情報を返すが用途が違う
  • 定義済み変数 → 現在チャート専用、即アクセス、軽い
  • システム関数 → 任意シンボル・任意条件も扱える、柔軟だがやや重い


📘 MQL4 における変数体系まとめ

✅ 1. 定義済み変数(Predefined Variables)

  • MQL4 があらかじめ提供している特別な変数
  • プログラマが宣言しなくても使える
  • 内容は自動で更新される

🔹 主な例:

  • チャート関連
    • _Symbol → 現在のチャート銘柄
    • _Period → 現在の時間足(分単位)
    • _Digits, _Point → 小数点桁数・ポイント値
  • テスト/実行環境関連
    • _LastError → 直近のエラーコード
    • _StopFlag → 停止要求があったか
    • _UninitReason → 終了理由コード
    • _IsTesting, _IsOptimization, _IsVisualMode → 実行環境フラグ

👉 特徴

  • 読み取り専用(ユーザーが値を書き換えられない)
  • 常に「現在の状態」を反映している

✅ 2. システム関数(System Functions)

  • 定義済み変数と同じ情報を取得できるが「関数」として呼び出す
  • 柔軟性が高い(任意シンボルや任意時間足も指定可能)

🔹 主な例:

  • Symbol(), Period(), Digits, Point
  • MarketInfo("USDJPY", MODE_DIGITS)
  • GetLastError()(呼び出し後に値リセット)
  • IsTesting(), IsStopped(), UninitializeReason()

👉 特徴

  • 関数呼び出しなので若干重い
  • 複数シンボル・マルチタイムフレーム対応の EA で必須

✅ 3. グローバル変数(Global Variables)

(A) プログラム内グローバル変数

  • int x; を関数外で宣言したもの
  • 同じファイル内のどの関数からでもアクセス可能
  • プログラム終了時に消える
int Counter = 0;   // プログラム内グローバル変数

void OnTick()
{
   Counter++;
   Print("Tick数 = ", Counter);
}

(B) ユーザー入力用グローバル変数

  • input / extern 修飾子を付けて宣言
  • EAやインジ起動時に設定画面から変更できる
input double Lots = 0.1;
extern int Magic = 12345;

(C) ターミナル間グローバル変数

  • GlobalVariableSet(), GlobalVariableGet() で作成
  • MT4 全体で共有される変数(EAやインジを超えて使える)
  • MT4終了後も保存される
// 値を保存
GlobalVariableSet("MyValue", 100);

// 値を取得
double v = GlobalVariableGet("MyValue");

👉 特徴

  • プログラムを超えて値を共有できる
  • 複数 EA の連携に便利

✅ まとめ(一覧表)

種類定義方法特徴
定義済み変数MQL4 が自動提供_Symbol, _Period, _LastError読み取り専用、即座に利用可、現在チャート専用
システム関数MQL4 標準関数Symbol(), GetLastError()柔軟に取得、他銘柄/他時間足も扱える
プログラム内グローバル変数ファイル先頭で宣言int x;プログラム内で共有、終了時に消える
ユーザー入力変数input / externinput double Lots;パラメータ入力可能、EA再起動で反映
ターミナルグローバル変数GlobalVariableSet()GlobalVariableGet("MyValue")MT4全体で共有、終了後も保持


📘 MQL4 変数体系完全まとめ

✅ 1. ローカル変数

  • 関数の中で宣言した変数
  • その関数の実行中だけ有効
  • 関数が終わると消える
void OnTick()
{
   int counter = 0;  // ローカル変数
   counter++;
   Print(counter);   // 毎回「1」と表示される
}

👉 特徴

  • 関数ごとに独立
  • 処理が終わると値は破棄

✅ 2. static 変数

  • 関数の中で宣言するが、一度代入された値は保持される
  • 関数を抜けても値が残る
void OnTick()
{
   static int counter = 0; // static変数
   counter++;
   Print(counter);         // Tickごとにカウントアップ
}

👉 特徴

  • ローカル変数の寿命を延ばしたもの
  • 「初期化は1回だけ」行われる

✅ 3. プログラム内グローバル変数

  • 関数の外で宣言した変数
  • 同じファイル内ならどこからでも使える
  • プログラムが終了すると消える
int counter = 0;  // プログラム内グローバル変数

void OnTick()
{
   counter++;
   Print(counter); // Tick数を永続カウント
}

✅ 4. ユーザー入力変数(外部変数)

  • input または extern を付けて宣言
  • EAやインジの設定画面から変更できる
input double Lots = 0.1;   // 外部入力可能
extern int Magic = 12345;

👉 特徴

  • コンパイル不要で値を変更可能
  • EAやインジを柔軟に設定できる

✅ 5. ターミナルグローバル変数

  • GlobalVariableSet() で作成
  • MT4ターミナル全体で共有可能
  • MT4を終了しても保持される
// 保存
GlobalVariableSet("MyValue", 100);
// 取得
double v = GlobalVariableGet("MyValue");

👉 特徴

  • 複数EAやインジで値を共有できる
  • 「変数の永続化」に使える

✅ 6. 定義済み変数(Predefined Variables)

  • MQL4が自動的に提供している変数
  • 常に最新の情報が入っている
  • 書き換え不可(読み取り専用)

例:

  • _Symbol, _Period, _Digits, _Point
  • _LastError, _UninitReason
  • _IsTesting, _IsOptimization

✅ 7. システム関数(System Functions)

  • 定義済み変数と同じ情報を取得するための関数版
  • 他のシンボルや時間足を指定できる

例:

  • Symbol(), Period(), Digits, Point
  • MarketInfo("USDJPY", MODE_DIGITS)
  • GetLastError(), IsTesting(), UninitializeReason()

✅ まとめ表(完全版)

種類有効範囲存在期間特徴
ローカル変数関数内のみ関数終了で消える毎回リセット
static変数関数内のみプログラム終了まで保持初期化1回だけ
プログラム内グローバル変数ファイル全体プログラム終了までどの関数からもアクセス可
ユーザー入力変数ファイル全体プログラム終了まで設定画面から変更可
ターミナルグローバル変数MT4全体MT4終了後も保持EAやインジ間で共有可
定義済み変数全スコープ常に最新の状態読み取り専用、自動更新
システム関数全スコープ呼び出し時他銘柄・他時間足に対応

コメント

タイトルとURLをコピーしました