MT5でEAが取引しない原因は9つの関門に絞れる|公式の戻りコード41個を分類して確認順序を決めた

本記事には広告(アフィリエイトリンク)を含みます。

MT5にEAを入れたのに何も起きない。チャートの右上にニコニコマークが出ているのに注文が飛ばない。昨日までは動いていたのに、今朝見たら止まっている。──この3つは「EAが動かない」という同じ言葉で語られますが、原因の層がまったく違います。

この記事では、MQL5公式リファレンスの取引サーバーの戻りコード全41個と、MT5公式ヘルプの「エキスパートアドバイザー」設定タブの記述を突き合わせて、注文が約定するまでに全て真でなければならない関門を9つに整理しました。さらに、その41個を「誰が直せるか」で分類し、38個の失敗コードのうち26個(68.4%)は自分の設定かEAのコードで直せることを数えました。分類と集計はPythonで検算しています。

あわせて、筆者が自作して実際にコンパイルしているEA(812行)のソースから、公式仕様をコードでどう判定しているかを引用します。ただし本記事は公式仕様・自作EAのソース・MetaEditorのコンパイルログにもとづく整理であり、41個のエラーコードを実口座で1つずつ再現した実測記録ではありません。この区別は本文中でも都度明記します。

先に結論

  • 注文が通るまでの関門は9つあり、すべてANDで効く。上流が閉じていると下流をいくら見ても無駄なので、確認は必ず上流から順に行う。
  • 最初に切り分けるべきは「EAが止まっている」のか「EAは動いているが取引を禁止されている」のか。MT5公式ヘルプは「自動売買を許可する」が無効の場合について「スクリプトとエキスパートアドバイザーは動作しますが、取引することができません」と明記している。つまりEAは正常に動いたまま、注文だけが出ない状態が公式仕様として存在する。
  • 自動売買の許可は端末全体の1つとEA個別の1つ、計2つの独立したフラグのAND。組み合わせは4通りあり、取引できるのはそのうち1通り(25%)だけ。
  • 公式の戻りコードは全41個。うち成功を意味するのは3個(10008 / 10009 / 10010)だけで、残り38個が失敗。分類すると最多は「口座と銘柄のルール」9個と「状態の競合」9個(各23.7%)で、「自動売買の許可」はわずか3個(7.9%)。許可を疑うのは最初の一手として正しいが、それで説明できる範囲は全体の1割未満(いずれも公式一覧にもとづく集計値)。
  • 設定を変えていないのに突然取引が止まるケースには、公式に用意された3つの自動停止トリガ(口座の変更・プロファイルの変更・チャートの銘柄または時間足の変更)がある。時間足を切り替えただけで自動売買が禁止される設定が存在する。
  • 「注文は出しているのに弾かれる」場合、犯人はたいてい銘柄仕様。10014(数量が無効)/ 10015(価格が無効)/ 10016(ストップが無効)の3つは、それぞれSYMBOL_VOLUME_MIN・SYMBOL_VOLUME_STEP、SYMBOL_TRADE_TICK_SIZE、SYMBOL_TRADE_STOPS_LEVELという銘柄ごとに違う値を見れば説明がつく。
  • 関門4(取引サーバーへの接続)と関門2・3は、端末が起動し続けていることが前提になる。自宅PCの再起動や回線断は、設定を何も変えていないのに関門4を落とす。

関門4を落とさないための選択肢として本記事で条件を確認したのは XServer VPS for FX プレミアム(FX自動売買専用・リソース専有型)です。公式サイトには稼働率99.99%以上をサービス品質の基準として設定と記載されています(2026年9月28日確認)。自宅PCとの費用比較はEAを24時間動かすなら自宅PCの分岐点は約96Wの記事で計算しています。

「EAが動かない」を最初に2つに分ける

切り分けを速くする唯一のコツは、いきなり原因を探さず、まず状態を2つに分けることです。

状態A:EAが止まっている 状態B:EAは動いているが取引しない
症状 ログに何も出ない。パネルやPrint()の出力が更新されない ログは流れている。自己診断やコメントは出るが注文が飛ばない
チャート右上 アイコンが無い/EA名が出ていない EA名は出ている(許可の有無はアイコン形状で示される)
疑う関門 関門1(実行ファイルとチャート適用) 関門2〜9
確認場所 ナビゲーター、MetaEditorのコンパイル結果 ツールボックスの「エキスパート」タブ、「操作履歴」タブ

