外汇

外汇与黄金行情 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 Keyhttps://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 货币对分类

类别特征典型品种适用场景
主流货币对含美元,全球交易量最大EURUSDGBPUSDUSDJPY日内交易,流动性最好
次要货币对不含美元EURGBPEURJPYGBPJPY交叉盘策略
稀有货币对含新兴市场货币USDTRYUSDSGDUSDMXN特定区域敞口监控
贵金属以外汇格式报价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)、intervalstart_timeend_time
数据路径data["data"]["klines"]
K线字段openhighlowclose(不是last_price)、volumetime(不是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线:openhighlowclosevolumetime
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"] 读取 symbollast_pricetimestamp
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_priceticker用 last_price,kline用 close
K线访问 timestampticker用 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"]

品种代码格式

  • 全部无后缀:EURUSDXAUUSD

品种搜索参数

  • 使用大写市场名:market=FOREX

错误处理速查

错误码含义行动
0成功-
1001API 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写出正确接入代码。
  • CLInpm 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 文档

相关文章