Главная > Блог > Unsupported filling mode (MT5, код 10030)

MT5MQL5ОшибкиРешение проблемEA

Unsupported filling mode (MT5, код 10030)

Опубликовано: 2026-07-07Время чтения: ~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. Что такое 10030 (TRADE_RETCODE_INVALID_FILL)
  2. Четыре режима исполнения (type_filling)
  3. Почему режим оказывается «недопустимым» — SYMBOL_FILLING_MODE
  4. Почему ошибка появляется именно «в день смены брокера»
  5. Связь с режимом исполнения символа (SYMBOL_TRADE_EXEMODE)
  6. Диагностика за 30 секунд
  7. ① Проверьте разрешённые режимы для символа (в терминале MT5)
  8. ② Проверьте входные параметры советника
  9. ③ Проверка через код (для разработчиков)
  10. Постоянное решение — код на MQL5 с автоматическим выбором по флагам
  11. Функция автоматического определения
  12. Использование в OrderSend
  13. Если используется CTrade
  14. О лимитных заявках с BOC
  15. На что обратить внимание у брокера (повторная проверка при переходе)
  16. Чек-лист по приоритету
  17. Итоги
  18. Часто задаваемые вопросы
  19. Вопрос: Советник, который работал ещё вчера, после смены брокера перестал открывать сделки и выдаёт 10030. Это поломка советника?
  20. Вопрос: Что лучше использовать — FOK или IOC?
  21. Вопрос: На тестере ошибки нет, а на реальном счёте появляется 10030.
  22. Вопрос: У одного и того же брокера по одним символам 10030 возникает, а по другим — нет.
  23. Вопрос: Нет возможности изменить код советника (есть только файл .ex5). Что делать?

Полное решение ошибки Unsupported filling mode (MT5, код 10030)

Советник, который ещё вчера прекрасно работал у одного брокера, после переноса на новый счёт вдруг начинает сыпать в журнале Эксперты сообщениями Unsupported filling mode или OrderSend error 10030, и ни одна сделка не открывается. Это одна из самых типичных проблем при смене брокера в MT5. Советник не сломан, и со счётом всё в порядке. Причина в том, что указанный в заявке «режим исполнения» (filling mode) не разрешён для данного символа у нового брокера, и только в этом.

Эта статья — исчерпывающий разбор для тех, кто торгует на MT5 с помощью советников, и для тех, кто пишет советников на MQL5: что такое TRADE_RETCODE_INVALID_FILL (10030), в чём смысл FOK/IOC/RETURN, как проверить настройки за 30 секунд и как раз и навсегда исправить это на уровне кода. Полный список кодов ошибок см. в сводном руководстве по кодам ошибок MQL5 / MT5.

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


Что такое 10030 (TRADE_RETCODE_INVALID_FILL)

Результат вызова OrderSend() записывается в поле MqlTradeResult.retcode. Значение 10030 = TRADE_RETCODE_INVALID_FILL — это отказ сервера, означающий, что «указанный в заявке type_filling (режим исполнения) не разрешён для этого символа».

Значение : указанный тип исполнения (filling type) не поддерживается
Константа: TRADE_RETCODE_INVALID_FILL
Код      : 10030
Текст    : Unsupported filling mode / Invalid order filling type
// Типичный вывод в журнале
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]

Главное — средства на счёте, лот и цена тут абсолютно ни при чём. Ошибка 10030 касается только одного поля заявки — MqlTradeRequest.type_filling. Исправьте его, и та же самая заявка пройдёт без изменений.

Четыре режима исполнения (type_filling)

В ENUM_ORDER_TYPE_FILLING в MQL5 определено четыре значения.

