Market closed(10018 / エラー132)を完全解決 — MT5「市場が閉鎖」でEAが発注できない原因と直し方
目次
- Market closed とは(10018 と 132 の違い)
- ① TRADE_RETCODE_MARKET_CLOSED = 10018(MT5 / `OrderSend()` のリターンコード)
- ② ERR_MARKET_CLOSED = 132(MT4 / MQL4 の `GetLastError()`)
- まず30秒でできる切り分け
- 原因と対処(6パターン)
- ① 週末・祝日で市場全体が閉まっている
- ② 銘柄ごとの取引セッション外(日次ブレイク)
- ③ サーバー時間とローカル時間の混同
- ④ シンボルが取引無効/決済のみ(SYMBOL_TRADE_MODE)
- ⑤ 月曜オープン直後・セッション再開直後
- ⑥ ニュース・イベントによる取引停止
- MQL5でこのエラーを防ぐコード(EA開発者向け)
- 取引セッション内かどうかを確認する
- 取引モード(SYMBOL_TRADE_MODE)を確認する
- 発注前ゲートとしてまとめる
- それでも10018が返ったときのハンドリング
- 優先度チェックリスト
- まとめ
- FAQ
- Q: 平日の昼間なのに Market closed が出ます。なぜ?
- Q: 10018 と 132 は何が違いますか?
- Q: 土日にEAがエラーを出し続けます。放置して大丈夫?
- Q: 暗号通貨(BTCUSD)でも Market closed が出ました。24時間取引できるのでは?
Market closed(MT5/MQL5)を完全解決
EAのログに Market closed や market is closed が出たとき、「土日だから当たり前」で済むケースは半分だけです。平日の日中なのに出る、あるいは他の銘柄では普通に発注できるのに特定の銘柄だけ出る——このパターンで悩む人が非常に多いエラーです。
原因は「週末」だけではなく、銘柄ごとの取引セッション(ゴールドや株価指数の日次ブレイク)・ブローカーのサーバー時間とあなたのローカル時間のズレ・シンボルの取引モード制限(close-only等)など複数あります。この記事は、MT5でEAを使う人とMQL5でEAを書く人の両方に向けて、Market closed の正体・6つの原因・30秒でできる切り分け・コード側での恒久防止までをまとめた決定版です。エラーコード全般の一覧は MQL5 / MT5 エラーコード対処法の総合ガイド を参照してください。
この記事は2026年7月時点のMT5(build 4xxx系)を前提にしています。セッション時間・画面名はブローカーやビルドにより異なります。
Market closed とは(10018 と 132 の違い)
「市場が閉まっている」を表すコードは、MT5とMT4(MQL4)で別物です。どちらのプラットフォームか・どこで値を取ったかで読み替えてください。
① TRADE_RETCODE_MARKET_CLOSED = 10018(MT5 / OrderSend() のリターンコード)
MQL5で発注した OrderSend() の結果は MqlTradeResult.retcode に入ります。取引サーバーが「この銘柄はいま取引時間外」と判断して拒否したときのコードが 10018 です。MT5側の内部エラーではなく、ブローカーサーバーからの拒否通知です。
意味: 市場が閉鎖中(Market is closed)
定数: TRADE_RETCODE_MARKET_CLOSED
値 : 10018
// ログで確認できる典型的な出力例
2026.07.06 23:05:11.204 EA_NAME XAUUSD,M5: OrderSend error 10018 [Market closed]
② ERR_MARKET_CLOSED = 132(MT4 / MQL4 の GetLastError())
MT4(MQL4)では OrderSend() が失敗したあとの GetLastError() が 132 を返します。意味は10018と同じ「市場閉鎖中」です。MT4版EAを併用している場合、同じ原因が MT5では10018・MT4では132 として現れます。
意味: 市場が閉鎖中(Market is closed)
定数: ERR_MARKET_CLOSED(MQL4)
値 : 132
実務上の使い分け:
| プラットフォーム | 取得元 | 値 |
|---|---|---|
| MT5 (MQL5) | MqlTradeResult.retcode / CTrade.ResultRetcode() | 10018 |
| MT4 (MQL4) | OrderSend() 失敗後の GetLastError() | 132 |
どちらも根本原因は共通で「サーバーの取引セッション外に注文を送った(または銘柄の取引が制限されている)」です。対処も共通なので、以下はまとめて解説します。
まず30秒でできる切り分け
やみくもにEAを再起動する前に、この4つを見れば原因の当たりがつきます。
- 銘柄の取引セッションを見る — 気配値(Market Watch)で該当シンボルを右クリック → 「仕様(Specification)」→ 「取引セッション」。**曜日ごとの取引可能時間(サーバー時間)**が書いてあります。いまの時刻がこの枠の外なら、それが答えです。
- サーバー時間を確認する — 気配値ウィンドウ上部に表示される時刻がブローカーのサーバー時間です。セッション判定はあなたのPC時計ではなくこの時刻で行われます。日本時間と数時間ずれているのが普通です。
- 取引モードを確認する — 同じ「仕様」画面の「取引」欄が
Full access以外(Disabled/Close onlyなど)になっていないか。なっていればセッション内でも新規は拒否されます。 - 別の銘柄で試す — EURUSDなど主要FXペアで同じEA/手動注文が通るなら、問題は口座やEAではなくその銘柄のセッション/制限に絞れます。
原因と対処(6パターン)
① 週末・祝日で市場全体が閉まっている
症状: 土曜・日曜、または年末年始やクリスマスなどにエラーが出る。全銘柄で出る。
原因: FX市場は概ねサーバー時間の金曜クローズ〜月曜オープンまで取引できません。祝日(元日・クリスマス等)は平日でも休場・短縮取引になります。EAがバーの残り処理や時間足の都合で週末にも発注を試みると、10018/132が連発します。
対処:
- エラー自体は無害です。市場が開けば自然に解消します
- ログを汚したくない場合は、EA側で曜日・セッションチェックを入れてそもそも送らないようにする(後述のコード)
- 祝日カレンダーはブローカーごとに違うため、ブローカーの休場スケジュール告知を確認する
② 銘柄ごとの取引セッション外(日次ブレイク)
症状: 平日なのに 特定の銘柄(ゴールド・シルバー・株価指数CFD・エネルギー等)だけエラーになる。毎日ほぼ同じ時間帯に出る。
原因: FXペアは平日ほぼ24時間取引できますが、貴金属や株価指数CFDには毎日数十分〜数時間の取引休止時間(日次ブレイク)があります。原資産の取引所メンテナンスやロールオーバーに合わせたもので、時間帯はブローカーと銘柄によって異なります。この休止帯にEAが発注すると10018になります。
対処:
- 「仕様 → 取引セッション」でその銘柄の正確な休止時間帯を確認する(ここに書いてある時間が唯一の正解です。他人のブログの時間を鵜呑みにしない——ブローカーごとに違います)
- EAの時間フィルター(
TradeStartHour/TradeEndHour等)で休止帯を避ける - 開発者はコードで
SymbolInfoSessionTrade()を見る(後述)
なお、暗号通貨(BTCUSD等)は土日も取引できるブローカーが多いですが、これもブローカー依存です。「暗号だから24/7のはず」と決めつけず、仕様画面で確認してください。
③ サーバー時間とローカル時間の混同
症状: 「仕様のセッションでは取引時間内のはずなのに」エラーが出る。海外ブローカー利用時に多い。
原因: 仕様に書かれたセッション時間も、MT5内の時刻表示も、すべてブローカーのサーバー時間です。多くの海外ブローカーはGMT+2/+3(NYクローズ=0時になる設定)を採用しており、日本時間とは6〜7時間ずれます。日本時間で「まだ金曜の夜」でも、サーバー時間ではすでに土曜、というズレが典型です。
対処:
- 気配値ウィンドウの時刻(=サーバー時間)を基準に考える癖をつける
- EAのパラメーター(取引時間フィルター等)はサーバー時間で指定する仕様が普通です。日本時間のつもりで設定していないか見直す
- コードでは
TimeTradeServer()を使う(TimeLocal()でセッション判定をしない)
④ シンボルが取引無効/決済のみ(SYMBOL_TRADE_MODE)
症状: セッション時間内・平日なのに、特定銘柄だけ新規注文が全部拒否される。決済だけは通ることもある。
原因: ブローカーはシンボル単位で取引モードを設定できます。
| SYMBOL_TRADE_MODE | 意味 |
|---|---|
SYMBOL_TRADE_MODE_FULL | 制限なし(通常) |
SYMBOL_TRADE_MODE_CLOSEONLY | 決済のみ可(新規不可)。上場廃止予定・限月交代前のCFD等 |
SYMBOL_TRADE_MODE_DISABLED | 取引完全無効 |
SYMBOL_TRADE_MODE_LONGONLY / SHORTONLY | 買いのみ/売りのみ可 |
デモ口座と本番口座で設定が違う、口座タイプによって取引可能銘柄が違う、ということもあります。
対処:
- 「仕様」画面の「取引」欄を確認する
Close onlyなら新規は諦めてポジション整理を。恒久的にその銘柄を使いたいなら同名の別限月シンボル・別サフィックスのシンボル(例:US500.f等)が用意されていないか確認するDisabledのままなら、その口座タイプで取引可能かブローカーに確認する
⑤ 月曜オープン直後・セッション再開直後
症状: 月曜の市場オープン直後の数分だけ、あるいは日次ブレイク明けの直後だけ、エラーや約定拒否が出る。
原因: セッションが「開いた」瞬間から実際に安定して約定できるまでには間があります。オープン直後は流動性が薄くスプレッドが極端に広がり、ブローカーによってはクォートが流れ始めるまで注文を受け付けない(=市場閉鎖扱いで拒否する)ことがあります。月曜朝一番にシグナルを出すタイプのEA、ブレイク明けを狙うゴールドEAが典型的にぶつかります。
対処:
- オープン後○分間は新規を見送るフィルターを入れる(
AvoidMondayOpen等)。当サイト配布EAが月曜0-3時(サーバー時間)を避けるデフォルトを持つのはこのためです - スプレッドフィルター(
MaxSpread)を必ず併用する。オープン直後の異常スプレッドでの約定は、エラーよりむしろ損失として痛い - 10018が出たら即リトライせず、次のバーまで待つ設計にする
⑥ ニュース・イベントによる取引停止
症状: 重要指標の発表前後や、個別銘柄の異常変動時に一時的にエラーになる。
原因: 一部のブローカー・銘柄では、重大イベント時に取引を一時停止(ハルト)したり、新規注文を制限することがあります。株価指数CFDでは原資産市場のサーキットブレーカーに連動して止まることもあります。この間の注文は市場閉鎖系の拒否になります。
対処:
- 一時的なものなので、時間を置けば解消します
- 経済指標フィルター(当サイトEAの
UseEconomicFilter)で指標前後の新規を止めておくと、エラー回避と急変動リスク回避を同時に達成できます
MQL5でこのエラーを防ぐコード(EA開発者向け)
Market closed は「エラーが出てから対処」ではなく、発注前にセッションと取引モードを確認して、閉まっているなら送らないのが正しい設計です。ログが綺麗になるだけでなく、無駄なサーバーリクエストとリトライ暴走を防げます。
取引セッション内かどうかを確認する
SymbolInfoSessionTrade() は、指定した曜日の第 i セッションの開始/終了時刻(サーバー時間の0時からの秒)を返します。セッションが複数ある銘柄(日次ブレイクを挟む指数等)に対応するため、ループで全セッションを確認します。
// 現在のサーバー時間が、この銘柄の取引セッション内かを判定する
bool IsTradeSessionOpen(const string symbol)
{
MqlDateTime dt;
TimeToStruct(TimeTradeServer(), dt); // 必ずサーバー時間で判定する
int now = dt.hour*3600 + dt.min*60 + dt.sec; // 0時からの経過秒
datetime from, to;
for(uint i = 0; SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)dt.day_of_week, i, from, to); i++)
{
int f = (int)from; // 0時からの秒
int t = (int)to; // 24:00終了は 86400 になる
if(now >= f && now < t)
return true;
}
return false; // この曜日に該当セッションなし(週末等)または全セッション外
}
取引モード(SYMBOL_TRADE_MODE)を確認する
// 新規エントリー可能な取引モードかを判定する
bool IsNewEntryAllowed(const string symbol, ENUM_ORDER_TYPE type)
{
long mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
if(mode == SYMBOL_TRADE_MODE_DISABLED) return false; // 取引無効
if(mode == SYMBOL_TRADE_MODE_CLOSEONLY) return false; // 決済のみ=新規不可
if(mode == SYMBOL_TRADE_MODE_LONGONLY && type != ORDER_TYPE_BUY) return false;
if(mode == SYMBOL_TRADE_MODE_SHORTONLY && type != ORDER_TYPE_SELL) return false;
return true; // SYMBOL_TRADE_MODE_FULL 等
}
発注前ゲートとしてまとめる
// OnTick 内: シグナルが立っても、市場が閉まっていれば送らない
if(!IsTradeSessionOpen(_Symbol) || !IsNewEntryAllowed(_Symbol, ORDER_TYPE_BUY))
{
// 10018 を未然に防ぐ。ログ1行だけ残して次のバーを待つ
return;
}
それでも10018が返ったときのハンドリング
セッション情報の更新タイミングやオープン直後の拒否など、ゲートをすり抜けるケースはゼロにできません。OrderSend() の retcode を見て、10018は即リトライしない(次のバーまで待つ)のが鉄則です。閉鎖中の連打はログを汚すだけで何も改善しません。
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... req を組み立て ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
if(res.retcode == TRADE_RETCODE_MARKET_CLOSED) // 10018
Print("Market closed. Skip and wait for the next session.");
else
PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}
正直なところ、月曜オープン直後や日次ブレイク前後(特にゴールド・株価指数)に発注するEAは、このエラーに日常的にぶつかります。スケジュールを意識したEA——セッション確認・オープン直後の見送り・週末前クローズを持つEA——は、無駄なエラーを出さないだけでなく、流動性の薄い時間帯の悪い約定も避けられます。FXEA365が配布しているEAは、**月曜オープン回避(AvoidMondayOpen)・時間フィルター・週末クローズ(CloseAllBeforeWeekend)**を標準実装しています。
優先度チェックリスト
| 優先 | 確認 | 対処 |
|---|---|---|
| 🚨 まず | いま週末・祝日か(サーバー時間で) | 待つだけ。エラー自体は無害 |
| 🚨 まず | 仕様の「取引セッション」の枠内か | 銘柄別の休止帯を時間フィルターで回避 |
| ⚠️ 次 | サーバー時間と日本時間を混同していないか | 気配値の時刻を基準に設定し直す |
| ⚠️ 次 | 取引モードが Full access か | Close only / Disabled ならブローカー仕様を確認 |
| ✅ 確認 | オープン直後・ブレイク明け直後でないか | ○分見送り+スプレッドフィルター |
| 🛠 開発 | 発注前にセッション/モード確認しているか | SymbolInfoSessionTrade ゲートを実装 |
まとめ
Market closedは MT5では10018(TRADE_RETCODE_MARKET_CLOSED)・MT4では132(ERR_MARKET_CLOSED)。意味は同じ「取引セッション外/取引制限中の注文」。- 週末だけでなく、銘柄別の日次ブレイク(ゴールド・指数)・サーバー時間とのズレ・SYMBOL_TRADE_MODE制限・オープン直後の拒否でも出る。平日に出たらまず「仕様 → 取引セッション」。
- セッション時間はブローカーと銘柄ごとに違う。あなたのMT5の仕様画面に書いてある時間だけが正解。
- EA開発者は
SymbolInfoSessionTrade()+SYMBOL_TRADE_MODE+TimeTradeServer()の発注前ゲートで恒久対策。10018が返ったら即リトライせず次のバーを待つ。
エラーコード全般は MQL5 / MT5 エラーコード対処法の総合ガイド を、セッション回避・時間フィルターを標準搭載した無料EAは EA一覧 を参照してください。
FAQ
Q: 平日の昼間なのに Market closed が出ます。なぜ?
その銘柄固有の取引休止時間帯(日次ブレイク)か、シンボルの取引モード制限が原因です。ゴールド・シルバー・株価指数CFDには平日でも毎日取引できない時間帯があります。気配値でシンボルを右クリック → 「仕様」→ 「取引セッション」と「取引」欄を確認してください。
Q: 10018 と 132 は何が違いますか?
プラットフォームが違うだけで意味は同じです。10018(TRADE_RETCODE_MARKET_CLOSED)はMT5の OrderSend() リターンコード、132(ERR_MARKET_CLOSED)はMT4(MQL4)の GetLastError() の値です。対処は共通です。
Q: 土日にEAがエラーを出し続けます。放置して大丈夫?
実害はありません。市場が開けば自然に止まります。ただしログが汚れる・プッシュ通知が鳴り続けるのが気になるなら、EA側に曜日/セッションチェックを入れて発注自体をスキップさせるのが根本対策です(本文のコード参照)。
Q: 暗号通貨(BTCUSD)でも Market closed が出ました。24時間取引できるのでは?
暗号通貨CFDを土日も取引できるかはブローカー次第です。週末は取引停止、または短いメンテナンス休止を設けているブローカーもあります。FXペアと同様に「仕様 → 取引セッション」で、あなたのブローカーでの実際の取引可能時間を確認してください。
関連記事
2026-07-07
Invalid stops(10016/130)を完全解決 — MT5/MT4でSL・TPが設定できない原因と直し方
2026-07-07
自動売買が無効(AutoTrading disabled)でEAが動かない — MT5の10027/10026を完全解決
2026-07-07
Unsupported filling mode(MT5エラー10030)を完全解決 — 別ブローカーに移した日にEAが発注できなくなる理由と直し方
2026-07-07
Off quotes / リクオート(MT5/MQL5)を完全解決 — 10021・10004 で注文が拒否される原因と直し方
📧 5日間メール講座(無料)
FX自動売買の本質、バックテストの正しい見方、ブローカー選びのコツを毎日1通お届けします。
※ プライバシーは厳守。配信解除はいつでも可能です。