kindle実践本のサンプルプログラムがMT4 Build1080でコンパイルできない理由

先日発売しました『新MT4対応ライブラリによるメタトレーダーEA実践プログラミング』ですが、そのサンプルプログラムでコンパイルエラーが出て、コンパイルできない場合があります。

ただし、これはMT4のBuildに依存するもので、Build1065以前のMT4では問題ありません。現在のところ判明しているのは、Build1080のMT4のみです。

具体的には、コンパイル時に

‘i’ – variable already defined    LibEA4.mqh    67    15

というエラーが表示されます。

これは、本書ライブラリ「LibEA4.mqh」で発生しているエラーなので、このファイルをインクルードしているすべてのサンプルプログラムでエラーとなってしまうのです。

このエラーの原因は既に明らかになっています。エラーの発生している箇所は以下の関数です。

この関数では、

というコードが2か所に書かれています。同じ関数の中で変数「i」が2か所で宣言されているので、2か所目でエラーが出ていると思われる方も多いでしょう。

しかし、このファイルの最初に、

#property strict

と書かれているので、仕様が若干異なります。詳しくは、

https://docs.mql4.com/mql4changes

に説明されていますが、この場合、変数のスコープ(有効範囲)はブロックの中となります。ここでは、for文がひとつのブロックとなるので、それぞれのfor文で宣言した変数は、そのfor文の中だけで有効となります。そのため、各for文で変数を宣言しなくてはいけないのです。

では、なぜ、Build1080からエラーが出るようになったのかというと、「LibEA4.mqh」に記述してあるにも関わらず、「#property strict」が無視されたからです。どうやら、コンパイルするファイルに直接「#property strict」が記述されていれば、有効なのですが、インクルードする別のファイルに記述しても無視されるようです。

おそらくこれはバグだと思われますので、現在、メタクオーツ社に問い合わせをしています。今後のアップデートでこのバグが修正される可能性もありますが、もし、これがバグではなく、インクルードファイル中の「#property strict」は無視されるという仕様に変更されたという場合、サンプルプログラムの全部を修正する必要があります。

具体的には、すべてのサンプルプログラム「*.mq4」の始めに「#property strict」を記述することになります。これは、kindle入門書のサンプルプログラムと同じなので、ご理解いただけると思います。

もし、Build1080でサンプルプログラムをお試しになりたい方は、とりあえず、上記のようにプログラムを修正してお使いになることをお勧めします。

今後のメタクオーツ社の対応や、アップデートの情報については、わかり次第ご報告いたします。

[2017/05/17 追記]
この記事の不具合はMT4の次のアップデートで修正されると、メタクオーツ社より返信がありました。

[2017/05/21 追記]
MT4 Build1090では、この記事の不具合は修正されています。kindle実践本のサンプルプログラムをお試しの方は、MT4 Build1090以降をご利用ください。

 



コメントは受け付けていません