【超入門】MQL5 EA講座 第28回「static変数について」

MQL5でEA作ろう講座

どの記事も、文章中に出てくる各用語については、なるべく関連記事のリンクを貼るようにしているので、講座記事を読み進めていく中で、「わからなくなってしまった」、「忘れてしまった」言葉が出てきたら、クリックして復習していただければと思います<m(__)m>

前回グローバル変数 について解説しました。

改めて前回の内容をおさらいをしておくと、

  • グローバル変数ローカル変数で同一の変数名をつけることは、文法的には問題はないが、特別な意図がある場合を除いて、同じ変数名を使うことは無用の混乱を招くので望ましいことではない

ということをお伝えしました。

今回はstatic変数についてお話ししたいと思います。

スポンサーリンク
スポンサーリンク

static変数とは?

static変数とは、

特定の関数内で宣言をされ、その関数が処理を終えても、値の記憶を保つことができるローカル変数

のことです。

・・・「ちょっとマジで何を言っているのかわかんないですけど( 一一)」

と思われる方、申し訳ありません。<m(__)m>

順を追って説明していきますので、まずは落ち着きましょう。

通常ローカル変数は、有効範囲(スコープ)が、関数等の{}内に限定されるので、関数が処理を終えるとその値の記憶を保つことができません。

// void型の  sampleFunctionを関数として宣言
void sampleFunction()
{

   //変数「varInt」を宣言し、値「0」を代入
    int varInt=0;
   
   //変数「varInt」に値「1」を代入
   varInt=varInt+1;
   
   Print(varInt);
   
}

void OnTick()
{

      //関数の呼び出し
     sampleFunction();
     
}

最初に、sampleFunction関数の中で変数varIntを宣言し、値「0」を代入しています。

その下にある

varInt=varInt+1;

という記述を見て、「何これ?」と思った方もいるかもしれません。

これはインクリメントという処理なのですが、

MQL5における計算の規則については、まだ説明していないので、わからなくて当然です。

※計算に関する記述については

第30回「計算に関する記述その1-基本編-」

第31回「計算に関する記述 その2-発展編-」

までもう少々お待ちください。

最初varIntには0がはいっているので、

varInt=varInt+1;

varInt=0+1;

すなわち1が新たに代入されたと考えてください。

これをOnTick関数の中で呼び出すと

値動きがあるたびに、値「1」がログ出力され続けます。

値の記憶を保つことができないために、値動きがあるたびに、いったん変数宣言時に代入した0にいったん初期化されてしまうので、0→1→1がログ出力、という繰り返しになっているんですね。

「・・・だから何?(; ・`д・´)」

と思われるかもしれませんが、設計する自動売買プログラム(EA)の内容によっては、いちいち変数の値がリセットされてしまうのは不都合な場合があるんです。

例えば、日付データを格納している変数があったとして、その日付データを判断材料にトレードをしようとしているときに、その日付データが肝心なところでリセットしてしまったら、トレード自体ができなくなってしまう・・・と言ったようなことも起こり得ます。

※ちなみに、日付データを格納する変数データ型にはdatetime型を用います。

忘れてしまった方は↓の記事を見直していただければと思います。

ローカル変数static変数にすると、関数が処理を終えても変数が値を保つことができるようになります。

これにより、関数が呼び出されるたびに変数を初期化する必要がなくなり、また関数の異なる呼び出し間でデータを保持することができます。

これは、関数の状態を保持するか、関数呼び出し間で共有される特定の情報を管理する際に有用です。

static変数の作り方

static変数を作るときには、

宣言するデータ型の前に、static というキーワードを記述する

ことで達成できます。

// void型の  sampleFunctionを関数として宣言
void sampleFunction()
{

   //変数「varInt」を宣言時、staticをつけてstatic変数を作る
    static int varInt=0;
   
   //変数「varInt」に値「1」を代入
   varInt=varInt+1;
   
   Print(varInt);
   
}

void OnTick()
{

      //関数の呼び出し
     sampleFunction();
     
}

最初のサンプルコードとの違いは、変数「varInt」の宣言時にデータ型 int の前にstaticキーワードを追加しただけです。

↓の動画を見てください。

最初は、staticキーワードをつけずに普通のローカル変数として、プログラムを走らせているのですが、後半staticキーワードをつけてコンパイルしてみたものです。

いかがでしょうか?

最初は「1」しか表示されていなかったのに、staticキーワードをつけてコンパイルした後は、「2,3,4・・・」と値が増えていくようになりましたよね。

本来は関数が処理を終えると、値が初期値の0になるのですが、staticキーワードをつけたことによって、変数が値の記憶を保つことができるようになり、関数が処理を終えても0にならないため、数が積みあがっているんですね。

※ちなみに初期値(default value) という言葉を日常感覚の延長で考えると、つい

初期値=0

と考えてしまいがちですが、あくまで初期値

最初に設定した値

であり、無条件に初期値=0という風に考えないよう注意してください。

サンプルコードの例はあくまで初期値を「自身で0に設定した」から0になっているのであって

例えば

// void型の  sampleFunctionを関数として宣言
void sampleFunction()
{

   //変数「varInt」を宣言時、初期値を5に設定する
   int varInt=5;
   
   
   Print(varInt);
   
}

void OnTick()
{

      //関数の呼び出し
     sampleFunction();
     
}

のように初期値を5に設定すれば

初期値=5としてログ出力されていますね。

初期値については、第46回「関数の初期値について」 で詳しく取り上げる予定なのでもうしばらくお待ちください<m(__)m>

まとめ

今回はstatic変数 について解説しました。

今回の記事では以下のことを学びました

  • static変数を作るときには、宣言するデータ型の前に、static というキーワードを記述する

今回は以上になります。

最後までお読みいただきありがとうございました<m(__)m>

【超入門】MQL5 EA講座 第27回「グローバル変数について」

              →【超入門】MQL5 EA講座 第29回「定義済み変数について」

コメント

タイトルとURLをコピーしました