static変数を多用したEAは危険!~PART1

たとえば、条件付きのトレーリングストップとか、セットアップ式のフィルターとかを装備した、ちょっと複雑なEAを作成するときには、一度設定した変数の値を、ティックが変動してもそのまま記憶しておく必要に迫られることが多々あります。

 

そんなときに便利なのがstatic変数です。

 

たとえば、次のプログラムを見ましょう。

最初に変数Aを宣言し、その後、Aの値に「1」を足してコメント表示しているわけですが、ティック変動のたびにstart()関数が実行されるので、単純に考えると、Aの値は、

 

0,1,2,3,・・・

 

と増えていきそうですが、残念ながら、

 

1,1,1,1・・・

 

のままです。

 

その理由は、start()関数が実行されるたびにAの値が「0」に初期化されるからです。

 

そこで、ティック変動にもかかわらず、Aの値を初期化せずにそのまま以前の値を記憶させるためには、

とすれば、Aの値は、ティック変動とともに、

 

0,1,2,3,4・・・

 

と加算されていきます。

 

同様の結果は、いわゆる外部変数を使っても実現できます。

上のように、変数をstart()関数の外で宣言すればOKです。

 

 

 

 

しか~し、

これらstatic変数や外部変数には困った欠点があります。

 

それは、パソコンまたはメタトレーダーもしくはEAのいずれかが再起動されたときに、それらの変数が再び初期化されるため、保存されていた記憶が切断されてしまい、再起動後のEAがわけのわからない作動をしてしまう、ということです。

 

つまり、先の例でいうと、思惑としては、Aの値が、

 

0,1,2,3,4  再起動  5,6,7,8,9・・・

 

となって欲しいところ、

 

0,1,2,3,4  再起動  0,1,2,3,4・・・

 

となってしまうということです。

 

なので、たとえば、直近の約定価格とかロット数などのように、MT4の現在のプール内にデータとして保存されている数値については、static変数などを使わずに、for文とOrderSelect()関数を使って、それらの値を抽出するというのが、あくまでも正攻法なのです。

 

ただ、自分で設定したフィルターや条件分岐の値など、MT4の現在のプール内に保存されない数値については、いかんともしがたく、ネット上でよく、「EAを再起動したら、とんでもないことになってしまった」という事例をみかけるのも、ほとんどはこれが原因です。

 

次回から、このような問題をうまく解決するテクニックについて、ご紹介します。