この2つを混同すると、ソースコードを何時間も読んだ末に「そもそも.ex5が古かった」というオチになります。MT5公式ヘルプは「指標の変更後、再度コンパイルします(F7)。さもないと以前のバージョンがプラットフォームで使用されます」と明記しています。ソースを直してもコンパイルしなければ、端末は前の実行ファイルを動かし続けます。

検証の条件と使った資料(先に開示する)

この記事の数字がどこから来ているかを先に出します。

項目 内容 実測/計算・集計の区別
戻りコードの一覧 MQL5公式リファレンス「取引サーバの戻りコード」(2026年9月28日取得) 一次情報(公式表の転記)
41個の分類と件数 「誰が直せるか」で筆者がA〜Gに分類し、Pythonで集計 集計値。分類そのものは筆者の判断で、公式の分類ではない
実行時エラーコード MQL5公式リファレンス「実行時エラーコード」(同日取得) 一次情報
端末設定の挙動 MT5公式ヘルプ「設定」→エキスパートアドバイザータブ(同日取得) 一次情報(公式文の引用)
EAソースの引用 筆者が自作した AutoSLTP_Guard.mq5 v1.05(812行) 実在するコード
コンパイル結果 MetaEditor 64bit のコンパイルログ3件 実測(手元のログファイル)
各エラーの再現 行っていない 実口座で41個を再現した記録ではない
環境 MT5(Windows 64bit)、#include <Trade\Trade.mqh> を使用。MT4は対象外 前提

なお本記事は特定のEAや商材の性能を保証するものではなく、投資判断の助言でもありません。EAの動作条件は口座種別・ブローカー・銘柄によって異なり、将来も同じ挙動が続くとは限りません。

注文が通るまでに越える9つの関門

MT5でEAが注文を成立させるまでには、次の9つがすべて真である必要があります。公式仕様から読み取れる範囲で、上流から並べました。

# 関門 MQL5で判定する方法 閉じているときの現れ方
1 実行ファイル(.ex5)が最新で、チャートに適用されている —(ナビゲーターとコンパイル結果で確認) ログに何も出ない/古い挙動のまま
2 端末全体で自動売買が許可されている TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) EAは動くが注文が出ない。retcode 10027
3 そのEA個別で自動売買が許可されている MQLInfoInteger(MQL_TRADE_ALLOWED) 同上。実行時エラー 4752
4 取引サーバーに接続している TerminalInfoInteger(TERMINAL_CONNECTED) retcode 10031/10012(タイムアウト)
5 口座側(サーバー側)で自動売買が許可されている —(送信して戻りコードで判別) retcode 10026
6 銘柄が気配値表示にあり、取引モードが全許可 SymbolInfoInteger(sym, SYMBOL_TRADE_MODE) 実行時エラー 4302/retcode 10017, 10042〜10044
7 取引セッションが開いている SymbolInfoSessionTrade() retcode 10018(市場が閉まっている)
8 必要証拠金を満たしている OrderCalcMargin() と AccountInfoDouble(ACCOUNT_MARGIN_FREE) retcode 10019
9 注文パラメータが銘柄仕様の範囲内 SYMBOL_VOLUME_MIN/STEP、SYMBOL_TRADE_STOPS_LEVEL 等 retcode 10014 / 10015 / 10016

そしてこの9つを全部通しても、EAのロジックがシグナルを出していなければ注文は出ません。これが10番目の、そして実際にはもっとも多い「原因」です。順番に確認していけば、9番目まで全部真だと分かった時点で「環境は正常。あとはロジックの問題」と言い切れます。切り分けの目的は原因を当てることではなく、原因でない領域を確実に消すことです。

参考として、仮に各関門が独立に95%の確率で真だとすると、9つ全部を通る確率は0.959=63.0%になります(これは関門がANDで積み上がることを示すための例示の計算で、実際の発生確率の測定値ではありません)。

公式の戻りコード41個を分類した(集計値)

