static変数(静的変数)を使ったときの動作を確認してみるMQL5


静的変数とは

static int count = 0;

 通常の変数の宣言にstatic修飾子を加えるとその変数を静的変数として用意することができます。動的変数は変数宣言のタイミングでメモリを確保するのに対して、静的変数はプログラム実行時に一度だけメモリを確保され、変数の初期化も最初の一度だけです。

静的変数 動的変数
初期化のタイミング プログラム実行時 変数宣言時

EAのOnTick関数内で動作の違いを確認してみる

void OnTick()
  {
   static int count1 = 0; //静的変数

          int count2 = 0; //動的変数

   count1++;

   count2++;

   Print("静的変数 count1 = ",count1," , 動的変数 count2 = ",count2);
  }

 1ティックごとに静的変数のcount1と動的変数のcount2をそれぞれ値を1づつプラスしていき、二つの変数の中身がどう違うのか、実際に動作させて確認してみます。

 Print関数で変数の中身を確認すると静的変数は1ティックごとに値が1ずつ増えているのに対して、動的変数は毎ティック変数の値が0に初期化さてるため、count2++;の処理をしても出力される値はずっと1のままです。

static変数を使ってローソク足の終値が確定したことを調べる

 static変数が毎回初期化されないことを活かし「ローソク足の終値確定」を調べます。新しいローソク足のティックボリュームは0から始まるため、最新足のティックボリュームとstatic変数との比較をして、そのタイミングを見つけるようにしてみました。

void OnTick()
  {
   static int TickVolume = 0;

   if( TickVolume > iTickVolume(_Symbol,PERIOD_CURRENT,0) ) Print("終値が確定しました");

   TickVolume = iTickVolume(_Symbol,PERIOD_CURRENT,0);
  }

 動作確認↓

※実行タイムフレームは1時間足で動作させています。

このように毎回初期化されないことを利用して終値の確定を知らせることが可能です。