OUCH 交易规范
版本 1.12
1. 引言
本文档解释了通过 OUCH 协议访问股票交易服务。它描述了服务的配置并指定了应用消息。
2. 概述
OUCH 的消息协议广泛使用并被认为是行业标准。
OUCH 消息的点对点传输层是 SoupBinTCP。
3. 故障冗余
单个 OUCH 账户可以绑定到多个物理 OUCH 机器,这些机器相互镜像以提供故障冗余。在这种配置下,这些 OUCH 机器能够接受订单和取消请求,并同时生成任何出站消息。
4. 服务配置
一个 OUCH 交易服务可以配置为接受并维护每个客户的多个 OUCH 会话。然而,每个账户只能有一个活动连接到特定的 OUCH 机器。
对于任何客户的 OUCH 账户,“断开连接时取消”功能始终处于活动状态。由由于任何原因与所有 OUCH 主机断开连接的 OUCH 账户创建的所有未完成订单将被自动撤回。在重新建立连接时,将向客户发送每个撤回订单的非请求取消消息。
5. 数据类型
整数字段是无符号大端(网络字节顺序)二进制编码数字。
字母字段是左对齐的,并在右侧填充空格。
标记字段是4字节整数字段。它们是顺序递增的,并且在一个交易日内每个 OUCH 账户必须唯一。
价格字段是4字节整数字段。转换为定点数格式时,它们有9位整数和1位小数。最大可表示值为214,748,364.6(7FFFFFFE十六进制)。
数量字段是4字节整数字段,最大可表示值为2,147,483,647(7FFFFFFF十六进制)。
6. 入站消息
入站消息从客户的应用程序发送到 OUCH 主机。所有入站消息都可以重复发送。这使客户能够在连接丢失或应用错误的情况下,如果不确定 Server 是否收到消息,可以重新发送任何入站消息。
安全的入站消息重传与端到端确认的想法是故障冗余实现的基础。如果客户的连接失败,就无法知道待处理的消息是否在故障前通过链接传输。健壮的 OUCH 客户可以安全地通过镜像链接重新发送任何待处理的消息,而无需担心生成重复消息。
在 OUCH 端口上的所有入站消息都按顺序处理。这保证如果在同一连接上连续输入两个订单,先输入的订单将始终先被接受。
6.1 新订单消息
新订单消息用于将新订单输入到执行系统。每个有效的订单都由一个订单接受消息确认。序列中的订单标记无效的新订单消息将被静默忽略。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 O = 新订单消息 |
| 订单标记 | 1 | 4 | 标记 | 必须在一个交易日内每个 OUCH 账户唯一且递增 |
| 客户参考 | 5 | 10 | 字母 | 由客户分配。此字段将转发到清算和结算场所。不对此字段进行验证 |
| 买卖指示器 | 15 | 1 | 字母 | 订单方向。值:B = 买入, S = 卖出, T = 卖空, E = 卖空豁免 |
| 数量 | 16 | 4 | 整数 | 股票数量 |
| 订单簿 ID | 20 | 4 | 字母 | 快速代码 |
| 组 | 24 | 4 | 字母 | 订单簿组标识符。值:DAY = 日间 J 市场, NGHT = 夜间 J 市场, DAYX = X 市场, DAYU = U 市场 |
| 价格 | 28 | 4 | 整数 | 订单价格 |
| 有效期 | 32 | 4 | 整数 | 指定订单的有效期。值:0 = 立即, 99999 = 当日。其他值不支持(订单将被拒绝) |
| 公司 ID | 36 | 4 | 整数 | 订单输入公司的标识符。应设置为零,除非指定客户的 MPID。如果需要,也将转发到下游系统 |
| 显示 | 40 | 1 | 字母 | 订单处理指示。值:P = 仅发布。未使用则留空 |
| 交易角色 | 41 | 1 | 字母 | 指定下单公司的角色。值:A = 代理, P = 主体 |
| 最小数量 | 42 | 4 | 整数 | 指定可接受的最小执行数量。非零值仅支持立即订单 |
| 订单分类 | 46 | 1 | 字母 | 高频交易(HFT)订单分类。值:1 = 非 HFT, 3 = HFT 做市策略, 4 = HFT 套利策略, 5 = HFT 定向策略, 6 = HFT 其他策略 |
| 现金保证金类型 | 47 | 1 | 字母 | 订单的现金保证金类型。值:1 = 现金, 2 = 保证金开仓(可议价), 3 = 保证金平仓(可议价), 4 = 保证金开仓(标准化), 5 = 保证金平仓(标准化) |
6.2 替换订单消息
替换订单消息用于修改现有订单。它需要两个有效的订单标记,一个现有标记必须与该账户的现有订单匹配,另一个替换标记必须符合新订单消息的要求。
如果现有订单标记不再有效或替换订单标记无效,则替换订单消息将被静默忽略。
如果与现有订单标记相关的订单有效但替换详细信息(替换订单标记除外)无效,则订单将被取消并从订单簿中移除。在这种情况下,替换订单标记不会被消耗,可以重复使用。
替换订单消息中的数量字段表示整个订单链的总数量。例如:
- 输入数量为100的订单,验证并接受。
- 执行数量为25。
- 额外执行数量为15。
- 如果客户希望替换订单并仍暴露于60的余额,则替换订单消息必须指定数量为100——当前余额加上累积执行数量。
订单不能替换为新总数量小于累积执行数量的订单。尝试这样做会导致现有订单被取消。
对于替换为新总数量等于累积执行数量的订单,替换接受状态为“死亡”。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 |
U = 替换订单消息 | | 现有订单标记 | 1 | 4 | 标记 | 必须与当前有效订单的标记完全匹配 | | 替换订单标记 | 5 | 4 | 标记 | 必须在一个交易日内每个 OUCH 账户唯一且递增 | | 数量 | 9 | 4 | 整数 | 整个订单链的总股数,即所需余额加上已执行股数的累积 | | 价格 | 13 | 4 | 整数 | 订单价格 | | 有效期 | 17 | 4 | 整数 | 指定订单的有效期。值:0 = 立即, 99999 = 当日。其他值不支持(订单将被拒绝) | | 显示 | 21 | 1 | 字母 | 订单处理指示。值:P = 仅发布。未使用则留空 | | 最小数量 | 22 | 4 | 整数 | 指定可接受的最小执行数量。非零值仅支持立即订单 |
6.3 取消订单消息
取消订单消息用于请求取消订单。注意,取消订单消息的唯一确认是订单取消消息,没有“取消为时已晚”消息,冗余取消订单消息将被静默忽略。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 X = 取消订单消息 |
| 订单标记 | 1 | 4 | 标记 | 必须与当前有效订单的标记完全匹配 |
| 数量 | 5 | 4 | 整数 | 保留字段,将被忽略,建议设置为零 |
7. 出站有序消息
出站消息由 OUCH 主机生成并由客户的应用程序接收。
7.1 系统事件消息
系统事件消息表示系统范围内的事件。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 S = 系统事件消息 |
| 时间戳 | 1 | 8 | 整数 | 当前日历日期午夜后的纳秒数 |
| 系统事件 | 9 | 1 | 字母 | 参见下表系统事件 |
表1:系统事件
| 事件 | 描述 |
|---|---|
| S | 日初——始终是第一条消息。表示市场开放并准备开始接受订单 |
| E | 日终——表示市场已关闭,不再接受新订单。不再有进一步的执行 |
7.2 订单接受消息
订单接受消息确认接收到并接受了有效的新订单消息。新订单消息中的数据字段在此消息中回显。
接受但未能执行的立即订单将以状态“死亡”发送订单接受消息。该订单不再发送其他消息。订单状态“死亡”表示订单已接受并自动取消。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 A = 订单接受消息 |
| 时间戳 | 1 | 8 | 整数 | 当前日历日期午夜后的纳秒数 |
| 订单标记 | 9 | 4 | 标记 | 订单标记与输入的一致 |
| 客户参考 | 13 | 10 | 字母 | 客户参考与输入的一致 |
| 买卖指示器 | 23 | 1 | 字母 | 买卖指示器与输入的一致。值:B = 买入, S = 卖出, T = 卖空, E = 卖空豁免 |
| 数量 | 24 | 4 | 整数 | 接受的股票数量 |
| 订单簿 ID | 28 | 4 | 字母 | 输入的订单簿标识符 |
| 组 | 32 | 4 | 字母 | 输入的订单簿组标识符。值:DAY = 日间 J 市场, NGHT = 夜间 J 市场, DAYX = X 市场, DAYU = U 市场 |
| 价格 | 36 | 4 | 整数 | 接受的订单价格 |
| 有效期 | 40 | 4 | 整数 | 接受的有效期。值:0 = 立即, 99999 = 当日 |
| 公司 ID | 44 | 4 | 整数 | 接受的公司标识符 |
| 显示 | 48 | 1 | 字母 | 接受的显示。值:P = 仅发布。未使用则留空 |
| 交易角色 | 49 | 1 | 字母 | 输入的下单公司的角色。值:A = 代理, P = 主体 |
| 订单编号 | 50 | 8 | 整数 | 订单的日唯一参考编号 |
| 最小数量 | 58 | 4 | 整数 | 接受的最小可执行数量 |
| 订单状态 | 62 | 1 | 字母 | 接受时的订单状态。值:L = 活动, D = 死亡 |
| 订单分类 | 63 | 1 | 字母 | 高频交易(HFT)订单分类。值:1 = 非 HFT, 3 = HFT 做市策略, 4 = HFT 套利策略, 5 = HFT 定向策略, 6 = HFT 其他策略 |
| 现金保证金类型 | 64 | 1 | 字母 | 订单的现金保证金类型。值:1 = 现金, 2 = 保证金开仓(可议价), 3 = 保证金平仓(可议价), 4 = 保证金开仓(标准化), 5 = 保证金平仓(标准化) |
7.3 订单替换消息
订单替换消息确认接收到并接受了有效的替换订单消息。替换订单消息中的数据字段在此消息中回显。
与订单接受消息类似,订单替换消息以状态“死亡”发送,表示替换已被接受并自动取消。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 U = 订单替换消息 |
| 时间戳 | 1 | 8 | 整数 | 当前日历日期午夜后的纳秒数 |
| 替换订单标记 | 9 | 4 | 标记 | 替换订单标记与输入的一致 |
| 买卖指示器 | 13 | 1 | 字母 | 原订单链中的买卖指示器与输入的一致。值:B = 买入, S = 卖出, T = 卖空, E = 卖空豁免 |
| 数量 | 14 | 4 | 整数 | 总剩余股数 |
| 订单簿 ID | 18 | 4 | 字母 | 原订单链中的订单簿标识符与输入的一致 |
| 组 | 22 | 4 | 字母 | 原订单链中的订单簿组标识符与输入的一致。值:DAY = 日间 J 市场, NGHT = 夜间 J 市场, DAYX = X 市场, DAYU = U 市场 |
| 价格 | 26 | 4 | 整数 | 接受的订单价格 |
| 有效期 | 30 | 4 | 整数 | 接受的有效期。值:0 = 立即, 99999 = 当日 |
| 显示 | 34 | 1 | 字母 | 接受的显示。值:P = 仅发布。未 |
使用则留空 | | 订单编号 | 35 | 8 | 整数 | 订单的日唯一参考编号 | | 最小数量 | 43 | 4 | 整数 | 接受的最小可执行数量 | | 订单状态 | 47 | 1 | 字母 | 替换时的订单状态。值:L = 活动, D = 死亡 | | 先前订单标记 | 48 | 4 | 标记 | 被替换订单的订单标记 |
7.4 订单取消消息
订单取消消息通知订单已被取消。这可以是取消订单消息的确认,也可以是订单被自动取消的结果。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 C = 订单取消消息 |
| 时间戳 | 1 | 8 | 整数 | 当前日历日期午夜后的纳秒数 |
| 订单标记 | 9 | 4 | 标记 | 被取消订单的订单标记 |
| 减少数量 | 13 | 4 | 整数 | 从订单中减少的股数。这是增量数量,而不是累计数量 |
| 取消原因 | 17 | 1 | 字母 | 订单减少或取消的原因。参见下表订单取消原因 |
表2:订单取消原因
| 原因 | 描述 |
|---|---|
| U | 用户请求取消订单。响应取消订单消息或替换订单消息 |
| L | 用户已注销 |
| S | 该订单由监管终端手动取消。例如,根据用户请求进行紧急撤回或用户被暂停 |
| I | 具有“立即”有效期的订单已执行,并且在订单簿上没有进一步的匹配时,剩余数量已取消 |
| M | 订单在匹配过程中到期 |
| X | 价格无效 |
| Z | 数量无效 |
| N | 最小数量无效 |
| Y | 订单类型无效 |
| D | 显示类型无效 |
| V | 超过订单价值限制 |
| i | 卖空订单限制 |
| R | 目前不允许该订单 |
| F | 启用流量控制,此 OUCH 端口正在被限制 |
| G | 由于保证金限制,保证金订单已取消 |
| O | 其他 |
7.5 AIQ 取消订单消息
AIQ 取消订单消息通知订单已被交易系统取消以防止自交易。这是订单取消消息的扩展版本,包含被防止交易的详细信息。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 D = AIQ 取消订单消息 |
| 时间戳 | 1 | 8 | 整数 | 当前日历日期午夜后的纳秒数 |
| 订单标记 | 9 | 4 | 标记 | 被取消订单的订单标记 |
| 减少数量 | 13 | 4 | 整数 | 从订单中减少的股数。这是增量数量,而不是累计数量 |
| 取消原因 | 17 | 1 | 字母 | 订单减少或取消的原因。值为 M = 订单在匹配过程中到期 |
| 被阻止交易数量 | 18 | 4 | 整数 | 如果交易发生,本应执行的股数 |
| 执行价格 | 22 | 4 | 整数 | 交易本应执行的价格 |
| 流动性指示器 | 26 | 1 | 字母 | 识别本应交易是否由流动性提供者提供流动性或流动性接受者接受流动性。值:A = 添加(被动方), R = 移除(主动方) |
7.6 订单执行消息
订单执行消息通知订单的全部或部分已执行。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 E = 订单执行消息 |
| 时间戳 | 1 | 8 | 整数 | 当前日历日期午夜后的纳秒数 |
| 订单标记 | 9 | 4 | 标记 | 已执行订单的订单标记 |
| 执行数量 | 13 | 4 | 整数 | 已执行的增量股数 |
| 执行价格 | 17 | 4 | 整数 | 执行股票的价格 |
| 流动性指示器 | 21 | 1 | 字母 | 识别交易是否由流动性提供者提供流动性或流动性接受者接受流动性。值:A = 添加(被动方), R = 移除(主动方) |
| 匹配编号 | 22 | 8 | 整数 | 交易的日唯一参考编号。匹配的买卖执行具有相同的匹配编号 |
7.7 订单拒绝消息
订单拒绝消息可能在新订单消息无法被接受时发送。
| 名称 | 偏移 | 长度 | 类型 | 备注 |
|---|---|---|---|---|
| 消息类型 | 0 | 1 | 字母 | 值为 J = 订单拒绝消息 |
| 时间戳 | 1 | 8 | 整数 | 当前日历日期午夜后的纳秒数 |
| 订单标记 | 9 | 4 | 标记 | 被拒绝订单的订单标记 |
| 拒绝原因 | 13 | 1 | 字母 | 订单被拒绝的原因。参见下表订单拒绝原因 |
表3:订单拒绝原因
| 原因 | 描述 |
|---|---|
| H | 当前有交易暂停,因此此时无法在该订单簿上接受任何订单 |
| S | 订单簿标识符无效 |
| X | 价格无效 |
| Z | 数量无效 |
| N | 最小数量无效 |
| Y | 订单类型无效 |
| D | 显示类型无效 |
| V | 超过订单价值限制 |
| i | 卖空订单限制 |
| R | 目前不允许该订单 |
| F | 启用流量控制,此 OUCH 端口正在被限制 |
| G | 保证金规格无效 |
| L | 该端口不允许 MPID |
| c | 用户无权在给定的板上输入订单 |
| O | 其他 |
修订历史
| 日期 | 版本 | 描述 |
|---|---|---|
| 2012-04-23 | 1.0 | 初始修订 |
| 2012-11-07 | 1.1 | 增加了取消订单消息的数量字段。增加了取消消息的减少数量字段。更新了取消订单原因。更新了拒绝订单原因。 |
| 2012-12-12 | 1.2 | 将公司 ID 字段格式更改为整数。更新了拒绝订单原因。记录断开连接时取消功能始终处于活动状态。 |
| 2013-07-09 | 1.3 | 增加了显示值“P”。更新了取消订单原因。更新了拒绝订单原因。 |
| 2014-03-20 | 1.4 | 增加了 AIQ 取消消息。 |
| 2015-01-22 | 1.5 | 提到 U 市场。 |
| 2016-02-10 | 1.6 | 在取消订单原因和拒绝订单原因中添加了“F |
”。 | | 2017-10-26 | 1.7 | 将订单参考编号字段名替换为订单编号。将证券 ID 字段名替换为订单簿 ID。 | | 2017-11-08 | 1.8 | 在新订单消息和接受消息中添加了订单分类字段。 | | 2017-12-18 | 1.9 | 更改字段名:取消订单原因→订单取消原因,拒绝订单原因→订单拒绝原因。更改消息名:接受消息→订单接受消息,替换消息→订单替换消息,取消消息→订单取消消息,AIQ 取消消息→AIQ 取消订单消息,执行消息→订单执行消息,拒绝消息→订单拒绝消息。 | | 2019-02-21 | 1.10 | 在新订单消息和订单接受消息中添加了现金保证金类型字段。在订单取消原因和订单拒绝原因中添加了“G”。 | | 2019-07-10 | 1.11 | 添加了现金保证金类型值“2”、“3”、“4”和“5”。 | | 2023-02-17 | 1.12 | 将订单簿 ID 类型更改为字母。 |