使用Go语言对接全球股票数据源API实践指南


使用Go语言对接全球股票数据API实践指南

概述

本文介绍如何通过Go语言对接支持多国股票数据的API服务。我们将基于提供的API文档,实现包括市场行情、K线数据、实时推送等核心功能的对接。


一、准备工作

1. 获取API Key

联系服务提供商获取访问密钥(替换下文中的YOUR_API_KEY

2. 安装依赖

go get github.com/go-resty/resty/v2  # HTTP客户端
go get github.com/gorilla/websocket  # WebSocket支持

二、核心功能实现

1. 获取指定国家市场列表

package main

import (
	"fmt"
	"github.com/go-resty/resty/v2"
)

type MarketResponse struct {
	Code    int    `json:"code"`
	Message string `json:"message"`
	Data    struct {
		Records []struct {
			ID        int     `json:"id"`
			Symbol    string  `json:"symbol"`
			Last      float64 `json:"last"`
			Chg       float64 `json:"chg"`
			ChgPct    float64 `json:"chgPct"`
			Volume    int64   `json:"volume"`
		} `json:"records"`
	} `json:"data"`
}

func GetStockList(countryID int) {
	client := resty.New()
	
	resp, err := client.R().
		SetQueryParams(map[string]string{
			"countryId": fmt.Sprintf("%d", countryID),
			"pageSize":  "10",
			"page":      "1",
			"key":       "YOUR_API_KEY",
		}).
		Get("https://api.stocktv.top/stock/stocks")

	var result MarketResponse
	if err := json.Unmarshal(resp.Body(), &result); err != nil {
		fmt.Println("解析错误:", err)
		return
	}

	fmt.Printf("获取到 %d 条市场数据\n", len(result.Data.Records))
	for _, stock := range result.Data.Records {
		fmt.Printf("%s 最新价: %.2f 涨跌幅: %.2f%%\n", 
			stock.Symbol, stock.Last, stock.ChgPct)
	}
}

2. 获取股票K线数据

type KLine struct {
	Time   int64   `json:"time"`
	Open   float64 `json:"open"`
	Close  float64 `json:"close"`
	High   float64 `json:"high"`
	Low    float64 `json:"low"`
	Volume int64   `json:"volume"`
}

func GetKLineData(pid int, interval string) {
	client := resty.New()
	
	resp, _ := client.R().
		SetQueryParams(map[string]string{
			"pid":     fmt.Sprintf("%d", pid),
			"interval": interval,
			"key":     "YOUR_API_KEY",
		}).
		Get("https://api.stocktv.top/stock/kline")

	var klines []KLine
	if err := json.Unmarshal(resp.Body(), &klines); err != nil {
		fmt.Println("K线数据解析失败:", err)
		return
	}

	fmt.Println("\nK线数据:")
	for _, k := range klines {
		fmt.Printf("[%s] O:%.2f H:%.2f L:%.2f C:%.2f\n",
			time.Unix(k.Time/1000, 0).Format("2006-01-02 15:04"),
			k.Open, k.High, k.Low, k.Close)
	}
}

3. WebSocket实时数据订阅

func ConnectWebSocket() {
	conn, _, err := websocket.DefaultDialer.Dial(
		"wss://ws-api.stocktv.top/connect?key=YOUR_API_KEY", nil)
	if err != nil {
		log.Fatal("连接失败:", err)
	}
	defer conn.Close()

	// 订阅股票(示例订阅pid=7310)
	subscribeMsg := `{"action":"subscribe","pids":[7310]}`
	if err := conn.WriteMessage(websocket.TextMessage, []byte(subscribeMsg)); err != nil {
		log.Fatal("订阅失败:", err)
	}

	for {
		_, message, err := conn.ReadMessage()
		if err != nil {
			log.Println("读取错误:", err)
			break
		}
		
		var data struct {
			PID    string  `json:"pid"`
			Last   float64 `json:"last_numeric"`
			ChgPct string  `json:"pcp"`
		}
		if err := json.Unmarshal(message, &data); err != nil {
			continue
		}
		
		fmt.Printf("实时更新 PID-%s: %.2f (%s)\n", 
			data.PID, data.Last, data.ChgPct)
	}
}

三、功能整合示例

func main() {
	// 获取印度市场数据(国家ID=14)
	GetStockList(14)
	
	// 获取指定股票的K线(15分钟间隔)
	GetKLineData(7310, "PT15M")
	
	// 启动WebSocket连接
	go ConnectWebSocket()
	
	// 保持主线程运行
	select {}
}

四、关键注意事项

  1. 参数处理

    • 国家ID对照:印度(14)、中国(42)、美国(840)等
    • 时间间隔格式:PT15M(15分钟)、P1D(日线)
  2. 错误处理

if resp.StatusCode() != 200 {
    fmt.Printf("请求失败,状态码:%d\n", resp.StatusCode())
    return
}
  1. 性能优化
    • 使用连接池复用HTTP Client
    • 对高频请求添加缓存机制
    • WebSocket心跳保持(每30秒发送ping)

五、总结

通过本文的实现,我们可以:
✅ 获取全球多个国家的股票市场数据
✅ 查询详细K线图表信息
✅ 实时接收价格变动推送
✅ 对接IPO日历、公司信息等扩展功能

完整示例代码已上传GitHub(替换为你的仓库链接)。实际使用时请根据业务需求添加认证、日志记录和监控模块。


扩展建议

  1. 添加Redis缓存高频数据
  2. 实现自动重连机制(WebSocket)
  3. 开发RESTful API包装原始接口
  4. 添加Prometheus监控指标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值