КонстантаНазваниеЗначение
ORDER_FILLING_FOKFill or KillИсполнение только при возможности заполнить весь объём. Если для заявки на 1 лот есть ликвидность лишь на 0.7 лота, вся заявка отменяется
ORDER_FILLING_IOCImmediate or CancelНемедленное исполнение доступного объёма, остаток отменяется. Из заявки на 1 лот может исполниться только 0.7, а 0.3 будет отменено
ORDER_FILLING_RETURNReturnИсполняется доступный объём, а остаток выставляется в стакан как заявка (ожидает доисполнения). Используется при биржевом исполнении
ORDER_FILLING_BOCBook or CancelЗаявка принимается, только если встаёт в стакан пассивно (ожиданием); если цена приведёт к немедленному исполнению — отклоняется. Только для лимитных/стоп-лимитных заявок (добавлен в более новых сборках)

В обычных советниках для рынка Форекс на практике почти всегда используются только FOK или IOC. RETURN актуален при биржевом исполнении (акции, фьючерсы), а BOC — узкоспециализированный режим для принудительно пассивных (maker) заявок.

Почему режим оказывается «недопустимым» — SYMBOL_FILLING_MODE

Какие режимы исполнения принимаются, определяется флагом, который брокер задаёт индивидуально для каждого символаSYMBOL_FILLING_MODE. В MQL5 его можно прочитать так:

long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
// Если установлен флаг SYMBOL_FILLING_FOK — доступен FOK
// Если установлен флаг SYMBOL_FILLING_IOC — доступен IOC

SYMBOL_FILLING_MODE — это битовые флаги, отражающие разрешённость FOK и IOC (если разрешены оба, установлены оба флага). RETURN в эти флаги не входит — его доступность определяется режимом исполнения символа (см. ниже).

Иными словами, схема возникновения 10030 предельно проста:

type_filling, отправленный советником ∉ режимы, разрешённые для данного символа → 10030

Вот и всё.


Почему ошибка появляется именно «в день смены брокера»

Причина, по которой 10030 называют классической ошибкой при переходе к новому брокеру, такова:

  1. Разрешённые режимы исполнения различаются у каждого брокера и для каждого символа. Один брокер разрешает для форекс-символов только FOK, другой — только IOC, третий — оба варианта. Даже у одного и того же брокера настройки для Форекс и для CFD/акций часто отличаются.
  2. Многие советники «зашивают» type_filling прямо в код. Например, советник со строкой request.type_filling = ORDER_FILLING_FOK; может годами исправно работать у брокера A, где разрешён FOK. Поскольку у автора всё работает, это не воспринимается как баг и распространяется в таком виде.
  3. Если у нового брокера B FOK не разрешён, ни одна заявка не пройдёт с самого начала. На тестере это часто не проявляется (поведение тестера мягче реального сервера), поэтому проблема вылезает именно «в день переноса на реальный счёт».

То есть 10030 — это, скорее, проявление жёстко зашитого предположения об окружении, а не баг советника как таковой. И, соответственно, если переписать код так, чтобы он читал флаги разрешённых режимов и выбирал их динамически, советник станет работать у любого брокера (код приведён ниже).

Связь с режимом исполнения символа (SYMBOL_TRADE_EXEMODE)

Помимо режима заполнения, у символа есть ещё и режим исполнения, который влияет на то, какие режимы заполнения вообще имеют смысл.

Режим исполненияКонстантаТипичный случайОбычные режимы заполнения
InstantSYMBOL_TRADE_EXECUTION_INSTANTЧасть Форекс-брокеров (чаще DD)Исполнение по указанной цене. Мир FOK/IOC + реквоты
MarketSYMBOL_TRADE_EXECUTION_MARKETБольшинство Форекс/CFD (NDD)Рыночное исполнение. FOK или IOC (зависит от настроек брокера)
ExchangeSYMBOL_TRADE_EXECUTION_EXCHANGEАкции, фьючерсыИсполнение через стакан заявок. Обычно RETURN
RequestSYMBOL_TRADE_EXECUTION_REQUESTУстаревший режимИсполнение по запросу (сейчас встречается редко)

Точные допустимые комбинации зависят от настроек сервера брокера, но на практике достаточно помнить: «для рыночного исполнения Форекс/CFD — FOK или IOC, для биржевого — как правило RETURN». Режим исполнения также можно проверить через SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE).


