江州大道 · 超短复盘看板生成器 v4.1(12段完整版)
触发条件
"超短复盘"、"涨停复盘"、"复盘看板"、"江州大道"。
模板来源
CSS 和 HTML 结构已于 2026-07-22 完全冻结,模板来源为 D:/Desktop/江州大道复盘/江州大道_超短复盘_07-20.html。
冻结文件:
references/css_frozen.md— 完整 CSS(181行),4格mood-grid / 2x2 kpi / .rw股票行 / .zha-row炸板行references/html_sections.md— 完整 HTML body 骨架(~37KB),作为模板复制
模板特征
| 特征 | 07-20 模板 | 07-22 v4.1 完整版 | |------|-----------|----------------| | mood-grid | 4 格(涨停/跌停/连板高度/一字板) | ✅ 4格 | | kpi | 2×2=4 格(成交额/炸板率/连板家数/周期定位) | ✅ 4格 | | 昨日回顾 | 无 | ✅ 无 | | 主线柱状图 | 有(.theme-row 横向条形图) | ✅ 有 | | 阶段涨幅榜 | 有(.rank-grid 3卡片,5/10/20日) | ✅ 有(tdx_screener 阶段涨幅选股) | | 涨停封单 TOP10 | 有(.row 排行) | ✅ 有(tdx_quotes 封单金额,恢复原始字段) | | 炸板明细·封板未果 | 有(.zha-row 炸板行,v4.3 紧凑版:2列网格 + 题材分组头) | ✅ 有(tdx_screener 炸板选股) | | 一字板·封板质量 | 有(独立 sec) | ✅ 有(tdx_quotes 今开=最高=最低 且涨停判定) | | ST/退市分组 | 有(.lz 子标题) | ✅ 有 | | gauge-scale | 0/30/50/70/100 | ✅ 0/30/50/70/100 |
页面顺序(12段,严格固定,不可改)
- brand-header(品牌头图 2.35:1,渐变背景+光影)
- 温度计 sec(4格 mood-grid + .premia 概要叙事)
- 情绪决策 sec(2×2 kpi + .dual 赚钱/亏钱 + .mid 连板+中军 + .verdict 决策)
- 主线题材柱状图 sec(.theme-row 横向柱状图 + .sig 叙事)
- 连板梯队·涨停明细 sec(.lz 板数标题 + .rw 股票行 + ST/退市分组)
- 涨停封单资金 TOP10 sec(.row 排行,tdx_quotes 封单金额降序取 TOP10)
- 一字板·封板质量 sec(.row 排行 + 分析叙事)
- 炸板明细·封板未果 sec(.zha-row 炸板行,tdx_screener 炸板选股)
- 阶段涨幅榜 sec(.rank-grid 3卡片:5/10/20日涨幅各TOP10)
- 风险警示 sec(.warn 叙事段)
- 观察锚点 sec(.anchor .a.hi/.po/.mn/.rk 四卡片)
- Footer(.ft 数据源+免责)
通达信 MCP 核心工具清单(tdx-connector)
| 工具 | 用途 | 单次上限 |
|------|------|---------|
| tdx_screener | 自然语言选股(涨停/跌停/炸板/阶段涨幅/行业/条件) | 默认20,可调大 |
| tdx_quotes | 实时行情快照(价/涨跌幅/换手率/成交额/封单金额/今开高低) | 批量 |
| tdx_kline | 日K线回溯(连板天数/一字板判定/区间涨停次数) | 1只/次 |
| tdx_lookup_stock | 名称/简称检索证券代码与市场 | - |
| tdx_indicator_select | 结构化指标与资料 | - |
| wenda_news_query | 财经新闻/主题资讯(涨停原因替代) | - |
| tdx_api_data | 统一底层API(阶段排行/封单等高级查询兜底) | - |
字段恢复说明(切换至 tdx 后)
对比旧版 iFind + westock 双源,切换至通达信 MCP 后下列字段恢复可用:
| 恢复字段 | 来源工具 |
|----------|---------|
| 封单金额 | tdx_quotes 封单金额字段(封单 TOP10 不再用成交额替代) |
| 涨停时间(FTIME) | tdx_quotes / tdx_kline 首板时间 |
| 涨停原因 | wenda_news_query 主题资讯替代 |
| 炸板列表 | tdx_screener("今日炸板的A股") 直接返回 |
生成流程(v4.0 模板冻结)
核心原则
CSS 和 HTML 结构永不修改。生成脚本 = 读取冻结模板 + 填入每日数据。
Step 0: 拉取数据(通达信 MCP / tdx-connector)
# 0a. 指数实时行情(上证/深证/创业)
tdx_quotes(codes=["000001", "399001", "399006"], fields=["最新价", "涨跌幅", "成交额"])
# 涨停家数 = len(0b结果);跌停家数 = len(0c结果);涨跌家数由指数行情+选股结果推导
# 0b. 涨停名单(自然语言选股)
tdx_screener(query="今日涨停的A股股票", limit=500) # → UP池 代码+简称
# 0c. 跌停名单
tdx_screener(query="今日跌停的A股股票", limit=500) # → DOWN池
# 0d. 批量实时行情(涨停/跌停池,含封单与开高低)
tdx_quotes(codes=[...涨停代码], fields=["最新价", "涨跌幅", "换手率", "成交额", "封单金额", "今开", "最高", "最低"])
# 0e. 连板天数(日K线回溯近10日涨停/一字板次数,高标优先生效)
tdx_kline(code, period="day", count=10) # 数区间内涨停天数 → 连板高度
# 0f. 阶段涨幅榜(自然语言阶段选股,5/10/20日各 TOP)
tdx_screener(query="近5日涨幅最大的20只A股", limit=20)
tdx_screener(query="近10日涨幅最大的20只A股", limit=20)
tdx_screener(query="近20日涨幅最大的20只A股", limit=20)
# 0g. 炸板列表
tdx_screener(query="今日炸板的A股股票", limit=200)
# 0h. 封单 TOP10(从 0d 行情按 封单金额 降序取 TOP10,恢复原始字段)
# 0i. 一字板(今开==最高==最低 且 涨停,由 0d 行情判定)
S 列表字段(6字段):(code, name, price, chg_pct, hsl%, 题材)
Step 1: 生成 Python 生成器脚本
创建 gen_brand_header_{date_str}.py:
-
读取冻结模板:
references/css_frozen.md→ 完整 CSS 字符串(181行,原样复制)references/html_sections.md→ HTML body 结构骨架
-
构建数据区:
- S 列表、D 列表、连板字典
- UP/DOWN/W_UP/W_DN/AMT/sentiment/max_cont_nonst
- 叙事段落(premia、dual、mid、verdict、warn、anchor)
-
按页面顺序拼接:
<!DOCTYPE html> → <style>冻结CSS</style> → brand-header → 温度计sec → 情绪决策sec → 主线柱状图sec → 涨停明细sec → 炸板sec → 风险警示sec → 锚点sec → Footer -
渲染股票行(.rw 格式):
f'<div class="rw"><div class="nm">{name}<span class="bd">{cont}板</span><span class="rs">{theme}</span></div><div class="code"><span class="px">+{chg}%</span><span class="ex">{hsl}%</span></div></div>'
Step 2: 运行 + 截图
python gen_brand_header_{date_str}.py
node screenshot_report.js {html路径} # 输出 header/body/full 三张PNG
输出路径:D:/Desktop/江州大道复盘/江州大道_超短复盘_{date_str}.html
关键规则(v4.0 冻结)
- CSS 绝不修改:从
references/css_frozen.md原样复制(181行,07-20模板) - HTML 结构绝不修改:页面顺序固定为 9 个板块(见上方)
- .rw 股票行格式固定:
.nm(名称+badge+题材) +.code(涨跌幅+换手率) - .lz 板数标题:
<div class="lz">N板 <span class="c">X只</span></div> - .subg 子分组:
<div class="subg">ST/反包·翘板<span class="cnt">X只</span></div> - .theme-row 柱状图:
<div class="theme-row"><div class="nm">题材</div><div class="barwrap"><div class="bar" style="width:N%"></div></div><div class="cnt">N</div></div> - .sig 题材叙事:放在柱状图下方
- .dual 赚钱/亏钱双栏:左边 .col.e 赚钱效应,右边 .col.l 亏钱效应
- mood-grid 始终 4 格:涨停/跌停/连板高度(非ST)/一字板
- kpi 始终 2×2=4 格:成交额/炸板率/连板家数/周期定位
- 无昨日回顾板块(07-20 模板特征)
- 炸板板块:
tdx_screener("今日炸板的A股")返回炸板列表;若为空或异常,标注"炸板数据暂不可用" - 换手率标注:>25% 黄底(.hsl-warn)已包含在 CSS 中,渲染时自行匹配
- 命名冲突修复:002460=赣锋锂业,002756=永兴材料,003029=永兴材料旧码不可再用
数据完整性规则(v4.2,防止涨停数不准)
根本问题
v4.0-v4.1 的数据流程是:screener 返回 JSON → 人工目视转录到 Python 脚本 → 手写 tuple。这个链路极易引入两类错误:
- 遗漏:screener 返回 128 只,手动转录漏掉几只(如 07-23 漏了 5 只)
- 伪涨停混入:为凑数把涨幅 < 9.5% 的股票加入 UP_ALL(如 +7.65% 赣锋锂业)
强制校验规则
生成的 gen_brand_header_{date}.py 必须在脚本末尾加入以下校验代码:
# ═══ 数据完整性校验(v4.2 强制) ═══
# screener 返回的 meta.total 必须与脚本收录的 UP_ALL 长度一致
_SCREENER_TOTAL = {从 screener meta.total 读取的值}
_actual = len(UP_ALL)
if _actual != _SCREENER_TOTAL:
raise SystemExit(f"❌ 涨停数据不完整!脚本收录 {_actual} 只,screener 返回 {_SCREENER_TOTAL} 只,差 {_SCREENER_TOTAL - _actual} 只。请检查遗漏。")
print(f"✅ 涨停数据完整校验通过: {_actual}/{_SCREENER_TOTAL}")
若校验失败 → 立即停止,对照 screener JSON 逐只排查遗漏/多余,修复后再继续。
防遗漏三原则
- 涨幅判定:chg ≥ +9.5% 才是真实涨停(考虑到 9.93%-10.13% 的含入误差),涨跌幅 < +9% 的绝对不放入 UP_ALL
- 双重验证:screener 拉取后立刻确认
meta.total数字,并在 HTML 生成前做len(UP_ALL) == meta.total校验 - 禁止凑数:不允许用非涨停股填充数据来"凑"某个数字;涨停数少了就是因为遗漏,必须从 screener 中找回来
STEP 0 拉取涨停时必做
拉取涨停池后,立即记录 meta.total 值和 meta.pageSize,确保 pageSize > total(无截断)。若 total > 200 条,需调整 pageSize。
炸板明细·紧凑排版规则(v4.3 新增)
24 只炸板默认单列 24 行会占满两屏,不利于手机端扫读。v4.3 起强制使用 2 列网格 + 题材分组:
HTML 结构
<div class="sec"><div class="sec-t"><span class="bar"></span>炸板明细 · 封板未果<span class="tag2">N只</span></div>
<div class="zha-grid">
<div class="zha-group"><span class="gh">🔴 MLCC / 被动元件炸板群</span><span class="gc">5只 · 集体利好兑现</span></div>
<div class="zha-row"><div class="nm">风华高科<span class="se">000636</span></div><div class="r"><span class="chg up">+4.62%</span></div></div>
<div class="zha-row"><div class="nm">火炬电子<span class="se">603678</span></div><div class="r"><span class="chg up">+1.91%</span></div></div>
...(组内 2 列网格自动填充)
<div class="zha-group"><span class="gh">🟠 光通信 / 算力分歧</span><span class="gc">5只 · 集体利好兑现</span></div>
...
<div class="zha-group"><span class="gh">⚪ 其他</span><span class="gc">14只 · 集体利好兑现</span></div>
...
</div>
<div class="sig tip">简短的炸板归因(≤4 行)</div>
</div>
CSS(已加入 references/css_frozen.md)
.zha-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 12px;margin-top:4px}
.zha-group{display:flex;align-items:baseline;grid-column:1/3;padding:6px 4px 2px;border-top:1px solid var(--line);font-size:11px;color:var(--sub);font-weight:700}
.zha-group .gh{color:#a8071a}
.zha-group .gc{margin-left:auto;font-size:10px;font-weight:400}
.zha-row{display:flex;align-items:baseline;padding:5px 4px;border-bottom:1px dashed var(--line);font-size:12px}
.zha-row .nm{font-weight:700;font-size:12.5px}
.zha-row .nm .se{font-size:9px;color:var(--sub);font-weight:400;margin-left:3px}
.zha-row .r{margin-left:auto;text-align:right}
.zha-row .r .chg{font-weight:800;font-variant-numeric:tabular-nums}
.zha-row .r .chg.up{color:var(--gold)}
.zha-row .r .chg.dn{color:var(--red)}
分组规则
- 第一组(🔴 红)= MLCC / 被动元件(识别关键词
MLCC) - 第二组(🟠 橙)= 光通信 / 算力 / 电网·光通信 / 光通信
- 第三组(⚪ 灰)= 其他剩余品种
- 不能只有 1 组:若 24 只全在同一题材,把该题材拆出 TOP10 高涨幅做红组,其余做灰组
视觉收益
- 24 行单列 → 12 行双列 + 3 个分组头,体积减少 ~50%
- 题材分组让"MLCC/被动元件炸板潮"等结构性信号一眼可见
- 题材标签从每只股票行剥离,避免冗余重复
微信扫一扫