Lỗi MT5 Not enough money (134/10019): 7 nguyên nhân
Mục lục
- ERR_NO_MONEY là gì (khác biệt giữa 134 và 10019)
- ① ERR_NO_MONEY = 134 (lỗi runtime từ `GetLastError()`)
- ② TRADE_RETCODE_NO_MONEY = 10019 (retcode của `OrderSend()`)
- Kiểm tra nhanh trong 30 giây
- Nguyên nhân và cách xử lý (6 dạng)
- ① Thực sự thiếu ký quỹ
- ② Khối lượng lệnh quá lớn (so với số dư)
- ③ Đòn bẩy thấp / bị giới hạn vào cuối tuần hoặc trước sự kiện
- ④ Ký quỹ bị chiếm dụng bởi lệnh hiện có
- ⑤ Tính cả bonus/credit vào ký quỹ
- ⑥ Khác biệt kích thước hợp đồng theo loại tài khoản (Standard vs Cent/Micro)
- Lưu ý theo từng 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)
- Kiểm tra ký quỹ cần thiết trước khi đặt lệnh
- Chuẩn hóa khối lượng lệnh theo min lot và step
- Luôn kiểm tra retcode của OrderSend
- Dừng khẩn cấp theo mức ký quỹ (Margin Level)
- Bảng kiểm tra theo thứ tự ưu tiên
- Tổng kết
- 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?
- Hỏi: 134 và 10019 khác nhau như thế nào?
- Hỏi: Backtest không báo lỗi nhưng tài khoản thật lại báo. Vì sao?
- Hỏi: EA nhồi lệnh/lưới (grid) càng sâu tầng càng dễ báo ERR_NO_MONEY?
- Hỏi: Có thể tự động tránh lỗi này bằng code trong EA không?
- 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?
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.
ERR_NO_MONEY là gì (khác biệt giữa 134 và 10019)
Trong MQL5, giá trị biểu thị "thiếu vốn" có hai loại tùy vào nơi bạn lấy được nó. Nhầm lẫn điểm này sẽ khiến việc tìm nguyên nhân đi vòng vo.
① ERR_NO_MONEY = 134 (lỗi runtime từ GetLastError())
Đây là mã lỗi runtime do GetLastError() trả về. Giá trị 134 xuất hiện khi các hàm tính toán như OrderCalcMargin(), OrderCalcProfit(), hoặc code kiểu cũ xác định rằng "ký quỹ cần thiết vượt quá ký quỹ khả dụng".
Ý nghĩa: Thao tác giao dịch không đủ vốn cần thiết (not enough money)
Hằng số: ERR_NO_MONEY
Giá trị: 134
② TRADE_RETCODE_NO_MONEY = 10019 (retcode của OrderSend())
Khi thực sự gửi lệnh bằng OrderSend() trong MQL5, kết quả được lưu trong MqlTradeResult.retcode. Khi lệnh bị server từ chối vì "thiếu vốn", mã trả về không phải 134 mà là 10019 (TRADE_RETCODE_NO_MONEY). Đây không phải lỗi từ phía MT5 mà là thông báo từ chối từ server của sàn giao dịch.
Ý 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
Cách phân biệt trong thực tế:
| Nguồn lấy | Giá trị | Xuất hiện khi nào |
|---|---|---|
GetLastError() | 134 (ERR_NO_MONEY) | Tính toán bằng OrderCalcMargin, kiểm tra nội bộ |
MqlTradeResult.retcode | 10019 (TRADE_RETCODE_NO_MONEY) | OrderSend bị server từ chối |
CTrade.ResultRetcode() | 10019 | Lệnh bị từ chối qua CTrade |
Nếu log hiện "134" nghĩa là lỗi xảy ra ở bước tính toán/kiểm tra nội bộ; nếu là "10019" hoặc tab Expert hiện not enough money, đó là bước bị server từ chối. Nguyên nhân gốc rễ của cả hai đều giống nhau (ký quỹ cần thiết > ký quỹ khả dụng), nên cách xử lý cũng chung.
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
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()); // ví dụ: 134
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
ERR_NO_MONEYcó hai dạng: 134 (từ GetLastError) và 10019 (retcode của OrderSend = TRADE_RETCODE_NO_MONEY), nhưng bản chất đều giống nhau: "ký quỹ cần thiết > 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?
134 (ERR_NO_MONEY) là lỗi runtime do GetLastError() trả về, còn 10019 (TRADE_RETCODE_NO_MONEY) là kết quả (retcode) của OrderSend(). Chỉ khác nhau ở nơi xuất hiện, còn nguyên nhân (thiếu vố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
📧 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.