Диагностика за 30 секунд

① Проверьте разрешённые режимы для символа (в терминале MT5)

Откройте Обзор рынка → правой кнопкой по символу → Спецификация (Specification) и найдите строку «Исполнение» (Filling). Там будет указано Fill or Kill / Immediate or Cancel либо оба варианта. Если советник отправляет режим, которого здесь нет — это гарантированно 10030.

② Проверьте входные параметры советника

У хорошо написанных советников обычно есть параметр вроде FillingType / Filling Mode. Если он есть, достаточно выставить значение, соответствующее разрешённому режиму из пункта ①, — правка кода не потребуется.

③ Проверка через код (для разработчиков)

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));

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


Постоянное решение — код на MQL5 с автоматическим выбором по флагам

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

Функция автоматического определения

// Возвращает режим исполнения, реально разрешённый для данного символа
// Приоритет: FOK → IOC → RETURN (запасной вариант для биржевого исполнения)
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;    // Исполнение только при заполнении всего объёма (без частичного)

   if((flags & SYMBOL_FILLING_IOC) != 0)
      return ORDER_FILLING_IOC;    // Исполнение доступного объёма, остаток отменяется

   return ORDER_FILLING_RETURN;    // Флаги не установлены — вероятно, биржевой тип. Отправляем RETURN
}

Использование в 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);   // ← не задаём жёстко

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);
}

Теперь один и тот же бинарный файл советника будет работать и у брокера, где разрешён только FOK, и там, где разрешён только IOC. Ручная подгонка при каждом переходе больше не нужна.

Если используется CTrade

В стандартной библиотеке класс CTrade предоставляет метод SetTypeFillingBySymbol(), который автоматически устанавливает режим исполнения на основе флагов символа.

#include <Trade/Trade.mqh>
CTrade trade;

int OnInit()
{
   trade.SetExpertMagicNumber(MagicNumber);
   trade.SetTypeFillingBySymbol(_Symbol);   // Читает флаги и настраивает автоматически
   return INIT_SUCCEEDED;
}

Если 10030 возникает из-за старого подхода вида trade.SetTypeFilling(ORDER_FILLING_FOK); (жёстко заданное значение), достаточно заменить эту строку на приведённую выше — и проблема решена. Если нужно задать режим вручную, можно передать результат уже знакомой функции GetFillingMode() в SetTypeFilling() — эффект будет тот же.

О лимитных заявках с BOC

ORDER_FILLING_BOC (Book or Cancel) предназначен только для лимитных и стоп-лимитных заявок: если указанная цена приведёт к немедленному исполнению, заявка отклоняется. Указывать его для рыночных заявок неверно, поэтому в советниках, работающих по рынку, включать BOC в список вариантов не нужно.


На что обратить внимание у брокера (повторная проверка при переходе)

  • Настройки разрешённых режимов исполнения различаются не только между брокерами, но и между разными группами символов у одного и того же брокера. Вполне обычна ситуация, когда Форекс допускает IOC, а CFD на акции — только RETURN.
  • Настройки могут измениться и при смене типа счёта или сервера. Внезапное появление 10030 возможно не только при переходе к новому брокеру, но и после переноса на другой сервер, смены типа счёта или пересмотра спецификации символа у того же брокера.
  • Поэтому в качестве рабочего правила стоит взять за привычку: «при любом изменении счёта, сервера или символа заново проверять режим исполнения через окно спецификации (или скриптом)». У советника со встроенной автоматической проверкой эта необходимость отпадает сама собой.

Информация вида «у конкретного брокера для такого-то символа разрешён только FOK» быстро устаревает из-за изменений настроек сервера, поэтому в этой статье она не приводится. Всегда проверяйте спецификацию символа непосредственно на своём счёте.


Чек-лист по приоритету

