Trang chủ > Blog > Giải quyết triệt để lỗi Market closed (10018 / lỗi 132)

MT5MQL5LỗiXử lý sự cốEA

Giải quyết triệt để lỗi Market closed (10018 / lỗi 132)

Đăng: 2026-07-07Thời gian đọc: khoảng 9 phút
This article reflects information as of its publish date. EA performance figures (PF, DD, annual return) change with live trading and re-validation — check the latest on the EA pages. See the latest EA results

Giải quyết triệt để lỗi Market closed (MT5/MQL5)

Khi log của EA hiện ra Market closed hoặc market is closed, chỉ khoảng một nửa trường hợp là do "đương nhiên vì cuối tuần". Rất nhiều người gặp khó khăn với kiểu lỗi này khi nó xuất hiện ngay cả vào ban ngày trong tuần, hoặc chỉ xảy ra với một mã cụ thể trong khi các mã khác vẫn đặt lệnh bình thường.

Nguyên nhân không chỉ giới hạn ở "cuối tuần" mà còn có nhiều yếu tố khác như phiên giao dịch riêng của từng mã (thời gian ngắt phiên hàng ngày của vàng hay chỉ số chứng khoán), lệch giờ giữa server của broker và giờ máy tính của bạn, hoặc giới hạn chế độ giao dịch của symbol (close-only, v.v.). Bài viết này dành cho cả người dùng EA trên MT5 lẫn người viết EA bằng MQL5, tổng hợp đầy đủ về bản chất của lỗi Market closed, 6 nguyên nhân, cách xác định nguyên nhân trong 30 giây, và cách phòng ngừa vĩnh viễn ở phía code. Để xem danh sách tổng hợp toàn bộ mã lỗi, hãy tham khảo Hướng dẫn toàn diện xử lý mã lỗi MQL5 / MT5.

Bài viết này dựa trên MT5 (dòng build 4xxx) tính đến thời điểm tháng 7 năm 2026. Thời gian phiên giao dịch và tên màn hình có thể khác nhau tùy theo broker và phiên bản build.


Market closed là gì (sự khác biệt giữa 10018 và 132)

Mã biểu thị "thị trường đang đóng cửa" là khác nhau giữa MT5 và MT4 (MQL4). Hãy đối chiếu tùy theo nền tảng bạn đang dùng và nơi bạn lấy giá trị đó.

① TRADE_RETCODE_MARKET_CLOSED = 10018 (mã trả về của OrderSend() trong MT5)

Kết quả đặt lệnh bằng OrderSend() trong MQL5 được lưu trong MqlTradeResult.retcode. Khi server giao dịch phán đoán rằng "mã này hiện đang ngoài giờ giao dịch" và từ chối lệnh, mã trả về là 10018. Đây không phải lỗi nội bộ của MT5, mà là thông báo từ chối từ server của broker.

Ý nghĩa: Thị trường đang đóng cửa (Market is closed)
Hằng số: TRADE_RETCODE_MARKET_CLOSED
Giá trị: 10018
// Ví dụ log điển hình có thể thấy
2026.07.06 23:05:11.204 EA_NAME XAUUSD,M5: OrderSend error 10018 [Market closed]

② ERR_MARKET_CLOSED = 132 (GetLastError() trong MT4 / MQL4)

Trong MT4 (MQL4), sau khi OrderSend() thất bại, GetLastError() sẽ trả về 132. Ý nghĩa giống hệt 10018: "thị trường đang đóng cửa". Nếu bạn dùng song song EA bản MT4, cùng một nguyên nhân sẽ hiện ra dưới dạng 10018 trên MT5 và 132 trên MT4.

Ý nghĩa: Thị trường đang đóng cửa (Market is closed)
Hằng số: ERR_MARKET_CLOSED (MQL4)
Giá trị: 132

Cách phân biệt trong thực tế:

Nền tảngNguồn lấyGiá trị
MT5 (MQL5)MqlTradeResult.retcode / CTrade.ResultRetcode()10018
MT4 (MQL4)GetLastError() sau khi OrderSend() thất bại132

