DEV Community

Cover image for Go 如何接入实时外汇行情 API
PeakLine
PeakLine

Posted on

Go 如何接入实时外汇行情 API

外汇行情接口是比较小众的工具, 在网络上的教程并不多,这部分是因为外汇并不是一个统一的大市场,它的报价会比较分散,要聚合这些报价是比较困难的,市面上的实时外汇行情API也不常见。如果你在用 Go 写交易系统、监控工具或市场数据采集模块,很可能会遇到通过 WebSocket 实时获取外汇行情的需求。下面是一份实用的接入教程,使用的是infoway.io提供的实时行情 API。本文以 EURUSD 的 1 分钟 K 线为例。

第一步:准备工作

确保你已安装 Go 环境,并获取了 API Key(可在官网免费申请)。

安装 WebSocket 客户端库:

go get nhooyr.io/websocket
Enter fullscreen mode Exit fullscreen mode

我们使用的是 nhooyr.io/websocket,它轻量、现代、支持上下文控制。

第二步:建立连接

WebSocket 地址如下:

wss://data.infoway.io/ws?business=forex&apikey=YourAPIKey
Enter fullscreen mode Exit fullscreen mode

你需要在地址中替换为你自己的 API key。

连接代码:

conn, _, err := websocket.Dial(ctx, url, nil)
if err != nil {
    log.Fatalf("WebSocket连接失败: %v", err)
}
defer conn.Close(websocket.StatusNormalClosure, "关闭连接")
Enter fullscreen mode Exit fullscreen mode

第三步:发送订阅消息

你需要发送一条初始化消息,告诉服务器你要订阅哪个品种、哪种周期的 K 线。例如,订阅 EURUSD 的 1 分钟 K 线:

initMsg := map[string]interface{}{
    "code":  10004,
    "trace": "your-trace-id", // 可使用uuid
    "data": map[string]interface{}{
        "arr": []map[string]interface{}{
            {
                "type":  1,
                "codes": "EURUSD",
            },
        },
    },
}
msgBytes, _ := json.Marshal(initMsg)
conn.Write(ctx, websocket.MessageText, msgBytes)
Enter fullscreen mode Exit fullscreen mode

第四步:设置心跳 Ping

WebSocket 连接需要保持活跃状态,推荐每 30 秒发送一次 ping:

go func() {
    ticker := time.NewTicker(30 * time.Second)
    defer ticker.Stop()
    for range ticker.C {
        pingMsg := map[string]interface{}{
            "code":  10010,
            "trace": "your-trace-id",
        }
        pingBytes, _ := json.Marshal(pingMsg)
        conn.Write(ctx, websocket.MessageText, pingBytes)
    }
}()
Enter fullscreen mode Exit fullscreen mode

第五步:接收行情数据

WebSocket 会持续推送行情数据。你只需监听并处理消息:

for {
    _, msg, err := conn.Read(ctx)
    if err != nil {
        log.Printf("读取消息失败: %v", err)
        break
    }
    fmt.Printf("收到消息: %s\n", string(msg))
}
Enter fullscreen mode Exit fullscreen mode

返回示例

收到的 JSON 格式数据包含开盘价、最高价、最低价、收盘价、时间戳等字段:

{
    "c": "1.0845",         // 当前价格(收盘价)
    "h": "1.0852",         // 该分钟内的最高价
    "l": "1.0839",         // 该分钟内的最低价
    "o": "1.0840",         // 开盘价
    "pca": "0.0005",       // 价格变化
    "pfr": "0.05%",        // 价格变化百分比
    "s": "EURUSD",         // 外汇货币对代码
    "t": 1747550648097,    // 时间戳(毫秒)
    "ty": 1,               // K线类型:1 表示1分钟K线
    "v": "2.4",            // 成交量(在外汇中通常是报价量或模拟值)
    "vw": "1.0843"         // 加权平均价格
}

Enter fullscreen mode Exit fullscreen mode

常见问题

连接失败:检查 API key 是否正确,网络是否支持 WebSocket。

收不到数据:确认订阅的品种代码无误,例如 EURUSD,并确保服务器返回了确认消息。

连接断开:可能是长时间无 Ping 消息,确保 Ping 机制正确运行。

Top comments (0)