ПриоритетПроверкаДействие
🚨 В первую очередьСовпадает ли поле «Исполнение» в спецификации символа с тем, что задаёт советникПривести в соответствие с разрешённым режимом
🚨 В первую очередьЕсть ли у советника входной параметр FillingTypeРешается изменением параметра, без правки кода
⚠️ ДалееНе «зашит» ли type_filling жёстко в код советникаЗаменить на GetFillingMode() / SetTypeFillingBySymbol()
⚠️ ДалееБыл ли переход к другому брокеру, смена сервера или типа счётаПосле любого изменения обязательно перепроверять спецификацию
✅ ПроверитьРазличие режимов исполнения (Instant/Market/Exchange)Для биржевых инструментов по умолчанию действует RETURN
🛠 Для разработчиковОбрабатывается ли 10030 отдельно по коду retcodeВыводить в журнал отправленный режим и разрешённые флаги

Итоги

  • Unsupported filling mode (10030 / TRADE_RETCODE_INVALID_FILL) — это отказ сервера, возникающий, когда type_filling заявки (FOK / IOC / RETURN / BOC) не разрешён для данного символа. Средства на счёте и объём лота тут ни при чём.
  • Разрешённые режимы различаются в зависимости от брокера и символа, поэтому советники с жёстко заданным type_filling массово выдают 10030 в день перехода к новому брокеру — это классический сценарий данной ошибки.
  • Пользователю достаточно свериться с полем «Исполнение» в спецификации символа и поправить входной параметр советника. Разработчикам стоит читать флаги через SymbolInfoInteger(SYMBOL_FILLING_MODE) и выбирать режим автоматически (либо использовать CTrade::SetTypeFillingBySymbol()) — это даёт окончательное решение проблемы.

Полный список кодов ошибок см. в сводном руководстве по кодам ошибок MQL5 / MT5. Советники, которые распространяет FXEA365, используют автоматическое определение режима исполнения и работают независимо от брокера (список советников).


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

Вопрос: Советник, который работал ещё вчера, после смены брокера перестал открывать сделки и выдаёт 10030. Это поломка советника?

Нет, это не поломка. Просто режим исполнения, заданный в советнике (например, FOK), не разрешён для этого символа у нового брокера. Проверьте поле «Исполнение» в спецификации символа, приведите в соответствие входной параметр советника (например, FillingType) или переделайте код на автоматическое определение — и советник снова заработает как прежде.

Вопрос: Что лучше использовать — FOK или IOC?

Если символ допускает оба варианта, разница проявляется только при нехватке ликвидности. FOK отменяет всю заявку, если невозможно заполнить весь объём (позиция не окажется «недоисполненной»), а IOC исполняет столько, сколько удалось (возможно частичное исполнение). При типичных объёмах лота у розничного трейдера на Форекс нехватка ликвидности сама по себе — редкость, так что на практике разница невелика. Приоритет FOK, как в примере автоматического определения, вполне оправдан.

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

Обработка исполнения в тестере стратегий не полностью повторяет настройки реального сервера, поэтому несоответствие type_filling может не проявляться при тестировании. При первом запуске на реальном или демо-счёте обязательно сверьтесь с полем «Исполнение» в спецификации символа.

Вопрос: У одного и того же брокера по одним символам 10030 возникает, а по другим — нет.

Это нормальное (ожидаемое) поведение. Разрешённые режимы исполнения настраиваются индивидуально для каждого символа, поэтому, например, валютные пары Форекс могут допускать IOC, а CFD на акции — только RETURN, в зависимости от группы инструментов. Для мультисимвольных советников обязательно нужно считывать SYMBOL_FILLING_MODE отдельно для каждого символа.

Вопрос: Нет возможности изменить код советника (есть только файл .ex5). Что делать?

В первую очередь проверьте, есть ли среди входных параметров советника что-то связанное с FillingType. Если такого параметра нет, значит, этот советник не подходит для использования с данным символом у текущего брокера. В этом случае нужно обратиться к автору за доработкой либо использовать советника у брокера / с типом счёта, где разрешён тот режим исполнения, на который он рассчитан изначально.

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

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

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

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