MQL4でEAを作成していると、 「EAを入れ直したらパネルの位置が元に戻った」 「MT4を再起動したらEA情報がリセットされた」 という問題が出てくることがあります。
通常の変数に保存した値は、EAの再読み込みやMT4の終了によって初期化されます。
このような場面で利用できるのが、 MT4ターミナルのグローバル変数です。
ターミナルのグローバル変数を使うと、EAとは別の場所に値を保存し、 時間足の変更、EAの再読み込み、MT4の再起動後にも状態を復元できます。
本記事では、実際に開発した時間決済EAを題材として、 次のような実用例を紹介します。
- ドラッグ移動したチャートパネルの位置を保存する
- 複数ポジションの決済予定時刻を個別に保存する
- MT4を停止していた時間も含めて残り時間を計算する
- Auto Closeの対象・対象外をポジションごとに記憶する
最初に両者の違いを整理してから、実際の保存方法を見ていきましょう。
MQL4には2種類のグローバル変数がある
MQL4で「グローバル変数」と呼ばれるものには、次の2種類があります。
- MQL4プログラム内のグローバル変数
- MT4ターミナルのグローバル変数
どちらも値を覚えておくために使えますが、 保存される場所と値を保持できる期間が異なります。
| 項目 | プログラム内グローバル変数 | MT4ターミナルのグローバル変数 |
|---|---|---|
| 宣言・保存方法 | 関数外で変数を宣言 | GlobalVariableSet() |
| 保存期間 | EAが読み込まれている間 | 最終アクセスから4週間(MT4終了後も保持) |
| 参照範囲 | そのEA・インジケーター内 | 同じMT4ターミナル内 |
| 保存できる型 | int、double、bool、stringなど | double型 |
| 時間足変更時 | 再初期化される | 保存値を読み直せる |
| EAを外した場合 | 値は失われる | EAを外しても残る(最終アクセスから4週間) |
| 主な用途 | EA実行中の状態管理 | 再起動後の状態復元 |
プログラム内のグローバル変数は、関数の外に宣言します。
int panelX = 10;
int panelY = 20;
int OnInit()
{
Print("Panel X = ", panelX);
return(INIT_SUCCEEDED);
} このpanelXとpanelYは、EA内のどの関数からでも参照できます。
ただし、時間足の変更やパラメータの再設定などでEAが再初期化されると、
宣言時の値である10と20に戻ります。
一方、MT4ターミナルのグローバル変数は、次のように関数を使って保存します。
GlobalVariableSet("Sample.PanelX", 10);
GlobalVariableSet("Sample.PanelY", 20);こちらはEAの変数として保持するのではなく、 「Sample.PanelX」という名前と「10」という値をMT4側へ保存しています。
既存記事では、プログラム内のグローバル変数とローカル変数の違いを詳しく解説しています。 先に変数のスコープや宣言場所を確認したい場合は、こちらも参考にしてください。
▶ 【MQL4】グローバル変数とローカル変数の違い|EAでの使い分けを実例コードで解説
MT4ターミナルのグローバル変数とは
MT4ターミナルのグローバル変数は、 EAとは独立してMT4側で管理される数値データです。
EA、インジケーター、スクリプトのいずれからでも利用でき、 同じMT4ターミナル内であれば別のMQL4プログラムから参照することもできます。
| 特徴 | 内容 |
|---|---|
| 保存場所 | 使用中のMT4ターミナル側 |
| 値の形式 | double型 |
| 管理方法 | 変数名を付けて値を保存 |
| EAを再読み込み | 保存値を復元できる |
| MT4を再起動 | 保存値を復元できる |
| 別のEAから参照 | 同じ変数名を指定すれば可能 |
| 別PC・別MT4 | 自動では共有されない |
名前に「グローバル」と付いていますが、 インターネット経由で共有される仕組みではありません。
例えば、自宅PCのMT4で保存した変数が、 VPS上のMT4や別のパソコンへ自動同期されることはありません。
同じMT4ターミナル内のMQL4プログラムから共通で利用できるという意味です。
保存値には有効期間がある
ターミナルグローバル変数は、何もしなくても永久に残り続けるわけではありません。
最後に読み取り・確認・更新などのアクセスを行ってから 4週間経過すると、自動的に削除されます。
EAを継続して稼働しており、定期的に値を読み取っている場合は、 その読み取りもアクセスとして扱われます。
数日間の再起動対策や、稼働中のEA状態を復元する用途では問題になりにくいですが、 長期間まったく使わないデータを保存し続ける用途には向いていません。
基本的な保存・取得・確認・削除方法
ターミナルグローバル変数を扱う際は、主に次の4つの関数を使用します。
| 関数 | 役割 |
|---|---|
GlobalVariableSet() | 値を新規保存、または上書きする |
GlobalVariableGet() | 保存されている値を取得する |
GlobalVariableCheck() | 指定した変数名が存在するか確認する |
GlobalVariableDel() | 指定した変数を削除する |
値を保存する
string gvName = "Sample.PanelX";
GlobalVariableSet(gvName, 100); Sample.PanelXという名前で、数値の100を保存しています。
同じ名前の変数が存在しない場合は新しく作成され、 すでに存在する場合は値が上書きされます。
存在を確認して値を取得する
string gvName = "Sample.PanelX";
if(GlobalVariableCheck(gvName))
{
int savedX = (int)GlobalVariableGet(gvName);
Print("Saved X = ", savedX);
} 最初にGlobalVariableCheck()で変数が存在するか確認し、
存在していた場合のみGlobalVariableGet()で値を取得しています。
取得した値はdouble型なので、
パネル座標として使うためにint型へ変換しています。
保存値として0が入っているケースと区別するため、 先にGlobalVariableCheck()で存在確認を行うと分かりやすくなります。
不要になった値を削除する
string gvName = "Sample.PanelX";
if(GlobalVariableCheck(gvName))
{
GlobalVariableDel(gvName);
} GlobalVariableDel()を実行すると、
指定した名前のターミナルグローバル変数が削除されます。
決済済みポジションの管理データなど、 今後使用しない値は適切なタイミングで削除します。
実用例1:チャートパネルの位置を保存する
チャート上に操作パネルを表示するEAでは、 パネルをドラッグして好きな場所へ移動できるようにすることがあります。
しかし、移動後の座標をプログラム内の変数だけで管理していると、 時間足の変更やMT4再起動によって初期位置へ戻ってしまいます。
そこで今回のEAでは、次の名前でパネル位置を保存しています。
| 変数名 | 保存内容 |
|---|---|
MTC1.<AccountNumber>.<Symbol>.PanelCorner | 左上・右上・左下・右下の基準位置 |
MTC1.<AccountNumber>.<Symbol>.PanelX | 基準位置から見た横方向の距離 |
MTC1.<AccountNumber>.<Symbol>.PanelY | 基準位置から見た縦方向の距離 |
MTC1は、このEAを識別するための短い名前です。
その後ろに口座番号と通貨ペアを付けることで、 別口座や別通貨ペアのパネル位置と重なりにくい名前にしています。
パネル位置を保存するコード
int panelCorner = CORNER_LEFT_UPPER;
int panelX = 10;
int panelY = 20;
// パネル用の共通名を作成
string GetPanelGvPrefix()
{
string prefix =
"MTC1."
+ IntegerToString(AccountNumber())
+ "."
+ Symbol()
+ ".";
return prefix;
}
// 現在のパネル位置を保存
void SavePanelPosition()
{
string prefix = GetPanelGvPrefix();
GlobalVariableSet(
prefix + "PanelCorner",
(double)panelCorner
);
GlobalVariableSet(
prefix + "PanelX",
(double)panelX
);
GlobalVariableSet(
prefix + "PanelY",
(double)panelY
);
} GetPanelGvPrefix()では、
EA識別子・口座番号・通貨ペアを組み合わせた共通名を作っています。
例えば、サンプル口座でAUDCADチャートを開いている場合は、 次のような名前になります。
MTC1.12345678.AUDCAD.PanelCornerMTC1.12345678.AUDCAD.PanelXMTC1.12345678.AUDCAD.PanelY
パネルのドラッグが終了したタイミングで SavePanelPosition()を呼び出せば、
その時点の位置をMT4側へ保存できます。
ドラッグ中に毎回保存することもできますが、 マウスが少し動くたびに書き込みが発生します。 通常は、ドラッグ終了時や位置が確定したタイミングで保存すれば十分です。
EA起動時にパネル位置を復元するコード
void LoadPanelPosition()
{
string prefix = GetPanelGvPrefix();
string cornerName = prefix + "PanelCorner";
string xName = prefix + "PanelX";
string yName = prefix + "PanelY";
if(GlobalVariableCheck(cornerName))
{
panelCorner =
(int)GlobalVariableGet(cornerName);
}
if(GlobalVariableCheck(xName))
{
panelX =
(int)GlobalVariableGet(xName);
}
if(GlobalVariableCheck(yName))
{
panelY =
(int)GlobalVariableGet(yName);
}
}
int OnInit()
{
LoadPanelPosition();
// 読み込んだ座標を使ってパネルを作成
CreatePanel();
return(INIT_SUCCEEDED);
} EAの初期化処理でLoadPanelPosition()を呼び出し、
保存済みの値があればパネル座標へ戻しています。
保存値が存在しない場合は、宣言時に設定した 10や20などの初期位置がそのまま使われます。
OnInit()で保存値を読み込んでからパネルを作成する、
という流れになります。
同じ口座・同じ通貨ペアで複数のチャートを開き、 それぞれ異なるパネル位置を保存したい場合は、 時間足やEAごとの番号を変数名に追加する方法もあります。
実用例2:ポジションの決済予定時刻を保存する
次は、ポジションを一定時間後に自動決済するEAの例です。
例えば、約定から30分後に決済する場合、 単純に「残り1800秒」というカウントだけをプログラム内で管理すると、 MT4を再起動した時点でカウントが失われます。
このようなタイマーでは、残り秒数を保存するのではなく、 「何時何分に決済するか」という決済予定日時そのものを保存する方法が扱いやすくなります。
| 項目 | 例 |
|---|---|
| ポジション約定時刻 | 10:03:25 |
| 設定した決済時間 | 30分 |
| 決済予定時刻 | 10:33:25 |
決済予定時刻は、約定時刻に設定時間を加算して求めます。
int closeMinutes = 30;
datetime closeTime =
OrderOpenTime() + closeMinutes * 60; OrderOpenTime()は、選択中の注文の約定時刻を返します。
設定時間の30分を秒へ変換し、 約定時刻へ加算することで決済予定時刻を作っています。
注文チケットを含む名前で保存する
string closeGvName =
"MTC1."
+ IntegerToString(AccountNumber())
+ "."
+ Symbol()
+ "."
+ IntegerToString(OrderTicket())
+ ".close";
GlobalVariableSet(
closeGvName,
(double)closeTime
);変数名には、口座番号・通貨ペア・注文チケット番号を含めています。
これにより、同じ通貨ペアで複数のポジションを保有している場合でも、 それぞれ異なる決済予定時刻を保存できます。
datetimeは、そのままではなく double型へ変換して保存しています。
再起動後に残り時間を計算する
if(GlobalVariableCheck(closeGvName))
{
datetime savedCloseTime =
(datetime)GlobalVariableGet(closeGvName);
int remainingSeconds =
(int)(savedCloseTime - TimeCurrent());
if(remainingSeconds > 0)
{
Print(
"決済まで残り ",
remainingSeconds,
" 秒"
);
}
else
{
Print("決済予定時刻を過ぎています");
}
}保存した決済予定時刻から現在時刻を引くことで、 残り秒数を求めています。
例えば、決済予定時刻が10時33分25秒で、 現在時刻が10時23分25秒なら、残り時間は600秒です。
MT4を10分間停止していた場合でも、 再起動後の現在時刻を使って再計算するため、 停止していた10分間を含めて時間が経過したものとして判定できます。
「決済する予定の日時」を保存することがポイントです。
決済予定時刻を過ぎている場合は、 対象ポジションが現在も存在することや取引可能な状態であることを確認したうえで、 決済処理へ進みます。
チケットごとに状態を保存する理由
複数ポジションを同時に管理する場合、 配列の順番や注文一覧の表示順を使ってポジションを見分けると、 ポジションの増減によって別の設定が割り当てられる可能性があります。
例えば、3番目のポジションが決済された後に注文一覧を読み直すと、 それまで4番目だったポジションが3番目になることがあります。
このようなズレを避けるため、 注文チケット番号を、各ポジションを見分けるための番号として使用します。
| 保存名 | 内容 |
|---|---|
MTC1.<Account>.<Symbol>.<Ticket>.open | ポジションの約定時刻 |
MTC1.<Account>.<Symbol>.<Ticket>.minutes | そのポジションへ適用した決済時間 |
MTC1.<Account>.<Symbol>.<Ticket>.close | 決済予定時刻 |
MTC1.<Account>.<Symbol>.<Ticket>.state | Auto Closeの対象・対象外などの状態 |
サンプルの口座番号・通貨ペア・チケット番号を使用すると、 次のような変数名になります。
MTC1.12345678.AUDCAD.7654321.close
複数の情報を順番に保存する
まずは、約定時刻・設定時間・決済予定時刻を順番に保存します。
最後にstateを保存することで、
必要な情報が一通り保存されたことを確認しやすくしています。
次のコードでは、保存に失敗した場合も考慮しています。 少し長く見えますが、基本の考え方は 「必要な値を保存し、最後にstateを保存する」というものです。
string GetOrderGvPrefix(int ticket)
{
string prefix =
"MTC1."
+ IntegerToString(AccountNumber())
+ "."
+ Symbol()
+ "."
+ IntegerToString(ticket)
+ ".";
return prefix;
}
bool SaveOrderTimer(
int ticket,
datetime openTime,
int closeMinutes,
bool autoCloseEnabled
)
{
string prefix = GetOrderGvPrefix(ticket);
string stateName = prefix + "state";
datetime closeTime =
openTime + closeMinutes * 60;
// 前回の保存完了状態を先に外す
if(GlobalVariableCheck(stateName))
{
if(!GlobalVariableDel(stateName))
return false;
}
bool openSaved =
GlobalVariableSet(
prefix + "open",
(double)openTime
) != 0;
bool minutesSaved =
GlobalVariableSet(
prefix + "minutes",
(double)closeMinutes
) != 0;
bool closeSaved =
GlobalVariableSet(
prefix + "close",
(double)closeTime
) != 0;
// いずれかの保存に失敗した場合はstateを作らない
if(!openSaved || !minutesSaved || !closeSaved)
return false;
// 最後に保存完了状態を書き込む
bool stateSaved =
GlobalVariableSet(
stateName,
autoCloseEnabled ? 1.0 : 0.0
) != 0;
return stateSaved;
} この例では、stateを最後に保存しています。
open、minutes、closeの保存途中で処理が中断された場合や、
いずれかの保存に失敗した場合はstateが作成されません。
読み込み側ではstateの存在を確認することで、
すべての項目が保存されたデータかどうかを判断できます。
また、stateの値を次のように使い分けることもできます。
1.0:Auto Closeの管理対象0.0:Auto Closeの管理対象外
対象外という状態も保存しておけば、 EAを再起動した後にすべてのポジションが自動で管理対象へ戻ることを防げます。
GlobalVariableSet()は、保存に成功すると更新日時を返し、
失敗した場合は0を返します。複数項目を保存する場合は、各処理の戻り値を確認し、 すべての保存に成功した場合のみ
stateを書き込むと、より確実です。保存した情報を読み込む
次は、注文チケット番号を使って、 そのポジションに対応する保存値を読み込む例です。
bool LoadOrderTimer(
int ticket,
datetime &openTime,
int &closeMinutes,
datetime &closeTime,
bool &autoCloseEnabled
)
{
string prefix = GetOrderGvPrefix(ticket);
string stateName = prefix + "state";
// stateがなければ保存未完了または未登録
if(!GlobalVariableCheck(stateName))
return false;
if(!GlobalVariableCheck(prefix + "open"))
return false;
if(!GlobalVariableCheck(prefix + "minutes"))
return false;
if(!GlobalVariableCheck(prefix + "close"))
return false;
openTime =
(datetime)GlobalVariableGet(prefix + "open");
closeMinutes =
(int)GlobalVariableGet(prefix + "minutes");
closeTime =
(datetime)GlobalVariableGet(prefix + "close");
autoCloseEnabled =
GlobalVariableGet(stateName) != 0.0;
return true;
}チケット番号から専用の変数名を作り、 そのポジションに対応する値だけを読み込んでいます。
後からポジションが増減しても、 注文チケット番号が変わらない限り、別ポジションのタイマーが移ることはありません。
Global VariablesはF3で確認できる
保存されているターミナルグローバル変数は、 MT4上でF3キーを押すと確認できます。
メニューから開く場合は、 「ツール」から「グローバル変数」を選択します。
F3画面では、主に次の内容を確認できます。
- グローバル変数の名前
- 現在保存されている値
- 最後にアクセスされた日時
今回のEAであれば、 MTC1.から始まるパネル位置やポジション管理用の変数を確認できます。
F3画面から変数の値を変更したり、不要な変数を削除したりすることも可能です。
パネル座標や決済予定時刻を変更すると、 EAが次に値を読み込んだときの動作へ影響します。
通常は保存状態の確認に使用し、 変更・削除はEAの動作を理解したうえで行いましょう。
ターミナルグローバル変数を使うときの注意点
保存できる値はdouble型
ターミナルグローバル変数に保存できる値は、
基本的にdouble型です。
ただし、次のような数値として表せるデータは、 double型へ変換して保存できます。
| 元の型 | 保存例 | 復元例 |
|---|---|---|
| int | (double)panelX | (int)value |
| bool | trueなら1.0、falseなら0.0 | value != 0.0 |
| enum | (double)panelCorner | (int)value |
| datetime | (double)closeTime | (datetime)value |
| 座標 | (double)panelX | (int)value |
| チケット番号 | (double)ticket | (int)value |
文字列は値として直接保存できません。
文字列を保存したい場合は、選択肢を番号へ置き換える、 ファイルへ保存するなど、別の方法を検討します。
変数名が重ならないようにする
同じMT4内では、EAやインジケーターが共通のターミナルグローバル変数を参照できます。
そのため、次のような短すぎる名前は、 別のEAと重なる可能性があります。
PanelXCloseTimeState
別のEAが同じ名前を使っていた場合、 意図しない値を上書きする可能性があります。
基本的には、次のような構成で名前を作ります。
EA識別子.口座番号.通貨ペア.チケット番号.項目名
例: MTC1.12345678.AUDCAD.7654321.close
必要に応じて、マジックナンバーや時間足、 EAごとの番号などを追加する方法もあります。
MT4では、通常チャートで動いているEAとストラテジーテスターが、 同じターミナルグローバル変数を共有します。
テスト用と実運用用で同じ変数名を使用すると、 保存値が上書きされる場合があります。
必要に応じて、変数名へ
LiveやTestなど、
実運用とテストを見分ける文字を追加します。実運用とテストを分ける場合は、次のような変数名になります。
MTC1.Live.12345678.AUDCAD.7654321.closeMTC1.Test.12345678.AUDCAD.7654321.close
変数名を長くしすぎない
ターミナルグローバル変数の名前は、 63文字以内にする必要があります。
日本語や特殊文字を含めるのではなく、 半角英数字と区切り用のピリオドを中心にすると管理しやすくなります。
EA名をそのまま長く入れるのではなく、 MTC1のような短い識別子を決めておく方法がおすすめです。
複数の値はstateを最後に保存する
1つのポジションに対して複数の値を保存する場合は、 途中までしか保存されていない状態も考慮します。
例えば、次の順番で保存します。
openminutesclosestate
最後にstateを保存することで、
読み込み側ではstateの存在を
「必要な値を保存できたことを確認する目印」として利用できます。
より確実にする場合は、保存開始前に以前のstateを削除し、
各GlobalVariableSet()の戻り値を確認してから、
最後にstateを書き込みます。
通常は
GlobalVariableSet()だけで利用できますが、
重要な状態を保存した直後にディスクへの書き込みを明示したい場合は、 GlobalVariablesFlush()を使う方法もあります。頻繁に呼び出す必要はありません。
不要になった値は削除する
注文が決済され、今後そのタイマー情報を使わないことが確認できた場合は、 チケットに対応する保存値を削除します。
void DeleteOrderTimer(int ticket)
{
string prefix = GetOrderGvPrefix(ticket);
GlobalVariableDel(prefix + "open");
GlobalVariableDel(prefix + "minutes");
GlobalVariableDel(prefix + "close");
GlobalVariableDel(prefix + "state");
} ただし、一時的にOrderSelect()が失敗した、
注文情報を取得できなかったという理由だけで、すぐに削除するのは注意が必要です。
通信状況や注文履歴の読み込み状態によっては、 一時的に注文を確認できないこともあります。
現在の注文一覧だけでなく、必要に応じて注文履歴も確認し、 決済済みであることが確認できてから削除します。
ターミナルグローバル変数が向いている用途
ターミナルグローバル変数は、 少量の数値や状態を手軽に保存する用途に向いています。
| 向いている用途 | 保存する値の例 |
|---|---|
| EA機能のON/OFF状態 | 1.0または0.0 |
| チャートパネルの位置 | 基準位置、X座標、Y座標 |
| ポジションの決済予定時刻 | datetimeをdoubleへ変換 |
| トレーリング開始状態 | 開始済みなら1.0 |
| 一度だけ実行した処理 | 実行済みなら1.0 |
| 日次の取引回数 | 回数を数値で保存 |
| 前回の処理時刻 | datetimeをdoubleへ変換 |
| 複数EA間の簡単な状態共有 | フラグや数値 |
一方、次のようなデータにはあまり向いていません。
- 大量の売買履歴
- 複雑な文字列
- CSVのような表形式データ
- 多数の項目を持つ複雑な設定
- 別PCとのリアルタイム同期
- 長期間アクセスしなくても残したいデータ
- 大規模な保存データ
大量の履歴や複雑なデータを保存する場合は、 ファイル保存、CSV、外部データベースなどの方が管理しやすくなります。
❓ MT4ターミナルのグローバル変数に関するよくある質問
💬 GlobalVariableSet()や再起動後の状態復元について、よくある疑問をまとめました。
プログラム内のグローバル変数は、そのEAが読み込まれている間だけ値を保持します。 ターミナルグローバル変数はMT4側へ保存されるため、 EAの再読み込みやMT4再起動後にも値を取得できます。
はい。通常のターミナルグローバル変数はMT4終了後も保持され、 次回起動時にGlobalVariableGet()で取得できます。 ただし、最後のアクセスから4週間経過すると自動削除されます。
残ります。ターミナルグローバル変数はEAとは独立して管理されるため、 EAを外しただけでは削除されません。 GlobalVariableDel()で削除するか、最後のアクセスから4週間経過するまで残ります。
MT4上でF3キーを押すと、グローバル変数の一覧を確認できます。 変数名、保存値、最後にアクセスされた日時が表示されます。
保存値はdouble型ですが、datetimeはdoubleへ変換して保存できます。 boolはtrueを1.0、falseを0.0として保存し、 読み込み時に0以外かどうかで判定できます。
文字列を値として直接保存することはできません。 選択肢を番号へ置き換えるか、ファイルやCSVなど別の保存方法を使用します。
同じMT4内では同じターミナルグローバル変数として扱われます。 意図しない上書きを防ぐため、 EA識別子・口座番号・通貨ペア・チケット番号などを名前に含めます。
はい。同じMT4では、通常チャートで動くEAとストラテジーテスターが ターミナルグローバル変数を共有します。 テスト値による上書きを防ぐため、必要に応じて変数名へ LiveやTestなどの文字を追加します。
決済までの残り秒数ではなく、決済予定日時を保存しておけば対応できます。 再起動後に保存日時と現在時刻を比較することで、 MT4を停止していた時間も含めて経過時間を判定できます。
まとめ
今回は、MT4ターミナルのグローバル変数について、 パネル位置とポジション別タイマーの保存例を使って解説しました。
- MQL4には2種類のグローバル変数がある
- プログラム内グローバル変数はEAが読み込まれている間だけ値を保持する
- ターミナルグローバル変数はMT4再起動後も値を保持できる
- ドラッグしたパネル位置や決済予定時刻の保存に利用できる
- datetimeやboolはdouble型へ変換して保存できる
- 注文チケット番号を使うと複数ポジションを個別に管理しやすい
- 口座番号・通貨ペア・チケット番号を名前に含めると重複を防ぎやすい
- ストラテジーテスターと通常チャートは保存値を共有する
- 複数項目を保存する場合は、stateを最後に保存する
- 不要になった保存値は、注文状態を確認してから削除する
- F3キーから実際の保存内容を確認できる
- 最後のアクセスから4週間経過すると自動削除される
ターミナルグローバル変数は、 大量のデータを保存する仕組みではありません。
一方で、パネル座標、ON/OFF状態、決済予定時刻など、 EAの再起動後にも引き継ぎたい少量の状態を保存する方法として便利です。
すべての状態をターミナルグローバル変数へ保存するのではなく、 通常の変数、ファイル保存、CSVなどと用途に応じて使い分けましょう。
プログラム内のグローバル変数とローカル変数の使い分けについては、 次の記事で詳しく解説しています。
▶ 【MQL4】グローバル変数とローカル変数の違い|EAでの使い分けを実例コードで解説
MQL4の変数型や宣言方法から確認したい場合は、 次の記事もあわせて参考にしてください。
▶ EAプログラミングの変数とは|MQL4で宣言・代入・型を理解する方法
✅EA開発初心者の方はこちらもチェック!
MT4やMQL4の知識がなくても大丈夫!
当サイトでは、プログラミング未経験者でも分かるEA開発の基本から、サンプルコードを使った実践的なチュートリアルまで多数ご用意しています。
ChatGPTやEAつくーるでのEAの作り方に興味がある方は是非参考にしてください。






コメント