MQL5公式リファレンスの「取引サーバの戻りコード」には41個が載っています(10004〜10046のうち、10005と10037は欠番)。このうち成功を意味するのは3個だけです。

コード 定数 意味
10008 TRADE_RETCODE_PLACED 注文が出された
10009 TRADE_RETCODE_DONE リクエストが完了した
10010 TRADE_RETCODE_DONE_PARTIAL リクエストの一部のみが完了した

残る38個が失敗です。これを「誰が直せるか」という観点で7つに分けて数えました。分類は筆者の判断であり、公式の分類ではありません。件数と割合はPythonで集計し、合計が38になることをコード内で検証しています。

分類 件数 38件中の割合 代表コード 最初に見る場所
E 口座と銘柄のルール 9 23.7% 10032, 10033, 10034, 10040, 10042〜10046 銘柄の仕様と口座の設定
F 状態の競合 9 23.7% 10007, 10023, 10024, 10025, 10028, 10029, 10036, 10039, 10041 EAのリトライ設計
D リクエストの不備 8 21.1% 10013, 10014, 10015, 10016, 10022, 10030, 10035, 10038 EAのコード
B 市場と接続 6 15.8% 10004, 10012, 10018, 10020, 10021, 10031 時間帯と回線
A 自動売買の許可 3 7.9% 10017, 10026, 10027 端末設定と口座
G サーバーの判断 2 5.3% 10006, 10011 ブローカーに問い合わせ
C 資金 1 2.6% 10019 証拠金

ここから読める重要な点が2つあります。

ひとつめ。「自動売買の許可」で説明できる失敗はたった3個(7.9%)です。ネット上の「EAが動かないときはまずAutoTradingボタンを確認」は正しいのですが、それは最も確認が速いから先にやるのであって、最も多い原因だからではありません。ボタンが緑なのに動かないほうが普通です。

ふたつめ。対処の主体で数え直すと、自分の設定で直せる13個+EAのコードを直す13個=26個(68.4%)は手元で解決できます。時間や回線の回復を待つものが8個、ブローカーに聞くしかないものが4個です。つまり3分の2以上は自力で潰せる、という数字になります。

関門2と3は別物。許可フラグは2つあってANDで効く

ここが最もつまずきやすい箇所です。MT5公式ヘルプの「エキスパートアドバイザー」タブの説明に、こう書かれています。

自動売買を許可する — このオプションはエキスパートアドバイザーとスクリプトを使った取引を許可または禁止します。無効の場合、スクリプトとエキスパートアドバイザーは動作しますが、取引することができません。

このオプションはプラットフォーム全体での自動売買を有効/無効にします。無効にした場合、エキスパートアドバイザーの設定で個別に自動売買が有効にされていても、エキスパートアドバイザーの取引は許可されません。有効にした場合、個別のエキスパートアドバイザーのパラメータで無効にされていない限り、エキスパートアドバイザーの取引は許可されます。

つまり許可は2段構えです。端末全体のフラグ(MQL5では TERMINAL_TRADE_ALLOWED)と、EA個別のフラグ(MQL_TRADE_ALLOWED)。組み合わせは4通りで、取引できるのは両方が真の1通りだけです。

端末全体(TERMINAL_TRADE_ALLOWED) EA個別(MQL_TRADE_ALLOWED) 取引 EA自体の動作
許可 許可 できる 動く
許可 禁止 できない 動く
禁止 許可 できない 動く
禁止 禁止 できない 動く

4通りのうち1通り、25%しか取引可の状態がないことになります。そして4通り全部でEA自体は動きます。だから「ログは流れているのに注文が出ない」が起きます。

この2つを実際にコードで判定するとこうなります。筆者が自作しているEAから、注文を送る直前の実コードを引用します。

//--- 発注可否 ---------------------------------------------------
if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) || !MQLInfoInteger(MQL_TRADE_ALLOWED))
  {
   g_lastNote = "trading is not allowed";
   Defer(idx, nowMs);
   return;
  }

||(いずれかが偽なら通さない)で書いているのは、公式の仕様がANDだからです。片方だけを見ているEAは、もう片方が禁止のときに「なぜか送信して4752で失敗し続ける」という挙動になります。自作する場合も、購入したEAを評価する場合も、この2つを両方見ているかどうかは1つの品質指標になります。

