MQL4言語でプログラミングをする際、「グローバル変数」と「ローカル変数」の使い分けは非常に重要です。これらの変数は、スクリプトやエキスパートアドバイザー(EA)の動作に直接影響を与えます。ここでは、それぞれの特徴と適切な使い方について解説します。
なお、本ページでの「グローバル変数」はプログラム内で宣言するグローバル変数のことです。詳しくはこちらを参考にしてください。
グローバル変数
グローバル変数は、プログラム全体で使用できる変数です。スクリプトや関数のどこからでもアクセス可能で、プログラムが終了するまで値を保持します。宣言は通常、プログラムの冒頭や関数の外で行ないます。
使用上の利点
- プログラム全体で一貫した値を保持できるため、設定値やカウンターとして利用されることが多い。
- どの関数からもアクセス可能なため、データの共有が簡単にできる。
使用上の欠点
- 不要な変更や誤操作によるバグが発生しやすい。
- 複数の関数が同時に値を変更する場合、予期せぬ動作を引き起こす可能性がある。
ローカル変数
ローカル変数は、その変数が宣言された関数やブロック内でのみ有効な変数です。関数が終了すると、その変数は破棄され、再度同じ関数が呼び出された際には新しい値が設定されます。
使用上の利点
- 他の関数やブロックからの影響を受けないため、変数の管理が容易。
- メモリ効率が良く、必要な時だけ変数を使用できる。
使用上の欠点
- 特定の関数やブロック内でしか使えないため、データの共有が困難。
使用例
グローバル変数とローカル変数を使ったプログラム例です。
グローバル変数「gv」を、作成した関数「lv_function()」の中で変化させています。「gv」は作成関数の外に出ても変化した値が維持されます。
ローカル変数「lv」は作成した関数「OnInit()」と「lv_function()」の中でそれぞれ宣言して値を変化させています。それぞれ「lv」は作成した関数の中でしか宣言されていないので、作成した関数の外で使うことができません。
それぞれの「lv」はそれぞれの関数の中でしか使うことができないので、別々の「lv」と考えてください。
コード
// 複数の値を返す参照渡しの方法
#property strict
int gv = 0; // 「gv」はグローバル変数
void OnInit() {
int lv = 1; // 「lv」はOnInit()関数内のローカル変数
Print("①lv_function()関数の結果:", lv_function());
Print("②グローバル変数 gv:", gv);
Print("③lv_function()関数の結果:", lv_function());
Print("④OnInit()関数内のローカル変数 lv:", lv);
}
int lv_function() {
int lv = 0; // 「lv」はlv_function()関数内のローカル変数
for(int i=0; i<10; i++){ // 「i」もlv_function()関数内のローカル変数
gv++; // 「gv」はグローバル変数
lv = lv + gv;
}
Print("⑤lv_function()関数の中のローカル変数 lv:", lv);
return(lv);
}
コードをコンパイルして実行する方法はこちらを参考にしてください。(デモ口座でお試しください)
結果
①作成関数「lv_function()」の中で、グローバル変数「gv(=0)」に順次 1が足され、1~10に変化した「gv」をそれぞれ合計して、ローカル変数「lv」が「55」になります。
②作成関数「lv_function()」は「55」を返します。
③この時「gv」は①で「10」になっています。
④作成関数「lv_function()」の中で、グローバル変数「gv(=10)」に順次 1が足され、11~20に変化した「gv」をそれぞれ合計して、ローカル変数「lv」が「155」になります。
⑤作成関数「lv_function()」は「155」を返します。
⑥「OnInit()」関数内のローカル変数「lv」は変更されていないので「1」のままです。
作成関数「lv_function()」中のローカル変数「lv」とは無関係の変数になります。
適切な使い分け
プログラミングにおいて、グローバル変数とローカル変数を適切に使い分けることは、コードの保守性やパフォーマンスを向上させる鍵です。次の点に注意して使い分けましょう。
共有データにはグローバル変数
複数の関数で共有する必要があるデータには、グローバル変数を使います。例としては、全体で使用する設定値やトレードカウンターなどが該当します。
限定的な使用にはローカル変数
特定の処理や関数内でのみ必要なデータには、ローカル変数を使いましょう。これにより、意図しない変更を防ぐことができます。
まとめ
- グローバル変数は、プログラム全体で使われる変数で、どこからでもアクセス可能。
- ローカル変数は、特定の関数やブロック内でのみ有効で、処理が終了すると破棄される。
- 適切な使い分けにより、コードの安定性と効率性が向上する。
これら基本を理解することで、MQL4プログラムの品質を高め、効率的なコーディングが可能になります。