
外汇接口返回的数据怎么看?价格、时间戳和交易品种解析
解析外汇接口返回的交易品种、Bid/Ask 价格、volume 和时间戳,结合 Python 示例说明如何读取盘口数据、转换时间及处理不同品种的行情字段,帮助开发者准确解析外汇行情。
接入外汇接口后,开发者拿到的通常是一组 JSON 数据,里面包含交易品种、报价和时间信息。有些接口还会返回买卖盘口及对应的数量字段。如果没有弄清楚这些字段的含义,就可能把买价当成卖价,把毫秒时间戳当成秒级时间戳,甚至将不同货币对的报价对应到错误的行情页面。
理解外汇行情数据,不能只看价格数字,还要结合交易品种、报价时间和盘口数量进行判断。下面以 AllTick 外汇深度行情为例,说明这些数据应该如何读取和处理。
外汇接口返回的价格和 volume 怎么看
外汇报价通常以货币对表示,例如 EURUSD、GBPUSD 和 USDJPY。以 EURUSD 为例,EUR 是基础货币,USD 是报价货币,表示 1 欧元对应多少美元。
在 AllTick 盘口数据中,bids 和 asks 分别代表买盘和卖盘,每个报价档位包含 price 和 volume 两个字段。
下面是一组 EURUSD 的演示数据,数值仅用于说明字段结构,并非实时接口返回记录。
{
"ret": 200,
"msg": "ok",
"trace": "demo-trace",
"data": {
"tick_list": [
{
"code": "EURUSD",
"seq": "123456",
"tick_time": "1793260800000",
"bids": [
{
"price": "1.08518",
"volume": "120000"
}
],
"asks": [
{
"price": "1.08522",
"volume": "95000"
}
]
}
]
}
}几个关键字段可以这样理解:
| 字段 | 含义 |
|---|---|
| code | 交易品种代码 |
| seq | 报价序号 |
| tick_time | 报价时间戳 |
| bids[0].price | 买盘价格 |
| bids[0].volume | 买盘对应数量 |
| asks[0].price | 卖盘价格 |
| asks[0].volume | 卖盘对应数量 |
其中,Bid 是买入基础货币的报价,Ask 是卖出基础货币的报价。从报价使用者的角度看,卖出基础货币通常参考 Bid,买入基础货币则参考 Ask。
例如,上面的 EURUSD 买价为 1.08518,卖价为 1.08522,两者之间的差值就是 Spread:
Spread = Ask − Bid
计算结果为 0.00004。对于 EURUSD,一个标准点通常为 0.0001,因此这里的价差相当于 0.4 pip。
volume 则表示对应盘口档位的数量。需要注意,它不是这个货币对的累计成交量,也不能直接当作 K 线成交量使用。具体数量单位应结合对应产品的数据定义判断,不要默认所有资产都使用相同单位。
目前 AllTick 的数据口径是:外汇、贵金属、能源、股票和加密货币数据均提供 volume;部分 CFD 指数不提供该字段。因此,处理多市场行情时,应允许不同品种返回不同的字段结构,不能把 volume 设置为所有产品都必须存在的字段。
时间戳如何转换才能正确显示行情时间
价格反映报价水平,时间戳则帮助开发者判断行情对应的时间,以及报价是否及时更新。
AllTick 不同接口的时间字段需要分别处理。例如,HTTP 盘口深度数据中的 tick_time 使用毫秒级时间戳,而 K 线数据中的 timestamp 使用秒级时间戳。
如果把毫秒级时间戳直接传入秒级转换函数,得到的时间就会不正确。
处理盘口时间可以使用 Python:
from datetime import datetime, timezone
tick_time = "1793260800000"
quote_time = datetime.fromtimestamp(
int(tick_time) / 1000,
tz=timezone.utc
)
print(quote_time.isoformat())
这里先将字符串转换为整数,再除以 1000 转换为秒,最后指定 UTC 时区。
如果处理的是 K 线数据,则应按照秒级时间戳转换:
timestamp = "1793260800"
kline_time = datetime.fromtimestamp(
int(timestamp),
tz=timezone.utc
)
print(kline_time.isoformat())
实际开发中,不要仅凭数字位数推断所有接口的时间单位,应优先查看对应接口的字段定义。判断行情延迟时,还应同时记录本地接收时间,并考虑服务器时钟同步情况,避免把本机时间误差当成网络延迟。
交易品种代码如何对应正确的行情
交易品种字段用于区分每条行情属于哪个市场标的。AllTick 外汇品种采用六位货币代码形式,例如:
| 品种代码 | 基础货币 | 报价货币 |
|---|---|---|
| EURUSD | EUR | USD |
| GBPUSD | GBP | USD |
| USDJPY | USD | JPY |
| AUDJPY | AUD | JPY |
以 USDJPY 为例,USD 是基础货币,JPY 是报价货币,表示 1 美元对应多少日元。
在开发中,建议保留接口返回的原始 code,再单独处理页面展示格式。例如,接口使用 EURUSD,前端可以显示为 EUR/USD,但不要直接把展示格式替换为请求参数。
当系统同时订阅多个货币对时,应将 code、价格、volume 和 timestamp 保存在同一条行情记录中。这样可以避免异步更新时出现价格与交易品种错配。
使用 Python 解析外汇盘口数据
理解字段后,可以在后端统一解析报价。下面以 AllTick HTTP Interface API 的 /depth-tick 盘口接口为例,演示如何读取 EURUSD 的买卖价格、数量和时间。
import json
import requests
from decimal import Decimal
from datetime import datetime, timezone
TOKEN = "YOUR_TOKEN_HERE"
query = {
"trace": "fx_depth_demo",
"data": {
"symbol_list": [{"code": "EURUSD"}]
}
}
response = requests.get(
"https://quote.alltick.co/quote-b-api/depth-tick",
params={
"token": TOKEN,
"query": json.dumps(query, separators=(",", ":"))
},
timeout=10
)
response.raise_for_status()
result = response.json()
if result.get("ret") != 200:
raise RuntimeError(f"API error: {result}")
tick_list = result.get("data", {}).get("tick_list", [])
for item in tick_list:
bids = item.get("bids") or []
asks = item.get("asks") or []
if not bids or not asks:
continue
bid = bids[0]
ask = asks[0]
bid_price = Decimal(bid["price"])
ask_price = Decimal(ask["price"])
bid_volume = bid.get("volume")
ask_volume = ask.get("volume")
quote_time = datetime.fromtimestamp(
int(item["tick_time"]) / 1000,
tz=timezone.utc
)
print({
"symbol": item["code"],
"bid": str(bid_price),
"bid_volume": bid_volume,
"ask": str(ask_price),
"ask_volume": ask_volume,
"spread": str(ask_price - bid_price),
"time": quote_time.isoformat()
})
这段代码完成了接口请求、返回状态检查、买卖报价解析、盘口数量读取和时间转换。使用 Decimal 处理价格,可以避免普通浮点数运算带来的精度问题。
示例针对支持盘口深度的 EURUSD 编写。对于部分不提供 volume 的 CFD 指数,代码需要将该字段作为可选值处理;如果某个品种没有盘口数据,也不能直接认定为价格异常,应先检查该品种是否支持盘口功能以及当前行情状态。
不同外汇行情需求应该选择什么接口
如果应用只需要读取当前买卖报价,可以使用 HTTP 盘口查询接口;如果需要持续接收盘口变化,则可以使用 WebSocket 订阅。若需要获取逐笔成交数据或历史 K 线,则应选择对应的数据接口。
还需要区分不同数据类型中的 volume:
- 盘口数据中的
volume:对应某个 Bid 或 Ask 档位的数量。 - 逐笔成交数据中的
volume:对应成交记录的数量。 - K 线数据中的
volume:对应当前 K 线周期的成交量。
三者虽然使用相同字段名称,但业务含义不同,不能直接混合计算。
AllTick 提供外汇行情 API,支持 EURUSD、GBPUSD、USDJPY 等货币对,并通过 REST 和 WebSocket 提供不同形式的行情接入。开发者可以根据行情展示、实时订阅或历史分析需求选择相应接口。
正式接入之前,建议先核对交易品种代码、价格字段、时间戳单位以及 volume 是否适用于当前数据类型。可以从 AllTick 官方入口 查看产品和开发者资源。
对于外汇行情系统来说,正确读取价格只是基础。只有同时理解报价时间、交易品种和盘口数量,后续的缓存、行情展示和策略计算才能建立在可靠的数据结构上。