Cả hai đều có nguyên nhân gốc chung là "đã gửi lệnh ngoài phiên giao dịch của server (hoặc giao dịch của mã đó đang bị giới hạn)". Cách xử lý cũng giống nhau nên bài viết sẽ giải thích chung dưới đây.


Xác định nguyên nhân trong 30 giây

Trước khi vội vàng khởi động lại EA, hãy kiểm tra 4 điểm sau để khoanh vùng nguyên nhân.

  1. Xem phiên giao dịch của mã — Trong cửa sổ giá (Market Watch), nhấp chuột phải vào symbol tương ứng → "Đặc tả (Specification)" → "Phiên giao dịch". Ở đó ghi rõ khung giờ giao dịch theo từng ngày trong tuần (theo giờ server). Nếu thời điểm hiện tại nằm ngoài khung này, đó chính là câu trả lời.
  2. Kiểm tra giờ server — Thời gian hiển thị ở phía trên cửa sổ giá chính là giờ server của broker. Việc phán đoán phiên giao dịch dựa trên thời gian này chứ không phải đồng hồ máy tính của bạn. Việc lệch vài giờ so với giờ Việt Nam là chuyện bình thường.
  3. Kiểm tra chế độ giao dịch — Xem mục "Giao dịch" trong cùng màn hình "Đặc tả" có phải là giá trị khác Full access không (ví dụ Disabled / Close only). Nếu đúng vậy, lệnh mới sẽ bị từ chối ngay cả trong giờ phiên.
  4. Thử với mã khác — Nếu cùng một EA/lệnh thủ công vẫn thực hiện được với các cặp FX chính như EURUSD, thì có thể khẳng định vấn đề không nằm ở tài khoản hay EA, mà ở phiên giao dịch/giới hạn của riêng mã đó.

Nguyên nhân và cách xử lý (6 kiểu)

① Toàn bộ thị trường đóng cửa vì cuối tuần/ngày lễ

Triệu chứng: Lỗi xuất hiện vào thứ Bảy, Chủ nhật, hoặc dịp Tết dương lịch, Giáng sinh, v.v. Xảy ra ở tất cả các mã.

Nguyên nhân: Thị trường FX về cơ bản không thể giao dịch từ khi đóng cửa thứ Sáu đến khi mở cửa thứ Hai (theo giờ server). Vào các ngày lễ (Tết dương lịch, Giáng sinh, v.v.), dù là ngày thường thị trường vẫn có thể đóng cửa hoặc rút ngắn thời gian giao dịch. Nếu EA vẫn cố đặt lệnh vào cuối tuần do xử lý nến còn dở hoặc do khung thời gian, lỗi 10018/132 sẽ liên tục xuất hiện.

Cách xử lý:

  1. Bản thân lỗi này vô hại. Khi thị trường mở cửa trở lại, nó sẽ tự hết
  2. Nếu không muốn log bị nhiễu, hãy thêm kiểm tra thứ trong tuần/phiên giao dịch ở phía EA để không gửi lệnh ngay từ đầu (xem code bên dưới)
  3. Lịch nghỉ lễ khác nhau tùy broker, nên hãy kiểm tra thông báo lịch nghỉ giao dịch của broker

② Ngoài phiên giao dịch riêng của mã (ngắt phiên hàng ngày)

Triệu chứng: Dù là ngày thường nhưng chỉ một số mã nhất định (vàng, bạc, CFD chỉ số chứng khoán, năng lượng, v.v.) bị lỗi. Gần như xảy ra vào cùng một khung giờ mỗi ngày.

Nguyên nhân: Các cặp FX có thể giao dịch gần như 24 giờ vào ngày thường, nhưng kim loại quý và CFD chỉ số chứng khoán thường có thời gian ngắt giao dịch từ vài chục phút đến vài giờ mỗi ngày. Điều này liên quan đến việc bảo trì sàn giao dịch của tài sản cơ sở hoặc thời điểm rollover, và khung giờ khác nhau tùy broker và mã. Nếu EA đặt lệnh trong khoảng thời gian ngắt phiên này, lỗi 10018 sẽ xảy ra.

