Trang chủ > Blog > Lỗi Unsupported filling mode (MT5 error 10030)

MT5MQL5LỗiKhắc phục sự cốEA

Lỗi Unsupported filling mode (MT5 error 10030)

Đăng: 2026-07-07Thời gian đọc: khoảng 8 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 Unsupported filling mode (MT5 error 10030)

Một EA vẫn chạy bình thường trên sàn cũ đến tận hôm qua, nhưng ngay khi chuyển sang tài khoản mới thì tab Expert lại tràn ngập thông báo Unsupported filling mode hoặc OrderSend error 10030, khiến không một lệnh nào được đặt thành công — đây là sự cố kinh điển thường gặp nhất khi vận hành EA trên MT5 lúc chuyển sàn. EA không hề bị hỏng, tài khoản cũng không có vấn đề gì. Nguyên nhân đơn giản là kiểu chỉ định "chế độ khớp lệnh" (filling mode) của lệnh đặt không được sàn mới cho phép áp dụng với cặp/mã đó.

Bài viết này dành cho cả người dùng EA trên MT5 lẫn lập trình viên viết EA bằng MQL5, tổng hợp toàn bộ kiến thức về TRADE_RETCODE_INVALID_FILL (10030): bản chất lỗi, ý nghĩa của FOK/IOC/RETURN, cách kiểm tra trong 30 giây, và giải pháp khắc phục triệt để ở tầng code. Để xem danh sách đầy đủ các mã lỗi khác, tham khảo Cẩm nang tổng hợp xử lý mã lỗi MQL5 / MT5.

Bài viết này dựa trên phiên bản MT5 (dòng build 4xxx) tính đến tháng 7/2026. Tên màn hình và cách hiển thị có thể khác đôi chút tùy theo sàn và phiên bản build.


10030 (TRADE_RETCODE_INVALID_FILL) là gì

Kết quả của OrderSend() được trả về trong MqlTradeResult.retcode. Mã 10030 = TRADE_RETCODE_INVALID_FILLthông báo từ chối từ phía server, có nghĩa "type_filling (chế độ khớp lệnh) được chỉ định trong yêu cầu không được phép sử dụng với mã giao dịch này".

Ý nghĩa: Chế độ khớp lệnh (filling type) được chỉ định không được hỗ trợ
Hằng số: TRADE_RETCODE_INVALID_FILL
Giá trị: 10030
Hiển thị: Unsupported filling mode / Invalid order filling type
// Ví dụ log điển hình có thể thấy
2026.07.07 09:15:32.441 EA_NAME EURUSD,M15: OrderSend error 10030
2026.07.07 09:15:32.441 EA_NAME EURUSD,M15: failed market buy 0.10 EURUSD [Unsupported filling mode]

Điểm mấu chốt là lỗi này hoàn toàn không liên quan đến số dư, khối lượng lệnh hay giá. 10030 chỉ là vấn đề của đúng một trường duy nhất trong yêu cầu: MqlTradeRequest.type_filling. Chỉ cần sửa đúng trường này, cùng một lệnh sẽ được thực thi bình thường.

4 loại chế độ khớp lệnh (type_filling)

ENUM_ORDER_TYPE_FILLING trong MQL5 có 4 giá trị.

Hằng sốTên gọiÝ nghĩa
ORDER_FILLING_FOKFill or KillChỉ thực thi khi có thể khớp toàn bộ khối lượng. Nếu đặt 1 lot mà thanh khoản chỉ đủ 0.7 lot thì toàn bộ lệnh bị hủy
ORDER_FILLING_IOCImmediate or CancelThực thi ngay phần có thể khớp, phần còn lại bị hủy. Ví dụ chỉ khớp 0.7 lot, phần 0.3 lot còn lại bị hủy
ORDER_FILLING_RETURNReturnThực thi phần có thể khớp, phần khối lượng còn lại vẫn nằm trên sổ lệnh (chờ khớp tiếp sau đó). Thường dùng trong kiểu thực thi theo sàn giao dịch (exchange execution)
ORDER_FILLING_BOCBook or CancelChỉ chấp nhận khi lệnh được đưa vào sổ lệnh (chờ khớp thụ động); nếu mức giá khiến lệnh khớp ngay lập tức thì bị từ chối. Chỉ dùng cho lệnh giới hạn/dừng giới hạn (được bổ sung ở các bản build gần đây)