なお公式リファレンスでは、実行時エラー 4752(ERR_TRADE_DISABLED)が「エキスパートアドバイザーでの取引が許可されていません」、4014(ERR_FUNCTION_NOT_ALLOWED)が「関数呼び出しの許可がありません」と定義されています。ログにこの番号が出ていれば関門2・3で確定です。

設定を変えていないのに止まる:3つの自動停止トリガ

「昨日まで動いていた」系のトラブルで見落とされやすいのが、MT5が公式に用意している防御機構です。同じ設定タブに3つ並んでいます。

オプション(公式表記) 公式の説明(要点) 踏みやすい操作
口座が変更されたら自動売買を停止する 口座が変更されたときEAやスクリプトによる取引を無効にする防御機構。デモからリアルへ切り替えるときに便利 デモ口座で検証してリアルに戻した直後
プロファイルが変更されたら自動売買を停止する プロファイルには接続されたEAの情報が含まれる。プロファイル変更の際のEAによる取引を防止する チャート構成を切り替えた直後
チャートの銘柄または時間足が変更されたら自動売買を停止する 有効な場合、チャートの時間足または銘柄が変更されたとき、接続されているEAの取引が自動的に禁止される M5からH1に切り替えて眺めただけ

3つめが厄介です。チャートの時間足をクリックしただけで、そのEAの取引が禁止されるという挙動が、設定次第で正規に起こります。しかもEA自体は動き続けるので、ログは流れます。「昨日は動いていた」「自分は何も変えていない」という申告と、この挙動は両立します。

逆に言えば、EAを動かしているチャートは触らないのが運用上の正解です。分析したい時間足は別チャートを開く。これは設定を変えるより確実です。

関門9:注文は出しているのに弾かれる(10014 / 10015 / 10016)

関門1〜8が全部通っていて、それでも失敗する場合。ログに残るコードは高い確率でこの3つです。いずれも銘柄ごとに違う値が原因なので、「別の通貨ペアでは動くのに、この銘柄だけ動かない」という形で現れます。

retcode 公式の説明 見るべき銘柄プロパティ 典型的な中身
10014 リクエストのボリュームが無効です SYMBOL_VOLUME_MIN / SYMBOL_VOLUME_MAX / SYMBOL_VOLUME_STEP 0.01ロット刻みの銘柄に0.015を送った/最小ロットを下回った
10015 リクエストの価格が無効です SYMBOL_TRADE_TICK_SIZE / SYMBOL_DIGITS ティックサイズの倍数になっていない価格を送った
10016 リクエストのストップが無効です SYMBOL_TRADE_STOPS_LEVEL / SYMBOL_TRADE_FREEZE_LEVEL 現在値に近すぎるSL/TPを指定した

公式リファレンスは SYMBOL_TRADE_STOPS_LEVEL を「現在の終値から逆指値注文を配置する場合の最少のインデント(ポイント単位)」、SYMBOL_TRADE_FREEZE_LEVEL を「取引業務を凍結までの距離(ポイント単位)」と定義しています。前者は「これより近くには置けない」、後者は「これより近づくと変更・決済ができなくなる」という別の制約です。10016で止まっているEAの多くは前者を、10029(FROZEN)で止まっているEAは後者を踏んでいます。

ここに落とし穴があります。SYMBOL_TRADE_STOPS_LEVEL は0を返すブローカーがあるのです。0は「制限なし」を意味しますが、実際に送ると10016で拒否されることがあります。筆者のEAでは、この現実に合わせて拒否されたら余白を足して再試行する設計にしています。該当箇所を引用します。

// Invalid stops で拒否された場合は、次回そのぶん距離を広げて再試行する。
// stopsLevel を 0 と申告しながら実際には制限があるブローカーへの対応。
if(code == TRADE_RETCODE_INVALID_STOPS)
  {
   double spread = ask - bid;
   double grow   = MathMax(spread, 10.0 * point);
   g_state[idx].pad = (g_state[idx].pad > 0.0 ? g_state[idx].pad * 2.0 : grow);
  }

