[MT4][mql4][プログラミング] property strictの機能とは?

mql4でEAやIndicatorを実装している方は、プログラムプロパティの「#property strict」を見たことがある人は多いかもしれません。

今回は、その「#property strict」の機能について、簡単に紹介したいと思います。

Contents

#property strict の機能

1. 仕様

EA作成のサンプルコードの紹介ページで既に少し紹介していますが、今回はMQL4 ReferenceのProgram Propertiesを見てみることにします。そこには下記のように記載されています。

Compiler directive for strict compilation mode

https://docs.mql4.com/basis/preprosessor/compilation

mql4で書かれたコードをコンパイルする際に、厳密なコンパイルモードにするといったことが書かれています。
また、上記Program Propertiesには、さらにUpdated MQL4へのリンクが張られており、「#property strict」は過去のMQL4コンパイラの大幅アップデートがありその際の機能の互換性を保たせるためにこのpropertyの設定の有無で制御できるようになっているようです。
この、大幅UpdateはBuild 600で行われたようなのでそれ以降のBuildで新規に作成する場合は基本「#property strict」を設定しておけば最新機能と動作となる為、設定しておくのが良いでしょう。

ただし、今回この記事では、上記の「厳格なコンパイルモード」と書かれる意味として、アップデート時の互換性以外の機能もありそうでしたので以下に紹介します。

2. 厳密なコンパイルモードの互換性以外の機能とは?

厳密なコンパイルモードの互換性以外の機能とは一体どういったモードなのでしょうか?
ピンとこない方もいるかと思いますので、実際にコードを書いて試してみましょう。

サンプルコード

#property strict

int      testVariable1 = 0;
double   testVariable2 = 10.0;

testVariable1 = testVariable2 / 2;

上記のようなサンプルコードを用意してみました。

コード上は、特におかしなところは無いように感じる方もいるかと思います。
最後の行で、int型のtestVariable1に対して割り算の結果を代入していますが、結果は「5」となる為、問題ありませんよね?

ではこのコードをそれぞれ、1行目の「#property strict」を入れている場合と、入れていない場合でそれぞれコンパイルしてみましょう。

まずは、「#property strict」がない場合のコンパイル結果です。

0 errors, 0 warnings, 188 msec elapsed		1	1

コンパイル結果は「0 error」「0 warnings」となっていて問題ない結果となっています。

次に、「#property strict」がある場合のコンパイル結果です。

possible loss of data due to type conversion	xxx.mq4
0 errors, 1 warnings, 183 msec elapsed		1	2

結果は、「#property strict」をつけてコンパイルすると、「1 warnings」が出てしまいました。

Warnngの理由としては、最後の行に書かれている「testVariable1 = testVariable2 / 2;」の記述に対して「型変換によるデータの損失の可能性があります」とのことです。

これがなぜかというと、
– testVariable1はint型の整数を格納する変数、
– testVariable2はdouble型の浮動小数点型を格納する変数
となっており、浮動小数点型の変数を使用して小数点以下まで計算できる能力があるのに、その結果を、整数の変数に入れてしまうと、小数点以下が切り捨てられてしまいますよというwarningになります。

今回は割り切れる値で試しましたが、コードが複雑になるにつれて、浮動小数点型の変数「testVariable2」に2で割り切れない値であったり少数点以下も値があるケースも出てくるかもしれません。

そういった場合に、意図して少数点以下を切り落として、整数型にしようとしているのならばいいですが、意図していなかった場合は思わぬバグを呼び起こすことになります。
また、意図して小数点以下を切り捨てる場合は可読性や、保守のしやすいように下記6行目のようにキャストを明示的に記述するべきですね。
下記のようなキャストを記述しておけば、コンパイラはプログラマが意図している処理と認識してWarningも出ないようになります。

#property strict

int      testVariable1 = 0;
double   testVariable2 = 10.0;

testVariable1 = (int)(testVariable2 / 2);

3. まとめ

ここまでで、厳密なコンパイルモードの互換性以外の機能とは、「プログラマの意図しない動作をする可能性のある場合にWarningを出力する機能」ということが分かりました。
一般的にいうとWarning levelも上げる機能もあるようですね。

[お知らせ]MT4使いのあなたへ

日本の金融商品取引業者にも登録されているゴールデンウェイ・ジャパン社が運営するFXTF のご紹介です。

国内FX業者の中でも最狭水準のスプレッドで有名なFXTFでは、口座開設と2つの指定通貨ペアでの取引を行うだけで1万円のキャッシュバックがあります。

1万円キャッシュバックキャンペーンキャッシュバック受け取り方法:

キャッシュバックの受け取り方法は以下の2つの条件をクリアすることで取引口座へ振り込まれます。

条件1:
FXTFでの新規口座開設
※ここまでだけでも、3000円のキャッシュバックが受け取れます。

条件2:
以下の2通貨ペアそれぞれで1取引、合計2取引を口座開設から10日以内に行うこと。
USDJPY(スプレッド : 0.1銭 原則固定)
GBPJPY(スプレッド : 0.6銭 原則固定)
※取引量は問われないようです。
※この条件を達成すると追加で7000円キャッシュバックされます。(条件1と合わせて合計1万円になります)

その他補足情報:

MT4:利用可
関東財務局長(金商)登録番号:第258号

FXTFはMT4が使えて、スプレッドもとても小さいFX国内業者の為、このキャッシュバックキャンペーン期間中にメイン/サブ口座として開設するのもいいかもしれませんね。
※MT4での指定の取引量の取引を行うと、さらに+5万円がキャッシュバックされるキャンペーンもやっていますがこちらは、指定の取引量がかなり大きいので紹介は割愛させていただきます。