Предотвращение самосделок и фиктивные сделки на бирже
Механизм предотвращения самосделок блокирует исполнение встречных заявок одного участника. Узнайте, как работает торговое ядро и где проходит граница с незаконными сделками.
Функция предотвращения самосделок (self-match prevention) — это механизм торгового ядра, который не позволяет двум заявкам от одной и той же фирмы исполниться друг с другом. При подаче заявки содержат идентификатор; если две заявки с одинаковым идентификатором должны пересечься, ядро отменяет одну из них или обе до того, как сделка будет зафиксирована. Предотвращение самосделок — это техническая настройка площадки, тогда как запрет на фиктивные сделки (wash trades) является требованием закона, и эти понятия не тождественны.
Как только вторая стратегия выставляет котировки по инструменту, по которому уже работает ваша первая стратегия, это правило начинает действовать. Для торгового робота, использующего сетку заявок по одному символу, оно работает на тех же условиях, что и для банковского торгового отдела.
Как работает предотвращение самосделок в торговом ядре
Каждая заявка, поступающая на площадку, содержит поля, которые ядро считывает перед сопоставлением: направление, цена, объем, время действия. Функция предотвращения самосделок добавляет еще два поля. Первое — это идентификатор (число или строка), указывающий, какой фирме, счету или группе стратегий принадлежит заявка. Второе — инструкция для ядра о том, что делать, если две активные заявки с этим идентификатором готовы исполниться друг с другом.
Проверка выполняется в момент, когда агрессивная заявка достигает цены пассивной заявки, с которой она могла бы исполниться. Обычно используются четыре сценария:
- Отмена пассивной заявки. Входящая заявка проходит в книгу и может исполниться по любой другой заявке, стоящей за отмененной по той же цене.
- Отмена входящей заявки. Пассивная заявка сохраняет свою позицию в очереди, а агрессор исчезает.
- Отмена обеих заявок — самый строгий вариант.
- Уменьшение объема и отмена. Объем большей заявки уменьшается на величину меньшей, меньшая заявка отменяется, а остаток большей остается активным.
Ни в одном из четырех случаев сделка не происходит. В ленту не поступает никаких данных, в журнале исполнений ничего не фиксируется, вместо этого приходит уведомление об отмене по одной или обеим сторонам.
Позиция в очереди — это скрытые издержки. Пассивная заявка, отмененная по инструкции «отменить старую», теряет все преимущество, полученное за время ожидания. При приоритете по цене и времени эта потеря является полной: повторная подача заявки ставит ее в конец очереди после всех, кто успел встать в нее, пока заявка находилась в книге. Наше руководство по оценке позиции в очереди объясняет, чего стоит это место в очереди.
Один инструмент, множество книг заявок
Проверка осуществляется на уровне площадки. Ядро сравнивает только те заявки, которые находятся в его собственной книге. Две ваши заявки, находящиеся в разных книгах, «не видят» друг друга, и механизмы рынка акций США не охватывают их одновременно. Одна акция США котируется во многих книгах сразу. В таблице ниже приведено количество площадок, на которых велись котировки и фиксировались сделки по шести известным компаниям за 15-минутный интервал утром 10 июня 2026 года.
Точный SQL-код для каждого числа
SELECT
q.ticker AS ticker,
q.quoting_venues AS quoting_venues,
t.printing_venues AS printing_venues
FROM
(
SELECT
ticker,
countDistinct(bid_exchange) AS quoting_venues
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
AND sip_timestamp >= toDateTime('2026-06-10 14:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 14:15:00', 'UTC')
AND bid_price > 0
GROUP BY ticker
) AS q
INNER JOIN
(
SELECT
ticker,
countDistinct(exchange) AS printing_venues
FROM global_markets.stocks_trades
WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
AND sip_timestamp >= toDateTime('2026-06-10 14:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-10 14:15:00', 'UTC')
GROUP BY ticker
) AS t ON t.ticker = q.ticker
ORDER BY quoting_venues DESC, tickerПо инструменту AAPL за этот четвертьчасовой интервал были выставлены котировки на 16 площадках, а сделки прошли на 17 из них. Даже по самому низколиквидному инструменту в таблице котировки велись на 11 площадках. Умный маршрутизатор заявок (smart order router), который по своей логике разбивает дочерние заявки, большую часть времени будет направлять ваши стратегии в разные книги, где проверка на уровне ядра не применяется. Фирмы устраняют этот разрыв на более высоком уровне — в системе управления заявками, до того как ордер покинет периметр компании. Ваши собственные заявки, выставленные на покупку и продажу по одной цене в двух разных книгах, также создают заблокированный или перекрестный рынок, для которого существуют свои правила.
Сколько сделок совершает одна книга за сессию
Проверка на самосделку встроена в путь каждой сделки, совершаемой ядром, и для ликвидного инструмента этот путь загружен весь день. В таблице ниже полная торговая сессия по одной акции разбита на 15-минутные интервалы, в которых зафиксировано не менее 200 сделок.
Точный SQL-код для каждого числа
SELECT
formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 15 MINUTE), '%H:%i') AS et_time,
count() AS trade_count
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-10 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-11 04:00:00', 'UTC')
GROUP BY et_time
HAVING count() >= 200
ORDER BY et_timeВ 04:00 по восточному времени по этой акции было совершено 9402 сделок за 15 минут, а в 19:45 — 1345 сделок, распределенных по 64 интервалам, превысившим порог в 200 сделок. Каждая сделка — это пара заявок, сведенных ядром, и перед их исполнением ядро проверяет идентификаторы обеих сторон. Любая заявка, попадающая в книгу, может в течение дня встретиться с другой заявкой от того же счета.
Что показывает лента при совершении самосделки
Предотвращенная самосделка не оставляет следов. В ленту попадают только исполненные сделки, и каждая из них сопровождается кодами условий (condition flags) — метками, которые площадка добавляет для описания того, как была совершена сделка. В таблице ниже приведена разбивка полной сессии по одной акции по этим кодам.
Точный SQL-код для каждого числа
SELECT
condition_name,
print_count,
round(100 * print_count / sum(print_count) OVER (), 2) AS share_pct
FROM
(
SELECT
cc.id AS condition_id,
any(cc.name) AS condition_name,
count() AS print_count
FROM
(
SELECT toInt32(arrayJoin(conditions)) AS condition_id
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-10 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-11 04:00:00', 'UTC')
) AS f
INNER JOIN
(
SELECT
toInt32(id) AS id,
any(name) AS name
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
AND has(data_types, 'trade')
GROUP BY id
) AS cc ON cc.id = f.condition_id
GROUP BY condition_id
)
ORDER BY print_count DESC
LIMIT 10Odd Lot Trade охватывает 48.34% всех сделок с кодами за сессию, а в списке указаны 10 наиболее часто встречающихся кодов за день. Обратите внимание на то, чего в списке нет. Отсутствие кода означает, что две заявки поступили от одной фирмы. Самосделка, которая все же попала в ленту, выглядит как любая другая сделка по этой цене, поэтому надзор за ними осуществляется вне ленты, на основе идентификаторов участников, которые хранит площадка, и номеров счетов, указанных в заявках.
Где заканчивается предотвращение самосделок и начинается закон о фиктивных сделках
Предотвращение самосделок — это сервис площадки. Вы подключаете его и настраиваете самостоятельно; если вы этого не сделаете, ядро будет спокойно сводить ваши заявки. Запрет на фиктивные сделки (wash trades) не является опциональным и не зависит от настроек.
Раздел 9(a)(1) Закона о фондовых биржах 1934 года касается сделок с ценными бумагами, при которых не происходит смены фактического владельца и которые совершаются для создания ложного впечатления об активной торговле. Закон о товарных биржах содержит аналогичное положение для фьючерсов, а правило 534 CME закрепляет его в своде правил биржи. Правило 5210 FINRA распространяется на брокеров-дилеров, а дополнительные материалы к нему прямо касаются самосделок: сделки между двумя независимыми алгоритмами одной фирмы сами по себе не являются нарушением, однако фирма обязана поддерживать политики по их отслеживанию и сокращению.
Для тех, кто использует более одной стратегии, это влечет два последствия. Самосделка может нарушить запрет на площадке, где вы не настроили функцию предотвращения, так как правило привязано к самой сделке и намерению, стоящему за ней. Самосделка, предотвращенная системой, нарушением не является: именно для этого она и существует.
Как операторы настраивают систему: CME, ICE, LME и MiFID II
На CME Globex предотвращение самосделок работает на основе идентификатора, передаваемого при подаче заявки. Фирмы регистрируют используемые идентификаторы, каждая заявка снабжается таким идентификатором, и задается инструкция, какую сторону ядро должно отменить при встрече двух заявок с этим идентификатором. Заявки, отправленные без идентификатора, исполняются обычным образом, что является ловушкой для новых операторов: по умолчанию функция отключена.
ICE использует функционал предотвращения самосделок (Self-Trade Prevention Functionality), настраиваемый на уровне идентификатора торговой фирмы, а не для каждой заявки отдельно, с тем же набором вариантов отмены. Лондонская биржа металлов (LME) предлагает функцию предотвращения самоисполнения (Self-Execution Prevention) на платформе LMEselect для идентификаторов участников. В Европе статья 17 директивы MiFID II возлагает на инвестиционные фирмы, занимающиеся алгоритмической торговлей, обязанность по контролю систем, включая тестирование, функции экстренной остановки и предотвращение дезорганизации торгов. Статья 48 накладывает аналогичные обязательства на саму площадку, и инструменты предотвращения на стороне биржи стали стандартным оборудованием.
Настройка осуществляется на уровне счета или фирмы, а не для каждого символа отдельно. Размер опционной поверхности одного базового актива объясняет почему.
Точный SQL-код для каждого числа
SELECT
toString(date) AS session_date,
countDistinct(ticker) AS contracts_traded,
countDistinct(strike_price) AS strikes_traded
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date >= '2026-06-01'
AND date <= '2026-06-30'
AND volume > 0
AND iv_converged = 1
GROUP BY date
ORDER BY dateНа 2026-06-01 один базовый актив имел 1579 отдельно торгуемых контрактов с объемом, распределенных по 112 страйкам, и таблица охватывает 21 сессий с аналогичными параметрами. Настройка правил для каждого контракта отдельно при таком количестве невозможна. Идентификатор привязывается к счету и сопровождает каждую заявку, которую этот счет отправляет.
Режим сбоя, который не объяснят журналы исполнений
На практике это выглядит так. Инструкция «отменить новую» уничтожает заявку сразу после поступления, до того как она успеет исполниться. Изнутри бота последовательность выглядит как подача новой заявки, за которой следует отмена, которую никто не запрашивал. Нет ни исполнения, ни отказа, ни кода ошибки с объяснением причины, поэтому операторы, столкнувшиеся с этим впервые, склонны искать ошибку в собственном коде отмены.
Две привычки делают ситуацию понятной. Регистрируйте сообщения о статусе заявки от площадки дословно, а не в виде нормализованной сводки, так как причина предотвращения обычно передается как поле в этом сообщении. Настройте оповещения на любую отмену, которую не инициировал ваш код. Это оповещение относится к категории автоматических торговых выключателей, так как сбой того же класса: площадка изменила состояние вашей заявки, а ваш процесс продолжил работу так, будто ничего не произошло.
Часто задаваемые вопросы
Что такое предотвращение самосделок?
Это проверка торгового ядра, которая не позволяет двум заявкам с одним и тем же идентификатором фирмы или счета исполниться друг с другом. Когда они готовы исполниться, ядро отменяет пассивную заявку, входящую заявку или обе, следуя инструкции, привязанной к заявке.
Является ли самосделка тем же самым, что и фиктивная сделка (wash trade)?
Нет. Самосделка — это любое исполнение между двумя заявками от одного фактического владельца. Фиктивная сделка — это самосделка, совершенная без реального рыночного риска и с намерением создать ложное впечатление об активности. Непреднамеренные самосделки между независимыми алгоритмами рассматриваются иначе, чем спланированные, однако фирмы все равно обязаны их отслеживать.
Работает ли предотвращение самосделок на разных биржах?
Нет. Каждое торговое ядро применяет проверку только к заявкам в своей собственной книге. Две заявки от одной фирмы, находящиеся на разных площадках, могут исполниться друг с другом, поэтому эта задача ложится на собственные предторговые проверки фирмы, проводимые до отправки заявок на площадки.
Почему моя заявка была отменена без исполнения и без объяснения причин?
Один из вариантов — инструкция «отменить новую» при предотвращении самосделки: площадка отменила заявку при поступлении, до того как она смогла исполниться по пассивной заявке с вашим идентификатором. Причина обычно указывается в поле сообщения об отмене от площадки, а не как отказ.
Какие площадки требуют идентификатор для предотвращения самосделок?
Требования зависят от площадки и продукта. CME требует идентификатор при подаче заявки, зарегистрированный заранее, в то время как ICE и Лондонская биржа металлов предлагают свои настройки на уровне фирмы, а европейские площадки обязаны обеспечивать контроль в соответствии с MiFID II. Свод правил площадки для конкретного продукта является определяющим документом.
Каждая таблица здесь содержит SQL-запрос, с помощью которого она была создана, поэтому вы можете развернуть любую из них и ознакомиться с ним. Чтобы подсчитать количество площадок, котирующих интересующий вас инструмент, или разбить сессию по кодам условий, задайте вопрос на обычном английском языке в терминале Strasmore.