Главная > Блог > MT5 «Not enough money» (134/10019): 7 причин и решения

MT5MQL5ОшибкиРешение проблемСоветникМаржа

MT5 «Not enough money» (134/10019): 7 причин и решения

Опубликовано: 2026-06-12Время чтения: ~6 мин
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

Содержание

  1. Что такое ERR_NO_MONEY (в чём разница между 134 и 10019)
  2. ① ERR_NO_MONEY = 134 (ошибка выполнения из `GetLastError()`)
  3. ② TRADE_RETCODE_NO_MONEY = 10019 (код возврата `OrderSend()`)
  4. Быстрая диагностика за 30 секунд
  5. Причины и решения (6 сценариев)
  6. ① Действительно не хватает средств
  7. ② Лот слишком большой (относительно баланса)
  8. ③ Низкое кредитное плечо / ограничение на выходные или перед событиями
  9. ④ Маржа заблокирована существующими позициями
  10. ⑤ Бонус/кредитные средства учитываются в марже не полностью
  11. ⑥ Разный размер контракта у типов счетов (стандартный против центового/микро)
  12. Особенности разных брокеров
  13. Код на MQL5 для предотвращения этой ошибки (для разработчиков советников)
  14. Проверка требуемой маржи перед отправкой ордера
  15. Нормализация лота по минимальному значению и шагу
  16. Обязательно проверяйте retcode после OrderSend
  17. Аварийная остановка по уровню маржи
  18. Чек-лист по приоритетам
  19. Итоги
  20. Часто задаваемые вопросы
  21. В: Баланс достаточный, но появляется ERR_NO_MONEY. Почему?
  22. В: В чём разница между 134 и 10019?
  23. В: На тестере стратегий ошибка не появляется, а на реальном счёте — появляется.
  24. В: На советниках с усреднением/сеткой при увеличении числа шагов появляется ERR_NO_MONEY.
  25. В: Можно ли избежать этого автоматически на уровне кода советника?
  26. В: С какой минимальной суммы можно начинать без риска?

Полное решение ошибки ERR_NO_MONEY (MT5/MQL5)

Когда во время работы советника на вкладке Experts или в журнале появляется ERR_NO_MONEY или not enough money, легко запаниковать: «неужели уже не хватает средств?». Но на самом деле эта ошибка может возникать даже при достаточном балансе. Причина не только в «нулевых средствах» — их несколько: расчёт лота, кредитное плечо, блокировка маржи существующими позициями и другие.

Эта статья — исчерпывающее руководство как для трейдеров, использующих советники в MT5, так и для разработчиков EA на MQL5. Мы разберём суть ошибки ERR_NO_MONEY, 6 причин, быстрые решения, нюансы у разных брокеров и постоянную защиту на уровне кода. Полный список кодов ошибок смотрите в сводном руководстве по кодам ошибок MQL5 / MT5.

Статья актуальна для MT5 (билды серии 4xxx) по состоянию на июнь 2026 года. Значения и названия экранов могут немного отличаться в зависимости от брокера и билда.


Что такое ERR_NO_MONEY (в чём разница между 134 и 10019)

В MQL5 значение, обозначающее «нехватку средств», бывает двух видов — в зависимости от того, откуда оно получено. Если их перепутать, поиск причины затянется.

① ERR_NO_MONEY = 134 (ошибка выполнения из GetLastError())

Это код ошибки выполнения, который возвращает GetLastError(). Значение 134 устанавливается, когда функции расчёта, такие как OrderCalcMargin() или OrderCalcProfit(), либо код в старом стиле определяют, что «требуемая маржа превышает свободную маржу».

Значение: недостаточно средств для торговой операции (not enough money)
Константа: ERR_NO_MONEY
Значение : 134

② TRADE_RETCODE_NO_MONEY = 10019 (код возврата OrderSend())

Результат реальной отправки ордера через OrderSend() в MQL5 записывается в MqlTradeResult.retcode. Если сервер отклоняет ордер из-за нехватки средств, это не 134, а 10019 (TRADE_RETCODE_NO_MONEY). Это не ошибка самого MT5, а уведомление об отказе от торгового сервера брокера.

