FastTick 行情分发接口协议规范 (API Specification)
本文档面向接入 FastTick 行情分发系统的下游商业客户、量化交易员及技术团队。协议版本 v1。
1. 通用约定
| 项目 | 约定 |
|---|---|
| 基础地址 | REST:https://api.example.com/api/v1;WebSocket:wss://api.example.com/ws/v1 |
| 时间戳 | 除 K 线的 open_time 为 UTC 秒外,其余一律为 UTC 毫秒 |
| 价格与数量 | 字符串,已按品种精度格式化(如 "67520.50"),客户端不要用浮点解析后再格式化 |
| 涨跌幅 | change_24h 为百分比,带符号的字符串,"+1.65" 表示上涨 1.65% |
| 字符编码 | UTF-8 |
| 数据格式 | 默认 JSON;可通过 ?format=msgpack(REST)或鉴权帧 "format":"msgpack"(WS)切换为 MessagePack,字段名与结构和 JSON 完全相同 |
| 版本与弃用 | 路径带版本号 /v1。接口变更不破坏兼容;必须破坏时发布 /v2,旧版本至少保留 90 天,并在响应头返回 Sunset 日期 |
1.1 每次响应都携带的字段
{
"code": 0,
"msg": "success",
"data": {},
"request_id": "6f1c2a9e-7d4b-4a1e-9c2f-1b3d5e7a9c01",
"timestamp": 1700000000123
}
request_id 用于排查问题,客户反馈时请提供。
1.2 限流响应头
所有 REST 响应都带有:
| 响应头 | 说明 |
|---|---|
X-RateLimit-Limit |
套餐的 QPS 上限 |
X-RateLimit-Remaining |
当前这一秒剩余可用次数 |
X-RateLimit-Reset |
配额重置的毫秒时间戳 |
Retry-After |
仅 429 时返回,建议等待的秒数 |
限流按订阅统计(同一订阅下的所有 Token 共享套餐配额)。
2. 认证鉴权:Token 接入
2.1 凭证体系
购买套餐后,客户只拿到一个 Token,直接在请求里使用,没有换取步骤:
| 项目 | 说明 |
|---|---|
| 形态 | 不透明随机字符串,形如 ft_live_9f2c1d7a4b8e5061c3d2e7f8a9b0c1d2 |
| 有效期 | 不设过期时间,长期有效,直到被吊销或所属订阅终止 |
| 用途 | 请求行情接口、资讯接口,或建立 WebSocket 连接 |
| 数量 | 每个订阅可创建多个 Token(如生产、测试各一个),数量受套餐限制 |
| 获取 | 购买成功后在控制台「接入凭证」中查看、复制;也可随时重置 |
为什么 Token 不设过期时间:行情接入是长期运行的服务端程序,让客户每隔几小时刷新一次凭证,会显著增加对接成本,而且客户往往把凭证写死在配置里,定时刷新反而更容易写错。因此 FastTick 采用「凭证长期有效 + 服务端实时控制」的模式:能不能用,不取决于 Token 自身的有效期,而取决于它所属订阅的当前状态。
代价是 Token 一旦泄露就是长期有效,所以必须配合 2.6 节的重置、白名单与告警机制。
2.2 获取 Token
- 支付成功、订阅开通后,系统自动生成一个名为
default的 Token,并邮件通知客户到控制台查看。 - 客户在控制台「接入凭证」页面可以随时查看完整 Token(需要两步验证),支持一键复制。
- 客户也可以为不同用途创建多个 Token 并分别命名。
Token 属于订阅,订阅终止后全部 Token 同时失效。
2.3 使用 Token 访问 REST
GET /api/v1/ticker?symbol=BTC/USDT HTTP/1.1
Host: api.example.com
Authorization: Bearer ft_live_9f2c1d7a4b8e5061c3d2e7f8a9b0c1d2
也可以是专门的请求头(二选一):
X-API-Token: ft_live_9f2c1d7a4b8e5061c3d2e7f8a9b0c1d2
- 只接受请求头传递。不支持
?token=、?apikey=等 URL 参数,出现即返回401,避免凭证进入网关日志和浏览器历史。 - Token 错误时统一返回
token_invalid,不区分"不存在"与"已删除",避免被用于探测。
权限范围(scopes)分为两条独立产品线,令牌上可以同时签入,但每个接口只认自己那一个:
| scope | 覆盖接口 | 说明 |
|---|---|---|
ticker |
/api/v1/ticker、/api/v1/tickers、/api/v1/symbols |
实时快照 |
kline |
/api/v1/klines |
历史与实时 K 线 |
depth |
/api/v1/depth、WS depth 流 |
L2 盘口,套餐需 depth_levels > 0 |
news |
/api/v1/news/flash、WS 无 |
7x24 快讯,套餐需 news_enabled = 1 |
calendar |
/api/v1/news/calendar |
财经日历,套餐需 calendar_enabled = 1 |
资讯类 scope 与行情类 scope 互不影响:
- 只买行情的套餐只能签
ticker/kline/depth,打资讯接口返回403 scope_not_allowed; - 只买资讯的套餐只能签
news/calendar,打行情接口同样403; - 同一订阅可签发多个 Token(如「生产行情」「内部资讯」分开),各自最小授权。
两层判定:接口权限 = Token 上的 scope 且 订阅快照里的套餐开关。套餐降级或后台关闭资讯后,旧 Token 上残留的 news/calendar 立即失效(403 scope_not_allowed),无需客户重置 Token。
2.4 WebSocket 接入
连接 wss://api.example.com/ws/v1 后,在 5 秒内发送鉴权帧,否则服务端以 4001 关闭:
{
"action": "auth",
"token": "ft_live_9f2c1d7a4b8e5061c3d2e7f8a9b0c1d2",
"format": "json"
}
服务端确认:
{
"event": "auth",
"code": 0,
"msg": "Authenticated",
"subscription_id": 88,
"plan": "forex_pro",
"scopes": ["ticker", "kline", "depth"],
"subscription_expire_time": 1798761600000,
"seq_epoch": 1792800000000
}
subscription_expire_time 是订阅到期时间,仅供客户端展示和提前提醒,服务端不依赖客户端遵守它。
seq_epoch 表示本条连接上的序列号从该值开始计数,客户端可用它识别连接是否重建。
2.5 到期与停用控制
这是「Token 不设过期」能够成立的关键。控制分四层,任何一层生效都能停止服务。
第一层:每个请求都校验订阅状态
引擎不在每个请求上查库,而是在本地内存中维护一份凭证状态表:
token_hash → { subscription_id, status, expire_time, grace_endtime, scopes, ip_whitelist, version }
校验链(全部在内存中完成,无网络往返):
- Token 格式合法 → 否则
401 token_invalid - 哈希命中状态表 → 未命中则
401 token_invalid(可能是已删除或从未存在) - 状态为
normal→ 为disabled则401 token_disabled now < expire_time + grace→ 否则402 subscription_expired- 订阅状态属于
trial/active/grace→ 否则402 subscription_expired scopes包含本次所需权限 → 否则403 scope_not_allowed- IP 在白名单内 → 否则
403 ip_not_allowed
第二层:订阅到期时主动断开已建立的连接
引擎加载凭证时已经知道 expire_time,因此为每个订阅在本地注册一个到期定时器:
- 到达
expire_time:进入宽限期(默认 24 小时),期间正常服务,但推送帧中带expiring: true,提示客户端续费。 - 到达
grace_endtime:立即执行- 该订阅下所有 WebSocket 连接以
4004关闭 - 该订阅下所有 Token 从状态表中标记为过期,之后任何 REST 请求返回
402
- 该订阅下所有 WebSocket 连接以
- 这一步不依赖 phpback 通知,也不依赖数据库可用性,即使业务库暂时不可用,到期也会在秒级内准时生效。
第三层:后台操作即时生效(事件驱动)
客户续费、升级、退款、被后台停用时,phpback 在事务提交后向 Redis 发布变更:
{"type": "subscription", "subscription_id": 88, "op": "upsert", "version": 1793059200123}
引擎收到后立即更新状态表。需要立刻断开的场景(停用、退款终止、重置 Token)会附带 op: "revoke",引擎在收到后立即断开对应连接,延迟通常在 100 毫秒以内。
第四层:兜底轮询
Redis Pub/Sub 不保证送达(节点重启、网络抖动期间的消息会丢),因此引擎另外每 30 秒按 updatetime 增量拉取一次变更,并用全局 config_version 比对。任何一层遗漏都会在 30 秒内被纠正。
整体时效
| 事件 | 生效延迟 | 说明 |
|---|---|---|
| 订阅自然到期 | ≤ 1 秒 | 本地定时器,最可靠 |
| 后台停用 / 退款终止 / 重置 Token | ≤ 100 毫秒 | Redis 通知 |
| 通知丢失时的纠正 | ≤ 30 秒 | 兜底轮询 |
| 续费后恢复服务 | ≤ 100 毫秒 | 同上 |
边界情况
| 情况 | 处理 |
|---|---|
| 引擎节点与 Redis 同时失联 | 状态表仍按本地 expire_time 正常到期,服务不会超期提供数据 |
| 引擎刚启动、状态表尚未加载完成 | 先全量加载再开放流量;加载完成前返回 503,不会放行 |
| 客户修改本机时间 | 无影响,时间判断全部在服务端 |
| 客户在到期前一刻建立连接 | 连接建立后仍受本地定时器约束,到期照样断开 |
| 续费发生在宽限期内 | 恢复为 active,已断开的连接需客户端重连,无需更换 Token |
2.6 重置、吊销与安全
因为 Token 长期有效,泄露后的处置必须简单可靠:
| 操作 | 效果 | 建议场景 |
|---|---|---|
| 重置 Token | 生成新 Token,旧 Token 立即失效(递增 token_version) |
怀疑泄露、员工离职、更换对接程序 |
| 停用 Token | 保留记录但停止使用,可随时恢复 | 临时下线某个环境 |
| 删除 Token | 记录软删除,立即失效 | 清理不再使用的凭证 |
| 订阅终止 | 该订阅下所有 Token 失效 | 退款、封禁 |
其他安全措施
- IP 白名单:Token 可绑定单个 IP 或 CIDR 网段,非白名单来源直接
403。 - 域名白名单(可选):如果客户要在浏览器里直连 WebSocket,可绑定来源域名,服务端校验
Origin头,降低 Token 被复制到其他网站的风险。但仍然强烈建议 Token 只放服务端,因为长期 Token 放进前端等于对所有人公开。 - 异常使用告警:同一 Token 在短时间内出现多个地理位置、或调用量突增时,控制台与后台都会显示风险提示,并可一键停用。
- 查看完整 Token 需要两步验证,避免后台账号被盗后直接获取凭证。
- 日志脱敏:FastTick 自己的访问日志只记录 Token 前 12 位(如
ft_live_9f2c…),不记录完整值。
Token 长度固定为 40 字符:ft_live_(8 字符)+ 16 字节随机值的 32 位小写十六进制。其他文档中的示例若与此不一致,以本节为准。
泄露后的标准处置(文档中会提供给客户的应急步骤):
- 控制台重置 Token,旧 Token 立即失效;
- 检查用量与在线连接记录,确认是否有异常调用;
- 绑定 IP 白名单,缩小可用范围;
- 如产生超额调用,按服务协议处理。
2.7 鉴权失败
{
"code": 401,
"msg": "Unauthorized: token invalid",
"reason": "token_invalid",
"data": null,
"request_id": "…",
"timestamp": 1700000000000
}
| reason | code | 含义 | 处理建议 |
|---|---|---|---|
token_missing |
401 |
未携带 Token | 补充请求头或 auth 帧 |
token_invalid |
401 |
Token 不存在、已删除或格式错误 | 到控制台核对并复制完整 Token |
token_disabled |
401 |
Token 被停用 | 启用或重置 Token |
subscription_expired |
402 |
订阅已过期、宽限期结束或已停用 | 续费后即可恢复,无需更换 Token |
ip_not_allowed |
403 |
IP 不在白名单 | 检查白名单与出口 IP |
symbol_not_allowed |
403 |
套餐不含该品种 | 检查套餐权益 |
scope_not_allowed |
403 |
Token 权限范围不含该接口;或套餐未开通快讯/日历 | 检查 Token scopes 与套餐权益(news_enabled / calendar_enabled) |
rate_limited |
429 |
超过 QPS | 参考 Retry-After |
注意 subscription_expired 与凭证无关:客户续费后,原来的 Token 立刻恢复可用,不需要重新生成,这是长期 Token 方案的重要体验优势。
3. HTTP REST API
3.1 单个品种实时快照
GET /api/v1/ticker?symbol=BTC/USDT
{
"code": 0,
"msg": "success",
"data": {
"symbol": "BTC/USDT",
"category": "crypto",
"digits": 2,
"bid": "67520.50",
"ask": "67521.10",
"last": "67520.80",
"bid_size": "2.40",
"ask_size": "1.85",
"volume_24h": "12845.62",
"high_24h": "68100.00",
"low_24h": "66400.00",
"change_24h": "+1.65",
"source": "binance",
"ts": 1700000000123,
"server_ts": 1700000000125,
"stale": false,
"seq": 918273645
},
"request_id": "…",
"timestamp": 1700000000126
}
| 字段 | 说明 |
|---|---|
digits |
价格小数位,客户端据此自行格式化(接口已格式化为字符串,此字段供客户端做计算用) |
ts |
该笔行情在上游的产生时间。注意口径:快照由多路流合并而成,ts 取「最近一笔有交易所时间戳的更新」(成交/统计),而 bid/ask 来自不带上游时间戳的盘口流,其接收时间记在 server_ts。因此对成交稀疏的品种,server_ts - ts 会显著大于真实链路延迟,不要用它做延迟监控,判断数据新鲜度请用 stale |
server_ts |
FastTick 收到并处理最新一次更新(任意流)的时间 |
stale |
上游超过阈值无更新时为 true,此时字段仍是最后一次有效价格,客户端应据此提示“行情延迟/暂停”,不要当成实时价 |
seq |
该品种的全局递增序列号,用于发现丢帧 |
3.2 批量快照
GET /api/v1/tickers?symbols=BTC/USDT,ETH/USDT,EUR/USD&compact=1
symbols省略时返回套餐权限内的全部品种。compact=1时只返回symbol、bid、ask、last、ts、stale、seq,用于行情列表页。- 响应为
data: [ … ]数组,单个品种的字段与 3.1 相同。 - 单次请求最多 200 个品种,超出返回
400。
3.3 L2 深度
GET /api/v1/depth?symbol=BTC/USDT&limit=10
{
"code": 0,
"msg": "success",
"data": {
"symbol": "BTC/USDT",
"bids": [["67520.50", "1.520"], ["67519.80", "2.100"]],
"asks": [["67521.10", "0.950"], ["67522.00", "3.240"]],
"ts": 1700000000123,
"stale": false,
"last_update_id": 88213
}
}
limit默认 10,最大50,同时受套餐depth_levels限制(套餐无深度权益时返回403)。- 数组元素为
[价格, 数量],均为字符串。 - 深度数据依赖上游提供 L2,并非所有品种都有;无深度数据的品种返回
404。
3.4 K 线(历史与实时)
GET /api/v1/klines?symbol=BTC/USDT&interval=1m&limit=100&end_time=1700000000000
| 参数 | 必填 | 说明 |
|---|---|---|
symbol |
是 | 标准品种代码 |
interval |
是 | 1m 5m 15m 30m 1h 4h 1d |
limit |
否 | 返回根数,默认 100,最大 1000 |
end_time |
否 | 毫秒时间戳,返回该时间及之前的 K 线;省略时返回最新的 limit 根。向前翻页时传入上一页最早一根的 open_time |
{
"code": 0,
"msg": "success",
"data": {
"symbol": "BTC/USDT",
"interval": "1m",
"digits": 2,
"bars": [
{
"open_time": 1700000000,
"open": "67500.00",
"high": "67530.00",
"low": "67490.00",
"close": "67520.50",
"volume": "12.8400",
"tick_count": 214,
"closed": true
}
]
},
"request_id": "…",
"timestamp": 1700000001000
}
open_time为 UTC 秒,即该 K 线的开盘时间;4h、1d按品种所属市场的交易日起点对齐,因此不一定是 14400 或 86400 的整数倍。- K 线按
open_time升序返回。 closed为false表示这是当前尚未收盘的 K 线(从内存实时合成,不经数据库)。- 历史深度受套餐
history_days限制,超出范围返回400并在msg中说明可查询的最早时间。 - 周期
4h和1d在部分套餐中不可用,见定价页;套餐的allowed_intervals为空表示全部周期可用。
3.5 品种列表
GET /api/v1/symbols?category=forex
{
"code": 0,
"msg": "success",
"data": [
{
"symbol": "EUR/USD",
"category": "forex",
"display_name": "Euro / US Dollar",
"digits": 5,
"volume_digits": 0,
"intervals": ["1m", "5m", "15m", "30m", "1h", "4h", "1d"],
"has_depth": true
}
]
}
只返回当前套餐权限内的品种。此接口的 QPS 与其他接口共享套餐配额。
3.6 资讯:7x24 快讯
GET /api/v1/news/flash?lang=zh-cn&limit=20&before_time=1700000000
需要 scope news。lang 只支持 zh-cn / en;limit 上限 200,同时受套餐 news_max_limit 收紧;before_time 用于翻页。
{
"code": 0,
"msg": "success",
"data": {
"lang": "zh-cn",
"items": [
{"id": 1002433844, "time": 1793288641, "title": "…", "content": "…", "important": false, "tags": []}
],
"updated_at": 1793288641,
"stale": false,
"count": 20
},
"request_id": "…",
"timestamp": 1793288641000
}
stale=true 表示上游超过 5 分钟没有新内容,前端应提示"延迟",不要当成实时流。
3.7 资讯:财经日历
GET /api/v1/news/calendar?lang=zh-cn&start=2026-10-01&end=2026-10-31&tabs=4
需要 scope calendar。start / end 为 YYYY-MM-DD,区间不超过 31 天;tabs 只支持 2,3,4,5,6。
{
"code": 0,
"msg": "success",
"data": {
"lang": "zh-cn",
"days": [
{"date": "2026-10-29", "items": [{"id": "…", "time": "20:30", "title": "…", "importance": 3, "actual": "", "forecast": "…", "previous": "…"}]}
],
"updated_at": 1793288635,
"stale": false,
"count": 38
}
}
资讯接口同样共享套餐 QPS:资讯与行情合计扣减同一个令牌桶,429 与 X-RateLimit-* 响应头口径和行情接口一致。
冷启动(进程刚启动、首轮抓取未完成)返回 503,客户端应退避重试,不要当成"没有数据"。
3.8 资讯:服务状态
GET /api/v1/news/status
运维接口:内部网关 Token,或任意持有 news / calendar 的客户 Token 可读。返回各语言的快讯/日历条数、最近更新时间与各条抓取线路的健康度。
4. WebSocket 实时分发
4.1 连接与鉴权
wss://api.example.com/ws/v1
流程:连接 → 5 秒内发送 auth 帧(见 2.4)→ 收到 auth 确认 → 发送 subscribe。
Token 长期有效,连接建立后不需要定期更换凭证。订阅到期时服务端会主动以 4004 关闭连接。
4.2 客户端指令
所有指令都带 id,服务端回复会原样带回,便于匹配请求与响应。
订阅
{
"action": "subscribe",
"id": "req-1001",
"symbols": ["BTC/USDT", "ETH/USDT", "EUR/USD"],
"streams": ["ticker", "kline"],
"interval": "1m"
}
| 字段 | 说明 |
|---|---|
symbols |
本次订阅的品种;单连接累计订阅数受套餐 max_sub_symbols 限制 |
streams |
可订阅 ticker(默认)、depth、kline |
interval |
仅 kline 流使用 |
{
"event": "subscribe",
"id": "req-1001",
"code": 0,
"msg": "Subscribed successfully",
"subscribed": ["BTC/USDT", "ETH/USDT", "EUR/USD"],
"rejected": [{"symbol": "XAU/USD", "code": 403, "msg": "not allowed by plan"}]
}
- 订阅成功后,服务端会立即为每个品种推送一次当前快照(
snapshot: true),随后是增量推送。客户端不必再调用 REST 初始化。 - 部分品种无权限时,其余品种照常订阅,被拒绝的放在
rejected中。
取消订阅
{ "action": "unsubscribe", "id": "req-1002", "symbols": ["ETH/USDT"] }
查询当前订阅
{ "action": "list", "id": "req-1003" }
心跳
{ "action": "ping", "timestamp": 1700000000123 }
{ "event": "pong", "timestamp": 1700000000124 }
- 客户端应在 30 秒内至少发送一次
ping或任意指令;超过 60 秒无任何数据交互,服务端以4008关闭。 - 浏览器无法发送原生 ping 帧,因此业务层
ping是必需的。 - 服务端也会定期发送协议层 Ping,客户端库通常会自动回复 Pong。
4.3 行情推送帧
Ticker
{
"stream": "ticker",
"symbol": "BTC/USDT",
"snapshot": false,
"seq": 918273646,
"data": {
"symbol": "BTC/USDT",
"digits": 2,
"bid": "67520.50",
"ask": "67521.10",
"last": "67520.80",
"bid_size": "2.40",
"ask_size": "1.85",
"volume_24h": "12845.62",
"high_24h": "68100.00",
"low_24h": "66400.00",
"change_24h": "+1.65",
"source": "binance",
"ts": 1700000000123,
"server_ts": 1700000000125,
"stale": false,
"expiring": false
}
}
expiring 为 true 表示该订阅已过期并处于宽限期,服务即将停止。客户端收到后应提示客户续费;宽限期结束后连接会被以 4004 关闭。该字段只出现在订阅进入宽限期期间,正常情况恒为 false。
序列号(seq)规则:seq 是每个品种的全局递增整数,与连接无关。
- 客户端发现
seq不连续,说明中间有帧丢失(正常只会发生在慢客户端被合并的情况下)。 - 丢失后应主动发一次
{"action":"subscribe","symbols":["BTC/USDT"]}重新获取快照,或调用 REST 快照。 - 服务端对慢客户端只保留每个品种的最新一帧,因此
seq跳号是预期行为,不会影响价格正确性,但会丢掉中间的 tick。
K 线推送(订阅 kline 流时)
{
"stream": "kline",
"symbol": "BTC/USDT",
"interval": "1m",
"seq": 918273647,
"data": {
"open_time": 1700000000,
"open": "67500.00",
"high": "67530.00",
"low": "67490.00",
"close": "67520.50",
"volume": "12.8400",
"tick_count": 214,
"closed": false
}
}
- 未收盘的 K 线按套餐
push_interval_ms节流推送;收盘时推送一次closed: true的最终值,此后该open_time不再推送。
深度推送(订阅 depth 流时,需要套餐含深度权益)
{
"stream": "depth",
"symbol": "BTC/USDT",
"seq": 918273648,
"data": {
"bids": [["67520.50", "1.520"]],
"asks": [["67521.10", "0.950"]],
"last_update_id": 88214,
"ts": 1700000000123,
"stale": false
}
}
深度为全量快照推送(不做增量),档数等于套餐的 depth_levels。
4.4 服务端错误帧
{
"event": "error",
"id": "req-1004",
"code": 429,
"msg": "rate limit exceeded",
"timestamp": 1700000000124
}
业务错误(如订阅超限)返回错误帧后连接保持不断开;严重错误才关闭连接。
4.5 关闭码
| 关闭码 | 含义 | 客户端处理 |
|---|---|---|
1000 |
正常关闭 | 无需重连 |
4001 |
5 秒内未完成鉴权 / Token 无效 | 到控制台核对 Token 后重连 |
4002 |
鉴权后 Token 被停用、删除或重置 | 停止重连,到控制台查看凭证状态 |
4003 |
IP 不在白名单 | 停止重连,检查出口 IP |
4004 |
订阅已过期或已停用 | 停止重连,续费后重连(Token 不用换) |
4008 |
心跳超时 | 立即重连,并确保按时发 ping |
4029 |
超出套餐并发连接数 | 关闭冗余连接后再重连 |
1011 |
服务端内部错误 | 指数退避重连 |
重连建议:4001~4004 属于凭证或权限问题,不要盲目重连,应先到控制台核实;4008、1011 使用指数退避(1s、2s、4s…上限 30s),并带随机抖动。4004 在客户续费后即可重连成功,无需更换 Token。
5. 状态码与异常
5.1 HTTP 状态码
| HTTP 状态 | 说明 |
|---|---|
200 |
请求已处理,业务结果看响应体里的 code |
400 |
参数错误 |
401 |
未认证(Token 缺失、无效、已停用或已重置) |
403 |
无权限(IP、品种、深度、周期) |
404 |
品种不存在或无该数据 |
429 |
超出 QPS |
500 / 502 / 503 |
服务端异常,请带 request_id 联系客服 |
5.2 业务错误码(响应体 code)
| code | 含义 | 处理建议 |
|---|---|---|
0 |
成功 | 正常处理 |
400 |
参数错误(品种不存在、周期不支持、limit 超限、超出历史天数) | 按 msg 修正参数 |
401 |
Token 缺失、无效、已停用或已重置(具体看 reason) |
到控制台核对 Token;见 2.7 |
402 |
订阅已过期或已停用 | 在客户控制台续费,或联系客服 |
403 |
IP 被拒绝 / 套餐无该品种、深度、周期权限 / scope 不足 | 检查白名单与套餐权益 |
404 |
品种不存在 | 用 /symbols 确认可用品种 |
429 |
超过套餐 QPS | 降低频次,参考 Retry-After |
430 |
WS 并发连接数超限 | 关闭冗余连接或升级套餐 |
500 |
服务端错误 | 带 request_id 联系客服 |
5.3 数据质量约定
| 项目 | 约定 |
|---|---|
| 时间戳 | 一律 UTC,客户端负责转换本地时区 |
| 汇率/外汇周末 | 休市期间无 Tick,stale 为 true,K 线不生成空 bar(与 MT4/MT5 一致) |
| 深度 | 仅部分品种提供;依赖上游 L2 数据 |
| 24 小时字段 | volume_24h、high_24h、low_24h、change_24h 基于滚动 24 小时计算,外汇为最近 24 个交易小时 |
| 数据修正 | 若上游出现异常数据,FastTick 会重算受影响的 K 线。客户端如发现历史 K 线变化,属于修正而非错误 |