Cách xử lý:

  1. Kiểm tra khung giờ ngắt phiên chính xác của mã đó tại "Đặc tả → Phiên giao dịch" (chỉ có thời gian ghi ở đây mới là đáp án duy nhất chính xác — đừng tin tuyệt đối thời gian trên blog của người khác, vì mỗi broker mỗi khác)
  2. Dùng bộ lọc thời gian của EA (TradeStartHour/TradeEndHour, v.v.) để tránh khung giờ ngắt phiên
  3. Nếu là developer, hãy kiểm tra bằng SymbolInfoSessionTrade() trong code (xem bên dưới)

Ngoài ra, nhiều broker cho phép giao dịch tiền điện tử (BTCUSD, v.v.) cả vào cuối tuần, nhưng điều này cũng tùy thuộc vào từng broker. Đừng mặc định rằng "tiền điện tử thì chắc chắn 24/7", hãy kiểm tra lại ở màn hình đặc tả.


③ Nhầm lẫn giữa giờ server và giờ địa phương

Triệu chứng: Lỗi xuất hiện dù "theo phiên giao dịch ghi trong đặc tả thì đang trong giờ giao dịch". Thường gặp khi dùng broker nước ngoài.

Nguyên nhân: Cả thời gian phiên ghi trong đặc tả lẫn thời gian hiển thị trong MT5 đều là giờ server của broker. Nhiều broker nước ngoài áp dụng múi giờ GMT+2/+3 (thiết lập sao cho NY đóng cửa = 0 giờ), lệch từ 6 đến 7 tiếng so với giờ Việt Nam. Trường hợp điển hình là khi giờ Việt Nam vẫn "còn là tối thứ Sáu" nhưng theo giờ server thì đã sang thứ Bảy.

Cách xử lý:

  1. Tập thói quen lấy thời gian hiển thị trong cửa sổ giá (= giờ server) làm chuẩn
  2. Các tham số của EA (bộ lọc thời gian giao dịch, v.v.) thường được quy định theo giờ server. Hãy kiểm tra lại xem bạn có đang thiết lập nhầm theo giờ Việt Nam không
  3. Trong code, hãy dùng TimeTradeServer() (không phán đoán phiên giao dịch bằng TimeLocal())

④ Symbol bị vô hiệu hóa giao dịch/chỉ cho đóng lệnh (SYMBOL_TRADE_MODE)

Triệu chứng: Dù đang trong giờ phiên giao dịch, ngày thường, nhưng chỉ một mã cụ thể bị từ chối toàn bộ lệnh mới. Đôi khi chỉ có đóng lệnh là thực hiện được.

Nguyên nhân: Broker có thể thiết lập chế độ giao dịch riêng cho từng symbol.

SYMBOL_TRADE_MODEÝ nghĩa
SYMBOL_TRADE_MODE_FULLKhông giới hạn (bình thường)
SYMBOL_TRADE_MODE_CLOSEONLYChỉ cho phép đóng lệnh (không cho mở lệnh mới). Áp dụng với CFD sắp hủy niêm yết, trước khi chuyển tháng đáo hạn, v.v.
SYMBOL_TRADE_MODE_DISABLEDVô hiệu hóa hoàn toàn giao dịch
SYMBOL_TRADE_MODE_LONGONLY / SHORTONLYChỉ cho mua/chỉ cho bán

Cũng có trường hợp thiết lập khác nhau giữa tài khoản demo và tài khoản thật, hoặc mã có thể giao dịch khác nhau tùy loại tài khoản.

Cách xử lý:

  1. Kiểm tra mục "Giao dịch" trong màn hình "Đặc tả"
  2. Nếu là Close only, hãy từ bỏ việc mở lệnh mới và tập trung xử lý đóng vị thế. Nếu muốn tiếp tục dùng mã đó lâu dài, hãy kiểm tra xem có symbol tháng đáo hạn khác hoặc symbol có hậu tố khác cùng tên (ví dụ: US500.f, v.v.) hay không
  3. Nếu vẫn ở trạng thái Disabled, hãy hỏi broker xem loại tài khoản đó có thể giao dịch mã này hay không

