文章目录
港股 vs A 股下单规则对比(MS/HKEX DMA 工程核对)
项目背景:Mingshi OMS/EMS 通过 FIX 4.2 接入 Morgan Stanley(Razer platform)并路由至 HKEX。本文件把交易所规则、券商 FIX 合约和当前代码实现分层记录;它不是券商规格,也不构成交易或合规意见。
规则核对日:2026-08-12。送单前仍必须使用交易所当日通告、证券主数据、实时行情、账户权限及 MS 已签署 FIX specification / UAT 结果复核。
资料与证据:
- HKEX Trading Mechanism、Securities Market Operations FAQ、Trading Hours、Regulated Short Selling;
- HKEX 2026 最小价差 Phase 2 上线资料、Board Lot Framework Conclusions;
- 上交所《交易规则(2026 年修订)》、北交所《交易规则》;
- 当前工作树静态检查:
src/fixApi/trade.go、src/utils/fix_order_utils.go、etc/ms/etc/dataCfg.json、/root/proj/go/hertz; - 代码结论不等于端到端 UAT;本仓库当前存在未提交 HKEX 相关变更,本文不将其视为已发布版本。
一、先分清规则层级与适用通道
| 层级 | 负责内容 | 不应混用的内容 |
|---|---|---|
| 交易所 / 清算所 | 数量、tick、时段、订单类型、卖空价格规则、T+2 等 | MS 的 FIX 字段值和账户路由 |
| 券商 FIX 合约 | Tag 57、18、114、58、账户映射、回报语义 | HKEX 指定卖空名单或报价规则 |
| 证券主数据 / 行情 | board lot、Spread Table Code、产品类型、状态、参考价 | 固定写死在源码的规则表 |
| OMS 风控与持仓 | 可售量、T+1、locate、限额、幂等、审计 | 替代交易所或券商的最终准入 |
本文的港股是 HKEX 本地证券市场 / OTP-C 自动对盘订单;A 股是沪深主板、科创板、创业板与北交所的股票竞价交易。它们均不同于:
- 北向 Stock Connect:香港/海外投资者交易沪深证券,遵循沪深市场交易模型;
- 南向港股通:内地投资者交易香港股票,但适用港股通资格、人民币结算、交易日历等专门安排;
- ETF、债券、期权、权证、结构性产品、大宗交易等专门产品/交易方式。
二、数量规则
| 规则 | A 股普通股票 | 港股本地自动对盘 | 当前 HKEX 代码路径 |
|---|---|---|---|
| 普通买入最小单位 | 100 股;零股余额可一次卖出 | 证券当前 board lot | 未读取 board lot |
| 数量增量 | 100 股整数倍(板块另有规定除外) | 普通 automatch 订单为 board lot 整数倍 | 未校验 |
| 单笔上限 | 主板通常 100 万股;科创板限价 10 万/市价 5 万;创业板限价 30 万/市价 15 万;北交所 100 万 | 3,000 board lots | 未校验 |
| 零股 / 特别手 | 卖出余额按各所规则一次申报 | 不进入普通整手订单簿;实际路由能力取决于交易所和券商支持 | 未实现独立路由 |
| 同价位队列 | 非本文件固定参数 | 交易所每个价格队列最多 40,000 笔订单 | 仅可做本方预警,不能声称全市场校验 |
工程要求:qty % boardLot == 0 只适用于普通自动对盘路径。系统支持 odd lot / special lot 时,应由 order_route 分流,不能把所有非整手数量全局拒绝。
HKEX 于 2026-07-02 开始分两阶段实施 board-lot 框架优化;Phase 2 与 USM 于 2026-11-16 上线同步。它不是“所有存量港股即时改为同一手数”。board lot 必须以有生效日期的证券主数据为准;零股自动撮合最早仍拟于 2027 年第三季度推出,且须监管批准和市场准备。
三、价格与报价约束
3.1 A 股与港股的根本差异
| 项目 | A 股 | 港股本地市场 |
|---|---|---|
| 最小价格变动 | 股票通常人民币 0.01 元 | 按证券 Spread Table Code 与价格档位 |
| 日涨跌幅 | 主板通常 ±10%,科创/创业 ±20%,北交所 ±30%;风险警示、IPO、退市整理另有规则 | 没有 A 股式普遍日涨跌停 |
| 连续竞价约束 | 有效申报价格范围、保护限价、价格笼子按板块/状态变化 | nominal-price 九倍/九分之一、quotation rules、POS/CAS 限制、VCM 等 |
3.2 HKEX Phase 2:不可再使用旧 tick 表
截至 2026-08-12,HKEX 最小价差下调 Phase 2 已于 2026-08-03 生效。对 Phase 2 适用的 Spread Table Code 01 证券,常用表为:
| 价格区间(货币单位) | 最小价差 |
|---|---|
| 0.01–0.25 | 0.001 |
| >0.25–10.00 | 0.005 |
| >10–20 | 0.010 |
| >20–50 | 0.020 |
| >50–100 | 0.050 |
| >100–200 | 0.100 |
| >200–500 | 0.200 |
| >500–1,000 | 0.500 |
| >1,000–2,000 | 1.000 |
| >2,000–5,000 | 2.000 |
| >5,000–9,995 | 5.000 |
边界:该表不能按 .HK 后缀盲套。ETP、债券、交易所买卖期权、结构性产品、inline warrants 等须使用自身 Spread Table Code。价格预校验必须消费 Security Definition / 证券主数据,而不是只限制四位小数。
连续交易的 quotation rule 也不能只概括为“九倍/九分之一”;对非 ETP 的部分边界还涉及 24 spreads 或参考价 5% 等规则。实现时将 spread_table_code、产品类别、规则版本、参考价与会话状态一起传给 venue validator。
四、订单类型与交易时段
| 时段 | HKEX 本地证券市场 | 可用订单类型 / 关键行为 |
|---|---|---|
| POS 09:00–09:30 | 开市前竞价 | At-auction / At-auction limit;09:15–09:20 不可撤,09:20–最多 09:22 随机撮合,之后 blocking 至 09:30 |
| CTS 上午 09:30–12:00 | 连续交易 | Limit / ELO / SLO;ELO/SLO 的扫单与剩余订单行为不同 |
| Extended Morning 12:00–13:00 | 仅指定 Extended Trading Securities | 不能当作一般港股午间可交易时段 |
| CTS 下午 13:00–16:00 | 连续交易 | 同上午 CTS |
| CAS 16:00–随机 16:08–16:10 | 收市竞价(CAS 证券) | 16:01–16:06 可输入,16:06–16:08 不可撤,随后随机收市 |
半日市:无 Extended Morning、无下午 CTS;CAS 证券在 12:00–随机 12:08–12:10 收市,非 CAS 证券 12:00 收市。
HKEX 本地 OTP-C 没有可泛化为普通连续交易市价单的独立 Market Order。At-auction order 不应被误写成 CTS market order。当前代码的 OrdType_MARKET 只是 broker/FIX 适配能力;它是否能用于某一 HKEX 场景必须经 MS 合约和 venue session 准入确认。
A 股普通竞价的核心时段为 09:15–09:25、09:30–11:30、13:00–14:57、14:57–15:00;通常 09:20–09:25 与 14:57–15:00 不接受竞价撤单。A 股存在规定的市价申报,不应一概说“不支持”,但一般限于有涨跌幅限制证券的连续竞价,并依赖交易所规定的市价类型和保护限价。
五、卖空:交易所合规与 MS FIX 声明必须同时成立
| 维度 | A 股 | HKEX 受监管卖空 |
|---|---|---|
| 业务前提 | 融资融券/证券出借标的、账户与券源 | 指定卖空证券、卖空标识、借券或无条件交付权利 |
| 裸卖空 | 禁止 | 禁止 |
| 连续交易价格 | 依交易所和券商业务规则 | 通常不得低于当时最优卖价,豁免除外 |
| POS / CAS | 依 A 股规则 | 仅 at-auction limit;POS 不低于前收,CAS 不低于参考价;CAS 不接受卖空 at-auction order |
| 账户声明 | 券商契约决定 | 除交易所规则外,MS 合约可能要求 LocateBroker / 覆盖声明 |
当前代码证据:
- 输入 Side
0/1/2/3映射为 FIXBUY/SELL/BUY/SELL_SHORT;BUY_TO_COVER在当前实现中输出普通 FIXBUY,返回的 close 标记未在新单路径写入独立 FIX 字段; SELL_SHORT可生成 FIX side,但系统没有对 designated securities、借券/locate、卖空价格、POS/CAS 订单类型作本地校验;- 未发现自动生成的 Tag 114 卖空 locate 或专用 Tag 58 covered 声明。现有 Tag 58 配置用于测试/盒子策略文本,不能当作卖空覆盖声明。
因此,仅设置 SELL_SHORT 不构成可送出的合规卖空订单。卖空校验链应为:
| |
六、当前 MS/HKEX 新单路径:已覆盖与缺口
已有静态代码证据(非 raw-FIX 回归测试)
| 项目 | 现状 |
|---|---|
| 港股代码 | 新单拒绝非 5 位 Stockcode;Hertz 也以 5 位识别 HK |
| 新单证券字段 | SecurityID=code.HK、Tag 22=5、Tag 15=HKD、Tag 207=HK、Tag 100=HK、Tag 167=CS、Tag 18=1 在新单路径中设置 |
| 路由 | TargetSubID(57) 由 condParams 配置,如 DMA 路由到 57=DMA |
| A 股限流隔离 | Hertz 的 A 股 bucket 只覆盖 SH/SZ/BJ;HK 不进入该 bucket |
| 数量与价格序列化 | 正数量检查、价格四位小数序列化;均不是 board-lot / tick 校验 |
需要明确的限制
- 新单字段结论是静态代码阅读结果;当前未发现港股
NewOrderSingle与 Cancel 的字段级 raw-FIX 回归测试。 - 撤单路径会写 Tag 100,但 Tag 207 被注释,且未同步设置 Tag 15 / 22 / 167;不能把“新单已设置 HK 字段”泛化为撤单也完整。
- 代码没有名为
global.HKEX的常量;实际新单根据Stocktype得到字符串HK。 float64/ 四位小数只能避免部分序列化问题,不能证明符合 venue tick。
缺口和建议优先级
| 优先级 | 缺口 | 验收证据 |
|---|---|---|
| P0 | SELL_SHORT 的账户、名单、locate/coverage、时段和价格规则;MS 声明字段 | UAT raw FIX、指定名单快照、边界回放、审计 readback |
| P0 | 新单与撤单港股字段一致性 | NewOrderSingle / Cancel 字段级测试及券商 UAT 对照 |
| P1 | board lot、3,000 手与 odd/special lot 分流 | 版本化主数据、公司行动回归、边界数量测试 |
| P1 | Spread Table Code 驱动的 tick / quotation 校验 | 各表边界测试、decimal 精度测试、行情版本记录 |
| P1 | POS/CTS/CAS、半日市、随机期 / no-cancel / blocking 状态机 | 冻结时钟测试、交易日历和会话状态测试 |
| P1 | 沪深北板块化规则包 | 版本/生效日测试、证券状态和保护限价测试 |
七、交收、可售量与风险状态不能混为一谈
| 概念 | A 股股票 | HKEX 本地现金市场 |
|---|---|---|
| 成交成立 | 交易主机撮合确认 | 交易所撮合确认 |
| 可售回转 | 买入当日通常不可卖出(T+1),例外产品另定 | 取决于券商、持仓与信用安排,不应由 T+2 直接推导 |
| 交易所/清算交收 | 按中国结算规则 | Exchange Participant 与 CCASS 间通常 T+2 |
截至核对日,HKEX 提议向 T+1 迁移的目标为 2027 年第四季度,仍须市场准备与监管批准,不是当前生效规则。持仓风控应单独保存 sellable_qty、settlement_date、borrow_coverage 和 channel,不得用一个 T+N 字段代替。
八、工程落地清单
| |
所有数字规则都应是带 effective_from、scope、source_version 的数据,而不是散落在业务代码中的常量。生产切换必须先做只读预校验、回放、UAT、审批与回滚演练。
九、权威资料
文章作者
上次更新 0001-01-01