AllTick
-
外汇 API 外汇数据 API 数据解析

外汇接口返回的数据怎么看?价格、时间戳和交易品种解析

解析外汇接口返回的交易品种、Bid/Ask 价格、volume 和时间戳,结合 Python 示例说明如何读取盘口数据、转换时间及处理不同品种的行情字段,帮助开发者准确解析外汇行情。

AllTick阅读 5 分钟

接入外汇接口后,开发者拿到的通常是一组 JSON 数据,里面包含交易品种、报价和时间信息。有些接口还会返回买卖盘口及对应的数量字段。如果没有弄清楚这些字段的含义,就可能把买价当成卖价,把毫秒时间戳当成秒级时间戳,甚至将不同货币对的报价对应到错误的行情页面。

理解外汇行情数据,不能只看价格数字,还要结合交易品种、报价时间和盘口数量进行判断。下面以 AllTick 外汇深度行情为例,说明这些数据应该如何读取和处理。

外汇接口返回的价格和 volume 怎么看

外汇报价通常以货币对表示,例如 EURUSD、GBPUSD 和 USDJPY。以 EURUSD 为例,EUR 是基础货币,USD 是报价货币,表示 1 欧元对应多少美元。

在 AllTick 盘口数据中,bids 和 asks 分别代表买盘和卖盘,每个报价档位包含 price 和 volume 两个字段。

下面是一组 EURUSD 的演示数据,数值仅用于说明字段结构,并非实时接口返回记录。

text
{
  "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:

text
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 线数据,则应按照秒级时间戳转换:

text
timestamp = "1793260800"

kline_time = datetime.fromtimestamp(
    int(timestamp),
    tz=timezone.utc
)

print(kline_time.isoformat())

实际开发中,不要仅凭数字位数推断所有接口的时间单位,应优先查看对应接口的字段定义。判断行情延迟时,还应同时记录本地接收时间,并考虑服务器时钟同步情况,避免把本机时间误差当成网络延迟。

交易品种代码如何对应正确的行情

交易品种字段用于区分每条行情属于哪个市场标的。AllTick 外汇品种采用六位货币代码形式,例如:

品种代码基础货币报价货币
EURUSDEURUSD
GBPUSDGBPUSD
USDJPYUSDJPY
AUDJPYAUDJPY

以 USDJPY 为例,USD 是基础货币,JPY 是报价货币,表示 1 美元对应多少日元。

在开发中,建议保留接口返回的原始 code,再单独处理页面展示格式。例如,接口使用 EURUSD,前端可以显示为 EUR/USD,但不要直接把展示格式替换为请求参数。

当系统同时订阅多个货币对时,应将 code、价格、volume 和 timestamp 保存在同一条行情记录中。这样可以避免异步更新时出现价格与交易品种错配。

使用 Python 解析外汇盘口数据

理解字段后,可以在后端统一解析报价。下面以 AllTick HTTP Interface API 的 /depth-tick 盘口接口为例,演示如何读取 EURUSD 的买卖价格、数量和时间。

text
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 官方入口 查看产品和开发者资源。

对于外汇行情系统来说,正确读取价格只是基础。只有同时理解报价时间、交易品种和盘口数量,后续的缓存、行情展示和策略计算才能建立在可靠的数据结构上。

立即开始接入市场数据

几秒内生成免费 API 密钥,通过一个端点连接所有市场。