⑤ Ngay sau khi mở cửa thứ Hai / ngay sau khi phiên giao dịch mở lại

Triệu chứng: Chỉ trong vài phút ngay sau khi thị trường mở cửa vào thứ Hai, hoặc ngay sau khi kết thúc thời gian ngắt phiên hàng ngày, xuất hiện lỗi hoặc lệnh bị từ chối khớp.

Nguyên nhân: Có một khoảng thời gian từ lúc phiên "mở cửa" đến khi thực sự khớp lệnh ổn định. Ngay sau khi mở cửa, thanh khoản thấp và spread giãn nở cực độ, và tùy broker có thể không nhận lệnh cho đến khi báo giá bắt đầu chạy ổn định (= bị từ chối như trường hợp thị trường đóng cửa). Đây là tình huống điển hình mà các EA phát tín hiệu ngay sáng thứ Hai, hay các EA vàng nhắm vào thời điểm sau khi hết ngắt phiên, thường gặp phải.

Cách xử lý:

  1. Thêm bộ lọc bỏ qua lệnh mới trong ○ phút sau khi mở cửa (AvoidMondayOpen, v.v.). Đây là lý do EA phân phối trên trang này có mặc định tránh khung giờ 0-3 giờ thứ Hai (theo giờ server)
  2. Nhất định phải dùng kèm bộ lọc spread (MaxSpread). Khớp lệnh với spread bất thường ngay sau khi mở cửa còn gây thiệt hại nặng hơn cả bản thân lỗi
  3. Thiết kế sao cho khi gặp lỗi 10018, không retry ngay lập tức mà chờ đến nến tiếp theo

⑥ Tạm dừng giao dịch do tin tức/sự kiện

Triệu chứng: Tạm thời bị lỗi trước và sau khi công bố các chỉ số kinh tế quan trọng, hoặc khi giá của một mã biến động bất thường.

Nguyên nhân: Một số broker/mã có thể tạm dừng giao dịch (halt) hoặc giới hạn lệnh mới trong các sự kiện lớn. Với CFD chỉ số chứng khoán, đôi khi giao dịch bị dừng liên động với circuit breaker của thị trường tài sản cơ sở. Lệnh đặt trong khoảng thời gian này sẽ bị từ chối dưới dạng thị trường đóng cửa.

Cách xử lý:

  1. Đây là hiện tượng tạm thời, sẽ tự hết sau một khoảng thời gian
  2. Nếu dùng bộ lọc chỉ số kinh tế (UseEconomicFilter của EA trên trang này) để dừng lệnh mới trước và sau khi công bố chỉ số, bạn có thể vừa tránh lỗi vừa tránh rủi ro biến động đột ngột cùng lúc

Code phòng ngừa lỗi này bằng MQL5 (dành cho developer EA)

Market closed không nên là kiểu "xử lý sau khi lỗi xảy ra" mà thiết kế đúng là kiểm tra phiên giao dịch và chế độ giao dịch trước khi đặt lệnh, nếu đang đóng cửa thì không gửi lệnh. Điều này không chỉ giúp log sạch hơn mà còn ngăn được các request thừa gửi lên server và tình trạng retry mất kiểm soát.

Kiểm tra có đang trong phiên giao dịch hay không

SymbolInfoSessionTrade() trả về thời gian bắt đầu/kết thúc (tính bằng giây kể từ 0 giờ theo giờ server) của phiên thứ i trong ngày trong tuần được chỉ định. Để hỗ trợ các mã có nhiều phiên (ví dụ chỉ số có ngắt phiên hàng ngày), cần lặp qua để kiểm tra tất cả các phiên.

// Xác định xem giờ server hiện tại có nằm trong phiên giao dịch của mã này không
bool IsTradeSessionOpen(const string symbol)
{
   MqlDateTime dt;
   TimeToStruct(TimeTradeServer(), dt);           // Bắt buộc phán đoán bằng giờ server
   int now = dt.hour*3600 + dt.min*60 + dt.sec;   // Số giây trôi qua kể từ 0 giờ

   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;                 // Số giây kể từ 0 giờ
      int t = (int)to;                   // Kết thúc lúc 24:00 sẽ là 86400
      if(now >= f && now < t)
         return true;
   }
   return false;   // Không có phiên tương ứng vào ngày này (cuối tuần, v.v.) hoặc ngoài tất cả các phiên
}

