ここでは、EAを作成する際に先頭部にプロパティ値として設定・記載されている『#property strict』について、書いた方が良いのかどうかについてに解説しています。
#property strictとは
まず『#property strict』についてですが、これは厳格モードと呼ばれる設定になります。
厳格モードとは、その名の通りソースコードを厳しくチェックするかどうかの設定になります。なので、同じソースコードでも『#property strict』を書いていない場合は正しくコンパイルされるのに、『#property strict』を書いてコンパイルするとワーニングが表示されたりします。
実際に、『#property strict』が記載されている場合と記載されていない場合を確認していきましょう。
記載されていない場合
//+------------------------------------------------------------------+
//| TEST.mq4 |
//| Copyright 2020, mef Software. |
//| https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link "https://fx-prog.com/"
#property version "1.00"
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
double d;
int i;
d = d + 0.1;
i=i+1;
Print("d=" + d);
return(0);
}
上記は、簡単なソースコードです。コンパイルしてみるとエラーなくコンパイルできます。
エラー無くコンパイルされていますね!
記載されている場合
//+------------------------------------------------------------------+
//| TEST.mq4 |
//| Copyright 2020, mef Software. |
//| https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link "https://fx-prog.com/"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
double d;
int i;
d = d + 0.1;
i=i+1;
Print("d=" + d);
return(0);
}
次に、上記は『#property strict』を追記したソースコードになります。その他はエラーなくコンパイルされたソースコードと全く同じです。
コンパイルしてみると、何もソースコードを変えていないのにワーニングが3件表示されていることがわかります。確かに、『#property strict』を書くだけで怒られるようになりましたね・・・。
では、ワーニングの内容を見ていきましょう。
possible use of uninitialized variable ‘d’
これは、 初期化されていない変数「d」を使用 という意味(和訳)です。
変数「d」を初期化していないためワーニングが発生しているんですね。次のワーニング(変数「i」)も同じですね。
implicit conversion from ‘number’ to ‘string’
これは、「数値」から「文字列」への暗黙的な変換 という意味(和訳)です。
Print(“d=” + d); この部分は、変数「d」の値を操作ログに表示しようとしていますが、変数「d」は数値ですが文字列として表示しようとしているためワーニングが発生しています。
では、ワーニングを発生させない書き方にするにはどうしたらいいか、次に記載していきます。
記載されている場合(ワーニングを発生させない)
//+------------------------------------------------------------------+
//| TEST.mq4 |
//| Copyright 2020, mef Software. |
//| https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link "https://fx-prog.com/"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
double d = 0;
int i = 0;
d = d + 0.1;
i=i+1;
Print("d=" + DoubleToStr(d));
return(0);
}
上記のソースコードは、『#property strict』を追記しいるパターンでかつワーニングを発生させないように修正しています。
まず、変数宣言の部分を以下のように修正し、初期値をセットしました。
double d = 0;
int i = 0;
次に、文字列の部分 Print(“d=” + DoubleToStr(d)); の部分ですが、DoubleToStr()を使って文字列に変換しています。こうすることによって、数値型を暗黙的に文字列にするのではなくちゃんと数値型を文字に変換して使用するようにしています。
これでコンパイルすると、『#property strict』を書いていますがワーニングが表示されなくなります。
結局#property strictは必要?
多分プログラム初心者の方は上記の内容をあまり理解できなかったかもしれません。ですが安心してください。
プログラム初心者のうちは、『#property strict』は書かなくてよいと思います。
理由は細かい部分のワーニングで迷うよりも、まずはプログラムを書いてガンガン動くEAを作っていった方が上達すると私は思うからです。
それに、MT4にはバックテスト機能がありテスト工程がしっかりしているので、少々汚いソースコードになったとしても、エラーで落ちるようなプログラムにはほぼならないでしょう。
ただ、『#property strict』を書けばワーニングを意識して綺麗なプログラムを書けるようになるので、プログラムに慣れてくれば『#property strict』を書いてプログラムを組んでいけばいいかなと思います。
さいごに
以上が、『#property strictとは?』です。
プログラム初心者のうちは、そもそも『#property strict』って何?みたいな状態からプログラムを始められると思うので、まずは『#property strict』を書かずにプログラムを組んでいく事をオススメします。
EAは、バックテストというとても優秀な自動テストツールがあるので『#property strict』を書かずとも正常に動くEAが最終的に作れると思います。
※仮にもし、明確なテストツールが無い場合は間違いなく『#property strict』は書いてくださいと言うと思います
※ EAのサンプルソースを一覧表にまとめました
※オンラインレッスンやってます
コメント
りょう様
#property strict の説明をありがとうございます。
まずは気にせず EA自作に取り掛かろうと思います。
(自作といいながら このサイトのサンプルソースそのままなんですが・・・・)
ただ『明確なテストツールがない場合』が気になるところです。
今後ともアドバイスお願いします。
ともぞう様
サンプルソースを使って動きを確認しながらアレンジしていく感じで良いと思います!
『明確なテストツールがない場合』というのは、例えばC言語です。C言語で1からプログラミングとなった場合、明確なテストツールがありません(自作で作ったりします)ので初動の作りこみをしっかりしないと問題だらけになって全然動かないといった事が結構起きます。今回のような、MT4(MQL4言語)の場合はバックテスト機能があるので問題ない(動かなくてもバックテストでカバーできる)といった感じです。