Lỗi Unsupported filling mode (MT5 error 10030)
Mục lục
- 10030 (TRADE_RETCODE_INVALID_FILL) là gì
- 4 loại chế độ khớp lệnh (type_filling)
- Vì sao bị coi là "không hợp lệ" — SYMBOL_FILLING_MODE
- Vì sao lỗi luôn xuất hiện đúng "ngày đổi sàn"
- Mối liên hệ với chế độ thực thi (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)
- ② Kiểm tra tham số đầu vào của EA
- ③ Kiểm tra bằng code (dành cho lập trình viên)
- 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
- Hàm tự động nhận diện
- Cách sử dụng trong OrderSend
- Trường hợp dùng CTrade
- Lưu ý khi dùng lệnh giới hạn (BOC)
- Lưu ý liên quan đến sàn giao dịch (kiểm tra lại khi chuyển sàn)
- Danh sách kiểm tra theo thứ tự ưu tiên
- Tổng kết
- 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?
- Hỏi: Nên dùng FOK hay IOC?
- Hỏi: Backtest không gặp lỗi nhưng tài khoản thực lại báo lỗi 10030.
- 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?
- Hỏi: Tôi không thể sửa code của EA (chỉ có file .ex5). Phải làm sao?
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_FILL là thô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_FOK | Fill or Kill | Chỉ 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_IOC | Immediate or Cancel | Thự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_RETURN | Return | Thự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_BOC | Book or Cancel | Chỉ 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:
- 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.
- 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. - 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 thi | Hằng số | Điển hình | Xu hướng chế độ khớp lệnh |
|---|---|---|---|
| Instant | SYMBOL_TRADE_EXECUTION_INSTANT | Mộ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 |
| Market | SYMBOL_TRADE_EXECUTION_MARKET | Phầ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) |
| Exchange | SYMBOL_TRADE_EXECUTION_EXCHANGE | Cổ phiếu, hợp đồng tương lai | Thực thi qua sổ lệnh. Chủ yếu dùng RETURN |
| Request | SYMBOL_TRADE_EXECUTION_REQUEST | Kiể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ên | Kiểm tra | Cách xử lý |
|---|---|---|
| 🚨 Trước tiên | Mụ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ên | EA có tham số đầu vào FillingType không | Chỉ cần đổi tham số là xong (không cần sửa code) |
| ⚠️ Tiếp theo | Code của EA có hard-code type_filling không | Thay bằng GetFillingMode() / SetTypeFillingBySymbol() |
| ⚠️ Tiếp theo | Có vừa đổi sàn, đổi server, hay đổi loại tài khoản không | Sau khi thay đổi, luôn kiểm tra lại thông số kỹ thuật |
| ✅ Xác nhận | Sự 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ển | Có xử lý riêng lỗi 10030 theo retcode không | Ghi 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 khitype_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ùngCTrade::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.
Liên quan
📧 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.