Đối với các EA giao dịch forex thông thường, hầu như chỉ dùng FOK hoặc IOC. RETURN có ý nghĩa trong kiểu thực thi theo sàn giao dịch (chứng khoán, hợp đồng tương lai...), còn BOC dành cho mục đích đặc thù khi muốn ép buộc lệnh maker.

Vì sao bị coi là "không hợp lệ" — SYMBOL_FILLING_MODE

Chế độ khớp lệnh nào được chấp nhận phụ thuộc vào cờ (flag) mà sàn thiết lập riêng cho từng mã giao dịch (SYMBOL_FILLING_MODE). Trong MQL5 có thể đọc như sau:

long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
// Nếu cờ SYMBOL_FILLING_FOK được bật thì FOK khả dụng
// Nếu cờ SYMBOL_FILLING_IOC được bật thì IOC khả dụng

SYMBOL_FILLING_MODE là một bit-flag, chứa thông tin cho phép FOK và IOC (nếu cả hai được phép thì cả hai cờ đều bật). RETURN không nằm trong cờ này, mà việc có sử dụng được hay không phụ thuộc vào chế độ thực thi (execution mode) của mã giao dịch (sẽ trình bày ở phần sau).

Nói cách khác, cấu trúc gây ra lỗi 10030 rất đơn giản:

type_filling mà EA gửi ∉ các chế độ khớp lệnh được phép với mã đó → 10030

Chỉ đơn giản vậy thôi.


Vì sao lỗi luôn xuất hiện đúng "ngày đổi sàn"

Lý do 10030 được gọi là "lỗi kinh điển khi chuyển sàn" là như sau:

  1. Chế độ khớp lệnh được phép khác nhau tùy theo sàn và tùy theo mã giao dịch. Có sàn chỉ cho phép FOK với các cặp forex, sàn khác chỉ cho IOC, sàn khác nữa cho phép cả hai. Ngay trong cùng một sàn, cấu hình cho forex và cho CFD/cổ phiếu cũng thường khác nhau.
  2. Nhiều EA hard-code sẵn type_filling. Ví dụ một EA viết cứng request.type_filling = ORDER_FILLING_FOK; sẽ chạy tốt trong nhiều năm trên sàn A vốn cho phép FOK. Vì nó chạy ổn trên môi trường của tác giả nên lỗi này thường không được phát hiện và được phát tán dưới dạng bug tiềm ẩn.
  3. Nếu sàn B (nơi chuyển đến) không cho phép FOK, thì ngay lệnh đầu tiên đã thất bại toàn bộ. Lỗi này thường không xuất hiện khi backtest (hành vi của Strategy Tester khoan dung hơn nhiều so với server thực), nên nó chỉ lộ diện đúng vào "ngày chuyển sang tài khoản thực".

Nói cách khác, 10030 không hẳn là bug của EA, mà là hệ quả của việc "mặc định cứng theo môi trường" bị phơi bày. Ngược lại, nếu sửa để EA đọc cờ cho phép của mã giao dịch và tự động lựa chọn, EA sẽ chạy được trên mọi sàn (xem đoạn code ở phần dưới).

Mối liên hệ với chế độ thực thi (SYMBOL_TRADE_EXEMODE)

Ngoài chế độ khớp lệnh, mỗi mã giao dịch còn có chế độ thực thi (execution mode), ảnh hưởng đến việc chế độ khớp lệnh nào có ý nghĩa thực tế.

Chế độ thực thiHằng sốĐiển hìnhXu hướng chế độ khớp lệnh
InstantSYMBOL_TRADE_EXECUTION_INSTANTMột số sàn forex (thường là dạng DD)Thực thi theo giá chỉ định. Thế giới của FOK/IOC + requote
MarketSYMBOL_TRADE_EXECUTION_MARKETPhần lớn forex/CFD (dạng NDD)Thực thi theo giá thị trường. FOK hoặc IOC (tùy cấu hình của sàn)
ExchangeSYMBOL_TRADE_EXECUTION_EXCHANGECổ phiếu, hợp đồng tương laiThực thi qua sổ lệnh. Chủ yếu dùng RETURN
RequestSYMBOL_TRADE_EXECUTION_REQUESTKiểu cũ (legacy)Thực thi theo yêu cầu (hiện nay hiếm gặp)

