外汇与黄金行情 API 怎么接?用 TickDB 跑通 EURUSD 和 XAUUSD 的完整记录
作者: TickDB Research · 发布: 2026/5/19 · 阅读: 12
标签: Track A, 产品介绍型, 知乎, 外汇
先说痛点:外汇数据接入的三个麻烦
如果你做过外汇相关开发,下面这些场景大概率遇到过:
麻烦一:黄金数据被归在另一个分类里。 你想同时监控 EURUSD 和 XAUUSD,结果主流数据源把黄金放在"大宗商品"类目下,字段名和外汇对不齐——一套系统要写两套解析逻辑。
麻烦二:稀有货币对需要单独付费。 免费 API 通常覆盖 20-30 个主流货币对,但策略回测需要 USDTRY 或 USDSGD 的历史日线时,发现需要买更高等级的付费套餐。
麻烦三:报价来源不透明。 外汇是场外交易市场,没有集中交易所。不同数据源的报价可能存在差异,如果API背后只是接了单一经纪商的demo数据,实盘参考价值有限。
TickDB 提供面向 AI 编程工具和自动化脚本的统一行情 API,通过"统一 REST + WebSocket 接口、统一字段、统一鉴权",将外汇和贵金属统一接入。下面是我从实际接入过程中整理的技术记录——先跑通最小示例,再展开端点细节和易错点。
声明:本文基于 TickDB 公开 API 文档的实测结果撰写,示例可对照 docs.tickdb.ai 独立复现。具体服务条款与免费额度以官方公示为准。
金融合规提醒:本文仅讨论行情数据接入与工程实现,不构成任何投资建议,也不建议仅凭单一数据源直接执行实盘交易。
最小可运行示例:两行命令查汇率和金价
先跑通最简单的场景——同时查 EURUSD 和 XAUUSD 的实时报价:
import requests
url = "https://api.tickdb.ai/v1/market/ticker"
headers = {"X-API-Key": "YOUR_API_KEY"}
params = {"symbols": "EURUSD,XAUUSD"}
resp = requests.get(url, headers=headers, params=params)
data = resp.json()
if data.get("code") == 0:
for item in data["data"]:
print(f"{item['symbol']}: 最新价 {item['last_price']}")
输出示例:
EURUSD: 1.13850
XAUUSD: 3425.80
一个 Key,一个接口,外汇和黄金返回字段完全一致。不需要分别接入两个不同的数据源,也不需要对字段名做映射。
TickDB 外汇接入速览
| 项目 | 详情 |
|---|---|
| 标的覆盖 | 1,200+ 外汇品种 + 贵金属(XAUUSD、XAGUSD) |
| 覆盖类型 | 主流货币对、次要货币对、稀有货币对、贵金属 |
| 代码格式 | EURUSD / XAUUSD(无后缀) |
| REST端点 | ticker、kline、kline/latest |
| WebSocket频道 | ticker |
| 鉴权方式 | REST: Header X-API-Key;WebSocket: URL参数 ?api_key= |
| 免费额度 | 7天免费试用,30次/分钟限流,覆盖部分精选品种 |
5分钟接入检查清单
| 步骤 | 操作 | 端点/命令 |
|---|---|---|
| 1.获取Key | 注册TickDB并生成API Key | https://tickdb.ai |
| 2.验证行情 | 查询欧元兑美元实时价 | GET /v1/market/ticker?symbols=EURUSD |
| 3.拉取K线 | 获取黄金日线数据 | GET /v1/market/kline?symbol=XAUUSD&interval=1d&... |
| 4.订阅推送 | 建立WebSocket接收实时报价 | wss://api.tickdb.ai/v1/realtime?api_key=YOUR_KEY |
第一层:全球外汇市场覆盖
TickDB 覆盖 1,200+ 个外汇品种,从 EURUSD 等主流货币对到 USDTRY 等稀有品种均包含在内。同时覆盖 XAUUSD(黄金)和 XAGUSD(白银),以外汇格式统一报价。
关键点:外汇是场外交易市场,没有集中交易所。不同流动性提供商各自报价,TickDB 聚合多家报价形成 ticker 数据。这意味着:
- 报价反映的是多源加权结果,而非单一做市商视图
- 稀有货币对在非主力交易时段可能出现价差放大,实盘策略需要单独处理
第二层:外汇与贵金属分类及端点矩阵
2.1 货币对分类
| 类别 | 特征 | 典型品种 | 适用场景 |
|---|---|---|---|
| 主流货币对 | 含美元,全球交易量最大 | EURUSD、GBPUSD、USDJPY | 日内交易,流动性最好 |
| 次要货币对 | 不含美元 | EURGBP、EURJPY、GBPJPY | 交叉盘策略 |
| 稀有货币对 | 含新兴市场货币 | USDTRY、USDSGD、USDMXN | 特定区域敞口监控 |
| 贵金属 | 以外汇格式报价 | XAUUSD(黄金)、XAGUSD(白银) | 避险监控、金汇联动策略 |
2.2 代码格式
外汇和贵金属代码无后缀,直接使用标准ISO代码:
| 品种 | 代码 | 说明 |
|---|---|---|
| 欧元/美元 | EURUSD | 全球交易量最大的货币对 |
| 英镑/美元 | GBPUSD | 第二大交易量 |
| 美元/日元 | USDJPY | 亚洲时段活跃 |
| 黄金/美元 | XAUUSD | 避险首选 |
| 白银/美元 | XAGUSD | 工业+避险双重属性 |
2.3 端点功能矩阵
| 端点 | 功能 | 典型参数示例 |
|---|---|---|
GET /v1/market/ticker | 实时报价快照 | symbols=EURUSD,XAUUSD |
GET /v1/market/kline | 历史K线 | symbol=XAUUSD&interval=1d&... |
GET /v1/market/kline/latest | 实时未闭合K线 | symbols=EURUSD&interval=1m |
GET /v1/symbols/available | 品种搜索 | market=FOREX |
WebSocket频道:
- ticker:实时推送报价变动
K线可用周期以 /v1/market/intervals/kline 接口返回为准。
第三层:端点速查卡与可运行代码
环境准备
pip install requests websockets
速查卡 #1:ticker(实时报价快照)
| 属性 | 值 |
|---|---|
| 端点 | GET https://api.tickdb.ai/v1/market/ticker |
| 参数 | symbols(复数,逗号分隔,最多50个) |
| 外汇示例 | symbols=EURUSD,GBPUSD,USDJPY |
| 贵金属示例 | symbols=XAUUSD,XAGUSD |
| 返回字段 | last_price(最新价)、timestamp(毫秒UTC)、price_change_percent_24h(涨跌幅)、volume_24h(24h成交量) |
| 字段注意 | ticker用 last_price(不是close),用 timestamp(不是time) |
| 限流码 | 3001 → 读 Retry-After 头,指数退避 |
| 鉴权失败码 | 1001 → 阻断并提示 |
import requests
import time
def main():
url = "https://api.tickdb.ai/v1/market/ticker"
headers = {"X-API-Key": "YOUR_API_KEY"}
params = {"symbols": "EURUSD,GBPUSD,XAUUSD"}
while True:
try:
resp = requests.get(url, headers=headers, params=params)
if resp.status_code == 429: # 3001 限流
retry_after = resp.headers.get("Retry-After", "5")
print(f"请求频率超限,{retry_after}秒后重试...")
time.sleep(int(retry_after))
continue
if resp.status_code == 401: # 1001 鉴权失败
print("API Key 无效,请检查 X-API-Key Header")
break
resp.raise_for_status()
data = resp.json()
if data.get("code") == 0:
for item in data["data"]:
print(f"{item['symbol']} 最新价: {item['last_price']} "
f"涨跌幅: {item.get('price_change_percent_24h', 'N/A')}% "
f"24h成交量: {item.get('volume_24h', 'N/A')}")
else:
print(f"业务错误: {data.get('code')} - {data.get('message')}")
break
except requests.exceptions.RequestException as e:
print(f"网络异常: {e}")
break
if __name__ == "__main__":
main()
场景:同时监控多个货币对和黄金价格,一套代码、一个Key,不需要分别接外汇和大宗商品两个接口。
速查卡 #2:kline(历史K线)
| 属性 | 值 |
|---|---|
| 端点 | GET https://api.tickdb.ai/v1/market/kline |
| 参数 | symbol(单数,不要写成 symbols)、interval、start_time、end_time |
| 数据路径 | data["data"]["klines"] |
| K线字段 | open、high、low、close(不是last_price)、volume、time(不是timestamp) |
| 字段注意 | K线用 close,不是 last_price;K线用 time,不是 timestamp |
import requests
import time
def main():
url = "https://api.tickdb.ai/v1/market/kline"
headers = {"X-API-Key": "YOUR_API_KEY"}
params = {
"symbol": "XAUUSD",
"interval": "1d",
"start_time": "2026-05-01T00:00:00Z",
"end_time": "2026-05-18T23:59:59Z"
}
try:
resp = requests.get(url, headers=headers, params=params)
if resp.status_code == 429:
retry_after = resp.headers.get("Retry-After", "5")
time.sleep(int(retry_after))
resp = requests.get(url, headers=headers, params=params)
if resp.status_code == 401:
print("API Key 无效")
return
resp.raise_for_status()
data = resp.json()
if data["code"] == 0:
klines = data["data"]["klines"]
for k in klines[:5]:
print(f"{k['time']} O:{k['open']} H:{k['high']} "
f"L:{k['low']} C:{k['close']} V:{k['volume']}")
print(f"共获取 {len(klines)} 根K线")
else:
print(f"错误: {data['message']}")
except requests.exceptions.RequestException as e:
print(f"请求异常: {e}")
if __name__ == "__main__":
main()
场景:回测黄金的日线趋势策略,或拉取稀有货币对的历史数据验证套利模型。
速查卡 #3:kline/latest(实时未闭合K线)
| 属性 | 值 |
|---|---|
| 端点 | GET https://api.tickdb.ai/v1/market/kline/latest |
| 参数 | symbols(复数)、interval |
| 数据路径 | data["data"]["klines"][0] |
| K线字段 | 同历史K线:open、high、low、close、volume、time |
import requests
import time
def main():
url = "https://api.tickdb.ai/v1/market/kline/latest"
headers = {"X-API-Key": "YOUR_API_KEY"}
params = {"symbols": "EURUSD", "interval": "1m"}
try:
resp = requests.get(url, headers=headers, params=params)
if resp.status_code == 429:
retry_after = resp.headers.get("Retry-After", "5")
time.sleep(int(retry_after))
resp = requests.get(url, headers=headers, params=params)
if resp.status_code == 401:
print("API Key 无效")
return
resp.raise_for_status()
data = resp.json()
if data["code"] == 0:
result = data["data"]
k = result["klines"][0]
print(f"实时K线 - {result['symbol']} "
f"O:{k['open']} H:{k['high']} L:{k['low']} "
f"C:{k['close']} 时间:{k['time']}")
except requests.exceptions.RequestException as e:
print(f"异常: {e}")
if __name__ == "__main__":
main()
场景:盘中获取当前1分钟K线的最新价,用于实时信号判断——不需要自己用ticker数据拼K线。
速查卡 #4:WebSocket(实时推送)
| 属性 | 值 |
|---|---|
| 端点 | wss://api.tickdb.ai/v1/realtime(路径不可省略) |
| 鉴权 | URL参数 ?api_key=YOUR_API_KEY |
| 订阅命令 | {"cmd":"subscribe","data":{"channel":"ticker","symbols":["EURUSD","XAUUSD"]}} |
| 心跳 | 每秒发送 {"cmd":"ping"},否则连接被防火墙断开 |
| 推送格式 | 先判断 msg["cmd"],再从 msg["data"] 读取 symbol、last_price、timestamp |
import asyncio
import json
import websockets
async def main():
uri = "wss://api.tickdb.ai/v1/realtime?api_key=YOUR_API_KEY"
try:
async with websockets.connect(uri) as ws:
sub_msg = {
"cmd": "subscribe",
"data": {"channel": "ticker", "symbols": ["EURUSD", "XAUUSD"]}
}
await ws.send(json.dumps(sub_msg))
print("已订阅外汇 ticker 频道")
async def heartbeat():
while True:
await ws.send(json.dumps({"cmd": "ping"}))
await asyncio.sleep(1)
asyncio.create_task(heartbeat())
async for message in ws:
msg = json.loads(message)
if msg.get("cmd") == "ticker":
item = msg.get("data", {})
print(f"推送: {item['symbol']} 最新价: {item['last_price']}")
elif msg.get("cmd") == "pong":
pass
except websockets.exceptions.ConnectionClosed as e:
print(f"连接关闭: {e}")
except Exception as e:
print(f"异常: {e}")
if __name__ == "__main__":
asyncio.run(main())
场景:外汇交易中几个点的波动就可能触发入场或离场。WebSocket推送让你摆脱轮询延迟,在实盘中即时响应。
接入易错点
| 易错点 | 正确做法 |
|---|---|
贵金属代码加后缀(如 XAUUSD.XAU) | 直接用 XAUUSD,无后缀 |
K线访问 last_price | ticker用 last_price,kline用 close |
K线访问 timestamp | ticker用 timestamp,kline用 time |
/kline 参数用 symbols(复数) | 该端点参数是 symbol(单数) |
/kline/latest 参数用 symbol(单数) | 该端点参数是 symbols(复数) |
| 稀有货币对忽略流动性差异 | 非主力时段价差可能异常放大,需单独设定价差过滤 |
symbols/available 参数用 market=fx | 应使用 market=FOREX(大写) |
| 免费额度超限 | 7天免费试用,30次/分钟,超出触发 3001 限流 |
API 技术事实红线
参数单复数
/v1/market/kline:参数symbol(单数)/v1/market/ticker:参数symbols(复数,最多50个)/v1/market/kline/latest:参数symbols(复数)
字段名对照
- K线价格:
close| Ticker价格:last_price - K线时间:
time| Ticker时间:timestamp - K线成交量:
volume| Ticker成交量:volume_24h
数据路径
- K线数据:
data["data"]["klines"]
品种代码格式
- 全部无后缀:
EURUSD、XAUUSD
品种搜索参数
- 使用大写市场名:
market=FOREX
错误处理速查
| 错误码 | 含义 | 行动 |
|---|---|---|
| 0 | 成功 | - |
| 1001 | API Key无效 | 阻断并提示 |
| 1002 | 未提供API Key | 检查Header |
| 2001 | 参数错误 | 核对参数名单复数 |
| 2002 | 交易品种不存在 | 检查代码是否无后缀 |
| 3001 | 请求频率超限 | Retry-After头,指数退避 |
| 5000 | 服务器内部错误 | 稍后重试 |
为AI而生的工具链
TickDB提供三种AI协作方式,遵循"对话用 Skill,编码用 MCP,自动化用 CLI":
- Skill:在ChatGPT/Claude中执行
npx clawhub@latest install tickdb-market-data,AI自动获取试用Key,对话中直接查询汇率和金价。 - MCP:端点
https://mcp.tickdb.ai,支持Cursor、Windsurf等9个客户端,13个金融数据工具覆盖外汇ticker、kline。在AI编程环境中直接调用,让AI写出正确接入代码。 - CLI:
npm install -g tickdb(Node.js >= 18),16个命令终端快速查价,--json输出可供脚本解析。
开源与可靠性
TickDB在GitHub开源(MIT协议),地址 https://github.com/TickDB/tickdb-unified-realtime-marketdata-api。官方承诺99.9%服务可用性SLA,文档 https://docs.tickdb.ai 提供三语版本。
免费额度为7天试用、30次/分钟限流、覆盖部分精选品种,具体以官网 Pricing 页面公示为准。支持渠道:Telegram @TickDB_Support、Email [email protected]。
通过 TickDB API 获取实时行情数据
一个 API 接入外汇、加密货币、美股、港股、A股、贵金属和全球指数的实时行情。支持 WebSocket 低延迟推送,免费开始使用。
免费领取 API Key查看 API 文档