変数のスコープ(グローバル変数とローカル変数)

アイキャッチ

変数には有効範囲がある

変数のスコープ(scope)とは、変数の有効範囲のことです。変数が利用可能な範囲とでも言いましょうか。その有効範囲はどこかと言うと、OnTick等の関数の{ }で囲まれた部分になります。ちなみに、{ }を”ブロック”と呼びます。

変数を宣言する場所によって、変数は2種類に大別されます(staticもありますが必須ではないので割愛)。関数の外に宣言した変数を”グローバル変数”、関数内に宣言した変数を”ローカル変数”と言います。

グローバル変数はプログラム内のどこでも利用できます。また、MT4を再起動したりEAを停止したりしない限り、変数の値は保持されます。

大変便利ではありますが、乱用するとバグの原因になります。「あれ、何でこの変数の値がここで0になっちゃってるんだろう?1が格納されているはずなのに…」といった感じで。

他方、ローカル変数は宣言された関数内でしか利用できません。言い換えると、他の関数でそのローカル変数を使うことはできません。また、関数を呼び出すたびにローカル変数の値は初期化されます。

この特性をうまく使って、2種類の変数を使い分けながら、プログラミングしていくことになります。

使い分けのポイントとしては、どの関数でも使う可能性のある変数だったり、関数を呼び出す際に変数を保持しておきたかったりする場合はグローバル変数として宣言し、それ以外はローカル変数として宣言することです。変数の有効範囲は基本的に狭い方が良いので、迷ったらローカル変数で事足りるか検討すると良いと思います。

では、サンプルプログラムでグローバル変数とローカル変数の挙動の違いを見てみましょう。

globalVarがグローバル変数、localVarがローカル変数です。globalVarはOnInit関数内でも、OnTick関数内でも使えることが分かると思います。他方、localVarはOnInit関数内で宣言されているので、OnInit関数内でしか使えません。

試しに、OnTick関数内でlocalVarを使ってみてください(最後のPrint関数がそれに該当)。コンパイルでエラーになるはずです。

プログラム内のコメントに記載していますが、localVarはOnTick関数内で宣言されていないので、そんな変数は存在しないと怒られるわけですね。

ここで、クイズです。上記コードの中で、【クイズ】に記述されている2行のコメントを解除してEAを実行した場合、OnTick関数内のglobalVarの値は「20」になるでしょうか?それとも「1」でしょうか?それはなぜでしょうか?ぜひ実際に試して結果を確認し、考察してみてください。

変数のスコープは非常に重要な概念ですので、ここでぜひ習得しておきましょう!

グローバル変数名に一工夫
グローバル変数を使う時は、グローバル変数だと分かる記号を変数名に入れておくことをお勧めします。私の場合、グローバル変数の先頭には「g」を付けるようにしています。例:gPipsPoint、gSlippage

ブログランキングに参加中!

ポチっとクリック頂けると励みになります♪
(クリックしてもランキング一覧が表示されるだけですが、それでOKです)

  にほんブログ村 為替ブログ FX システムトレード派へ

2件のコメント

  • 伊東 和彦

     FXの裁量トレードは、自分に向かないと気づき、FX自動売買を勉強し始めました。
     近道はないようですね。 頑張ります。
    どのサイトより、一番参考になってます。
    ありがとうございます。  頑張って下さい。
     

    • りゅーき

      こういう応援の言葉が何よりの励みになります!これからも色んな記事を書いていきますので、ご愛読いただけますと幸いです。

コメントを残す



four × one =