Unsupported filling mode (MT5, код 10030)
Содержание
- Что такое 10030 (TRADE_RETCODE_INVALID_FILL)
- Четыре режима исполнения (type_filling)
- Почему режим оказывается «недопустимым» — SYMBOL_FILLING_MODE
- Почему ошибка появляется именно «в день смены брокера»
- Связь с режимом исполнения символа (SYMBOL_TRADE_EXEMODE)
- Диагностика за 30 секунд
- ① Проверьте разрешённые режимы для символа (в терминале MT5)
- ② Проверьте входные параметры советника
- ③ Проверка через код (для разработчиков)
- Постоянное решение — код на MQL5 с автоматическим выбором по флагам
- Функция автоматического определения
- Использование в OrderSend
- Если используется CTrade
- О лимитных заявках с BOC
- На что обратить внимание у брокера (повторная проверка при переходе)
- Чек-лист по приоритету
- Итоги
- Часто задаваемые вопросы
- Вопрос: Советник, который работал ещё вчера, после смены брокера перестал открывать сделки и выдаёт 10030. Это поломка советника?
- Вопрос: Что лучше использовать — FOK или IOC?
- Вопрос: На тестере ошибки нет, а на реальном счёте появляется 10030.
- Вопрос: У одного и того же брокера по одним символам 10030 возникает, а по другим — нет.
- Вопрос: Нет возможности изменить код советника (есть только файл .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_FOK | Fill or Kill | Исполнение только при возможности заполнить весь объём. Если для заявки на 1 лот есть ликвидность лишь на 0.7 лота, вся заявка отменяется |
ORDER_FILLING_IOC | Immediate or Cancel | Немедленное исполнение доступного объёма, остаток отменяется. Из заявки на 1 лот может исполниться только 0.7, а 0.3 будет отменено |
ORDER_FILLING_RETURN | Return | Исполняется доступный объём, а остаток выставляется в стакан как заявка (ожидает доисполнения). Используется при биржевом исполнении |
ORDER_FILLING_BOC | Book 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 называют классической ошибкой при переходе к новому брокеру, такова:
- Разрешённые режимы исполнения различаются у каждого брокера и для каждого символа. Один брокер разрешает для форекс-символов только FOK, другой — только IOC, третий — оба варианта. Даже у одного и того же брокера настройки для Форекс и для CFD/акций часто отличаются.
- Многие советники «зашивают» type_filling прямо в код. Например, советник со строкой
request.type_filling = ORDER_FILLING_FOK;может годами исправно работать у брокера A, где разрешён FOK. Поскольку у автора всё работает, это не воспринимается как баг и распространяется в таком виде. - Если у нового брокера B FOK не разрешён, ни одна заявка не пройдёт с самого начала. На тестере это часто не проявляется (поведение тестера мягче реального сервера), поэтому проблема вылезает именно «в день переноса на реальный счёт».
То есть 10030 — это, скорее, проявление жёстко зашитого предположения об окружении, а не баг советника как таковой. И, соответственно, если переписать код так, чтобы он читал флаги разрешённых режимов и выбирал их динамически, советник станет работать у любого брокера (код приведён ниже).
Связь с режимом исполнения символа (SYMBOL_TRADE_EXEMODE)
Помимо режима заполнения, у символа есть ещё и режим исполнения, который влияет на то, какие режимы заполнения вообще имеют смысл.
| Режим исполнения | Константа | Типичный случай | Обычные режимы заполнения |
|---|---|---|---|
| Instant | SYMBOL_TRADE_EXECUTION_INSTANT | Часть Форекс-брокеров (чаще DD) | Исполнение по указанной цене. Мир FOK/IOC + реквоты |
| Market | SYMBOL_TRADE_EXECUTION_MARKET | Большинство Форекс/CFD (NDD) | Рыночное исполнение. FOK или IOC (зависит от настроек брокера) |
| Exchange | SYMBOL_TRADE_EXECUTION_EXCHANGE | Акции, фьючерсы | Исполнение через стакан заявок. Обычно RETURN |
| Request | SYMBOL_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-курс
Все советники продаются по стартовой цене, которая растёт ступенями по мере продаж. Получайте уведомление перед каждым повышением, плюс ежедневное письмо об алготрейдинге, чтении бэктестов и выборе брокера.
* Конфиденциальность строго защищена. Отписаться можно в любое время.