Значение: недостаточно средств для исполнения ордера (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

Как различать на практике:

ИсточникЗначениеКогда возникает
GetLastError()134 (ERR_NO_MONEY)Расчёты вроде OrderCalcMargin, внутренние проверки
MqlTradeResult.retcode10019 (TRADE_RETCODE_NO_MONEY)OrderSend отклонён сервером
CTrade.ResultRetcode()10019Отказ при отправке ордера через CTrade

Если в журнале «134» — проблема на этапе расчёта/внутренней проверки, если «10019» или not enough money на вкладке Experts — на этапе отказа сервера. В обоих случаях первопричина одна и та же (требуемая маржа > доступная маржа), поэтому и решение общее.


Быстрая диагностика за 30 секунд

Откройте вкладку «Панель инструментов → Торговля» в MT5 и проверьте три показателя:

Баланс (Balance)             : денежные средства на счёте
Средства (Equity)            : баланс ± плавающая прибыль/убыток
Свободная маржа (Free Margin): маржа, доступная для новой позиции сейчас ← ключевой параметр
Уровень маржи (Margin Level %): Equity / Margin × 100
  • Если свободная маржа (Free Margin) меньше требуемой маржи для новой позиции, ERR_NO_MONEY возникнет со 100% вероятностью.
  • Если ошибка появляется при достаточном балансе, причина — одна из описанных ниже: «② слишком большой лот», «④ маржа заблокирована существующей позицией» или «⑥ несоответствие типа счёта».

Требуемую маржу для одной позиции можно посмотреть в MT5: «Котировки → правый клик по символу → Спецификация» (пункт «Маржа для 1 лота»). Приблизительная формула:

Требуемая маржа ≈ (Лот × Размер контракта × Цена) / Плечо

Причины и решения (6 сценариев)

① Действительно не хватает средств

Симптом: плавающий убыток вырос, свободная маржа опустилась ниже требуемой для новой позиции. Часто бывает после серии убытков или на глубоких шагах усреднения.

Решение:

  1. Пополнить счёт, или
  2. Вручную закрыть часть открытых позиций, чтобы освободить маржу
  3. Снизить RiskPercent в настройках советника, чтобы уменьшить размер последующих лотов

Если такая ошибка повторяется регулярно, значит лот изначально слишком велик относительно капитала. Переходим к пункту ②.


② Лот слишком большой (относительно баланса)

Симптом: баланс есть, но ERR_NO_MONEY возникает уже на первой же попытке открыть ордер. Часто встречается при использовании фиксированного лота.

Причина: FixedLot не соответствует балансу счёта и кредитному плечу. Например, на счёте со 100 000 иен (≈$670) при попытке открыть XAUUSD объёмом 0.1 лота требуемая маржа может превысить баланс — в зависимости от плеча.

Решение:

  1. Попробовать снизить фиксированный лот до минимального (0.01) и посмотреть, откроется ли позиция
  2. Переключиться на автоматический расчёт по риску в % (UseFixedLot=false / RiskPercent)
  3. Если даже 0.01 не открывается, значит проблема в плече счёта или капитале → переходите к пунктам ③ и ⑥

Ориентир: разумной базовой конфигурацией считается счёт со 100 000 иен (≈$670) на стандартном типе счёта, старт с минимального лота 0.01. Если капитал меньше или вы хотите торговать ещё более безопасно малыми объёмами, рассмотрите центовый (микро) счёт — см. ниже.


③ Низкое кредитное плечо / ограничение на выходные или перед событиями

Симптом: тот же советник с тем же лотом открывает позицию на другом счёте, но на этом — выдаёт ERR_NO_MONEY. Либо ошибки концентрируются с вечера пятницы до утра понедельника.

Причина: если у счёта низкое кредитное плечо (например, 1:30 на регулируемом счёте ЕС против 1:1000 на офшорном счёте), требуемая маржа может отличаться в десятки раз. Кроме того, некоторые брокеры снижают плечо на выходные и перед важными новостями (например, XM ограничивает плечо до 200:1 на выходные), из-за чего требуемая маржа внезапно возрастает во время удержания позиции. Для золота и криптовалют лимит плеча иногда задаётся отдельно по каждому символу.

Решение:

  1. Проверить кредитное плечо счёта (в личном кабинете брокера или в информации о счёте MT5)
  2. Проверить «ставку маржи» в спецификации символа (по некоторым инструментам она может быть ниже)
  3. Использовать настройку закрытия позиций перед выходными (CloseAllBeforeWeekend=true и т.п.) или выбрать брокера без ограничения плеча на выходные
  4. Перейти на счёт с более высоким плечом или снизить размер лота

④ Маржа заблокирована существующими позициями

Симптом: первая позиция открылась, но при попытке открыть вторую или добавить объём (усреднение) появляется ERR_NO_MONEY.

Причина: уже открытые позиции блокируют часть маржи, из-за чего свободной маржи не хватает на новую позицию. Часто возникает при работе с несколькими парами или несколькими советниками на одном счёте.

Решение:

  1. Проверить использованную маржу (Margin) и свободную маржу (Free Margin) на вкладке «Торговля»
  2. Убедиться, что советники не конкурируют за маржу на одном счёте (при использовании нескольких EA)
  3. Ограничить максимальное число одновременных позиций через параметры советника
  4. У советников на усреднение/сетку маржа расходуется тем быстрее, чем больше шагов — стоит пересмотреть лимит шагов, множитель лота и настройки аварийного закрытия

⑤ Бонус/кредитные средства учитываются в марже не полностью

Симптом: по сумме «баланс + бонус» средств должно хватать, но всё равно возникает ERR_NO_MONEY.

Причина: у некоторых брокеров кредитные (бонусные) средства не учитываются или учитываются лишь частично при расчёте маржи. Отображаемый баланс и маржа, которую фактически использует сервер, расходятся.

Решение: проверить в условиях бонусной программы брокера, включается ли кредит в расчёт маржи. Если нет — снизить лот так, чтобы требуемой маржи хватало только за счёт реально внесённых средств.


⑥ Разный размер контракта у типов счетов (стандартный против центового/микро)

Симптом: один и тот же лот «0.01», но при смене счёта внезапно появляется ERR_NO_MONEY — либо, наоборот, объём оказывается избыточным.

Причина: на центовом (микро) счёте и стандартном счёте размер контракта отличается примерно в 100 раз. 0.01 лота на центовом счёте по реальной экспозиции соответствует примерно 1/100 от того же значения на стандартном. Если советник использует фиксированный лот без учёта типа счёта, на одном из них может не хватать маржи.

Решение:

  1. Для небольшого капитала и безопасной торговли использовать центовый/микро счёт, чтобы даже минимальный лот не создавал избыточный риск
  2. Проектировать советника так, чтобы он не был жёстко завязан на тип счёта, а определял реальную требуемую маржу через 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()); // например, 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;   // не открывать позицию = заранее избежать 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 перед отправкой ордераРеализовать код, приведённый выше