Tổ hợp cho phép chính xác còn tùy thuộc vào cấu hình server của từng sàn, nhưng trên thực tế chỉ cần nhớ nguyên tắc: "Với forex/CFD thực thi theo Market thì dùng FOK hoặc IOC, còn với mã kiểu sàn giao dịch thì dùng RETURN" là đủ dùng. Chế độ thực thi cũng có thể kiểm tra qua SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE).


Cách kiểm tra nhanh trong 30 giây

① Xem chế độ khớp lệnh được phép của mã giao dịch (trên giao diện MT5)

Vào Market Watch → nhấp chuột phải vào mã giao dịch → Specification (Thông số kỹ thuật), xem dòng "Filling" (Khớp lệnh). Nó sẽ hiển thị Fill or Kill / Immediate or Cancel / hoặc cả hai. Nếu EA gửi một chế độ không có trong danh sách này thì chắc chắn sẽ gặp lỗi 10030.

② Kiểm tra tham số đầu vào của EA

Những EA được thiết kế tốt thường có tham số đầu vào dạng FillingType / Filling Mode. Nếu có, chỉ cần đổi giá trị này cho khớp với chế độ được phép đã xác định ở bước ① là giải quyết xong (không cần sửa code).

③ Kiểm tra bằng code (dành cho lập trình viên)

long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
PrintFormat("%s filling: FOK=%s IOC=%s exemode=%d",
            _Symbol,
            ((flags & SYMBOL_FILLING_FOK) != 0) ? "yes" : "no",
            ((flags & SYMBOL_FILLING_IOC) != 0) ? "yes" : "no",
            (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE));

Chỉ cần chạy đoạn này dưới dạng script, kết quả sẽ hiển thị ngay trong một dòng log tình trạng cho phép thực tế của sàn và mã giao dịch đó.


Giải pháp khắc phục triệt để — Đoạn code MQL5 tự động chọn dựa trên cờ cho phép

Cách sửa đúng đắn cho lỗi 10030 không phải là "mỗi lần đổi sàn lại chỉnh tay", mà là để chính EA tự đọc cờ cho phép của mã giao dịch và tự động lựa chọn. Dưới đây là đoạn code chuẩn có thể dùng ngay.

Hàm tự động nhận diện

// Trả về chế độ khớp lệnh thực sự được phép với mã giao dịch đó
// Thứ tự ưu tiên: FOK → IOC → RETURN (dự phòng cho kiểu sàn giao dịch)
ENUM_ORDER_TYPE_FILLING GetFillingMode(const string symbol)
{
   long flags = SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);

   if((flags & SYMBOL_FILLING_FOK) != 0)
      return ORDER_FILLING_FOK;    // Chỉ thực thi khi khớp được toàn bộ khối lượng (không khớp một phần)

   if((flags & SYMBOL_FILLING_IOC) != 0)
      return ORDER_FILLING_IOC;    // Thực thi phần khớp được, phần còn lại hủy

   return ORDER_FILLING_RETURN;    // Không có cờ nào = kiểu sàn giao dịch v.v. Gửi bằng RETURN
}

Cách sử dụng trong OrderSend

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);

req.action       = TRADE_ACTION_DEAL;
req.symbol       = _Symbol;
req.volume       = lots;
req.type         = ORDER_TYPE_BUY;
req.price        = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
req.deviation    = 20;
req.magic        = MagicNumber;
req.type_filling = GetFillingMode(_Symbol);   // ← không hard-code

if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_INVALID_FILL)   // 10030
      PrintFormat("Unsupported filling mode: sent=%d, allowed flags=%d",
                  (int)req.type_filling,
                  (int)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE));
   else
      PrintFormat("OrderSend failed: retcode=%d", res.retcode);
}

Với cách này, EA chạy được với cùng một file nhị phân trên cả sàn chỉ hỗ trợ FOK lẫn sàn chỉ hỗ trợ IOC, không còn cần chỉnh sửa mỗi lần đổi sàn.

Trường hợp dùng CTrade

