Lỗi MT5 Not enough money (10019/134): 6 nguyên nhân
Mục lục
Giải quyết triệt để lỗi ERR_NO_MONEY (MT5/MQL5)
Khi đang chạy EA mà tab Expert hoặc Journal hiện ERR_NO_MONEY hay not enough money, nhiều người sẽ hoảng vì nghĩ "hết vốn rồi sao?" Nhưng thực tế, lỗi này vẫn có thể xuất hiện dù số dư còn dư dả. Nguyên nhân không chỉ là "vốn bằng 0" mà còn đến từ cách tính khối lượng lệnh, đòn bẩy, hay ký quỹ bị chiếm dụng bởi các lệnh đang mở.
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 đủ bản chất lỗi ERR_NO_MONEY, 6 nguyên nhân, cách xử lý ngay lập tức, lưu ý theo từng sàn giao dịch, và cách phòng ngừa vĩnh viễn ở tầng code. Muốn xem danh sách đầy đủ các mã lỗi khác, tham khảo Hướng dẫn tổng hợp cách xử lý mã lỗi MQL5 / MT5.
Bài viết dựa trên MT5 (dòng build 4xxx) tính đến thời điểm tháng 6/2026. Con số và tên màn hình có thể khác đôi chút tùy sàn và phiên bản build.
Kiểm tra nhanh trong 30 giây
Vào tab "Toolbox → Trade" trên MT5 và xem 3 chỉ số sau:
Balance (Số dư) : Tiền mặt trong tài khoản
Equity (Vốn chủ sở hữu) : Số dư ± lãi/lỗ chưa thực hiện
Free Margin (Ký quỹ khả dụng): Ký quỹ có thể dùng cho lệnh mới ← Đây là chỉ số quan trọng
Margin Level % (Mức ký quỹ): Equity / Margin × 100
- Nếu Free Margin nhỏ hơn ký quỹ cần thiết cho 1 lệnh sắp mở → 100% sẽ báo ERR_NO_MONEY.
- Nếu số dư vẫn đủ mà vẫn báo lỗi, nguyên nhân nằm ở "② Khối lượng lệnh quá lớn", "④ Ký quỹ bị chiếm dụng bởi lệnh hiện có", hoặc "⑥ Sai loại tài khoản" được nêu bên dưới.
Ký quỹ cần thiết cho 1 lệnh có thể xem tại "Market Watch → chuột phải vào symbol → Specification" trên MT5 (mục Margin cho 1 lot). Công thức tính gần đúng:
Ký quỹ cần thiết ≈ (Khối lượng lệnh × Kích thước hợp đồng × Giá) / Đòn bẩy
So sánh nhà môi giới khuyên dùng →
🎁 Tải EA miễn phí📧 Khóa học email miễn phí (8 email) + gói 13 chỉ báo MT5 dành riêng cho người đăng ký
* 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.
ERR_NO_MONEY là gì (10019 trên MT5, 134 trên MT4)
ERR_NO_MONEY là cách gọi tắt phổ biến, không phải hằng số chính thức: cả tài liệu MQL5 lẫn MQL4 đều không định nghĩa tên này. Tên và mã chính thức tùy theo nền tảng (MQL5: mã trả về của máy chủ giao dịch, MQL4: mã lỗi).
① MT5: TRADE_RETCODE_NO_MONEY = 10019 (mã trả về của máy chủ giao dịch)
Trong MQL5, kết quả của OrderSend() nằm trong MqlTradeResult.retcode. Khi máy chủ từ chối lệnh vì không đủ tiền, mã là 10019 (TRADE_RETCODE_NO_MONEY). Đây là thông báo từ chối từ máy chủ của broker. OrderCheck() kiểm tra số tiền trước khi gửi lệnh và ghi kết quả vào MqlTradeCheckResult.retcode.
Ý nghĩa: Không đủ vốn để thực hiện yêu cầu (There is not enough money to complete the request)
Hằng số: TRADE_RETCODE_NO_MONEY
Giá trị: 10019
// Ví dụ log điển hình có thể thấy
2026.06.12 09:15:32.441 EA_NAME XAUUSD,H1: OrderSend error 10019
② MT4: ERR_NOT_ENOUGH_MONEY = 134 (GetLastError() trong MQL4)
134 là mã của MT4 (MQL4). Danh sách lỗi runtime của MQL5 do GetLastError() trả về không có 134 và cũng không có mã nào cho việc không đủ tiền; trên MT5 hãy đọc retcode.
Ý nghĩa: Thao tác giao dịch không đủ vốn cần thiết (not enough money)
Hằng số: ERR_NOT_ENOUGH_MONEY
Giá trị: 134 (MT4)
Cách phân biệt trong thực tế:
| Nguồn lấy | Giá trị | Xuất hiện khi nào |
|---|---|---|
MqlTradeResult.retcode (MT5) | 10019 (TRADE_RETCODE_NO_MONEY) | OrderSend bị server từ chối |
CTrade.ResultRetcode() (MT5) | 10019 | Lệnh bị từ chối qua CTrade |
GetLastError() (MT4) | 134 (ERR_NOT_ENOUGH_MONEY) | OrderSend (MT4 / MQL4) |
Nếu log hiện «10019» hoặc not enough money, lệnh đã bị máy chủ giao dịch MT5 từ chối; «134» đến từ terminal hoặc EA của MT4. Nguyên nhân gốc là như nhau (ký quỹ cần > ký quỹ khả dụng) nên cách xử lý là chung.
Nguyên nhân và cách xử lý (6 dạng)
① Thực sự thiếu ký quỹ
Triệu chứng: Lỗi thả nổi tăng dần, Free Margin giảm xuống dưới mức cần cho lệnh mới. Thường gặp sau chuỗi thua liên tiếp hoặc khi số tầng nhồi lệnh (nanpin) quá sâu.
Cách xử lý:
- Nạp thêm tiền, hoặc
- Đóng thủ công một phần lệnh đang mở để thu hồi ký quỹ
- Giảm
RiskPercenttrong EA để khối lượng lệnh sau này nhỏ hơn
Nếu lỗi này lặp đi lặp lại với cùng một EA, có nghĩa là khối lượng lệnh vốn đã quá lớn so với số vốn. Xem tiếp mục ②.
② Khối lượng lệnh quá lớn (so với số dư)
Triệu chứng: Vẫn còn số dư nhưng ERR_NO_MONEY xuất hiện ngay từ lệnh đầu tiên. Thường gặp ở EA dùng khối lượng lệnh cố định.
Nguyên nhân: FixedLot không tương xứng với số dư/đòn bẩy tài khoản. Ví dụ với tài khoản 100.000 yên (≈$670), nếu cố vào lệnh XAUUSD 0,1 lot, tùy đòn bẩy mà ký quỹ cần thiết có thể vượt quá số dư.
Cách xử lý:
- Hạ khối lượng cố định xuống mức tối thiểu (0,01) để thử xem có vào lệnh được không
- Chuyển sang chế độ tự tính khối lượng theo % rủi ro (
UseFixedLot=false/RiskPercent) - Nếu vẫn không vào được 0,01 lot, khả năng cao là đòn bẩy hoặc vốn tài khoản không đủ → xem tiếp mục ③, ⑥
Tiêu chuẩn hợp lý: tài khoản Standard 100.000 yên (≈$670) có thể bắt đầu với khối lượng tối thiểu 0,01 lot. Nếu vốn thấp hơn mức này, hoặc muốn giao dịch an toàn với khối lượng nhỏ hơn nữa, hãy cân nhắc tài khoản Micro (Cent) ở phần tiếp theo.
③ Đòn bẩy thấp / bị giới hạn vào cuối tuần hoặc trước sự kiện
Triệu chứng: Cùng một EA, cùng khối lượng lệnh, nhưng tài khoản khác vẫn vào lệnh bình thường trong khi tài khoản này báo ERR_NO_MONEY. Hoặc lỗi tập trung vào chiều thứ Sáu đến sáng thứ Hai.
Nguyên nhân: Đòn bẩy tài khoản thấp (ví dụ: 1:30 của tài khoản chịu quản lý EU so với 1:1000 của tài khoản offshore) khiến ký quỹ cần thiết chênh lệch hàng chục lần. Ngoài ra, một số sàn hạ đòn bẩy vào cuối tuần hoặc quanh các sự kiện quan trọng (XM giới hạn đòn bẩy xuống 200:1 vào cuối tuần), khiến ký quỹ cần thiết tăng đột ngột trong khi đang giữ lệnh. Vàng hay tiền điện tử cũng có thể có giới hạn đòn bẩy riêng theo từng symbol.
Cách xử lý:
- Kiểm tra đòn bẩy tài khoản (trang quản lý của sàn / thông tin tài khoản trên MT5)
- Kiểm tra "Margin rate" trong thông số symbol (một số cặp có tỷ lệ thấp hơn)
- Dùng cài đặt không giữ lệnh qua cuối tuần (
CloseAllBeforeWeekend=true...), hoặc chuyển sang sàn không giới hạn đòn bẩy cuối tuần - Chuyển sang tài khoản đòn bẩy cao hơn, hoặc giảm khối lượng lệnh
④ Ký quỹ bị chiếm dụng bởi lệnh hiện có
Triệu chứng: Lệnh đầu tiên vào được, nhưng từ lệnh thứ hai trở đi hoặc khi nhồi lệnh (nanpin) thì báo ERR_NO_MONEY.
Nguyên nhân: Các lệnh đang giữ chiếm dụng ký quỹ khiến Free Margin giảm xuống dưới mức cần cho lệnh mới. Thường gặp khi chạy nhiều cặp tiền hoặc nhiều EA trên cùng một tài khoản.
Cách xử lý:
- Kiểm tra Margin đang sử dụng và Free Margin trong tab "Trade"
- Kiểm tra xem các EA có đang cạnh tranh ký quỹ trên cùng tài khoản không (nếu chạy nhiều EA)
- Giới hạn số lệnh mở đồng thời bằng tham số của EA
- Với EA nhồi lệnh/lưới (grid), số tầng càng sâu càng ngốn ký quỹ nhanh → xem lại giới hạn số tầng, hệ số nhân khối lượng, và cài đặt đóng lệnh khẩn cấp
⑤ Tính cả bonus/credit vào ký quỹ
Triệu chứng: Nếu tính "số dư + bonus" thì đủ, nhưng vẫn báo ERR_NO_MONEY.
Nguyên nhân: Một số sàn không tính credit (bonus) vào ký quỹ, hoặc chỉ tính một phần. Điều này khiến số dư hiển thị và ký quỹ thực tế mà server sử dụng không khớp nhau.
Cách xử lý: Kiểm tra điều khoản bonus của sàn xem "credit có được tính vào ký quỹ hay không". Nếu không được tính, hãy giảm khối lượng lệnh xuống mức phù hợp chỉ với số tiền đã nạp thực tế.
⑥ Khác biệt kích thước hợp đồng theo loại tài khoản (Standard vs Cent/Micro)
Triệu chứng: Cùng là "0,01 lot" nhưng khi đổi tài khoản lại đột nhiên báo ERR_NO_MONEY, hoặc ngược lại trở thành khối lượng quá lớn.
Nguyên nhân: Kích thước hợp đồng của tài khoản Cent (Micro) và Standard chênh nhau khoảng 100 lần. 0,01 lot trên tài khoản Cent có mức exposure thực tế chỉ bằng khoảng 1/100. Nếu EA dùng khối lượng cố định mà không phân biệt loại tài khoản, một trong hai loại sẽ bị thiếu ký quỹ.
Cách xử lý:
- Nếu giao dịch với vốn nhỏ và muốn an toàn, hãy dùng tài khoản Cent/Micro để khối lượng tối thiểu cũng không tạo rủi ro quá lớn
- Thiết kế EA không hard-code loại tài khoản, mà dùng
OrderCalcMargin()để tính ký quỹ thực tế cần thiết rồi mới quyết định khối lượng lệnh (xem chương sau)
Lưu ý theo từng sàn giao dịch
| Sàn | Đặc điểm | Tần suất gặp ERR_NO_MONEY |
|---|---|---|
| XM | Có giới hạn đòn bẩy cuối tuần · Stop Out 20% | Trung bình (cao hơn vào cuối tuần) |
| Exness | Có tài khoản đòn bẩy không giới hạn · Stop Out 0% | Thấp |
| HFM / FXGT... | Có tài khoản đòn bẩy cao | Thấp |
Tài khoản đòn bẩy không giới hạn của Exness (tài khoản Pro/Raw Spread) thường vẫn cho phép vào lệnh mới dù ký quỹ khả dụng gần như bằng 0, nên ít khi gặp lỗi này. Loại tài khoản này phù hợp với EA kiểu nhồi lệnh (nanpin), nhưng cần lưu ý mặt trái là Stop Out khó kích hoạt, khiến thua lỗ dễ phình to hơn. Tham khảo thêm trang so sánh sàn giao dịch.
Đoạn code MQL5 để ngăn lỗi này (dành cho người phát triển EA)
Không chỉ "sửa lỗi", thiết kế EA đúng đắn là chặn ERR_NO_MONEY ngay từ trước khi gửi lệnh. Điểm mấu chốt là: "tính ký quỹ cần thiết trước khi đặt lệnh, nếu không đủ thì không vào lệnh / giảm khối lượng".
Kiểm tra ký quỹ cần thiết trước khi đặt lệnh
// Cổng kiểm tra trước khi đặt lệnh: xác nhận ký quỹ cần thiết <= ký quỹ khả dụng rồi mới gọi OrderSend
bool HasEnoughMargin(ENUM_ORDER_TYPE type, double lots)
{
double price = (type == ORDER_TYPE_BUY)
? SymbolInfoDouble(_Symbol, SYMBOL_ASK)
: SymbolInfoDouble(_Symbol, SYMBOL_BID);
double margin = 0.0;
if(!OrderCalcMargin(type, _Symbol, lots, price, margin))
{
Print("OrderCalcMargin failed: ", GetLastError());
return false;
}
double freeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
if(margin > freeMargin)
{
PrintFormat("Skip: need %.2f > free %.2f (ERR_NO_MONEY guard)", margin, freeMargin);
return false; // Không vào lệnh = chặn ERR_NO_MONEY từ trước
}
return true;
}
Chuẩn hóa khối lượng lệnh theo min lot và step
Nếu gửi thẳng giá trị tính được từ % rủi ro mà không chuẩn hóa, lệnh sẽ bị từ chối vì không khớp khối lượng tối thiểu hoặc bước khối lượng (thiếu bước chuẩn hóa là nguyên nhân điển hình khiến lệnh bị từ chối). Thay vì bỏ cuộc khi không vào được lệnh, hãy thu nhỏ về mức có thể vào lệnh được để giảm cơ hội bị bỏ lỡ.
double NormalizeLot(double lots)
{
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lots = MathFloor(lots / step) * step; // Làm tròn theo step
lots = MathMax(minLot, MathMin(maxLot, lots)); // Giới hạn trong khoảng min~max
return NormalizeDouble(lots, 2);
}
Luôn kiểm tra retcode của OrderSend
Không chỉ nhìn giá trị trả về (bool) của OrderSend(), mà cần kiểm tra result.retcode để xử lý riêng trường hợp 10019 (TRADE_RETCODE_NO_MONEY).
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_NO_MONEY) // 10019
Print("Not enough money. Cần giảm khối lượng lệnh hoặc nạp thêm tiền.");
else
PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}
Nếu dùng CTrade, có thể kiểm tra trade.ResultRetcode() có bằng 10019 hay không, hoặc xem mô tả qua trade.ResultRetcodeDescription().
Dừng khẩn cấp theo mức ký quỹ (Margin Level)
Việc cài đặt cơ chế an toàn tự động dừng vào lệnh mới hoặc đóng toàn bộ lệnh khi mức ký quỹ giảm dưới một ngưỡng nhất định sẽ giúp ngăn cả tình trạng ERR_NO_MONEY liên tục lẫn nguy cơ cháy tài khoản.
double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // Mức ký quỹ (%)
if(level > 0 && level < EmergencyMarginLevel) // Ví dụ: 150%
{
// Dừng vào lệnh mới / đóng một phần lệnh đang giữ nếu cần
}
Các EA do FXEA365 phân phối đều tích hợp sẵn "tự động tính khối lượng theo % rủi ro", "kiểm tra ký quỹ trước khi đặt lệnh", và "dừng khẩn cấp theo mức ký quỹ (UseMarginEmergencyClose)" như tiêu chuẩn, nên có thể vận hành ổn định ngay cả với số vốn tối thiểu.
Bảng kiểm tra theo thứ tự ưu tiên
| Ưu tiên | Kiểm tra | Cách xử lý |
|---|---|---|
| 🚨 Trước tiên | Free Margin < Ký quỹ cần thiết? | Nạp thêm tiền / đóng một phần lệnh / giảm khối lượng |
| 🚨 Trước tiên | Khối lượng cố định có quá lớn so với số dư? | Hạ về 0,01 / chuyển sang tự động theo % rủi ro |
| ⚠️ Tiếp theo | Đòn bẩy tài khoản thấp hoặc bị giới hạn cuối tuần? | Chuyển tài khoản đòn bẩy cao / đóng lệnh cuối tuần / giảm khối lượng |
| ⚠️ Tiếp theo | Ký quỹ bị chiếm dụng bởi lệnh hiện có hoặc EA khác? | Sắp xếp lại các lệnh đang mở trên cùng tài khoản |
| ✅ Kiểm tra | Khác biệt kích thước hợp đồng Cent/Standard? | Điều chỉnh khối lượng phù hợp với loại tài khoản |
| 🛠 Phát triển | Đã chặn bằng OrderCalcMargin trước khi đặt lệnh? | Triển khai đoạn code nêu trên |
Tổng kết
- Trên MT5, không đủ tiền là 10019 (TRADE_RETCODE_NO_MONEY); 134 (ERR_NOT_ENOUGH_MONEY) là mã của MT4, còn
ERR_NO_MONEYlà cách gọi tắt cho cả hai. Trong cả hai trường hợp nguyên nhân đều là: ký quỹ cần > ký quỹ khả dụng. - Dù còn số dư, lỗi vẫn có thể xảy ra do khối lượng lệnh quá lớn, đòn bẩy thấp (kể cả giới hạn cuối tuần), ký quỹ bị chiếm dụng bởi lệnh hiện có, hoặc sai loại tài khoản.
- Người dùng EA nên phòng ngừa bằng "tự động tính khối lượng theo % rủi ro" và "chọn đúng loại tài khoản"; người phát triển EA nên xử lý triệt để bằng "cổng kiểm tra
OrderCalcMargintrước khi đặt lệnh", "chuẩn hóa khối lượng lệnh", và "xử lý riêng retcode 10019".
Tham khảo Hướng dẫn tổng hợp cách xử lý mã lỗi MQL5 / MT5 để biết đầy đủ các mã lỗi khác, và Danh sách EA để tìm EA miễn phí hoạt động ổn định với mức vốn hợp lý. Nếu bạn đang dùng EA của trang này và đổi cài đặt vẫn không khắc phục được, hãy liên hệ qua form hỗ trợ kèm ảnh chụp màn hình tình trạng ký quỹ tài khoản.
Câu hỏi thường gặp
Hỏi: Số dư vẫn còn đủ nhưng vẫn báo ERR_NO_MONEY. Vì sao?
Vì lỗi được xác định dựa trên ký quỹ khả dụng (Free Margin) chứ không phải số dư (Balance). Nếu Free Margin bị giảm do lỗ thả nổi hoặc bị lệnh hiện có chiếm dụng ký quỹ, thì dù còn số dư vẫn không thể vào lệnh mới. Hãy kiểm tra Free Margin trong tab "Trade".
Hỏi: 134 và 10019 khác nhau như thế nào?
10019 (TRADE_RETCODE_NO_MONEY) là mã trả về của máy chủ giao dịch MT5 nằm trong kết quả OrderSend(); 134 (ERR_NOT_ENOUGH_MONEY) là lỗi của MT4 do GetLastError() trả về. Chỉ khác nền tảng — nguyên nhân (không đủ tiền) là như nhau.
Hỏi: Backtest không báo lỗi nhưng tài khoản thật lại báo. Vì sao?
Do đòn bẩy, loại tài khoản (Cent/Standard), và các lệnh đang mở trên tài khoản thật khác với cài đặt khi test. Đặc biệt chênh lệch đòn bẩy và kích thước hợp đồng ảnh hưởng rất lớn.
Hỏi: EA nhồi lệnh/lưới (grid) càng sâu tầng càng dễ báo ERR_NO_MONEY?
Đây là dấu hiệu ngay trước khi xảy ra tình trạng bất thường. Số tầng càng tăng, tốc độ tiêu hao ký quỹ càng nhanh. Hãy giảm giới hạn số tầng, hệ số nhân khối lượng, chắc chắn bật tính năng đóng lệnh khẩn cấp như UseMarginEmergencyClose, và chỉ giao dịch với số vốn có thể chấp nhận mất.
Hỏi: Có thể tự động tránh lỗi này bằng code trong EA không?
Có thể. Trước khi đặt lệnh, hãy dùng OrderCalcMargin() để tính ký quỹ cần thiết, và nếu vượt quá AccountInfoDouble(ACCOUNT_MARGIN_FREE) thì không vào lệnh (hoặc giảm khối lượng). Tham khảo đoạn code mẫu trong bài viết.
Hỏi: Nên bắt đầu với số vốn tối thiểu bao nhiêu để không gặp rủi ro?
Tiêu chuẩn hợp lý là tài khoản Standard 100.000 yên (≈$670) với khối lượng tối thiểu 0,01 lot. Nếu muốn bắt đầu với vốn ít hơn hoặc giao dịch an toàn hơn, hãy dùng tài khoản Cent (Micro) — khối lượng tối thiểu sẽ có exposure thực tế nhỏ hơn, giúp tránh ERR_NO_MONEY dễ dàng hơn.
Liên quan
📧 Khóa học email miễn phí (8 email) + gói 13 chỉ báo MT5 dành riêng cho người đăng ký
* 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ạn có câu hỏi về EA hay Forex?
Bạn có thể đăng câu hỏi trên diễn đàn giao dịch Nattzy (đăng ký miễn phí). Không nhất thiết liên quan đến bài viết này — cài đặt EA, chọn sàn môi giới, v.v. đều được.
Hỏi trên Nattzy ↗