MT5 «Not enough money» (10019/134): 6 причин и решения
Содержание
Полное решение ошибки ERR_NO_MONEY (MT5/MQL5)
Когда во время работы советника на вкладке Experts или в журнале появляется ERR_NO_MONEY или not enough money, легко запаниковать: «неужели уже не хватает средств?». Но на самом деле эта ошибка может возникать даже при достаточном балансе. Причина не только в «нулевых средствах» — их несколько: расчёт лота, кредитное плечо, блокировка маржи существующими позициями и другие.
Эта статья — исчерпывающее руководство как для трейдеров, использующих советники в MT5, так и для разработчиков EA на MQL5. Мы разберём суть ошибки ERR_NO_MONEY, 6 причин, быстрые решения, нюансы у разных брокеров и постоянную защиту на уровне кода. Полный список кодов ошибок смотрите в сводном руководстве по кодам ошибок MQL5 / MT5.
Статья актуальна для MT5 (билды серии 4xxx) по состоянию на июнь 2026 года. Значения и названия экранов могут немного отличаться в зависимости от брокера и билда.
Быстрая диагностика за 30 секунд
Откройте вкладку «Панель инструментов → Торговля» в MT5 и проверьте три показателя:
Баланс (Balance) : денежные средства на счёте
Средства (Equity) : баланс ± плавающая прибыль/убыток
Свободная маржа (Free Margin): маржа, доступная для новой позиции сейчас ← ключевой параметр
Уровень маржи (Margin Level %): Equity / Margin × 100
- Если свободная маржа (Free Margin) меньше требуемой маржи для новой позиции, ERR_NO_MONEY возникнет со 100% вероятностью.
- Если ошибка появляется при достаточном балансе, причина — одна из описанных ниже: «② слишком большой лот», «④ маржа заблокирована существующей позицией» или «⑥ несоответствие типа счёта».
Требуемую маржу для одной позиции можно посмотреть в MT5: «Котировки → правый клик по символу → Спецификация» (пункт «Маржа для 1 лота»). Приблизительная формула:
Требуемая маржа ≈ (Лот × Размер контракта × Цена) / Плечо
Сравнение рекомендованных брокеров →
🎁 Скачать бесплатный EA📧 Бесплатный email-курс (8 писем) + пакет из 13 индикаторов MT5 только для подписчиков
* Конфиденциальность строго защищена. Отписаться можно в любое время.
Что такое ERR_NO_MONEY (10019 в MT5, 134 в MT4)
ERR_NO_MONEY — распространённое сокращение, а не официальная константа: ни в справочнике MQL5, ни в справочнике MQL4 её нет. Официальное имя и номер зависят от платформы (MQL5: коды возврата торгового сервера, MQL4: коды ошибок).
① MT5: TRADE_RETCODE_NO_MONEY = 10019 (код возврата торгового сервера)
В MQL5 результат OrderSend() записывается в MqlTradeResult.retcode. Если сервер отклоняет ордер из-за нехватки средств, код равен 10019 (TRADE_RETCODE_NO_MONEY). Это уведомление об отказе от сервера брокера. OrderCheck() проверяет достаточность средств до отправки и записывает результат в MqlTradeCheckResult.retcode.
Значение: недостаточно средств для исполнения ордера (There is not enough money to complete the request)
Константа: TRADE_RETCODE_NO_MONEY
Значение : 10019
// Типичный пример записи в журнале
2026.06.12 09:15:32.441 EA_NAME XAUUSD,H1: OrderSend error 10019
② MT4: ERR_NOT_ENOUGH_MONEY = 134 (GetLastError() в MQL4)
134 — это номер из MT4 (MQL4). В списке ошибок времени выполнения MQL5, которые возвращает GetLastError(), нет ни 134, ни какого-либо кода нехватки средств; в MT5 нужно смотреть retcode.
Значение: недостаточно средств для торговой операции (not enough money)
Константа: ERR_NOT_ENOUGH_MONEY
Значение : 134 (MT4)
Как различать на практике:
| Источник | Значение | Когда возникает |
|---|---|---|
MqlTradeResult.retcode (MT5) | 10019 (TRADE_RETCODE_NO_MONEY) | OrderSend отклонён сервером |
CTrade.ResultRetcode() (MT5) | 10019 | Отказ при отправке ордера через CTrade |
GetLastError() (MT4) | 134 (ERR_NOT_ENOUGH_MONEY) | OrderSend (MT4 / MQL4) |
Если в журнале «10019» или not enough money, ордер отклонил торговый сервер MT5; «134» приходит от терминала или советника MT4. Корневая причина одна и та же (требуемая маржа > доступная маржа), поэтому и способы решения общие.
Причины и решения (6 сценариев)
① Действительно не хватает средств
Симптом: плавающий убыток вырос, свободная маржа опустилась ниже требуемой для новой позиции. Часто бывает после серии убытков или на глубоких шагах усреднения.
Решение:
- Пополнить счёт, или
- Вручную закрыть часть открытых позиций, чтобы освободить маржу
- Снизить
RiskPercentв настройках советника, чтобы уменьшить размер последующих лотов
Если такая ошибка повторяется регулярно, значит лот изначально слишком велик относительно капитала. Переходим к пункту ②.
② Лот слишком большой (относительно баланса)
Симптом: баланс есть, но ERR_NO_MONEY возникает уже на первой же попытке открыть ордер. Часто встречается при использовании фиксированного лота.
Причина: FixedLot не соответствует балансу счёта и кредитному плечу. Например, на счёте со 100 000 иен (≈$670) при попытке открыть XAUUSD объёмом 0.1 лота требуемая маржа может превысить баланс — в зависимости от плеча.
Решение:
- Попробовать снизить фиксированный лот до минимального (0.01) и посмотреть, откроется ли позиция
- Переключиться на автоматический расчёт по риску в % (
UseFixedLot=false/RiskPercent) - Если даже 0.01 не открывается, значит проблема в плече счёта или капитале → переходите к пунктам ③ и ⑥
Ориентир: разумной базовой конфигурацией считается счёт со 100 000 иен (≈$670) на стандартном типе счёта, старт с минимального лота 0.01. Если капитал меньше или вы хотите торговать ещё более безопасно малыми объёмами, рассмотрите центовый (микро) счёт — см. ниже.
③ Низкое кредитное плечо / ограничение на выходные или перед событиями
Симптом: тот же советник с тем же лотом открывает позицию на другом счёте, но на этом — выдаёт ERR_NO_MONEY. Либо ошибки концентрируются с вечера пятницы до утра понедельника.
Причина: если у счёта низкое кредитное плечо (например, 1:30 на регулируемом счёте ЕС против 1:1000 на офшорном счёте), требуемая маржа может отличаться в десятки раз. Кроме того, некоторые брокеры снижают плечо на выходные и перед важными новостями (например, XM ограничивает плечо до 200:1 на выходные), из-за чего требуемая маржа внезапно возрастает во время удержания позиции. Для золота и криптовалют лимит плеча иногда задаётся отдельно по каждому символу.
Решение:
- Проверить кредитное плечо счёта (в личном кабинете брокера или в информации о счёте MT5)
- Проверить «ставку маржи» в спецификации символа (по некоторым инструментам она может быть ниже)
- Использовать настройку закрытия позиций перед выходными (
CloseAllBeforeWeekend=trueи т.п.) или выбрать брокера без ограничения плеча на выходные - Перейти на счёт с более высоким плечом или снизить размер лота
④ Маржа заблокирована существующими позициями
Симптом: первая позиция открылась, но при попытке открыть вторую или добавить объём (усреднение) появляется ERR_NO_MONEY.
Причина: уже открытые позиции блокируют часть маржи, из-за чего свободной маржи не хватает на новую позицию. Часто возникает при работе с несколькими парами или несколькими советниками на одном счёте.
Решение:
- Проверить использованную маржу (Margin) и свободную маржу (Free Margin) на вкладке «Торговля»
- Убедиться, что советники не конкурируют за маржу на одном счёте (при использовании нескольких EA)
- Ограничить максимальное число одновременных позиций через параметры советника
- У советников на усреднение/сетку маржа расходуется тем быстрее, чем больше шагов — стоит пересмотреть лимит шагов, множитель лота и настройки аварийного закрытия
⑤ Бонус/кредитные средства учитываются в марже не полностью
Симптом: по сумме «баланс + бонус» средств должно хватать, но всё равно возникает ERR_NO_MONEY.
Причина: у некоторых брокеров кредитные (бонусные) средства не учитываются или учитываются лишь частично при расчёте маржи. Отображаемый баланс и маржа, которую фактически использует сервер, расходятся.
Решение: проверить в условиях бонусной программы брокера, включается ли кредит в расчёт маржи. Если нет — снизить лот так, чтобы требуемой маржи хватало только за счёт реально внесённых средств.
⑥ Разный размер контракта у типов счетов (стандартный против центового/микро)
Симптом: один и тот же лот «0.01», но при смене счёта внезапно появляется ERR_NO_MONEY — либо, наоборот, объём оказывается избыточным.
Причина: на центовом (микро) счёте и стандартном счёте размер контракта отличается примерно в 100 раз. 0.01 лота на центовом счёте по реальной экспозиции соответствует примерно 1/100 от того же значения на стандартном. Если советник использует фиксированный лот без учёта типа счёта, на одном из них может не хватать маржи.
Решение:
- Для небольшого капитала и безопасной торговли использовать центовый/микро счёт, чтобы даже минимальный лот не создавал избыточный риск
- Проектировать советника так, чтобы он не был жёстко завязан на тип счёта, а определял реальную требуемую маржу через
OrderCalcMargin()и на основе этого рассчитывал лот (см. следующий раздел)
Особенности разных брокеров
| Брокер | Особенности | Частота ERR_NO_MONEY |
|---|---|---|
| XM | Ограничение плеча на выходные, Stop Out 20% | Средняя (выше на выходных) |
| Exness | Есть счета с неограниченным плечом, Stop Out 0% | Низкая |
| HFM / FXGT и др. | Есть счета с высоким плечом | Низкая |
Счета с неограниченным плечом у Exness (Pro/Raw Spread) часто позволяют открывать новые ордера даже при почти нулевой свободной марже, поэтому данная ошибка возникает реже. Это хорошо сочетается с советниками на усреднение, но есть и обратная сторона: стоп-аут срабатывает слабо, и убытки могут разрастись сильнее обычного — учитывайте это. Сравнение брокеров смотрите на странице сравнения брокеров.
Код на MQL5 для предотвращения этой ошибки (для разработчиков советников)
Правильный подход для советника — не «исправлять» ошибку постфактум, а не допускать ERR_NO_MONEY ещё до отправки ордера. Суть: рассчитать требуемую маржу перед отправкой ордера и, если средств не хватает, не открывать позицию или уменьшить лот.
Проверка требуемой маржи перед отправкой ордера
// Проверка перед отправкой: требуемая маржа <= свободная маржа, только после этого вызывать 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; // не открывать позицию = заранее избежать ERR_NO_MONEY
}
return true;
}
Нормализация лота по минимальному значению и шагу
Если отправить значение, рассчитанное по риску в %, без изменений, оно может не соответствовать минимальному лоту или шагу лота (несоблюдение нормализации — типичная причина отказа при отправке ордера). Вместо того чтобы отказываться от сделки, уменьшение до доступного объёма снижает упущенную выгоду.
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; // округление по шагу
lots = MathMax(minLot, MathMin(maxLot, lots)); // ограничение диапазоном мин.-макс.
return NormalizeDouble(lots, 2);
}
Обязательно проверяйте retcode после OrderSend
Смотрите не только на булево значение, возвращаемое OrderSend(), но и на result.retcode, отдельно обрабатывая код 10019 (TRADE_RETCODE_NO_MONEY).
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... заполнение req ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
if(res.retcode == TRADE_RETCODE_NO_MONEY) // 10019
Print("Not enough money. Нужно уменьшить лот или пополнить счёт.");
else
PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}
При использовании CTrade проверяйте trade.ResultRetcode() на значение 10019 либо смотрите trade.ResultRetcodeDescription().
Аварийная остановка по уровню маржи
Если добавить защитный механизм, который останавливает открытие новых позиций или закрывает все позиции при падении уровня маржи ниже определённого %, это предотвратит как повторяющиеся ERR_NO_MONEY, так и слив счёта.
double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // уровень маржи, %
if(level > 0 && level < EmergencyMarginLevel) // например, 150%
{
// остановить открытие новых позиций / при необходимости частично закрыть текущие
}
В советниках, которые распространяет FXEA365, по умолчанию реализованы автоматический расчёт лота по риску в %, проверка маржи перед отправкой ордера и аварийная остановка по уровню маржи (UseMarginEmergencyClose), поэтому их можно без проблем запускать даже с минимальным капиталом.
Чек-лист по приоритетам
| Приоритет | Проверка | Решение |
|---|---|---|
| 🚨 Первое | Свободная маржа < требуемой маржи? | Пополнение / частичное закрытие / уменьшение лота |
| 🚨 Первое | Фиксированный лот избыточен относительно баланса? | Снизить до 0.01 / перейти на риск в % |
| ⚠️ Далее | Низкое плечо счёта / ограничение на выходные? | Счёт с высоким плечом / закрытие на выходные / уменьшение лота |
| ⚠️ Далее | Маржа заблокирована существующими позициями или другими EA? | Упорядочить открытые позиции на счёте |
| ✅ Проверить | Разница в размере контракта между центовым и стандартным счётом | Подобрать лот под тип счёта |
| 🛠 Разработка | Защита через OrderCalcMargin перед отправкой ордера | Реализовать код, приведённый выше |
Итоги
- В MT5 нехватка средств — это 10019 (TRADE_RETCODE_NO_MONEY); 134 (ERR_NOT_ENOUGH_MONEY) — номер из MT4, а
ERR_NO_MONEY— сокращение, которым называют оба. В обоих случаях причина одна: требуемая маржа > доступная маржа. - Ошибка может возникать даже при достаточном балансе — из-за избыточного лота, низкого плеча (в том числе ограничений на выходные), блокировки маржи существующими позициями или несоответствия типа счёта.
- Трейдерам, использующим советники, стоит предотвращать ошибку через «автоматический расчёт лота по риску в %» и «подходящий тип счёта»; разработчикам советников — через «проверку
OrderCalcMarginперед отправкой ордера», «нормализацию лота» и «обработку retcode 10019».
Полный список кодов ошибок смотрите в сводном руководстве по кодам ошибок MQL5 / MT5, а бесплатные советники, которые работают при разумных настройках капитала — в списке советников. Если вы используете советник с нашего сайта и проблема не решается даже после изменения настроек, обратитесь через форму поддержки, приложив скриншот состояния маржи по счёту.
Часто задаваемые вопросы
В: Баланс достаточный, но появляется ERR_NO_MONEY. Почему?
Потому что оценка идёт не по балансу (Balance), а по свободной марже (Free Margin). Если свободная маржа уменьшилась из-за плавающего убытка или блокировки существующими позициями, открыть новую позицию нельзя даже при достаточном балансе. Проверьте значение Free Margin на вкладке «Торговля».
В: В чём разница между 134 и 10019?
10019 (TRADE_RETCODE_NO_MONEY) — код возврата торгового сервера MT5 в результате OrderSend(); 134 (ERR_NOT_ENOUGH_MONEY) — ошибка MT4, которую возвращает GetLastError(). Отличается только платформа — причина (нехватка средств) одна и та же.
В: На тестере стратегий ошибка не появляется, а на реальном счёте — появляется.
Это связано с тем, что на реальном счёте отличаются плечо, тип счёта (центовый/стандартный) и уже открытые позиции по сравнению с настройками теста. Особенно сильно влияют разница в плече и в размере контракта.
В: На советниках с усреднением/сеткой при увеличении числа шагов появляется ERR_NO_MONEY.
Это предвестник закономерного исхода. Чем больше шагов, тем быстрее расходуется маржа. Снизьте лимит числа шагов и множитель лота, обязательно включите аварийное закрытие (например, UseMarginEmergencyClose) и торгуйте только теми средствами, потерю которых вы готовы принять.
В: Можно ли избежать этого автоматически на уровне кода советника?
Да. Перед отправкой ордера рассчитайте требуемую маржу через OrderCalcMargin() и добавьте проверку: если значение превышает AccountInfoDouble(ACCOUNT_MARGIN_FREE), не открывать позицию (или уменьшить лот). Пример кода приведён в статье выше.
В: С какой минимальной суммы можно начинать без риска?
Разумный ориентир — счёт со 100 000 иен (≈$670) на стандартном типе счёта, старт с минимального лота 0.01. Если сумма меньше или вы хотите торговать ещё безопаснее, используйте центовый (микро) счёт — тогда даже минимальный лот будет давать меньшую реальную экспозицию, что снижает риск ERR_NO_MONEY.
По теме
📧 Бесплатный email-курс (8 писем) + пакет из 13 индикаторов MT5 только для подписчиков
* Конфиденциальность строго защищена. Отписаться можно в любое время.
Есть вопрос о советниках или Forex?
Задайте его на трейдерском форуме Nattzy (бесплатная регистрация). Можно спрашивать не только по этой статье — о настройке советников, выборе брокера и многом другом.
Спросить на Nattzy ↗