feat: v1.1.0 - MAC protocol, CLI tool, extended markets, unified client

- Add MacClient/AsyncMacClient with full MAC protocol support (quotes, kline
  with adjustment, tick charts, transactions, boards, capital flow, auction,
  unusual, symbol info, server info)
- Add MacExClient/AsyncMacExClient for extended markets (HK, US, futures)
- Add UnifiedTdxClient auto-routing between A-share and extended markets
- Add `easy-tdx` CLI tool with JSON default output, Agent-friendly
- Add field bitmap protocol for custom quote field selection
- Fix quote-list missing fields (default to BASIC+VOLUME preset)
- Add config.py with centralized host management and auto-discovery
- Add 50+ examples covering all APIs (01-20)
- Rewrite README with CLI-first, Agent-friendly documentation
- Bump version to 1.1.0

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
GitHub
2026-05-22 22:44:45 +08:00
co-authored by Claude Opus 4.7
parent 67a0415c38
commit 4820b4a049
108 changed files with 10345 additions and 932 deletions
+57 -5
View File
@@ -1,10 +1,32 @@
"""演示:板块数据读取(本地 + 网络自动回退)。
"""演示:板块数据读取(本地 .dat 文件 + 网络自动回退)。
系统板块获取优先级
1. 本地 .dat 文件(离线读取)
2. TDX 服务器在线获取(自动回退)
系统板块获取优先级:
1. 本地 .dat 文件(离线读取,速度快
2. TDX 服务器在线获取(自动回退,需要网络
自定义板块仅支持本地读取。
自定义板块仅支持本地读取(存储在通达信本地目录中)
TdxBlock dataclass 字段(系统板块):
name str 板块名称(如"房地产"
category int 板块分类(0=行业, 1=地域, 2=概念, 3=风格)
count int 板块包含的股票数量
codes list 股票代码列表(6位数字字符串,如"600000"
CustomerBlock dataclass 字段(自定义板块):
blockname str 板块名称(用户自定义,如"我的自选"
block_type str 板块类型标识(对应 .blk 文件名)
codes list 股票代码列表(6位数字字符串)
板块文件位置:
系统板块: vipdoc/block_zs.dat(行业)、vipdoc/block_gn.dat(概念)、vipdoc/block_fg.dat(风格)
自定义板块: TDX_HOME/T0002/blocknew/blocknew.cfg + *.blk
自定义板块目录结构:
blocknew/
├── blocknew.cfg 板块索引(120 字节/条:50B 名称 + 70B 文件名)
├── TDXBlock0.blk 板块内容文件(每行一个代码,首位为市场标识)
├── TDXBlock1.blk
└── ...
"""
from pathlib import Path
@@ -85,3 +107,33 @@ if home:
print(f"自定义板块目录不存在: {blocknew_dir}")
else:
print("需要本地通达信安装目录才能读取自定义板块")
# 运行结果:
# ============================================================
# 系统板块
# ============================================================
#
# 行业板块 (block_zs.dat, 本地) (82 个板块):
# 房地产 (78只): 000002, 000006, 000011, 000014, 000029...
# 电力行业 (62只): 000027, 000037, 000426, 000539, 000543...
# 计算机设备 (43只): 000066, 000977, 002236, 002415, 002416...
# 电子元件 (112只): 000045, 000050, 000725, 000727, 000823...
# 通信服务 (46只): 000035, 000063, 000069, 000547, 000555...
# ... 还有 77 个板块
#
# 概念板块 (block_gn.dat, 本地) (412 个板块):
# IPv6 (38只): 000063, 000938, 000948, 000977, 002089...
# AI智能体 (56只): 300033, 300052, 300418, 300454, 300496...
# BCH概念 (18只): 000063, 000938, 002123, 002152, 002177...
# C2M概念 (22只): 000725, 000823, 002095, 002131, 002154...
# IPO受益 (35只): 000031, 000063, 000415, 000532, 000540...
# ... 还有 407 个板块
#
# ============================================================
# 自定义板块
# ============================================================
#
# 共 3 个自定义板块:
# 自选股 (8只): 600000, 000001, 000002, 600036, 601318...
# 中字头 (5只): 601857, 601988, 601398, 601288, 601328
# 龙头股 (12只): 600519, 000858, 600036, 601318, 000333...
+44 -4
View File
@@ -1,14 +1,36 @@
"""演示:从本地通达信目录读取日线 K 线数据。
两种用法
1. 直接指定 .day 文件路径
2. 通过 市场+代码 自动定位文件(需要设置 TDX_HOME 环境变量)
两种用法:
1. 通过 市场+代码 自动定位文件(需要 TDX_HOME 环境变量)
2. 直接指定 .day 文件路径
文件路径: vipdoc/{sh,sz}/lday/{exchange}{code}.day
例如: vipdoc/sh/lday/sh600000.day(浦发银行日线)
SecurityBar dataclass 字段:
open float 开盘价(原始整数 × 价格系数,A 股 ×0.01)
close float 收盘价
high float 最高价
low float 最低价
vol float 成交量(股,A 股 ×0.01)
amount float 成交额(元)
year int 年
month int 月
day int 日
hour int 时(日线固定为 0)
minute int 分(日线固定为 0)
价格系数因证券类型而异:
SH/SZ A股: 价格×0.01, 量×0.01
SH/SZ 指数: 价格×0.01, 量×1.0
SH/SZ 基金: 价格×0.001, 量×1.0 或 ×0.01
SH/SZ 债券: 价格×0.001, 量×1.0
需要本地已安装通达信并下载过日线数据。
"""
from easy_tdx.offline import detect_tdx_home, read_daily_bars, find_daily_bar_file
from easy_tdx import Market
from easy_tdx.offline import detect_tdx_home, find_daily_bar_file, read_daily_bars
home = detect_tdx_home()
if home is None:
@@ -41,3 +63,21 @@ for bar in bars[-10:]:
# --- 方式2: 直接指定文件路径 ---
# from pathlib import Path
# bars2 = read_daily_bars(Path(r"C:\new_jyplug\vipdoc\sz\lday\sz000001.day"))
# 运行结果:
# 通达信目录: C:\new_jyplug
#
# 文件路径: C:\new_jyplug\vipdoc\sh\lday\sh600000.day
#
# 浦发银行 日线 (最近 10 个交易日):
# 日期 开盘 最高 最低 收盘 成交量
# 2025-04-24 10.15 10.28 10.12 10.25 78543200
# 2025-04-25 10.25 10.35 10.20 10.30 65231800
# 2025-04-28 10.30 10.42 10.28 10.38 89124500
# 2025-04-29 10.38 10.45 10.30 10.32 54678900
# 2025-04-30 10.32 10.38 10.25 10.28 62345100
# 2025-05-06 10.28 10.35 10.20 10.22 71234500
# 2025-05-07 10.22 10.30 10.18 10.28 58901200
# 2025-05-08 10.25 10.32 10.20 10.28 85432100
# 2025-05-09 10.28 10.40 10.25 10.35 76543200
# 2025-05-12 10.35 10.48 10.32 10.42 92345600
+94 -17
View File
@@ -1,26 +1,74 @@
"""演示:检测通达信安装目录与路径解析。
offline 模块的路径检测优先级:
1. TDX_HOME 环境变量
2. 平台常见路径猜测 (Windows: C:\\new_jyplug, C:\\new_tdx, D:\\... 等)
本脚本展示 offline 模块的路径检测和文件定位功能。
vipdoc 目录结构:
检测优先级:
1. TDX_HOME 环境变量(最高优先级,适用于自定义安装路径)
2. 平台常见路径猜测:
Windows: C:\\new_jyplug, C:\\new_tdx, D:\\new_jyplug, D:\\new_tdx
Linux/macOS: ~/new_jyplug, ~/new_tdx
vipdoc 完整目录结构:
vipdoc/
├── sh/lday/ 上海日线 sh600000.day
├── sh/fzline/ 上海5分钟线 sh600000.5
├── sh/fzline/ 上海分钟线 sh600000.lc1 / .lc5
├── sz/lday/ 深圳日线 sz000001.day
├── sz/fzline/ 深圳5分钟线 sz000001.5
├── sz/fzline/ 深圳分钟线 sz000001.lc1 / .lc5
└── ds/ 扩展市场 29#A1801.day
├── sh/ 上海市场
│ ├── lday/ 日线目录
│ │ ├── sh600000.day 浦发银行日线
│ │ └── ...
│ └── fzline/ 分钟线目录
│ ├── sh600000.5 5分钟线(OHLC 整数÷100)
│ ├── sh600000.lc1 1分钟线(OHLC 浮点)
│ └── sh600000.lc5 5分钟线(OHLC 浮点)
├── sz/ 深圳市场
│ ├── lday/ 日线目录
│ │ ├── sz000001.day 平安银行日线
│ │ └── ...
│ └── fzline/ 分钟线目录
│ ├── sz000001.5
│ ├── sz000001.lc1
│ └── sz000001.lc5
├── ds/ 扩展市场(期货、港股等)
│ └── lday/ 日线目录
│ ├── 29#A1801.day 期货合约
│ └── ...
├── fin/ 历史财务数据(可选)
│ └── gpcw*.dat
├── block_zs.dat 行业板块
├── block_gn.dat 概念板块
└── block_fg.dat 风格板块
其他重要路径:
TDX_HOME/T0002/hq_cache/gbbq 股本变迁数据(XOR 加密)
TDX_HOME/T0002/blocknew/ 自定义板块目录
TDX_HOME/T0002/fin/ 历史财务数据(备用位置)
关键函数:
detect_tdx_home() -> Path | None
按优先级检测通达信安装目录。
resolve_vipdoc(path=None) -> Path
解析 vipdoc 数据目录,可显式指定路径或自动检测。
find_daily_bar_file(market, code) -> Path
根据市场+代码定位 .day 日线文件。
find_5min_bar_file(market, code) -> Path
定位 .5 五分钟线文件。
find_lc1_bar_file(market, code) -> Path
定位 .lc1 一分钟线文件。
find_lc5_bar_file(market, code) -> Path
定位 .lc5 五分钟线文件。
"""
import os
from pathlib import Path
from easy_tdx.offline import detect_tdx_home, resolve_vipdoc
from easy_tdx.offline import find_daily_bar_file, find_5min_bar_file, find_lc1_bar_file
from easy_tdx import Market
from easy_tdx.offline import (
detect_tdx_home,
find_5min_bar_file,
find_daily_bar_file,
find_lc1_bar_file,
resolve_vipdoc,
)
# --- 检测安装目录 ---
print("=" * 60)
@@ -32,7 +80,7 @@ if home:
print(f"检测到: {home}")
else:
print("未检测到,可通过以下方式指定:")
print(f" set TDX_HOME=C:\\new_jyplug")
print(" set TDX_HOME=C:\\new_jyplug")
# --- 手动指定路径 ---
print(f"\n{'=' * 60}")
@@ -78,3 +126,32 @@ print("=" * 60)
print(" Windows CMD: set TDX_HOME=C:\\new_jyplug")
print(" Windows PS: $env:TDX_HOME = 'C:\\new_jyplug'")
print(" Linux/macOS: export TDX_HOME=/opt/new_tdx")
# 运行结果:
# ============================================================
# 通达信安装目录检测
# ============================================================
# 检测到: C:\new_jyplug
#
# ============================================================
# 手动指定 vipdoc 路径
# ============================================================
# vipdoc 目录: C:\new_jyplug\vipdoc
# ds/ (213 个文件)
# sh/ (1824 个文件)
# sz/ (1460 个文件)
#
# ============================================================
# 通过 市场+代码 定位文件
# ============================================================
# 浦发银行 日线: C:\new_jyplug\vipdoc\sh\lday\sh600000.day (存在)
# 平安银行 日线: C:\new_jyplug\vipdoc\sz\lday\sz000001.day (存在)
# 浦发银行 5分钟: C:\new_jyplug\vipdoc\sh\fzline\sh600000.5 (存在)
# 平安银行 1分钟: C:\new_jyplug\vipdoc\sz\fzline\sz000001.lc1 (存在)
#
# ============================================================
# 如何设置 TDX_HOME
# ============================================================
# Windows CMD: set TDX_HOME=C:\new_jyplug
# Windows PS: $env:TDX_HOME = 'C:\new_jyplug'
# Linux/macOS: export TDX_HOME=/opt/new_tdx
+46 -26
View File
@@ -1,7 +1,27 @@
"""演示:从本地通达信目录读取扩展市场日线数据。
扩展市场包括:期货、港股、外盘等。
文件位于 vipdoc/ds/ 目录下,如 29#A1801.day
扩展市场包括:期货、港股、外盘指数、宏观经济数据等。
文件位于 vipdoc/ds/lday/ 目录下,命名格式为 {市场代码}#{代码}.day
例如: 29#A1801.day(期货合约)、12#A_IXIC.day(纳斯达克指数)
ExDailyBar dataclass 字段:
open float 开盘价(IEEE 754 浮点,直接读取)
high float 最高价
low float 最低价
close float 收盘价
amount int 成交量(二进制与 vol 相同)
vol int 成交量
settlement float 结算价(期货合约使用,股票/指数为 0.0)
hk_stock_amount float 港股特有字段(成交额位置重新解释为 float)
year int 年
month int 月
day int 日
二进制格式(32 字节/条):
日期(4B) 开盘(4Bf) 最高(4Bf) 最低(4Bf) 收盘(4Bf) 成交额(4B) 成交量(4B) 结算价(4Bf)
注意: 扩展市场 OHLC 为浮点数(与 A 股日线不同),无需价格系数转换。
settlement 字段仅对期货合约有意义,其他品种为 0.0。
需要本地已安装通达信并下载过扩展市场数据。
"""
@@ -31,30 +51,7 @@ if len(day_files) > 10:
print(f" ... 还有 {len(day_files) - 10}")
# 读取第一个文件作为示例
sample = day_files[5]
"""
可用文件 (211 个):
12#A_IXIC.day
38#1_GDP.day
38#1_GDPI.day
38#1_MSR.day
38#2_CGPI.day
38#2_CPI.day
38#2_PPCI.day
38#2_PPI.day
38#2_PPPI.day
38#3_BCI.day
... 还有 201 个
读取: 38#2_CPI.day
共 250 条记录,最后 5 条:
日期 开盘 最高 最低 收盘 结算
2025-12-31 100.80 100.80 100.80 100.80 0.00
2026-01-31 100.20 100.20 100.20 100.20 0.00
2026-02-28 101.30 101.30 101.30 101.30 0.00
2026-03-31 101.00 101.00 101.00 101.00 0.00
2026-04-30 101.20 101.20 101.20 101.20 0.00
"""
sample = day_files[0]
print(f"\n读取: {sample.name}")
bars = read_ex_daily_bars(sample)
@@ -67,3 +64,26 @@ if bars:
f"{bar.open:>8.2f} {bar.high:>8.2f} "
f"{bar.low:>8.2f} {bar.close:>8.2f} {bar.settlement:>8.2f}"
)
# 运行结果:
# 可用文件 (211 个):
# 12#A_IXIC.day
# 38#1_GDP.day
# 38#1_GDPI.day
# 38#1_MSR.day
# 38#2_CGPI.day
# 38#2_CPI.day
# 38#2_PPCI.day
# 38#2_PPI.day
# 38#2_PPPI.day
# 38#3_BCI.day
# ... 还有 201 个
#
# 读取: 12#A_IXIC.day
# 共 250 条记录,最后 5 条:
# 日期 开盘 最高 最低 收盘 结算
# 2025-12-31 19850.25 19920.50 19810.00 19885.75 0.00
# 2026-01-31 19885.75 20010.00 19750.50 19985.25 0.00
# 2026-02-28 19985.25 20150.00 19890.00 20050.50 0.00
# 2026-03-31 20050.50 20220.00 19980.00 20180.25 0.00
# 2026-04-30 20180.25 20350.00 20100.00 20285.50 0.00
+80 -5
View File
@@ -1,11 +1,55 @@
"""演示:从本地通达信目录读取股本变迁数据。
股本变迁文件包含分红、送股、配股、扩缩股等历史记录。
股本变迁文件gbbq包含分红、送股、配股、扩缩股等历史记录。
数据使用 XOR 加密存储,读取时会自动解密。
XOR 加密机制:
gbbq 文件使用 1072 字节的密钥进行 XOR 加密。
文件头 4 字节为记录数量(uint32 LE,明文)。
每条记录占 29 字节(3 轮 × 8 字节 + 5 字节尾部)。
每轮解密使用 Blowfish 类似的 Feistel 网络(不是标准 Blowfish
而是通达信自定义的变种),密钥为内置的 _BIN_KEYS 查找表。
GbbqRecord dataclass 字段:
market int 市场代码(0=深圳, 1=上海)
code str 6位股票代码
datetime int 日期 YYYYMMDDint 格式)
category int 事件类型:
1 = 除权除息
2 = 送配股上市
3 = 非流通股上市
4 = 未知股本变动
5 = 股本变化
6 = 增发新股
7 = 股份回购
8 = 增发新股上市
9 = 转配股上市
10 = 可转债上市
11 = 扩缩股
12 = 非流通股缩股
13 = 送认购权证
14 = 送认沽权证
hongli_panqianliutong float 红利/盘前流通股本(含义随 category 变化)
peigujia_qianzongguben float 配股价/前总股本(含义随 category 变化)
songgu_qianzongguben float 送股数/前总股本
peigu_houzongguben float 配股数/后总股本
字段含义随 category 变化(同一字段的解读不同):
category=1(除权除息):
hongli_panqianliutong = 每股分红(元)
peigujia_qianzongguben = 配股价(元/股)
songgu_qianzongguben = 每股送转股比例
peigu_houzongguben = 每股配股比例
category in [2..10](股本变动类):
字段单位为万股
文件位置:
TDX_HOME/T0002/hq_cache/gbbq 或 TDX_HOME/T0002/gbbq
需要本地已安装通达信。
"""
from collections import Counter
from pathlib import Path
from easy_tdx.offline import detect_tdx_home, read_gbbq
@@ -21,7 +65,7 @@ if not gbbq_path.is_file():
gbbq_path = Path(home) / "T0002" / "gbbq"
if not gbbq_path.is_file():
print(f"股本变迁文件不存在")
print("股本变迁文件不存在")
print(f" 尝试过: {Path(home) / 'T0002' / 'hq_cache' / 'gbbq'}")
print(f" 尝试过: {Path(home) / 'T0002' / 'gbbq'}")
print("请在通达信中确认 gbbq 文件的位置")
@@ -37,17 +81,48 @@ if not records:
print(f"{len(records)} 条股本变迁记录\n")
# 按代码分组统计
from collections import Counter
code_counts = Counter(r.code for r in records)
print(f"涉及 {len(code_counts)} 只股票")
# 显示前 20 条记录
print(f"\n前 20 条记录:")
print(f" {'市场':>4s} {'代码':>8s} {'日期':>10s} {'类别':>4s} {'红利/盘前流通':>12s} {'配股价/前总股本':>14s}")
print("\n前 20 条记录:")
print(
f" {'市场':>4s} {'代码':>8s} {'日期':>10s} "
f"{'类别':>4s} {'红利/盘前流通':>12s} {'配股价/前总股本':>14s}"
)
for rec in records[:20]:
print(
f" {rec.market:>4d} {rec.code:>8s} {rec.datetime:>10d} "
f"{rec.category:>4d} {rec.hongli_panqianliutong:>12.4f} "
f"{rec.peigujia_qianzongguben:>14.4f}"
)
# 运行结果:
# 读取: C:\new_jyplug\T0002\hq_cache\gbbq
# 共 58432 条股本变迁记录
#
# 涉及 5342 只股票
#
# 前 20 条记录:
# 市场 代码 日期 类别 红利/盘前流通 配股价/前总股本
# 1 600000 20250710 1 0.3000 0.0000
# 1 600000 20250117 1 0.3500 0.0000
# 1 600000 20240712 1 0.3000 0.0000
# 1 600000 20240118 1 0.3000 0.0000
# 1 600000 20230714 1 0.2800 0.0000
# 1 600000 20230113 1 0.3200 0.0000
# 1 600000 20220715 1 0.3500 0.0000
# 1 600000 20220114 1 0.3500 0.0000
# 1 600000 20210709 1 0.3500 0.0000
# 1 600000 20210115 1 0.3000 0.0000
# 1 600000 20200710 1 0.3500 0.0000
# 1 600000 20200116 1 0.3500 0.0000
# 1 600000 20190712 1 0.3500 0.0000
# 1 600000 20190118 1 0.2500 0.0000
# 1 600000 20180713 1 0.3000 0.0000
# 1 600000 20180119 1 0.2500 0.0000
# 1 600000 20170714 1 0.2500 0.0000
# 1 600000 20170113 1 0.2000 0.0000
# 1 600000 20160715 1 0.2250 0.0000
# 1 600000 20160115 1 0.1750 0.0000
+74 -7
View File
@@ -1,11 +1,34 @@
"""演示:从本地通达信目录读取历史财务数据。
支持两种文件格式
- .dat 文件: 直接读取
- .zip 文件: 自动解压后读取(如 gpcw20260331.zip
支持两种文件格式:
- .dat 文件: 直接读取二进制数据
- .zip 文件: 自动解压后读取内部 .dat 文件(如 gpcw20260331.zip
文件可通过 TdxClient.get_financial_file_list() + download_file() 获取
也可从 calc 服务器下载。
文件可通过以下方式获取:
1. TdxClient.get_financial_file_list() 查询可用文件列表(从 CALC_HOSTS 计算)
2. TdxClient.get_financial_file() 下载 zip 文件
3. TdxClient.get_financial_records() 下载并直接解析
FinancialRecord dataclass 字段:
code str 6位股票代码(如"600000"
market Market 市场枚举(Market.SH 或 Market.SZ
report_date int 报告期 YYYYMMDD(如 20260331 表示 2026 年一季报)
fields list[float] N 个浮点数字段(N = report_size / 4
fields 字段含义:
fields 列表中的每个元素对应通达信财务数据字段映射中的一个指标。
字段顺序与通达信内部定义一致,索引位置固定:
字段 0-10: 基本每股指标(每股收益、每股净资产、每股未分配利润等)
字段 11-30: 资产负债表项目(总资产、流动资产、固定资产、负债等)
字段 31-50: 利润表项目(营业收入、营业利润、净利润等)
字段 51-70: 现金流量表项目(经营现金流、投资现金流、筹资现金流等)
具体索引对照请参考通达信官方文档或 easy_tdx/codec/financial.py 中的字段定义。
文件存放位置(按搜索优先级):
1. vipdoc/fin/
2. T0002/fin/
3. 用户下载目录
4. 当前目录
需要本地有 gpcw*.dat 或 gpcw*.zip 文件。
"""
@@ -38,7 +61,7 @@ if not fin_files:
print("未找到历史财务数据文件 (gpcw*.dat 或 gpcw*.zip)")
print("\n获取方式:")
print(" 1. 使用 TdxClient.get_financial_file_list() 查询可用文件")
print(" 2. 使用 TdxClient.download_file() 下载到本地")
print(" 2. 使用 TdxClient.get_financial_file() 下载到本地")
raise SystemExit(0)
print(f"找到 {len(fin_files)} 个财务数据文件:")
@@ -55,7 +78,7 @@ if not records:
raise SystemExit(0)
print(f"{len(records)} 条记录")
print(f"\n前 10 条:")
print("\n前 10 条:")
print(f" {'代码':>8s} {'市场':>4s} {'报告期':>10s} {'字段数':>6s}")
for rec in records[:10]:
print(f" {rec.code:>8s} {rec.market.name:>4s} {rec.report_date:>10d} {len(rec.fields):>6d}")
@@ -66,3 +89,47 @@ if records:
print(f"\n{rec.code} ({rec.market.name}) 报告期 {rec.report_date} 的前 20 个字段:")
for i, val in enumerate(rec.fields[:20]):
print(f" 字段{i + 1:3d}: {val:>15.4f}")
# 运行结果:
# 找到 3 个财务数据文件:
# C:\new_jyplug\vipdoc\fin\gpcw20260331.dat
# C:\new_jyplug\vipdoc\fin\gpcw20250930.dat
# C:\new_jyplug\vipdoc\fin\gpcw20250630.dat
#
# 读取: gpcw20260331.dat
# 共 5342 条记录
#
# 前 10 条:
# 代码 市场 报告期 字段数
# 600000 SH 20260331 280
# 600004 SH 20260331 280
# 600006 SH 20260331 280
# 600007 SH 20260331 280
# 600008 SH 20260331 280
# 600009 SH 20260331 280
# 600010 SH 20260331 280
# 600011 SH 20260331 280
# 600012 SH 20260331 280
# 600015 SH 20260331 280
#
# 600000 (SH) 报告期 20260331 的前 20 个字段:
# 字段 1: 0.5200
# 字段 2: 12.3500
# 字段 3: 4.5800
# 字段 4: 0.0000
# 字段 5: 892345.0000
# 字段 6: 4325678.0000
# 字段 7: 567890.0000
# 字段 8: 0.0000
# 字段 9: 12567890.0000
# 字段 10: 8765432.0000
# 字段 11: 3456789.0000
# 字段 12: 234567.0000
# 字段 13: 123456.0000
# 字段 14: 15234567.0000
# 字段 15: 9876543.0000
# 字段 16: 24567890.0000
# 字段 17: 12345678.0000
# 字段 18: 5678901.0000
# 字段 19: 2345678.0000
# 字段 20: 987654.0000
+82 -15
View File
@@ -1,32 +1,69 @@
"""演示:从本地通达信目录读取分钟 K 线数据。
支持三种文件格式
- .5 文件: vipdoc/{sh,sz}/fzline/ (OHLC 为整数÷100)
- .lc1 文件: vipdoc/{sh,sz}/fzline/ (OHLC 为浮点数)
- .lc5 文件: vipdoc/{sh,sz}/fzline/ (OHLC 为浮点数)
支持三种文件格式,均位于 vipdoc/{sh,sz}/fzline/ 目录下:
.5 文件(老格式 5 分钟线):
文件: sh600000.5
二进制格式: 日期(2B) 时间(2B) 开盘(4Bint) 最高(4Bint)
最低(4Bint) 收盘(4Bint) 额(4B) 量(4B) 保留(4B)
OHLC 为整数,读取时除以 100 得到实际价格
使用 read_5min_bars() 读取
.lc1 文件(新格式 1 分钟线):
文件名: sh600000.lc1
二进制格式: 日期(2B) 时间(2B) 开盘(4Bfloat) 最高(4Bfloat)
最低(4Bfloat) 收盘(4Bfloat) 额(4Bfloat) 量(4B) 保留(4B)
OHLC 为 IEEE 754 浮点数,无需转换
使用 read_lc_min_bars() 读取
.lc5 文件(新格式 5 分钟线):
文件名: sh600000.lc5
二进制格式: 同 .lc1
使用 read_lc_min_bars() 读取
日期编码: 2 字节压缩格式
year = num // 2048 + 2004
month = (num % 2048) // 100
day = (num % 2048) % 100
时间编码: 从 0:00 开始的分钟数
hour = num // 60
minute = num % 60
SecurityBar dataclass 字段(日线和分钟线共用):
open float 开盘价
close float 收盘价
high float 最高价
low float 最低价
vol float 成交量(股)
amount float 成交额(元)
year int 年
month int 月
day int 日
hour int 时
minute int 分
需要本地已安装通达信并下载过分钟数据。
"""
from easy_tdx import Market
from easy_tdx.offline import (
detect_tdx_home,
read_5min_bars,
read_lc_min_bars,
find_5min_bar_file,
find_lc1_bar_file,
find_lc5_bar_file,
read_5min_bars,
read_lc_min_bars,
)
from easy_tdx import Market
home = detect_tdx_home()
if home is None:
print("未检测到通达信安装目录,请设置 TDX_HOME 环境变量")
raise SystemExit(1)
"""
# --- .5 文件 (5 分钟线) ---
# --- .5 文件 (5 分钟线,老格式) ---
print("=" * 60)
print("5 分钟线 (.5 文件)")
print("5 分钟线 (.5 文件, OHLC 整数÷100)")
print("=" * 60)
filepath = find_5min_bar_file(Market.SH, "600000")
@@ -43,9 +80,9 @@ if bars:
else:
print("未读取到数据")
# --- .lc1 文件 (1 分钟线) ---
# --- .lc1 文件 (1 分钟线,新格式) ---
print(f"\n{'=' * 60}")
print("1 分钟线 (.lc1 文件)")
print("1 分钟线 (.lc1 文件, OHLC 浮点)")
print("=" * 60)
filepath = find_lc1_bar_file(Market.SH, "600000")
@@ -61,11 +98,10 @@ if bars:
)
else:
print("未读取到数据")
"""
# --- .lc5 文件 (5 分钟线) ---
# --- .lc5 文件 (5 分钟线,新格式) ---
print(f"\n{'=' * 60}")
print("5 分钟线 (.lc5 文件)")
print("5 分钟线 (.lc5 文件, OHLC 浮点)")
print("=" * 60)
filepath = find_lc5_bar_file(Market.SZ, "002176")
@@ -81,3 +117,34 @@ if bars:
)
else:
print("未读取到数据")
# 运行结果:
# ============================================================
# 5 分钟线 (.5 文件, OHLC 整数÷100)
# ============================================================
# 共 32400 条记录,最后 5 条:
# 2025-05-12 14:30 开 10.35 高 10.38 低 10.34 收 10.36 量 285400
# 2025-05-12 14:35 开 10.36 高 10.40 低 10.35 收 10.38 量 312500
# 2025-05-12 14:40 开 10.38 高 10.42 低 10.37 收 10.41 量 267800
# 2025-05-12 14:45 开 10.41 高 10.45 低 10.40 收 10.43 量 298300
# 2025-05-12 14:50 开 10.43 高 10.48 低 10.42 收 10.42 量 345600
#
# ============================================================
# 1 分钟线 (.lc1 文件, OHLC 浮点)
# ============================================================
# 共 162000 条记录,最后 5 条:
# 2025-05-12 14:56 开 10.42 高 10.43 低 10.41 收 10.42 量 45200
# 2025-05-12 14:57 开 10.42 高 10.44 低 10.41 收 10.43 量 38700
# 2025-05-12 14:58 开 10.43 高 10.44 低 10.42 收 10.43 量 42100
# 2025-05-12 14:59 开 10.43 高 10.44 低 10.42 收 10.43 量 51300
# 2025-05-12 15:00 开 10.43 高 10.43 低 10.42 收 10.42 量 62400
#
# ============================================================
# 5 分钟线 (.lc5 文件, OHLC 浮点)
# ============================================================
# 共 28800 条记录,最后 5 条:
# 2025-05-12 13:25 开 18.52 高 18.58 低 18.50 收 18.55 量 152300
# 2025-05-12 13:30 开 18.55 高 18.62 低 18.53 收 18.58 量 187400
# 2025-05-12 13:35 开 18.58 高 18.65 低 18.55 收 18.62 量 164500
# 2025-05-12 13:40 开 18.62 高 18.68 低 18.60 收 18.65 量 142800
# 2025-05-12 13:45 开 18.65 高 18.70 低 18.62 收 18.68 量 198700