さらに、SL側だけがスプレッドの影響を受けます。買いポジションは建値がAskで、SL/TPの判定はBidで行われるため、SLは建値からスプレッド分だけ市場に近くなります。したがって置ける最小のSL距離は「スプレッド+最小距離」で、たとえばスプレッドが2.0pips、最小距離が0.1pipsの銘柄では、2.1pips未満のSLは物理的に置けません(銘柄仕様からの計算値)。「10pipsで指定したのに動かない」の正体がこれであることは珍しくありません。

確認順序(上流から6ステップ)

9つの関門を、実際の操作単位でまとめると6ステップになります。上流が閉じていると下流の確認結果は意味を持たないので、順番を飛ばさないことが重要です。

順 やること 見る場所 ここで確定する関門
1 ツールボックスの「エキスパート」タブを開き、EA名の行が出ているかを見る エキスパートタブ 関門1(動いているか)=状態AかBかの判定
2 MetaEditorでF7を押し直し、「0 errors」を確認する コンパイル結果 関門1(.ex5が最新か)
3 ツールバーの自動売買ボタンと、EAのプロパティ「コモン」タブの許可を両方見る ツールバー/EAプロパティ 関門2・関門3
4 右下の接続状態と、気配値表示に対象銘柄があるかを見る ステータスバー/気配値表示 関門4・関門6
5 「操作履歴」タブでretcodeを読む。番号を上の分類表に当てる 操作履歴タブ 関門5・7・8・9
6 ここまで全部正常なら、EAのロジックとパラメータを疑う ソース/入力値 10番目の原因

ステップ3で「両方」と書いているのがこの記事の要点です。片方だけ見て「許可は入っている」と判断すると、4通りのうち2通りを見落とします。

ステップ2について補足します。手元のMetaEditor 64bitのコンパイルログ(実測)は次のようになっていました。812行・インクルード7ファイルのEAで 906ms、同じEAの別ビルドで 707ms、スクリプト1本で 485ms、いずれも 0 errors, 0 warnings、cpu='X64 Regular' です。1秒前後で終わる処理なので、疑うより先に押したほうが速い。これがステップ2を上位に置いた理由です。

なお、コンパイルが通ることは文法の正しさしか保証しません。0 errorsのEAが1つも注文を出さないことは普通にあります。バックテストの数字が信用できない理由を分解した同じEA・同じ設定でPF1.65と1.10になる話と同じで、「通った」と「正しい」は別の話です。

ログに出る実行時エラーの読み分け

「操作履歴」タブにretcodeが1件も出ていない場合、EAは注文を送る前に落ちています。その場合は「エキスパート」タブ側の実行時エラーを見ます。公式リファレンスから、EAが止まる原因になりやすいものを抜き出しました。

コード 定数 公式の説明 読み方
4014 ERR_FUNCTION_NOT_ALLOWED 関数呼び出しの許可がありません DLLやWebRequestの許可が無い。設定タブで個別に許可が必要
4302 ERR_MARKET_NOT_SELECTED 「気配値表示」でシンボルが未選択 複数銘柄を扱うEAで最頻。SymbolSelect()で明示的に追加する
4304 ERR_MARKET_LASTTIME_UNKNOWN 最後のティックの時間が未知(ティック不在) 週末や取扱停止銘柄。価格が来ないので判断もできない
4401 ERR_HISTORY_NOT_FOUND リクエストされた履歴が見つかりません 起動直後に長期のバーを要求した。履歴の取得待ちを入れる
4806 ERR_INDICATOR_DATA_NOT_FOUND リクエストされたデータが見つかりません CopyBuffer()が空。指標の計算が済む前に読んでいる
4807 ERR_INDICATOR_WRONG_HANDLE 不正な指標ハンドル iATR()等の戻り値がINVALID_HANDLEのまま使われている
4752 ERR_TRADE_DISABLED エキスパートアドバイザーでの取引が許可されていません 関門2または3。ここで確定
4756 ERR_TRADE_SEND_FAILED 取引リクエスト送信に失敗 送信自体が通っていない。retcodeも併せて見る