Thư viện chuẩn CTrade có sẵn hàm SetTypeFillingBySymbol(), tự động thiết lập chế độ khớp lệnh dựa trên cờ cho phép của mã giao dịch.

#include <Trade/Trade.mqh>
CTrade trade;

int OnInit()
{
   trade.SetExpertMagicNumber(MagicNumber);
   trade.SetTypeFillingBySymbol(_Symbol);   // Đọc cờ cho phép và tự động thiết lập
   return INIT_SUCCEEDED;
}

Nếu EA bị lỗi 10030 do dùng cách viết cũ trade.SetTypeFilling(ORDER_FILLING_FOK); (chỉ định cứng), chỉ cần thay bằng dòng này là giải quyết được vấn đề. Nếu muốn chỉ định thủ công, có thể truyền kết quả của GetFillingMode() nêu trên vào SetTypeFilling() để đạt hiệu quả tương tự.

Lưu ý khi dùng lệnh giới hạn (BOC)

ORDER_FILLING_BOC (Book or Cancel) chỉ dành cho lệnh giới hạn / lệnh dừng giới hạn, và sẽ bị từ chối nếu mức giá chỉ định khiến lệnh khớp ngay lập tức. Việc chỉ định BOC cho lệnh thị trường (market order) là sai, nên các EA giao dịch theo kiểu market không cần đưa BOC vào danh sách lựa chọn.


Lưu ý liên quan đến sàn giao dịch (kiểm tra lại khi chuyển sàn)

  • Cấu hình cho phép chế độ khớp lệnh không chỉ khác nhau giữa các sàn, mà còn khác nhau giữa các nhóm mã giao dịch trong cùng một sàn. Việc forex cho phép IOC nhưng CFD cổ phiếu chỉ cho phép RETURN là chuyện hoàn toàn bình thường.
  • Cấu hình cũng có thể thay đổi khi đổi loại tài khoản hoặc đổi server. Không chỉ khi chuyển sàn, mà cả khi di chuyển server trong cùng một sàn, đổi loại tài khoản, hoặc sau khi sàn cập nhật thông số kỹ thuật của mã giao dịch, lỗi 10030 cũng có thể đột ngột xuất hiện.
  • Vì vậy, nên tạo thói quen vận hành: "hễ tài khoản, server, hoặc mã giao dịch có bất kỳ thay đổi nào, hãy kiểm tra lại chế độ khớp lệnh qua màn hình Specification (hoặc bằng script)". Với EA đã tích hợp sẵn cơ chế tự động nhận diện, bước kiểm tra này trở nên không còn cần thiết.

Thông tin kiểu "sàn X chỉ cho phép FOK với mã Y" dễ bị lỗi thời do thay đổi cấu hình server, nên bài viết này không liệt kê cụ thể. Hãy luôn kiểm tra trực tiếp thông số kỹ thuật của mã giao dịch trên tài khoản của chính bạn.


Danh sách kiểm tra theo thứ tự ưu tiên

Ưu tiênKiểm traCách xử lý
🚨 Trước tiênMục "Filling" trong thông số kỹ thuật của mã giao dịch có khớp với chế độ EA đang chỉ định khôngĐổi sang chế độ được phép
🚨 Trước tiênEA có tham số đầu vào FillingType khôngChỉ cần đổi tham số là xong (không cần sửa code)
⚠️ Tiếp theoCode của EA có hard-code type_filling khôngThay bằng GetFillingMode() / SetTypeFillingBySymbol()
⚠️ Tiếp theoCó vừa đổi sàn, đổi server, hay đổi loại tài khoản khôngSau khi thay đổi, luôn kiểm tra lại thông số kỹ thuật
✅ Xác nhậnSự khác biệt giữa các chế độ thực thi (Instant/Market/Exchange)Mã kiểu sàn giao dịch mặc định dùng RETURN
🛠 Phát triểnCó xử lý riêng lỗi 10030 theo retcode khôngGhi log chế độ đã gửi và cờ cho phép