Kiểm tra chế độ giao dịch (SYMBOL_TRADE_MODE)

// Xác định xem có phải chế độ giao dịch cho phép mở lệnh mới hay không
bool IsNewEntryAllowed(const string symbol, ENUM_ORDER_TYPE type)
{
   long mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
   if(mode == SYMBOL_TRADE_MODE_DISABLED)  return false; // Vô hiệu hóa giao dịch
   if(mode == SYMBOL_TRADE_MODE_CLOSEONLY) return false; // Chỉ đóng lệnh = không cho mở mới
   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, v.v.
}

Tổng hợp thành cổng kiểm tra trước khi đặt lệnh

// Trong OnTick: dù tín hiệu đã xuất hiện, nếu thị trường đang đóng cửa thì không gửi lệnh
if(!IsTradeSessionOpen(_Symbol) || !IsNewEntryAllowed(_Symbol, ORDER_TYPE_BUY))
{
   // Ngăn chặn lỗi 10018 từ trước. Chỉ ghi 1 dòng log rồi chờ nến tiếp theo
   return;
}

Cách xử lý khi vẫn nhận được 10018

Vẫn có những trường hợp lọt qua cổng kiểm tra như thời điểm cập nhật thông tin phiên hoặc bị từ chối ngay sau khi mở cửa, không thể triệt tiêu hoàn toàn về 0. Nguyên tắc là khi xem retcode của OrderSend(), nếu gặp 10018 thì không retry ngay lập tức (chờ đến nến tiếp theo). Gửi lệnh liên tục trong lúc thị trường đóng cửa chỉ làm log bẩn thêm mà không cải thiện được gì.

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... xây dựng 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());
}

Thành thật mà nói, các EA đặt lệnh ngay sau khi mở cửa thứ Hai hoặc quanh thời điểm ngắt phiên hàng ngày (đặc biệt là vàng, chỉ số chứng khoán) sẽ thường xuyên gặp phải lỗi này. Những EA có ý thức về lịch trình — kiểm tra phiên giao dịch, bỏ qua ngay sau khi mở cửa, đóng lệnh trước cuối tuần — không chỉ tránh được các lỗi vô ích mà còn tránh được các lần khớp lệnh xấu trong khung giờ thanh khoản mỏng. Các EA do FXEA365 phân phối đều triển khai sẵn tính năng tránh mở cửa thứ Hai (AvoidMondayOpen), bộ lọc thời gian, và đóng lệnh cuối tuần (CloseAllBeforeWeekend) như một tiêu chuẩn.


Bảng kiểm tra theo mức độ ưu tiên

Ưu tiênKiểm traCách xử lý
🚨 Trước tiênHiện tại có phải cuối tuần/ngày lễ không (theo giờ server)Chỉ cần chờ. Bản thân lỗi vô hại
🚨 Trước tiênCó nằm trong khung "Phiên giao dịch" ghi trong đặc tả khôngDùng bộ lọc thời gian để tránh khung ngắt phiên riêng của mã
⚠️ Tiếp theoCó nhầm lẫn giữa giờ server và giờ Việt Nam khôngThiết lập lại lấy thời gian trong cửa sổ giá làm chuẩn
⚠️ Tiếp theoChế độ giao dịch có phải Full access khôngNếu là Close only / Disabled thì kiểm tra đặc tả của broker
✅ Xác nhậnCó phải ngay sau khi mở cửa/ngay sau khi hết ngắt phiên khôngBỏ qua ○ phút + bộ lọc spread
🛠 Phát triểnCó kiểm tra phiên/chế độ giao dịch trước khi đặt lệnh khôngTriển khai cổng kiểm tra SymbolInfoSessionTrade

