MetaEditorでF7キーを押したら、見慣れないエラーがずらっと表示された。
デモ口座にEAを適用したのに、1回も発注されない。
EA開発でつまずく原因は、実は毎回同じようなパターンの繰り返しです。
このサイトの既刊記事群を書く過程でも、同じ種類のミスを何度も実際に目にしてきました。
この記事では、その中から特によく見るものをTOP10としてまとめ、
原因と直し方を一覧表と具体的なコード例で解説します。
この記事で分かること
・コンパイルが通らない原因TOP5とその直し方
・コンパイルは通るのに動かない・止まる原因TOP5とその直し方
・エラーに遭遇したときの共通の確認手順
・GetLastError()を使った原因特定の方法
この記事の使い方
TOP10を、コンパイルエラー編・実行時エラー編の2つに分けて解説します。
コンパイルエラーと実行時エラーの違い
コンパイルエラーは、MetaEditorでF7を押した時点で発覚します。
実行時エラーは、コンパイルは通ったのに、実際にEAを動かした後で発生します。
まず一覧表で全体像を確認する
| # | エラー内容 | よくある原因 |
|---|---|---|
| 1 | True/Falseが未定義 | 大文字小文字の誤り(MQL4はtrue/false) |
| 2 | 波括弧{}の対応エラー | ネストが深く、閉じ忘れ・数え間違い |
| 3 | セミコロン忘れ | 文末に;を付け忘れている |
| 4 | 未定義の識別子 | 変数・関数名のスペルミス |
| 5 | MQL5構文の混在 | 生成AIがMQL5の書き方を混ぜている |
| 6 | エラー130(Invalid stops) | 損切り距離が最小ストップ距離未満 |
| 7 | エラー134(Not enough money) | ロット数が証拠金に対して大きすぎる |
| 8 | OrderSelect忘れ | 選択せずにOrder関数を呼んでいる |
| 9 | 配列の添字が範囲外 | ループ境界や添字の計算ミス |
| 10 | インジケーターバッファ未初期化 | SetIndexBuffer()の呼び忘れ |
コンパイルエラー編(1) 構文レベルのミス
まず、F7キーを押した瞬間に発覚する構文レベルのミスを3つ確認します。
1. True/Falseの大文字小文字
// エラーになる例 if(True) OrderSend(...); // 直した例 if(true) OrderSend(...);
MQL4の真偽値は小文字のtrue・falseです。
ChatGPT等の生成コードでは、
他言語の習慣で先頭を大文字にしたTrue・Falseが混ざることがあります。
2. 波括弧{}の閉じ忘れ
if文やfor文のネストが深くなると、
波括弧の対応が1つずれていることに気づきにくくなります。
補足
・MetaEditorでは、カーソルを波括弧の上に置くと対応する括弧がハイライトされる
・インデント(字下げ)を揃えて書くと、閉じ忘れが目で見て分かりやすくなる
3. セミコロン忘れ
文末の;を1つ忘れただけで、エラーメッセージは忘れた行ではなく、
次の行に表示されることが多い点に注意してください。
コンパイルエラー編(2) 関数・変数レベルのミス
次に、名前の扱いに関わるミスを2つ確認します。
4. 未定義の識別子(スペルミス)
// エラーになる例(InpLotsをInpLotと書き間違えた) OrderSend(_Symbol, OP_BUY, InpLot, Ask, 3, 0, 0, "", InpMagic, 0, clrBlue); // 直した例 OrderSend(_Symbol, OP_BUY, InpLots, Ask, 3, 0, 0, "", InpMagic, 0, clrBlue);
変数名・関数名のスペルミスは、エラーメッセージに出てくる識別子名をそのまま検索すれば、
定義元とのズレをすぐ見つけられます。
5. MQL5構文の混在
生成AIにコードを書かせると、MQL4を指定したつもりでも、
MQL5特有の構文(クラス定義、CTrade等)が混ざって出力されることがあります。
どちらの構文か見分ける手がかりを確認してください。
実行時エラー編(1) 発注・注文操作
コンパイルは通るのに、発注した瞬間に起きるエラーを3つ確認します。
6. エラー130(Invalid stops)
double minDistance = MarketInfo(_Symbol, MODE_STOPLEVEL) * Point;
if(Ask - sl < minDistance)
{
Print("損切りが近すぎるため発注を見送りました");
return;
}
損切り(ストップロス)の距離が、
ブローカーが決めた最小ストップ距離(MODE_STOPLEVEL)より近いと発生します。
発注前にこのチェックを入れておくことで事前に回避できます。
7. エラー134(Not enough money)
発注しようとしたロット数が、口座の証拠金に対して大きすぎる場合に発生します。
既刊のAccountFreeMarginCheckの記事で、
発注前に証拠金が足りるかを確認する方法を解説しています。
8. OrderSelectを呼ばずにOrder関数を使う
// エラーになりやすい例(OrderSelectの結果を確認していない)
double sl = OrderStopLoss();
// 直した例
if(OrderSelect(ticket, SELECT_BY_TICKET))
{
double sl = OrderStopLoss();
}
OrderStopLoss()等のOrder関数は、
直前にOrderSelect()で選択した注文の情報を返す設計です。
選択に失敗したまま呼ぶと、古い注文の情報が返ってくることがあります。
実行時エラー編(2) 配列・インジケーター
最後に、配列やインジケーター特有のミスを2つ確認します。
9. 配列の添字が範囲外
// エラーになりやすい例(境界を1つ間違えている) for(int i = 0; i <= ArraySize(arr); i++) Print(arr[i]); // 直した例 for(int i = 0; i < ArraySize(arr); i++) Print(arr[i]);
<=と<の混同で、配列の範囲を1つ超えてアクセスしてしまう事故です。
ArraySize()で配列の要素数を確認してからループを組んでください。
10. インジケーターバッファの初期化忘れ
カスタムインジケーターで、OnInit()内のSetIndexBuffer()を呼ばずに、
バッファ配列へ値を書き込むと、コンパイルは通るのにチャート上に何も表示されません。
全部に共通する確認手順
10項目に共通する、トラブル時の確認手順をまとめます。
GetLastError()で原因を特定する
if(!OrderSend(...))
Print("発注に失敗しました。エラーコード=", GetLastError());
実行時エラーの多くは、
GetLastError()の戻り値をPrint()で出力すれば原因が特定できます。
既刊のGetLastErrorの記事で、主なエラーコードの一覧を確認してください。
「0 errors, 0 warnings」を必ず確認する
注意
・警告(warning)が出ていても一見動くことがある
・しかし型の暗黙変換等、意図しない動作の原因になりやすい
・エラーだけでなく警告も0になるまで確認する習慣をつける
既刊記事の該当関数リファレンスに戻って確認する
このサイトのMQL4関数ギャップ記事群では、
関数ごとに引数・戻り値を1つずつ検証して解説しています。
エラーが出た関数名で検索し、該当記事を確認する習慣をつけてください。
よくある質問
EA開発のエラーについて、よくある疑問に回答します。
実践アドバイス
・エラーは1つずつ直し、直したら必ず再コンパイルする
・複数のエラーを一度に直そうとすると、どの修正が効いたか分からなくなる
・コメントアウトで処理の一部を無効化しながら原因を切り分けるのも有効
コピペしたコードがコンパイルできないとき、まず何を見ればいいですか?
最初のエラー行から直すことを推奨します。
1つ目のエラーが原因で、後続の行が連鎖的にエラー表示されることが多いためです。
ChatGPTで生成したコードに多いエラーは何ですか?
本記事の5番(MQL5構文の混在)と、
1番(True/Falseの大文字)が特に多い傾向があります。
既刊のコピペしたEAが動かない時に確認する10項目の記事も参考にしてください。
MQL5に移植する時に新たに増えるエラーはありますか?
はい。
OrderSend等のMQL4関数がそのまま存在しないため、
CTradeクラスへの置き換え忘れによるコンパイルエラーが新たに増えます。
【MQL4】EA開発でよく詰まるエラーTOP10とその直し方(コンパイルエラー・実行時エラー):まとめ
EA開発でつまずく原因は、実は限られたパターンの繰り返しです。
コンパイルエラーは構文・識別子のミスが中心、
実行時エラーは損切り距離・証拠金・選択順序・配列範囲が中心です。
エラーに遭遇したら、まずGetLastError()で原因を特定し、
1つずつ直して再コンパイルする習慣をつけてください。
コメント