Tổng kết

  • Unsupported filling mode (10030 / TRADE_RETCODE_INVALID_FILL) là lỗi bị server từ chối khi type_filling (FOK / IOC / RETURN / BOC) của lệnh đặt không được phép sử dụng với mã giao dịch đó. Số dư hay khối lượng lệnh không liên quan đến lỗi này.
  • Vì chế độ được phép khác nhau tùy theo sàn và tùy theo mã giao dịch, nên các EA hard-code type_filling sẽ đồng loạt phát sinh lỗi 10030 ngay vào ngày chuyển sang sàn khác. Đây chính là mẫu hình kinh điển của lỗi này.
  • Người dùng có thể giải quyết ngay bằng cách "kiểm tra mục Filling trong thông số kỹ thuật của mã giao dịch → đổi tham số đầu vào của EA". Lập trình viên có thể khắc phục triệt để bằng cách đọc cờ từ SymbolInfoInteger(SYMBOL_FILLING_MODE) để tự động lựa chọn (hoặc dùng CTrade::SetTypeFillingBySymbol()).

Tham khảo Cẩm nang tổng hợp xử lý mã lỗi MQL5 / MT5 để biết thêm về các mã lỗi khác. Các EA do FXEA365 phân phối đều đã tích hợp sẵn cơ chế tự động nhận diện chế độ khớp lệnh, hoạt động ổn định trên mọi sàn giao dịch (Danh sách EA).


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

Hỏi: EA vẫn chạy tốt đến hôm qua, nhưng khi đổi sàn thì hoàn toàn không đặt được lệnh vì lỗi 10030. EA có bị hỏng không?

Không phải EA bị hỏng. Chỉ đơn giản là chế độ khớp lệnh mà EA đang chỉ định (ví dụ: FOK) không được sàn mới cho phép áp dụng với mã giao dịch đó. Hãy kiểm tra mục "Filling" trong thông số kỹ thuật của mã giao dịch, sau đó đổi tham số đầu vào của EA (FillingType v.v.) cho khớp, hoặc sửa code để tự động nhận diện — EA sẽ hoạt động trở lại bình thường.

Hỏi: Nên dùng FOK hay IOC?

Nếu mã giao dịch cho phép cả hai, sự khác biệt về hành vi chỉ thể hiện rõ "khi thanh khoản không đủ". FOK sẽ hủy toàn bộ lệnh nếu không khớp được hết khối lượng (tránh vị thế bị khớp dở dang), còn IOC sẽ giữ lại phần đã khớp được (có thể xảy ra khớp một phần). Với khối lượng giao dịch forex thông thường của nhà đầu tư cá nhân, tình trạng thiếu thanh khoản vốn đã hiếm gặp, nên trên thực tế dùng chế độ nào cũng không khác biệt nhiều. Việc ưu tiên FOK như trong đoạn code tự động nhận diện ở trên là hoàn toàn hợp lý.

Hỏi: Backtest không gặp lỗi nhưng tài khoản thực lại báo lỗi 10030.

Cơ chế xử lý khớp lệnh của Strategy Tester không mô phỏng hoàn toàn giống cấu hình của server thực, nên sự không tương thích của type_filling có thể không lộ ra khi backtest. Khi vận hành lần đầu trên tài khoản thực hoặc demo, hãy đối chiếu ngay với mục Filling trong thông số kỹ thuật của mã giao dịch.

Hỏi: Cùng một sàn nhưng có mã giao dịch gặp lỗi 10030, có mã lại không?

Đây là hành vi bình thường (hoàn toàn có thể xảy ra). Vì cấu hình cho phép chế độ khớp lệnh được thiết lập riêng cho từng mã giao dịch, nên các cặp forex có thể cho phép IOC trong khi CFD cổ phiếu chỉ cho phép RETURN, tùy theo từng nhóm mã. Với EA giao dịch đa mã, bắt buộc phải đọc SYMBOL_FILLING_MODE riêng cho từng mã giao dịch.

Hỏi: Tôi không thể sửa code của EA (chỉ có file .ex5). Phải làm sao?

Trước tiên hãy kiểm tra xem EA có tham số đầu vào dạng FillingType hay không. Nếu không có, EA đó không thể sử dụng được với mã giao dịch hiện tại trên sàn này. Bạn cần liên hệ tác giả để được hỗ trợ, hoặc chuyển sang vận hành trên sàn/loại tài khoản có cho phép chế độ khớp lệnh mà EA đó yêu cầu.

📧 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