| 功能 | 状态 | 主要方法 |
|---|---|---|
| 盘口(5档报价) | ✅ 已完成 | GetQuote |
| 代码数量/列表 | ✅ 已完成 | GetCount GetCode GetCodeAll |
| 分时图 / 历史分时图 | ✅ 已完成 | GetMinute GetHistoryMinute |
| 分时成交 / 历史分时成交 | ✅ 已完成 | GetTrade GetHistoryTrade |
| K线 / 历史K线 / 指数 | ✅ 已完成 | GetKline* GetIndex* |
| 股本变迁(除权除息) | ✅ 已完成 | GetGbbq GetGbbqAll |
| 前/后复权(对齐通达信) | ✅ 已完成 | Gbbq.QFQKlineDay HFQKlineDay QFQ HFQ |
| 集合竞价 | ✅ 已完成 | GetCallAuction |
| 财务信息 | ✅ 已完成 | GetFinanceInfo |
| F10 公司资料 | ✅ 已完成 | GetCompanyCategory GetCompanyContent |
| 板块成分(地域/概念/指数) | ✅ 已完成 | GetBlockData GetBlockDataWithIndex |
| 大型指数成分(中证2000等) | ✅ 已完成 | GetSpBlock |
| 行业归属(通达信/申万) | ✅ 已完成 | GetTdxHy |
| 报表/配置文件下载 | ✅ 已完成 | GetReportFile GetZHBFiles |
| 板块指数代码(id)映射 | ✅ 已完成 | GetTdxZs GetTdxBk |
| 个股统计 / 资金流向 | ✅ 已完成 | GetTdxStat GetTdxStat2 |
| 新股申购 | ✅ 已完成 | GetXgsg |
| 扩展行情(期货/港股/外盘) | ✅ 已完成 | DialExHq + ExQuote ExBars ExTrade 等 |
| mac 秒级逐笔成交 | ✅ 已完成 | DialMacDefault + GetMacTradeAll GetMacHistoryTrade |
| mac 批量自定义行情(主力净流入等) | ✅ 已完成 | DialMacDefault + GetMacQuote |
| mac 资金流向 / 所属板块 / 板块成分 | ✅ 已完成 | GetMacCapitalFlow GetMacBelongBoards GetMacBoardMembers |
| mac 交易时段 / K线总量 / 远程文件 | ✅ 已完成 | GetMacServerSession GetMacKlineCount GetMacFile |
| HTTP API 服务(标准+mac 双池) | ✅ 已完成 | go run ./cmd/tdx-api 或 httpserver 包 |
package main
import (
"fmt"
"github.com/injoyai/tdx"
)
func main() {
// 连接服务器,开启日志,支持断线重连
c, err := tdx.Dial("124.71.187.122:7709", tdx.WithDebug(), tdx.WithRedial())
if err != nil {
panic(err)
}
// 获取行情
resp, err := c.GetQuote("sz000001", "sh600008")
if err != nil {
panic(err)
}
for _, v := range resp {
fmt.Printf("%#v\n", v)
}
<-c.Done()
}板块成分文件(block_*.dat)本身不含板块指数代码(id),id 映射在 tdxzs.cfg(全称),而成分文件用简称,二者经 tdxbk.cfg(简称↔全称) 桥接。GetBlockDataWithIndex 自动完成关联(命中率约 100%)。
c, _ := tdx.DialDefault()
defer c.Close()
// 板块成分 + 板块指数代码(id)。file 可选: protocol.BlockFileGN(概念)/FG(地域风格)/ZS(指数)
blocks, _ := c.GetBlockDataWithIndex(protocol.BlockFileGN)
for _, b := range blocks {
fmt.Printf("板块=%s id=%s 类型=%d 成分数=%d\n", b.Name, b.Index, b.Type, len(b.Codes))
}
// 仅成分(无 id, 不额外下载 zhb.zip)
plain, _ := c.GetBlockData(protocol.BlockFileGN)
_ = plainblock_zs.dat 单板块成分上限 400,装不下中证2000/1000/500 等大型指数,服务端把它们放在文本文件 spblock.dat(无上限),用 GetSpBlock 获取。
沪深300 例外:仍在
block_zs.dat,用GetBlockData(protocol.BlockFileZS)取(成分 300)。
// 专业板块: 中证2000/中证1000/中证500/中证A500/国证2000/深证成指 等
sp, _ := c.GetSpBlock()
for _, b := range sp {
fmt.Printf("板块=%s 成分数=%d\n", b.Name, len(b.Codes)) // Codes 7字符: 市场(0深/1沪/2北)+代码
}
// 按名取中证2000成分
if b := protocol.SpBlockByName(sp, "中证2000"); b != nil {
fmt.Printf("中证2000 成分数=%d\n", len(b.Codes)) // 2000
}演示:
example/GetSpBlock。
复权基于股本变迁(gbbq)的除权除息事件做仿射变换 price_adj = QFQMul × price_raw + QFQAdd,
结果四舍五入到分(2 位小数),与电脑端通达信桌面端逐日对齐(含配股、大比例送转、股改停牌复合事件均已实盘核验)。
成交量/额不复权。Gbbq 内置 gbbq 数据自动更新与本地缓存(sqlite)。
c, _ := tdx.DialDefault()
defer c.Close()
gb, _ := tdx.NewGbbq(tdx.WithGbbqClient(c)) // 首次会拉取并缓存 gbbq
// 方式一: 一步到位拉取全量历史 + 复权
qfq, _ := gb.QFQKlineDay("sh600519") // 前复权日线
hfq, _ := gb.HFQKlineDay("sh600519") // 后复权日线
for _, k := range qfq {
fmt.Printf("%s 开%.2f 高%.2f 低%.2f 收%.2f\n",
k.Time.Format("2006-01-02"), k.Open.Float64(), k.High.Float64(), k.Low.Float64(), k.Close.Float64())
}
// 方式二: 已有不复权 K 线时直接复权
resp, _ := c.GetKlineDayAll("sh600519")
qfq2 := gb.QFQ("sh600519", resp.List)
_ = qfq2
// 方式三: 仅取复权因子(每个除权区间一个仿射系数), 自行施加
fs := gb.GetFactors("sh600519", resp.List)
for _, f := range fs {
_ = f.QFQPrice(protocol.Yuan(100)) // 对任意原始价做前复权
}价格类型
protocol.Price为 int64, 单位厘(元×1000),.Float64()得元。股票最小变动 0.01 元(分),ETF/可转债/指数到 0.001 元(厘)。 完整演示见example/GetQFQKline。
c, _ := tdx.DialDefault()
defer c.Close()
// 财务/基本面: 流通股本/总股本/上市日期/股东户数/净利润等
fi, _ := c.GetFinanceInfo(protocol.ExchangeSH, "600519")
fmt.Println(fi.LiuTongGuBen, fi.ZongGuBen, fi.GuDongRenShu, fi.JingLiRun)
// F10 公司资料: 先取分类, 再读正文
cats, _ := c.GetCompanyCategory(protocol.ExchangeSH, "600519")
content, _ := c.GetCompanyContent(protocol.ExchangeSH, "600519", cats[0].Filename, cats[0].Start, cats[0].Length)
_ = content
// 行业归属(通达信新行业 T + 申万行业 X), 全市场
hy, _ := c.GetTdxHy()
for _, v := range hy { _ = v.TdxHy; _ = v.SwHy }通达信板块/配置文件以 zhb.zip 总包经 report file 协议(0x06B9)整体下发,含 44 个文件(tdxzs.cfg/tdxbk.cfg/incon.dat/tdxstat.cfg 等)。
// 任意报表文件原始字节(无需预查大小, 自动分块拉取)
raw, _ := c.GetReportFile("zhb.zip")
// 下载 zhb.zip 并解压 → 文件名→原始字节
files, _ := c.GetZHBFiles()
for name := range files { fmt.Println(name) }
// 板块名↔指数代码(id) / 概念简称↔全称
zs, _ := c.GetTdxZs() // []*protocol.TdxZs{Name, Code(880xxx), Type, ...}
bk, _ := c.GetTdxBk() // []*protocol.TdxBk{Short, Full}
_ = zs; _ = bk来自 zhb.zip 的全市场逐股数据。tdxstat.cfg 字段经 10 只大市值股对照实盘核验(见 protocol/model_stat.go 命中率注释),未核验字段保留在 Fields。
// 个股综合统计: 市盈TTM/静态市盈/股息率/涨跌幅/连涨连跌天数/区间涨跌幅(5/10/20/60日/YTD, 均已核验)
stat, _ := c.GetTdxStat()
for _, s := range stat {
fmt.Printf("%s PE_TTM=%.2f 静PE=%.2f 股息=%.2f%% 连涨跌=%d 5日=%.2f%% 20日=%.2f%% YTD=%.2f%%\n",
s.Code, s.PETTM, s.PEStatic, s.DivYield, s.TrendDays, s.Chg5, s.Chg20, s.ChgYTD)
}
// 资金流向 + 板块归属(股→板块id 反向映射)
stat2, _ := c.GetTdxStat2()
s2b := protocol.StockBlockIndex(stat2) // map[证券代码]板块指数代码
_ = s2b
// 新股申购
xgsg, _ := c.GetXgsg()
for _, x := range xgsg {
fmt.Printf("%s %s 申购日=%s 发行价=%.3f\n", x.Code, x.Name, x.Date, x.IssuePrice)
}完整演示见
example/DumpReportFile:下载 zhb.zip、解压、解析、板块 id 关联一条龙。
扩展行情走独立服务(端口 7727),需用 DialExHq* 单独连接。
ex, err := tdx.DialExHqDefault() // 或 DialExHq(addr) / DialExHqHosts(hosts)
if err != nil { panic(err) }
defer ex.Close()
markets, _ := ex.ExMarkets() // 市场代码表
n, _ := ex.ExCount() // 品种数量
insts, _ := ex.ExInstruments(0, 100) // 品种(代码)列表分页
q, _ := ex.ExQuote(market, code) // 单品种五档行情
bars, _ := ex.ExBars(category, market, code, 0, 20) // K线
ticks, _ := ex.ExTrade(market, code, 0, 30) // 分笔成交
_ = markets; _ = n; _ = insts; _ = q; _ = bars; _ = ticksmac 方言是通达信 MAC 版客户端使用的协议变体: 传输信封与标准 7709 完全相同(16字节响应头+zlib),
仅内层命令帧不同。服务器为独立 mac 池(与标准行情不重叠, 端口同 7709), 需用 DialMac* 单独连接。
相比标准协议 GetTrade(分钟精度), mac 逐笔提供秒级时间 + 成交笔数, 且含盘后固定价格成交:
c, err := tdx.DialMacDefault() // 或 DialMac(addr) / DialMacHosts(hosts)
if err != nil { panic(err) }
defer c.Close()
// 最近交易时段全部逐笔(自动分页, 时间正序), 秒级+笔数
resp, err := c.GetMacTradeAll("sh601872")
if err != nil { panic(err) }
for _, v := range resp.List {
fmt.Println(v) // 2026-08-28 09:25:01 19.000 7907(手) 626(笔)
}
// 指定日期(YYYYMMDD)
hist, err := c.GetMacHistoryTrade("20260828", "sh601872", 0, 10) // start 从最新端往回
_ = hist
// 批量自定义字段报价(实时): 主力净流入/内外盘/均价/涨速/量比/涨跌停价/PE/盘后量/五档盘口/委比
// (标准 GetQuote 没有的字段, 厂商口径; 单次最多 80 只, 一次请求批量五档)
quotes, err := c.GetMacQuote("sh601872", "sz000001")
_ = quotes
// 资金流向(主力/散户净额, 与 0x122B 主力净额同源) / 所属板块
flow, err := c.GetMacCapitalFlow("sh601872")
_ = flow
boards, err := c.GetMacBelongBoards("sh601872") // 上海板块(880216)...
_ = boards
// 板块成分(按涨幅降序; 板块显示代码自动转协议代码 880216→20216)
members, err := c.GetMacBoardMembers("880216", 0, 10)
_ = members
// 交易时段与交易日历 / K线总量 / 远程文件
session, err := c.GetMacServerSession()
_ = session
cnt, err := c.GetMacKlineCount()
_ = cnt
data, err := c.GetMacFile("文件名") // 自动分段下载(单段 30KB)
_ = data说明:
- 单次
GetMacTrade请求start从最新一端往回偏移,count建议 ≤1000;GetMacTradeAll自动分页拼接为时间正序, 建议盘后调用。 MacTrade.Status: 0=买入 1=卖出 2=中性/集合竞价 5=盘后固定价格成交。- 记录时间日期部分为请求日期/客户端当日, 非交易日拉取的是最近交易日数据(同标准
GetTrade)。 - 已与 easy_tdx(其协议逆向自 pytdx, 数据与东方财富逐笔对账)逐行核对 100% 一致; 实连测试
TDX_MAC_LIVE=1 go test . -run TestMacTradeLive。 GetMacQuote实测校验: 内盘+外盘=总量、均价×股数=成交额、换手=量/流通股 全部吻合;MainNetAmount为通达信自家主力口径(与腾讯/东财同数量级但数值不同); 顺带修正了 easy_tdx 类型表一处错误(0x2E 盘后量实为 float32 而非 int32)。
| IP | 测试时间 | 运营商 | 结果 |
|---|---|---|---|
| 124.71.187.122 | 2026-05-16 | 华为 | ✅️ |
| 122.51.120.217 | 2026-05-16 | 腾讯 | ✅️ |
| 111.229.247.189 | 2026-05-16 | 腾讯 | ✅️ |
| 122.51.232.182 | 2026-05-16 | 腾讯 | ✅️ |
| 118.25.98.114 | 2026-05-16 | 腾讯 | ✅️ |
| 124.70.199.56 | 2026-05-16 | 华为 | ✅️ |
| 121.36.225.169 | 2026-05-16 | 华为 | ✅️ |
| 123.60.70.228 | 2026-05-16 | 华为 | ✅️ |
| 123.60.73.44 | 2026-05-16 | 华为 | ✅️ |
| 124.70.133.119 | 2026-05-16 | 华为 | ✅️ |
| 124.71.187.72 | 2026-05-16 | 华为 | ✅️ |
| 123.60.84.66 | 2026-05-16 | 华为 | ✅️ |
| 124.223.163.242 | 2026-05-16 | 腾讯云 | ✅️ |
| 150.158.160.2 | 2026-05-16 | 腾讯云 | ✅️ |
| 101.35.121.35 | 2026-05-16 | 腾讯云 | ✅️ |
| 111.231.113.208 | 2026-05-16 | 腾讯云 | ✅️ |
| IP | 测试时间 | 运营商 | 结果 |
|---|---|---|---|
| 62.234.50.143 | 2026-05-16 | 腾讯云 | ✅️ |
| 81.70.151.186 | 2026-05-16 | 腾讯云 | ✅️ |
| 101.42.240.54 | 2026-05-16 | 腾讯云 | ✅️ |
| 101.43.159.194 | 2026-05-16 | 腾讯云 | ✅️ |
| 120.53.8.251 | 2026-05-16 | 腾讯云 | ✅️ |
| 152.136.191.169 | 2026-05-16 | 腾讯云 | ✅️ |
| 49.232.15.141 | 2026-05-16 | 腾讯云 | ✅️ |
| 82.156.174.84 | 2026-05-16 | 腾讯云 | ✅️ |
| 101.42.164.241 | 2026-05-16 | 腾讯云 | ✅️ |
| IP | 测试时间 | 运营商 | 结果 |
|---|---|---|---|
| 124.71.9.153" | 2026-05-16 | 华为 | ✅️ |
| 116.205.163.254" | 2026-05-16 | 华为 | ✅️ |
| 116.205.171.132" | 2026-05-16 | 华为 | ✅️ |
| 116.205.183.150" | 2026-05-16 | 华为 | ✅️ |
| 111.230.186.52" | 2026-05-16 | 腾讯 | ✅️ |
| 110.41.2.72" | 2026-05-16 | 华为 | ✅️ |
| 110.41.147.114" | 2026-05-16 | 华为 | ✅️ |
| 101.33.225.16" | 2026-05-16 | 腾讯云 | ✅️ |
| 175.178.112.197" | 2026-05-16 | 腾讯云 | ✅️ |
| 175.178.128.227" | 2026-05-16 | 腾讯云 | ✅️ |
| 43.139.95.83" | 2026-05-16 | 腾讯云 | ✅️ |
| 159.75.29.111" | 2026-05-16 | 腾讯云 | ✅️ |
| 43.139.18.171" | 2026-05-16 | 腾讯云 | ✅️ |
| 81.71.32.47" | 2026-05-16 | 腾讯云 | ✅️ |
| 129.204.230.128" | 2026-05-16 | 腾讯云 | ✅️ |
| IP | 测试时间 | 运营商 | 结果 |
|---|---|---|---|
| 119.97.185.59 | 2026-01-26 | 电信 | ✅️ |
- 本项目仅供 学习、研究和技术交流 使用,禁止用于任何商业或非法用途。
- 使用本项目产生的任何数据、损失或法律责任,作者 不承担任何责任。
- 对第三方服务器或服务的访问,用户需自行遵守相关法律法规及服务协议。
- 请勿将本项目用于侵犯他人权益或违反监管规定的行为。
MIT License - 详见 LICENSE
⭐ 喜欢这个项目吗?点个 Star 支持一下吧!