Tổng kết

  • Market closed10018 (TRADE_RETCODE_MARKET_CLOSED) trên MT5, 132 (ERR_MARKET_CLOSED) trên MT4. Ý nghĩa giống nhau: "lệnh đặt ngoài phiên giao dịch/đang trong thời gian giới hạn giao dịch".
  • Không chỉ xảy ra vào cuối tuần mà còn do thời gian ngắt phiên hàng ngày riêng của từng mã (vàng, chỉ số), lệch giờ server, giới hạn SYMBOL_TRADE_MODE, bị từ chối ngay sau khi mở cửa. Nếu gặp lỗi vào ngày thường, trước tiên hãy kiểm tra "Đặc tả → Phiên giao dịch".
  • Thời gian phiên giao dịch khác nhau tùy broker và tùy mã. Chỉ có thời gian ghi trong màn hình đặc tả của MT5 bạn đang dùng mới là đáp án chính xác.
  • Developer EA nên phòng ngừa vĩnh viễn bằng cổng kiểm tra trước khi đặt lệnh kết hợp SymbolInfoSessionTrade() + SYMBOL_TRADE_MODE + TimeTradeServer(). Khi gặp 10018, không retry ngay mà chờ đến nến tiếp theo.

Về toàn bộ mã lỗi, hãy tham khảo Hướng dẫn toàn diện xử lý mã lỗi MQL5 / MT5, và để tìm EA miễn phí đã tích hợp sẵn tính năng tránh phiên và bộ lọc thời gian, hãy xem Danh sách EA.


Câu hỏi thường gặp

Hỏi: Đang ban ngày trong tuần nhưng vẫn gặp lỗi Market closed. Tại sao?

Nguyên nhân là do khung giờ ngắt giao dịch riêng của mã đó (ngắt phiên hàng ngày), hoặc giới hạn chế độ giao dịch của symbol. Vàng, bạc, CFD chỉ số chứng khoán đều có khung giờ không thể giao dịch hàng ngày dù là ngày thường. Hãy nhấp chuột phải vào symbol trong cửa sổ giá → "Đặc tả" → kiểm tra mục "Phiên giao dịch" và "Giao dịch".

Hỏi: 10018 và 132 khác nhau ở điểm nào?

Chỉ khác nhau về nền tảng, còn ý nghĩa giống hệt nhau. 10018 (TRADE_RETCODE_MARKET_CLOSED) là mã trả về của OrderSend() trên MT5, còn 132 (ERR_MARKET_CLOSED) là giá trị của GetLastError() trên MT4 (MQL4). Cách xử lý giống nhau.

Hỏi: EA cứ liên tục báo lỗi vào cuối tuần. Có để vậy được không?

Không gây hại thực tế gì. Khi thị trường mở cửa, nó sẽ tự dừng. Tuy nhiên nếu bạn lo lắng về việc log bị nhiễu hoặc thông báo đẩy kêu liên tục, giải pháp gốc rễ là thêm kiểm tra thứ trong tuần/phiên giao dịch ở phía EA để bỏ qua việc đặt lệnh ngay từ đầu (tham khảo code trong bài).

Hỏi: Với tiền điện tử (BTCUSD) cũng gặp lỗi Market closed. Không phải có thể giao dịch 24 giờ sao?

Việc có thể giao dịch CFD tiền điện tử vào cuối tuần hay không tùy thuộc vào từng broker. Có những broker dừng giao dịch vào cuối tuần, hoặc có thời gian bảo trì ngắn. Giống như các cặp FX, hãy kiểm tra "Đặc tả → Phiên giao dịch" để biết khung giờ giao dịch thực tế với broker của bạn.

📧 Cảnh báo trước khi tăng giá + khóa học email miễn phí 5 ngày

Tất cả EA đang ở giá ra mắt và tăng dần theo doanh số. Nhận thông báo trước mỗi lần tăng giá, cùng email hằng ngày về giao dịch thuật toán, cách đọc backtest và chọn sàn.

* Quyền riêng tư được bảo vệ nghiêm ngặt. Bạn có thể hủy đăng ký bất cứ lúc nào.

Bình luận & câu hỏi