黄金眼数据查询设计说明
1. 文档目的
本文档用于固化数据中心 WebAPI 一期中黄金眼数据查询的接口契约、字段白名单、查询规则、分页排序规则以及与平台级能力的衔接方式。
当前阶段只输出设计说明,不涉及最终实现代码。
2. 一期范围
2.1 功能范围
一期仅实现黄金眼数据查询能力,作为统一市场数据查询接口中的第一个 queryType。
2.2 数据来源
黄金眼数据当前阶段直接来自 ClickHouse 的两张表:
snapshotgoldeye1dsnapshotgoldeye3s
其中:
snapshotgoldeye1d:历史日表,一天一笔snapshotgoldeye3s:实时 3 秒表,3 秒一笔
按数据中心整体规划,这两类数据理论上都应归入 ADS 层对外交付对象。当前阶段由于尚未完全拆分到独立 ADS 层,因此一期允许直接从 ODS 层 ClickHouse 获取,但接口字段和返回语义应尽量按交付层口径收敛。
2.3 不在一期范围内
- 股票 L1 查询实现
- 多证券批量查询
- 多市场批量查询
- 行情写入
- 自定义排序
- 任意表达式查询
3. 接口位置
黄金眼查询挂在统一市场数据接口下:
POST /api/marketdata/query
一期固定使用:
query_type = goldeneye
4. 查询定位
黄金眼一期查询固定为:
- 单市场查询
- 单证券标识查询
- 指定时间范围查询
- 指定字段白名单查询
- 固定时间倒序分页
5. 请求参数设计
虽然黄金眼当前挂在统一 POST /api/marketdata/query 入口下,但一期请求参数命名和分页语义应尽量遵循《第1期交付设计_v0.96.pdf》的交付契约风格。
黄金眼属于时序查询对象,因此正式时间窗口字段采用 starttime、endtime,分页字段采用 pagesize、pagetoken,证券标识字段采用 symbols。
需要注意的是,黄金眼一期中的 symbols 虽然沿用 PDF 契约名称,但参数值先不带 .XSHG、.XSHE 这类交易所扩展名,直接传证券代码即可。
请求示例如下:
{
"query_type": "goldeneye",
"symbols": [
"009898"
],
"start_time": "2026-06-23 00:00:00",
"end_time": "2026-06-23 16:00:00",
"time_granularity": "AUTO",
"market_id": 153,
"fields": [
"market_id",
"code_str",
"trade_date",
"market_time",
"contracts_0_0",
"amount_1_1"
],
"page_size": 5,
"page_token": null
}
上述示例已在当前生产环境实测通过,可返回“今日最新快照折算后的日级结果”。
5.1 参数说明
| 参数 | 类型 | 必填 | 状态 | 说明 |
|---|---|---|---|---|
query_type | string | 是 | 第1期上线 | 统一市场数据入口的路由参数,一期固定为 goldeneye。 |
symbols | string[] | 是 | 第1期上线 | 一个或多个证券代码。为对齐 PDF 契约,一期正式请求参数使用 symbols;当前黄金眼查询仅支持传入 1 个元素,且参数值不带 .XSHG、.XSHE 等交易所扩展名。 |
start_time | datetime | 是 | 第1期上线 | 查询起始时间,采用本地交易所时间,格式必须为 yyyy-MM-dd HH:mm:ss。 |
end_time | datetime | 是 | 第1期上线 | 查询结束时间,采用本地交易所时间,格式必须为 yyyy-MM-dd HH:mm:ss。 |
time_granularity | string | 是 | 第1期上线 | 查询粒度控制参数,支持 AUTO、DAY、THREE_SECOND。 |
market_id | int | 是 | 第1期上线 | 黄金眼特有扩展参数。当前底层查询仍按 marketid 路由,单次只允许传入一个值;常用值见下方 marketid 对照表。 |
fields | string[] | 是 | 第1期上线 | 指定返回字段。至少传 1 个字段,且仅允许白名单字段。 |
page_size | int | 是 | 第1期上线 | 分页大小,最大 500。 |
page_token | string | 否 | 第1期上线 | seek 翻页标记。首次请求不传,后续原样回传上一页的 nextpagetoken。当前游标为接口内部复合游标,不要求调用方解析。 |
5.1.1 market_id 对照表
| market_id | 中文含义 | RealDataMarketId | 说明 |
|---|---|---|---|
150 | 上海黄金眼网关 | 0 | 对应上海证券交易所黄金眼数据 |
151 | 深圳黄金眼网关 | 1 | 对应深圳证券交易所黄金眼数据 |
152 | 板块黄金眼网关 | 10 | 对应周边市场/板块黄金眼数据 |
153 | 香港黄金眼网关 | 2 | 对应香港黄金眼数据 |
以上映射依据 获取行情数据 项目的 appsettings.json 中 Market 配置整理。当前文档中的已验证示例统一使用 153,因为该市场在现网环境存在稳定可返回样本数据。
5.2 一期固定约束
symbols为正式对外交付参数,一次只允许传入 1 个证券代码,且当前阶段不带交易所扩展名。- 当前黄金眼底层仍按
marketid + codestr命中数据,因此接入层需要能将symbols解析为黄金眼内部定位口径;在标准标识解析能力稳定前,market_id仍作为一期显式参数保留。 starttime、endtime采用左闭右开区间[starttime, endtime)。page_size最大500。- 3 秒实时数据最多查近
7天。 AUTO即使结束日期落在今天,也只补当天最后一条 3 秒记录,不受“近 7 天 3 秒明细跨度”限制。- 历史日线最多查近
3年。 starttime < endtime。fields直接使用数据库标准字段名。fields至少传 1 个字段。- 不允许请求未开放字段。
- 不允许自定义排序字段。
- 排序固定按时间倒序返回。
5.3 time_granularity 取值说明
time_granularity 用于控制查询应优先命中哪一类数据表,以及返回结果的时间粒度。
5.3.1 AUTO
AUTO 是一期默认取值,适用于“由系统自动判断历史日表和当日 3 秒表如何拼接”的场景。
具体规则如下:
- 当
endtime不在今天时,只查询snapshotgoldeye_1d。 - 当
end_time落在今天时:
- 今天之前的数据查
snapshotgoldeye1d - 今天当天不返回整段 3 秒明细,只取
snapshotgoldeye3s中该证券当天market_time最大的一条记录 - 这条记录按“今天的日线数据”参与拼接返回
适用场景:
- 调用方不想自己区分历史和实时数据来源。
- 希望在一个请求中自动拿到“历史日线 + 今日最新快照”的混合结果。
- 黄金眼默认查询场景。
5.3.2 DAY
DAY 表示强制按日粒度查询,只返回日表数据。
具体规则如下:
- 只查询
snapshotgoldeye1d。 - 返回结果以
trade_date为主时间字段。 - 即使
endtime落在今天,也不返回snapshotgoldeye_3s的盘中数据。 - 当前口径下可视为“只查历史日表”;当天数据不由
DAY主动补齐。
适用场景:
- 只需要历史日统计数据。
- 做日级分析、日级回测、离线汇总。
- 明确不需要盘中 3 秒明细。
5.3.3 THREE_SECOND
THREE_SECOND 表示强制按 3 秒粒度查询,只返回实时 3 秒表数据。
具体规则如下:
- 只查询
snapshotgoldeye3s。 - 返回结果以
market_time为主时间字段。 - 不返回任何
snapshotgoldeye1d的历史日表记录。 - 查询时间范围仍受“最多近 7 天”的限制。
适用场景:
- 只需要盘中 3 秒级明细。
- 做实时监控、盘中分析、短周期行为观察。
- 调用方明确要排除历史日聚合结果。
6. 数据来源路由规则
6.1 基本规则
黄金眼查询按时间范围路由到底层两张表:
- 当
timegranularity = DAY时,只查询snapshotgoldeye_1d - 当
timegranularity = THREESECOND时,只查询snapshotgoldeye3s - 当
timegranularity = AUTO且endTime不在今天时,只查询snapshotgoldeye_1d - 当
time_granularity = AUTO且endTime落在今天时:
- 今天之前的数据查
snapshotgoldeye1d - 今天当天只取
snapshotgoldeye3s中最后一条记录参与拼接
6.2 今日数据规则
今天的数据不直接返回整段 snapshotgoldeye3s 明细,而是只取当天最后一条记录,按今天日线口径参与返回。
这样可以避免:
- 同一天同时出现大量 3 秒明细和历史日线混在一起
AUTO与THREE_SECOND的职责边界不清- 调用方对“今日数据到底是明细还是日级快照”产生混淆
6.3 分页与排序
实现时需保证:
- 历史与实时数据统一合并
- 合并后按时间倒序排序
- 排序后再分页
- 分页基于时间倒序 seek 游标,下一页通过
nextpagetoken -> page_token延续 - 复合游标按当前粒度选择次级排序键:
DAY使用tradedate + sourcerecord_indexTHREESECOND使用markettime + insert_time
7. 对外字段策略
7.1 设计原则
当前阶段不再对黄金眼字段做接口层重命名映射,直接使用数据库字段定义。
原则如下:
fields参数直接传数据库标准字段名- 返回结果字段名直接使用数据库标准字段名
- 仅允许白名单字段
- 非白名单字段直接拒绝
- 未启用字段应返回明确错误,不得返回推断值或占位值
7.2 公共字段
一期建议保留以下直接可见的核心字段:
market_idcode_strtrade_datemarket_timesourcerecordindeximported_atinsert_time
7.3 黄金眼业务字段白名单
一期建议直接按数据库字段名开放黄金眼字段,并在文档中同步保留中文说明,便于调用方理解字段业务含义。
字段使用补充说明:
tradedate、sourcerecordindex、importedat只在日线表snapshotgoldeye1d中可用。markettime、inserttime只在 3 秒表snapshotgoldeye3s中可用。- 其它 24 个黄金眼业务字段在日线表和 3 秒表中都可用。
- 大小单编码说明:
0表示买方,1表示卖方0表示庄单,1表示大单,2表示中单,3表示小单
7.3.1 定位与时间字段
| 字段名 | 适用粒度 | 中文说明 |
|---|---|---|
market_id | DAY / THREE_SECOND / AUTO | 市场 ID,具体取值见上方 market_id 对照表 |
code_str | DAY / THREE_SECOND / AUTO | 证券代码 |
trade_date | DAY / AUTO | 日线记录的交易日期 |
market_time | THREE_SECOND / AUTO | 3 秒行情记录时间 |
sourcerecordindex | DAY | 日线表内部排序辅助序号 |
imported_at | DAY | 日线记录导入时间 |
insert_time | THREE_SECOND | 3 秒记录入库时间 |
7.3.2 黄金眼业务字段
| 字段名 | 中文说明 |
|---|---|
contracts00 | 买方庄单成交笔数 |
volume00 | 买方庄单成交量 |
amount00 | 买方庄单成交额 |
contracts01 | 买方大单成交笔数 |
volume01 | 买方大单成交量 |
amount01 | 买方大单成交额 |
contracts02 | 买方中单成交笔数 |
volume02 | 买方中单成交量 |
amount02 | 买方中单成交额 |
contracts03 | 买方小单成交笔数 |
volume03 | 买方小单成交量 |
amount03 | 买方小单成交额 |
contracts10 | 卖方庄单成交笔数 |
volume10 | 卖方庄单成交量 |
amount10 | 卖方庄单成交额 |
contracts11 | 卖方大单成交笔数 |
volume11 | 卖方大单成交量 |
amount11 | 卖方大单成交额 |
contracts12 | 卖方中单成交笔数 |
volume12 | 卖方中单成交量 |
amount12 | 卖方中单成交额 |
contracts13 | 卖方小单成交笔数 |
volume13 | 卖方小单成交量 |
amount13 | 卖方小单成交额 |
7.4 字段治理建议
虽然当前阶段不做字段重命名映射,但仍建议保留字段白名单治理能力。
推荐规则:
- 只开放对外交付需要的数据库字段
- 不暴露导入辅助字段、内部技术字段或临时字段
- 对后续字段按“第1批上线 / 上线前补齐 / 后续提供”分类管理
- 请求未开放字段时,应返回明确错误
8. 响应结构设计
建议统一响应如下:
{
"code": "SUCCESS",
"message": "请求成功",
"traceId": "TRACE-20260623-000001",
"data": {
"query_type": "goldeneye",
"items": [
{
"market_id": 153,
"code_str": "009898",
"market_time": "2026-06-23T15:59:54",
"trade_date": "2026-06-23",
"contracts_0_0": 0,
"amount_1_1": 0.00
}
],
"page": {
"page_size": 5,
"next_page_token": null,
"total": 1
}
},
"page": {
"page_size": 5,
"next_page_token": null,
"total": 1
}
}
8.1 顶层字段
| 字段名 | 说明 |
|---|---|
code | 响应码 |
message | 响应说明 |
traceId | 请求追踪标识 |
data | 业务数据 |
page | 分页信息 |
其中分页字段补充约定:
page_size表示本次请求的页大小。nextpagetoken为下一页 seek 游标,没有下一页时返回null。total表示当前查询条件下的真实总量,而不是当前页返回条数。nextpagetoken属于不透明复合游标,调用方只需原样回传,不应依赖其内部编码格式。
8.3 Swagger 联调分页示例
为了避免调用方在 Swagger 页面上把 page_token 写错,建议按下面的方式调试:
- 第一页请求时,可以完全不传
page_token。 - 如果需要显式传空值,必须写成合法 JSON:
"page_token": null。 - 不要写成
page_token:null,因为这不是合法 JSON,请求会在进入业务前就被拦截。 - 当响应返回
page.nextpagetoken后,下一页请求只需要把该值原样回填到page_token。 - 下一页请求除了
page_token外,其余查询条件应保持不变。
8.2 items 公共字段
| 字段名 | 说明 |
|---|---|
market_id | 市场 ID,具体取值见 market_id 对照表 |
code_str | 证券代码 |
trade_date | 日线记录的交易日 |
market_time | 3 秒记录的行情时间 |
9. 与平台能力的衔接
黄金眼查询虽然是一期唯一业务查询能力,但实现时应保持与平台级能力的衔接扩展点,而不是单独做一套封死结构。
一期建议实际落地的能力:
- 字段白名单校验
- 统一请求结构
- 统一响应结构
- 统一异常处理
后续扩展预留能力:
- Token 鉴权入口
- 用户与企业权限判断
- 数据集权限校验
- 限流与配额控制
- 统一审计日志
10. Token 预留设计
当前阶段黄金眼查询接口需要接入一期简化登录能力。
Token 传递方式约定如下:
Authorization: Bearer
一期建议:
- 通过
POST /api/auth/login在首次使用时传递用户名和密码,获取token - 首次登录响应中返回后续续期所需的会话凭证字段,例如
refresh_token - 后续通过
POST /api/auth/refresh完成续期、换发或会话变更,不再重复传递用户名和密码 - 黄金眼查询接口请求头必须携带 Token
- 服务端校验 Token 有效性
- 后续如鉴权方案明确,再补用户、企业、权限、配额逻辑
11. 后续待确认项
在代码落地前,建议继续确认:
- 黄金眼数据库字段白名单最终清单
- 黄金眼 1D 与 3S 结果字段的统一对外可见范围
- 黄金眼查询错误码与参数校验规则
- ClickHouse 查询超时、连接池与熔断策略
/api/marketdata/query后续扩展到股票 L1 的路由规则- 后续统一鉴权方案明确后的接入方式