変数はデータを一時的に保持するための基本的な要素です。どこで宣言された変数の値がどこまで保持されているかを理解することが重要です。ローカル変数、グローバル変数、Static変数の宣言方法や値の保持について解説します。
ローカル変数は変数が定義されたブロック内(ブレース { } で囲まれた領域)でのみアクセス可能です。また、ブロックが終了すると、その値は失われます。
使用例(関数のブロック内)
void Function(int a = 2) { int b = 1; Print(a + b); //a,bは関数Functionのブロック内でのみアクセスできるローカル変数 } //ここではローカル変数a,bにアクセスできません |
使用例(forループのブロック内)
for(int i = 0; i < 10; i++) { Print(i); //ローカル変数iはforループのブロック内でのみアクセス可能 } // ここではローカル変数iにアクセスできません |
※MQL4では通常モードとストリクトモード(#property strict が使用された場合)でローカル変数のアクセス可能場所が異なりますが、MQL5は常にストリクトモードのためアクセス可能場所が変わることはありません。
グローバル変数はプログラム全体でアクセスできます。
スクリプト、インジケータ、エキスパートアドバイザの開始から終了まで変数の値は保持されます。
使用例(forループのブロック内)
int GlobalVar = 50; int OnInit() { Print(GlobalVar); return INIT_SUCCEEDED; } void OnTick() { GlobalVar ++; Print(GlobalVar); } |
解説)
グローバルエリアで宣言されたGlovalVarはグローバル変数となり、OnInit()関数、OnTick()関数どちらのブロック内からでもアクセスすることができます。
Static変数はブロック内で宣言されますが、ブロックが終了してもその値は保持され続けます。
ブロックが再度呼び出された時に前回の値を参照することができます。
void OnInit() { TestFunction(); //結果 static変数: 1 / ローカル変数: 1 TestFunction(); //結果static変数: 2 / ローカル変数: 1 } void TestFunction() { static int staticVar = 0; // static変数 int localVar = 0; // 通常のローカル変数 staticVar += 1; localVar += 1; Print("static変数: ", staticVar, " / ローカル変数: ", localVar); } |
解説)static変数は宣言する際にstaticを付与しますstatic変数は、ブロックの外でも値を保持します。このため、1回目の関数呼び出し時にstaticVarは1となり、2回目の呼び出し時には2となります。一方、ローカル変数localVarは1回目も2回目も1となります。
変数の種類やその振る舞いを理解することは、エラーを減少させ、効率的なプログラミングを実現するために非常に重要です。本記事を通じて、変数の使い方の基本を再確認し、MQL5プログラミングのスキルを一段と磨いていただければ幸いです。
林 貴晴(AMSER株式会社代表取締役)
内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役、株式会社トリロジー他で役員を兼任。