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

如果你在用 Go 写交易系统、监控工具或市场数据采集模块,很可能会遇到通过 WebSocket 实时获取外汇行情的需求。下面是一份实用的接入教程,使用的是infoway.io提供的实时行情 API。本文以 EURUSD 的 1 分钟 K 线为例。

第一步:准备工作

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

安装 WebSocket 客户端库:

go get nhooyr.io/websocket

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

第二步:建立连接

WebSocket 地址如下:

wss://data.infoway.io/ws?business=forex&apikey=YourAPIKey

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

连接代码:

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

第三步:发送订阅消息

你需要发送一条初始化消息,告诉服务器你要订阅哪个品种、哪种周期的 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)

第四步:设置心跳 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)
	}
}()

第五步:接收行情数据

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

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

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

常见问题

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

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

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

你可能感兴趣的:(golang,开发语言,后端,websocket,go,经验分享,笔记)