API_SPEC.md Base URL: https://api.example.com/api/v1

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

  1. 支付成功、订阅开通后,系统自动生成一个名为 default 的 Token,并邮件通知客户到控制台查看。
  2. 客户在控制台「接入凭证」页面可以随时查看完整 Token(需要两步验证),支持一键复制。
  3. 客户也可以为不同用途创建多个 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 }

校验链(全部在内存中完成,无网络往返):

  1. Token 格式合法 → 否则 401 token_invalid
  2. 哈希命中状态表 → 未命中则 401 token_invalid(可能是已删除或从未存在)
  3. 状态为 normal → 为 disabled 则 401 token_disabled
  4. now < expire_time + grace → 否则 402 subscription_expired
  5. 订阅状态属于 trial / active / grace → 否则 402 subscription_expired
  6. scopes 包含本次所需权限 → 否则 403 scope_not_allowed
  7. IP 在白名单内 → 否则 403 ip_not_allowed

第二层:订阅到期时主动断开已建立的连接

引擎加载凭证时已经知道 expire_time,因此为每个订阅在本地注册一个到期定时器:

  • 到达 expire_time:进入宽限期(默认 24 小时),期间正常服务,但推送帧中带 expiring: true,提示客户端续费。
  • 到达 grace_endtime:立即执行
    • 该订阅下所有 WebSocket 连接以 4004 关闭
    • 该订阅下所有 Token 从状态表中标记为过期,之后任何 REST 请求返回 402
  • 这一步不依赖 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 位小写十六进制。其他文档中的示例若与此不一致,以本节为准。

泄露后的标准处置(文档中会提供给客户的应急步骤):

  1. 控制台重置 Token,旧 Token 立即失效;
  2. 检查用量与在线连接记录,确认是否有异常调用;
  3. 绑定 IP 白名单,缩小可用范围;
  4. 如产生超额调用,按服务协议处理。

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 线变化,属于修正而非错误