とくに4806と4807は「ATRベースのEAが起動直後だけ何もしない」という形で出ます。指標ハンドルは作成した瞬間には値を持たないため、数ティック待つか、BarsCalculated()で計算済みバー数を確認してから読む必要があります。筆者のEAでは、この問題を避けるためにATRハンドルをOnInit()で作らず、必要になった時点で遅延生成し、OnDeinit()で必ず解放する構成にしています。

関門4は「端末が生きていること」に依存する

ここまでの9つのうち、関門2・3・4はMT5が起動し、回線がつながっている間しか維持されません。設定を何も変えていないのに取引が止まる原因として、自宅PC運用では次のような事象が現実的です。

  • Windows Updateの自動再起動でMT5が終了する(再起動後に自動起動しない設定なら、そのまま止まる)
  • 回線の一時断で TERMINAL_CONNECTED が偽になり、送信が10031や10012で落ちる
  • スリープや休止状態への移行でティックが止まる

前述の記事で計算したとおり、稼働率99.99%が許容する停止時間は月4.32分です(30日=43,200分×0.01%の計算値)。自宅PCの場合、Windows Updateの再起動が1回10分かかればそれだけで超えます。逆に言えば、VPSに払っている差額で買っているのは計算能力ではなく「関門4が落ちないこと」です。

FX自動売買専用に設計されたVPSとして条件を確認した XServer VPS for FX プレミアム は、公式サイトに稼働率99.99%以上をサービス品質の基準として設定と記載しています(2026年9月28日確認)。料金はプランと契約期間で変わるため、金額と最低利用期間は公式サイトの表記を確認してください(Premiumプランは1ヶ月契約で月額32,000円、2026年9月23日時点の公式掲載値)。自宅PCとの損益分岐を消費電力から計算した結果は、冒頭で挙げた電気代の記事にまとめています。

ただし、VPSに移しても関門2・3・5〜9は何も変わりません。VPSが解決するのは「端末が落ちる」という関門1・4に属する問題だけです。ここを混同すると、動かない原因を環境のせいにして無駄な出費をすることになります。

まとめ:確認は上流から、原因は下流に多い

  • 関門は9つ。すべてANDなので、上流から順に消していくのが最短。
  • 公式の戻りコード41個のうち成功は3個、失敗は38個。自動売買の許可で説明できるのは3個(7.9%)だけ。
  • 失敗38個のうち26個(68.4%)は自分の設定かEAのコードで直せる。
  • 許可フラグは端末とEA個別の2つ。組み合わせ4通りのうち取引可は1通り(25%)で、残り3通りでもEAは動く。
  • 「何も変えていないのに止まった」は、3つの自動停止トリガ(とくに時間足の変更)を疑う。
  • 10014 / 10015 / 10016 は銘柄仕様の問題。VOLUME_STEP・TICK_SIZE・STOPS_LEVEL を見る。

この記事の数字は公式仕様の集計と、筆者のEAソース・コンパイルログにもとづく整理です。個々のエラーを実口座で再現した実測記録ではありません。また、EAの挙動はブローカー・口座種別・銘柄によって異なり、将来も同じとは限りません。本記事は特定のEAや投資手法の成果を保証するものではなく、投資判断の助言でもありません。

この記事の検証環境

  • 取引プラットフォーム:MetaTrader 5(Windows 64bit)。MT4は対象外。#include <Trade\Trade.mqh>(標準ライブラリCTrade)を使用
  • 開発環境:MetaEditor 64bit。コンパイルログ3件(0 errors, 0 warnings/906ms・707ms・485ms/cpu='X64 Regular')を実測データとして参照
  • 引用したEA:筆者自作 AutoSLTP_Guard.mq5 v1.05(812行、インクルード7ファイル)
  • 検算:戻りコードの分類と件数はPython 3で集計し、合計38件・成功3件をコード内のassertで検証
  • 24時間稼働の実行環境:XServer VPS for FX プレミアム(FX自動売買専用・リソース専有型/稼働率99.99%以上をサービス品質の基準として設定、2026年9月28日 公式サイト確認。Premiumプラン 月額32,000円/1ヶ月契約、2026年9月23日時点の公式掲載値)
  • 比較対象として参照したVPS:ConoHa VPS、お名前.com デスクトップクラウド

出典(いずれも2026年9月28日確認)

タイトルとURLをコピーしました