自成交防范与洗售交易:SMP如何运作
了解自成交防范如何在撮合引擎中阻止同一公司的订单互相成交,以及它与洗售交易法律的区别,避免误触规则并保留队列优势。
自成交防范是撮合引擎的一项功能,可阻止同一公司的两笔订单相互成交。订单进入系统时会带有标识符。当两个带有相同标识符的订单即将交叉成交时,引擎会在任何成交记录生成前取消其中一笔或两笔订单。自成交防范属于需要启用的交易场所基础设施;禁止洗售交易则是法律要求,两者并不涵盖同一范围。
当第二个策略开始对第一个策略已经报价的工具进行报价时,这项规则就与您有关了。同一标的上的双层网格机器人,与银行交易台面临的是同样的规则。
撮合引擎中的自成交防范如何运作
交易场所收到的每笔订单都会带有引擎在撮合前读取的字段:买卖方向、价格、数量和有效期。自成交防范会再增加两个字段。第一个是标识符,即表明订单属于哪家公司、账户或策略组的数字或字符串。第二个是指令,告诉引擎当两个带有该标识符的有效订单即将相互成交时应如何处理。
当主动成交订单触及被动订单的价格、即将与其撮合时,检查会立即运行。常见结果有四种:
- 取消被动订单。新进订单继续进入订单簿,并可与该价格后面的其他订单成交。
- 取消新进订单。被动订单保留其队列位置,主动订单被取消。
- 同时取消两笔订单。这是最严格的设置。
- 减量并取消。较大订单按较小订单的数量减少,较小订单被取消,剩余数量继续有效。
四种情况下都不会发生交易。不会有成交记录进入行情带,不会写入成交日志,而是收到一笔或两笔订单的主动取消通知。
队列位置是容易被忽视的成本。按照“取消旧订单”指令取消的被动订单,会失去排队等待所积累的一切优势。按照价格—时间优先规则,这种损失是完全的:重新提交后,订单会排在等待期间加入队列的所有订单之后。我们的估算队列位置指南介绍了这一排位的价值。
一个标的,多个订单簿
检查按交易场所分别进行。引擎只比较自己持有的订单。您在两个不同订单簿中的两笔订单彼此不可见,美国股票市场也没有任何机制能跨订单簿执行这一检查。一只美国股票可以同时在多个订单簿中报价。下方面板统计了2026年6月10日上午一个十五分钟窗口内,六只常见股票分别有多少个不同交易场所提供报价并产生成交。
每个数字背后的完整 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个报价交易场所。智能订单路由器如果按设计拆分子订单,通常会把您的两个策略分配到不同订单簿,因此大部分时间不会触发引擎级检查。公司会在订单离开系统前,于订单管理层在上游弥合这一缺口。您在两个订单簿中以同一价格分别挂出买单和卖单,也会形成锁定或交叉市场,并受到另一套规则约束。
一个订单簿在一个交易时段内撮合多少次
自成交检查处于引擎每次撮合的路径上。对于流动性较高的股票,这条路径全天都很繁忙。下方面板将一只股票的完整交易时段按十五分钟切分,并统计每个区间的成交记录,只保留成交记录至少达到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 ET,该股票在十五分钟内产生了9402笔成交;在19:45 ET,产生了1345笔成交。共有64个区间达到200笔成交的门槛。每笔成交都代表引擎撮合的一对订单。引擎会先读取双方的标识符,再允许它们成交。任何进入订单簿并停留的订单,都可能在当天稍后与同一账户的另一笔订单相遇。
自成交发生时行情带显示什么
被拦截的自成交不会留下任何记录。行情带只记录已执行的交易,每笔成交都会带有条件标记,即报告交易场所附加的代码,用于说明交易如何发生。下方面板将一只股票的完整交易时段按这些标记进行拆分。
每个数字背后的完整 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个标记。阅读列表时请注意其中缺少什么。没有任何代码会表明两笔订单来自同一家公司。实际发生的自成交看起来与该价格上的其他交易没有区别,因此,对自成交的监控依赖行情带,以及交易场所持有的参与者标识符和订单上的账户编号。
自成交防范的边界与洗售交易法律的起点
自成交防范是交易场所提供的一项服务。您可以选择启用并进行配置。如果从未设置该功能,引擎会正常撮合您的两笔订单。禁止洗售交易则不是可选项,也不取决于任何系统设置。
《1934年证券交易法》第9(a)(1)条涵盖无实际受益所有权变更、且意在制造活跃交易假象的证券交易。《商品交易法》规定了期货交易中的对应要求,CME规则534也在交易所规则手册中重申了这一点。FINRA规则5210适用于经纪交易商,其补充材料直接涉及自成交:同一家公司内两个无关联算法之间的交易本身并不违反规定,但公司应制定政策,对此类交易进行审查并加以减少。
对于运行多个策略的交易者,这会带来两个后果。如果您完全没有设置自成交指令,自交叉交易仍可能违反交易场所的相关禁令,因为该规则针对的是交易本身及其背后的意图。如果自成交防范阻止了自交叉交易,则不构成违规;阻止自交叉正是该功能的目的。
交易者如何配置:CME、ICE、LME和MiFID II
在CME Globex上,自成交防范根据订单进入系统时提交的标识符运行。公司需预先注册所使用的标识符,每笔订单都带有一个标识符;当带有相同标识符的两笔订单相遇时,配套指令会规定引擎取消哪一方。未提交标识符的订单会正常撮合。这是新操作者容易忽视的陷阱:默认状态是关闭。
ICE运行自成交防范功能。该功能按交易公司标识符配置,而不是逐笔订单配置,并提供相同类型的取消结果。伦敦金属交易所则在LMEselect上为会员交易标识符提供自执行防范功能。在欧洲,MiFID II第17条要求从事算法交易的投资公司建立系统和控制措施,包括测试、终止功能以及防止市场无序交易。第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个形态相近的交易时段。按合约逐一设置规则,在这样的数量下无法管理。因此,标识符会绑定到账户,并随该账户发送的每笔订单一同传递。
成交日志无法解释的故障模式
下面说明这一问题在实际操作中的表现。“取消新订单”指令会在您刚提交的订单到达时立即将其取消,使其无法与被动订单成交。在机器人内部,这一序列表现为提交新订单,随后出现一笔无人请求的取消。由于没有成交、没有拒单,也没有错误字符串说明原因,首次遇到该情况的操作者往往会先检查自己的撤单流程是否存在错误。
两个习惯有助于识别问题。应逐字记录交易场所发送的订单状态消息,而不是只保留标准化摘要,因为防范原因通常作为该消息中的字段传递。对于任何并非由您自己的代码发起的取消,都应触发警报。该警报应归入您的自动交易断路器,因为这属于同一类故障:交易场所改变了您的订单状态,而您的进程却继续运行,仿佛什么都没有发生。
常见问题
什么是自成交防范?
撮合引擎中的一项检查功能,可阻止带有相同公司或账户标识符的两笔订单相互成交。当两笔订单即将撮合时,引擎会根据订单附带的指令,取消被动订单、新进订单或两笔订单。
自成交与洗售交易是同一回事吗?
不是。自成交是同一受益所有人提交的两笔订单之间发生的任何成交。洗售交易则是指在没有真实市场风险的情况下进行自成交,并意图制造交易活跃的误导性假象。无关联算法之间的非故意自成交,与有安排的自成交受到的处理不同,但公司仍应对其进行监控。
自成交防范能跨不同交易所生效吗?
不能。每个撮合引擎只检查自己订单簿中的订单。同一家公司在两个交易场所挂出的两笔订单仍可能相互成交,因此需要由公司在交易场所之上的交易前检查来完成这一工作。
为什么我的订单没有成交、也没有原因就被取消?
“取消新订单”自成交指令是其中一种可能原因。交易场所会在订单到达时将其取消,使其无法与带有您标识符的被动订单成交。原因通常显示在交易场所的取消消息字段中,而不是拒单消息中。
哪些交易场所要求提供自成交防范标识符?
要求因交易场所和产品而异。CME要求在订单进入系统时提交预先注册的标识符;ICE和伦敦金属交易所提供各自的公司层级配置;欧洲交易场所则依据MiFID II承担系统和控制措施义务。您交易产品适用的交易场所规则手册才是最终依据。
本页每个面板都附有生成数据的SQL。展开任意面板即可查看。若要统计某只股票的报价交易场所,或按条件标记拆分交易时段,请在Strasmore终端中用自然语言提出问题。