静的変数とは
.cpp
static int count = 0;
通常の変数の宣言に__static修飾子__を加えるとその変数を静的変数として用意することができます。動的変数は変数宣言のタイミングでメモリを確保するのに対して、静的変数はプログラム実行時に一度だけメモリを確保され、変数の初期化も最初の一度だけです。
静的変数 | 動的変数 | |
---|---|---|
初期化のタイミング | プログラム実行時 | 変数宣言時 |
EAのOnTick関数内で動作の違いを確認してみる
.cpp
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変数との比較をして、そのタイミングを見つけるようにしてみました。
.cpp
void OnTick()
{
static int TickVolume = 0;
if( TickVolume > iTickVolume(_Symbol,PERIOD_CURRENT,0) ) Print("終値が確定しました");
TickVolume = iTickVolume(_Symbol,PERIOD_CURRENT,0);
}
動作確認↓
※実行タイムフレームは1時間足で動作させています。
このように毎回初期化されないことを利用して__終値の確定__を知らせることが可能です。