- ✅ 定義済み変数とは?
- ✅ 主な定義済み変数一覧
- ✅ 使い方の例
- ✅ システム変数との違いは?
- ✅ 1. シンボル・時間足に関する変数
- ✅ 2. 実行環境に関する変数
- ✅ 3. 使用例まとめ
- ✅ 1. シンボル・時間足関連
- ✅ 2. 実行環境関連
- ✅ 3. 実用的な使い分け
- ✅ 4. コード例:両者の違いを実演
- ✅ 1. 定義済み変数(Predefined Variables)
- ✅ 2. システム関数(System Functions)
- ✅ 3. グローバル変数(Global Variables)
- ✅ 1. ローカル変数
- ✅ 2. static 変数
- ✅ 3. プログラム内グローバル変数
- ✅ 4. ユーザー入力変数(外部変数)
- ✅ 5. ターミナルグローバル変数
- ✅ 6. 定義済み変数(Predefined Variables)
- ✅ 7. システム関数(System Functions)
✅ 定義済み変数とは?
MQL4 には、プログラマが宣言しなくても最初から使える変数 がいくつか用意されています。
これを 定義済み変数 と呼びます。
つまり、extern
や int
などで宣言しなくても、チャート上での EA/インジケーターの状態や環境情報を自動的に参照できる「組み込み変数」です。
✅ 主な定義済み変数一覧
MetaQuotes公式ドキュメントでは次の変数が「定義済み変数」とされています:
変数名 | 型 | 内容 |
---|---|---|
_Digits | int | 現在の銘柄の小数点桁数(例:EURUSD = 5、USDJPY = 3) |
_Point | double | 1ポイントの大きさ(0.00001 など) |
_Symbol | string | 現在の銘柄名(”EURUSD” など) |
_Period | int | 現在の時間足(M1=1, H1=60, D1=1440 など) |
_LastError | int | 直近のエラーコード |
_UninitReason | int | OnDeinit() が呼ばれた理由 |
_StopFlag | bool | EA/インジケータが停止要求を受けているかどうか |
_IsTesting | bool | ストラテジーテスター内で実行中か |
_IsOptimization | bool | 最適化中か |
_IsVisualMode | bool | ビジュアルモードで実行中か |
_AppliedPrice | int | インジケータで使用される価格種類(PRICE_CLOSEなど) |
_PeriodSeconds | int | 現在の時間足の秒数(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. シンボル・時間足に関する変数
変数名 | 型 | 説明 | 実用例 |
---|---|---|---|
_Symbol | string | 現在のチャートの銘柄名(”EURUSD” など) | EAを複数通貨で動かす時に「どの銘柄か」を判別 |
_Period | int | 現在の時間足(分単位:M1=1, H1=60, D1=1440) | マルチタイムフレーム分析で利用 |
_Digits | int | 現在の銘柄の小数点桁数(例:EURUSD=5, USDJPY=3) | 損切り・利確の計算時に使用 |
_Point | double | 1ポイントの大きさ(例:0.00001, 0.01) | pips換算やスリッページ計算で利用 |
_PeriodSeconds | int | 現在の時間足の秒数(M1=60, H1=3600, D1=86400) | タイマー計算、インジの時間管理に利用 |
✅ 2. 実行環境に関する変数
変数名 | 型 | 説明 | 実用例 |
---|---|---|---|
_LastError | int | 直近のエラーコード(GetLastError() と同等) | 注文失敗時の原因確認 |
_StopFlag | bool | EAやインジが停止要求を受けているか | 無限ループ回避や安全停止処理 |
_UninitReason | int | OnDeinit() が呼ばれた理由を示すコード | EA終了時の後処理 |
_IsTesting | bool | ストラテジーテスター内で実行中か | バックテスト時のみログを出す |
_IsOptimization | bool | ストラテジーテスターの最適化中か | 最適化時だけ軽量処理に切り替え |
_IsVisualMode | bool | テスターのビジュアルモードで実行中か | 可視化用ログを出すか制御 |
_AppliedPrice | int | インジケータが使っている価格種別(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 に最初から用意されている「宣言不要で使える特別な変数」
- 大きく分けると
- シンボル・時間足関連
- 実行環境関連
- 実運用・テスト・ファイル処理・安全停止などで大活躍
📘 定義済み変数とシステム関数の対応表(MQL4)
✅ 1. シンボル・時間足関連
定義済み変数 | 対応するシステム関数 | 違い・使い分け |
---|---|---|
_Symbol | Symbol() | _Symbol は常に「現在のチャートの銘柄」。Symbol() は EA/インジ内から呼び出して取得。どちらも同じ結果。 |
_Period | Period() | _Period は「現在の時間足」を保持。Period() を呼んでも同じ値を返す。 |
_Digits | Digits (グローバル変数) / MarketInfo(Symbol(), MODE_DIGITS) | _Digits は現在チャートの小数桁数を即取得。MarketInfo は任意シンボルの桁数を取得可能。 |
_Point | Point (グローバル変数) / MarketInfo(Symbol(), MODE_POINT) | _Point は現在チャート専用。複数シンボルを扱うときは MarketInfo を推奨。 |
_PeriodSeconds | PeriodSeconds() | _PeriodSeconds は定義済み変数、PeriodSeconds() は関数。どちらも現在時間足の秒数を返す。 |
✅ 2. 実行環境関連
定義済み変数 | 対応するシステム関数 | 違い・使い分け |
---|---|---|
_LastError | GetLastError() | _LastError は常に「最後のエラーコード」を保持。GetLastError() は呼び出した瞬間に取得し、その後 0 にリセット。 |
_StopFlag | IsStopped() | _StopFlag は「停止要求中か」をリアルタイムに保持。IsStopped() は関数として確認できる。 |
_UninitReason | UninitializeReason() | _UninitReason は EA/インジ終了理由のコードを格納。UninitializeReason() で同じ値を取得可能。 |
_IsTesting | IsTesting() | どちらも「テスト中か」を判別。変数で直接見るか、関数で呼ぶかの違い。 |
_IsOptimization | IsOptimization() | 最適化モードかを判別。同等の機能。 |
_IsVisualMode | IsVisualMode() | テストのビジュアルモード中かを判別。同等の機能。 |
✅ 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 / extern | input 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やインジ間で共有可 |
定義済み変数 | 全スコープ | 常に最新の状態 | 読み取り専用、自動更新 |
システム関数 | 全スコープ | 呼び出し時 | 他銘柄・他時間足に対応 |
コメント