ここでは、EAを作成する際に先頭部にプロパティ値として設定・記載されている『#property strict』について、書いた方が良いのかどうかについてに解説しています。
🔍#property strictとは?
MetaTrader4(MT4)のプログラミング言語MQL4で使われる#property strict
とは、EA(エキスパートアドバイザー)の動作をより厳密にチェックするための「厳格モード」を有効にする記述です。
この設定を使うことで、コードの記述ミスや型の不一致などを事前に発見しやすくなり、バグを未然に防ぐ効果があります。
また、#property strict
を使うと、EAの入力パラメータに日本語で名前を付けられるというメリットもあります。
これにより、EAのパラメータ設定画面で日本語の説明が表示され、初心者でも直感的に操作しやすくなります。
厳格モードとは何か?
#property strict
を指定すると、MQL4のコンパイラーがより厳格なチェックを実施します。
具体的には:
- 変数の型や関数の引数の整合性を厳密に確認
- 型変換に関する警告やエラーを表示
- 曖昧なコードの動作を明確化
このため、従来の「緩いモード」と比べてミスが発見しやすく、将来的なトラブルを減らせます。
記載していない場合の挙動
#property strict
を記載しない場合、MQL4は以前の緩いモードでコンパイルされます。
そのため、型変換のミスや曖昧なコードでも警告が出ないことがあります。
例えば、次のようなコードがあってもワーニングが表示されず、気づかないままEAが動作してしまう可能性があります。
//+------------------------------------------------------------------+
//| 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);
}
上記は、簡単なソースコードです。コンパイルしてみるとエラーがなくコンパイルできます。

エラー無くコンパイルされていますね!
記載している場合の挙動
#property strict
を指定した場合、上記のような型変換に関してはコンパイル時に警告やエラーが表示されます。9行目以外は全く同じコードですが・・・
//+------------------------------------------------------------------+
//| 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);
}
コンパイルしてみると、何もソースコードを変えていないのにワーニングが3件表示されていることがわかります。確かに、『#property strict』を書くだけで警告が表示されるようになりました・・・。

では、ワーニングの内容を見ていきましょう。
⚠️ possible use of uninitialized variable ‘d’
これは、 初期化されていない変数「d」を使用 というワーニングの内容(日本語訳)です。
変数「d」を初期化していないためワーニングが発生しているんですね。次のワーニング(変数「i」)も同じですね。
⚠️ implicit conversion from ‘number’ to ‘string’
これは、「数値」から「文字列」への暗黙的な変換 というワーニングの内容(日本語訳)です。
Print(“d=” + d); この部分は、変数「d」の値を操作ログに表示しようとしていますが、変数「d」は数値ですが文字列として表示しようとしているためワーニングが発生しています。
💡 初心者が知っておくべきメリットとデメリット
メリット
- パラメータ設定に日本語で名前を付けられる
- コードの不備や型の不一致を早期発見できる
- バグを減らし、安定した自動売買が実現できる
- 将来的にMQL4の仕様変更にも対応しやすい
MQL4では、EAの外部パラメータに対してinput
キーワードを使って設定します。#property strict
が有効な場合、パラメータに以下のように日本語で説明を付けることが可能です。
input int lot = 1; // 取引ロット数
input double rikaku = 50.0; // 利確する値幅(pips)
input bool TS = true; // トレーリングストップの有効/無効
このように「// 取引ロット数
」と記載すると、MT4のEA設定画面で日本語表示されます。「
」→「rikaku
利確する値幅(pips)
」になるので、設定時の誤解を防ぎやすくなります。
デメリット
- 厳格なチェックにより、初心者には警告やエラーが多く感じることもある
- 記述ミスがあるとコンパイルが通らず、最初は戸惑うかもしれない
しかし、慣れてしまえば開発効率が大幅に向上するため、初心者にもおすすめです。
では、ワーニングを発生させない書き方にするにはどうしたらいいか、次に記載していきます。
ワーニングを発生させない記載例
//+------------------------------------------------------------------+
//| 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』を書いていますがワーニングが表示されなくなります。
❓ 初心者のQ&A
Q1.結局#property strictは必要?
プログラム初心者のうちは、『#property strict』は不要です。
理由は細かい部分のワーニングで迷うよりも、まずはプログラムを書いてガンガン動くEAを作っていった方が上達します。また、MT4にはバックテスト機能がありテスト工程がしっかりしているので、少々汚いソースコードになったとしても、経験上エラーで落ちるようなプログラムにはなりません。
Q2.ワーニングが出ても実行できますか?
はい、ワーニングはあくまで注意喚起であり、必ずしもコンパイルエラーではありません。ただし放置すると誤動作の原因になるので、必ず内容を理解し修正しましょう。
Q3.いつ使うべきか?おすすめのタイミングは?
EA開発に慣れてきて、『パラメータ設定を日本語にしたいな』と余裕が出てきたタイミングで#property strict
を使うことを推奨します。
✅ まとめ:#property strict は必要か?
以上、『#property strictとは?』でした。
プログラム初心者のうちは、『#property strict』って何?みたいな感じだと思いますが、まずは『#property strict』を書かずにプログラムを組んでいく事をオススメします。
EA開発に慣れてきて、『パラメータ設定を日本語にしたいな』や『コンパイルした時に出るワーニングを消したいな』とかの余裕が出てきたタイミングで#property strict
を使っていけたらいいですね。
✅EA開発初心者の方はこちらもチェック!
MT4やMQL4の知識がなくても大丈夫!
当サイトでは、プログラミング未経験者でも分かるEA開発の基本から、サンプルコードを使った実践的なチュートリアルまで多数ご用意しています。
ChatGPTやEAつくーるでのEAの作り方に興味がある方は是非参考にしてください。
コメント
りょう様
#property strict の説明をありがとうございます。
まずは気にせず EA自作に取り掛かろうと思います。
(自作といいながら このサイトのサンプルソースそのままなんですが・・・・)
ただ『明確なテストツールがない場合』が気になるところです。
今後ともアドバイスお願いします。
ともぞう様
サンプルソースを使って動きを確認しながらアレンジしていく感じで良いと思います!
『明確なテストツールがない場合』というのは、例えばC言語です。C言語で1からプログラミングとなった場合、明確なテストツールがありません(自作で作ったりします)ので初動の作りこみをしっかりしないと問題だらけになって全然動かないといった事が結構起きます。今回のような、MT4(MQL4言語)の場合はバックテスト機能があるので問題ない(動かなくてもバックテストでカバーできる)といった感じです。