Итоги

  • У ERR_NO_MONEY два «лица» — 134 (GetLastError) и 10019 (retcode OrderSend = TRADE_RETCODE_NO_MONEY), но первопричина одна: «требуемая маржа > доступная маржа».
  • Ошибка может возникать даже при достаточном балансе — из-за избыточного лота, низкого плеча (в том числе ограничений на выходные), блокировки маржи существующими позициями или несоответствия типа счёта.
  • Трейдерам, использующим советники, стоит предотвращать ошибку через «автоматический расчёт лота по риску в %» и «подходящий тип счёта»; разработчикам советников — через «проверку OrderCalcMargin перед отправкой ордера», «нормализацию лота» и «обработку retcode 10019».

Полный список кодов ошибок смотрите в сводном руководстве по кодам ошибок MQL5 / MT5, а бесплатные советники, которые работают при разумных настройках капитала — в списке советников. Если вы используете советник с нашего сайта и проблема не решается даже после изменения настроек, обратитесь через форму поддержки, приложив скриншот состояния маржи по счёту.


Часто задаваемые вопросы

В: Баланс достаточный, но появляется ERR_NO_MONEY. Почему?

Потому что оценка идёт не по балансу (Balance), а по свободной марже (Free Margin). Если свободная маржа уменьшилась из-за плавающего убытка или блокировки существующими позициями, открыть новую позицию нельзя даже при достаточном балансе. Проверьте значение Free Margin на вкладке «Торговля».

В: В чём разница между 134 и 10019?

134 (ERR_NO_MONEY) — это ошибка выполнения, которую возвращает GetLastError(), а 10019 (TRADE_RETCODE_NO_MONEY) — это результат (retcode) OrderSend(). Различается только место возникновения, а причина (нехватка средств) одна и та же.

В: На тестере стратегий ошибка не появляется, а на реальном счёте — появляется.

Это связано с тем, что на реальном счёте отличаются плечо, тип счёта (центовый/стандартный) и уже открытые позиции по сравнению с настройками теста. Особенно сильно влияют разница в плече и в размере контракта.

В: На советниках с усреднением/сеткой при увеличении числа шагов появляется ERR_NO_MONEY.

Это предвестник закономерного исхода. Чем больше шагов, тем быстрее расходуется маржа. Снизьте лимит числа шагов и множитель лота, обязательно включите аварийное закрытие (например, UseMarginEmergencyClose) и торгуйте только теми средствами, потерю которых вы готовы принять.

В: Можно ли избежать этого автоматически на уровне кода советника?

Да. Перед отправкой ордера рассчитайте требуемую маржу через OrderCalcMargin() и добавьте проверку: если значение превышает AccountInfoDouble(ACCOUNT_MARGIN_FREE), не открывать позицию (или уменьшить лот). Пример кода приведён в статье выше.

В: С какой минимальной суммы можно начинать без риска?

Разумный ориентир — счёт со 100 000 иен (≈$670) на стандартном типе счёта, старт с минимального лота 0.01. Если сумма меньше или вы хотите торговать ещё безопаснее, используйте центовый (микро) счёт — тогда даже минимальный лот будет давать меньшую реальную экспозицию, что снижает риск ERR_NO_MONEY.

📧 Оповещения до повышения цен + бесплатный 5-дневный email-курс

Все советники продаются по стартовой цене, которая растёт ступенями по мере продаж. Получайте уведомление перед каждым повышением, плюс ежедневное письмо об алготрейдинге, чтении бэктестов и выборе брокера.

* Конфиденциальность строго защищена. Отписаться можно в любое время.

Комментарии и вопросы