--- name: horizontal-table-format description: "QQ push 横向 markdown 表格格式 (4-8 列可滑动比较). 用户 2026-07-29 明确偏好 — 原纵向 bullet 太长(14 票 = 56 行) 看不过来, 改成横向表格用户能左右滑动. 现在 dividend_alert.py / daily_t_analysis.py / cn_dividend_buy_timing.py 全部用此格式. 适用于所有 cron push 推送 (交易确认/分红提醒/日报/做T分析 等)." version: 1.0.0 type: reference date: 2026-07-29 --- # QQ Push 横向 Markdown 表格格式 ## 为什么改 **用户原话** (2026-07-29):"不是这种表格, 是这种" — 看到横向可滑动比较的格式后明确要求全换。 **之前** (纵向 bullet): ``` 📌 UNH.US | 9股(9手) | 成本426.00USD 现价428.79 | 🟢+0.7% | ↗️偏多 | ATR13.48(3.1%) 支撑412.54 | 阻力436.32 💡 策略: 波段做T (★★☆) — ... ``` - 14 票 = 56 行, 手机上看不完 - 不容易对比 (左右票来回看, 视觉跳跃) **之后** (横向 markdown 表格): ``` | 项目 | UNH.US | RGTI.US | QQQI.US | 3416.HK | |:---|:---|:---|:---|:---| | 现价 | 420.57 | 13.22 | 51.00 | 8.655 | | 盈亏% | 🔴-1.3% | 🔴-35.5% | 🔴-3.3% | 🔴-6.8% | | 趋势 | 📉空头 | 📉空头 | 📉空头 | 📈多头 | | ATR% | 3.2% | 8.7% | 2.1% | 0.3% | ``` - 4-8 列 = 横向滑动 - 上下行同字段 = 垂直对比 - 整体 5-10 行 = 单屏可看完 ## 实现规范 ### 1. 表头生成 ```python # 列 = 票 (每票 1 列) cols = [r['sym'] for r in rows_data] n = len(cols) # 表头 + 分隔线 hdr = "| 项目 | " + " | ".join(cols) + " |" sep = "|:---|" + "|".join([":---"] * n) + "|" ``` ### 2. 单元格 emoji 前缀 | 类型 | 格式 | 示例 | |------|------|------| | 价格 | `📊{价}` 或 `📊${价:.2f}` | `📊420.57` | | 每股派息 | `💰{d}` | `💰2.80元` | | 股息率 | `**{d/10/p*100:.2f}%**` (加粗) | `**5.12%**` | | 盈亏 | `{emoji}{pct:+.1f}%` | `🟢+0.7%` / `🔴-1.3%` | | 趋势 | 直接 | `📈多头` / `↗️偏多` / `📉空头` | | 胜率/稳定性 | `🔥`/`⚡`/`⭐` | `🔥15` (15年连续) | | 数值 | 简短 | `3.2%` / `12` | | **离均线 (vs MA50)** | `{emoji_off}{pct:+.1f}%` (见 2.1) | `🟢+5%` / `🔴-3%` / `⛔-15%` | | **派息频率 (次/年)** | `{n:.1f}` | `1.0` (年) / `1.7` (年/半年) | | **连续派息 (年)** | `{emoji}{n}` | `🔥15` (15年) / `⚡8` / 空 `5` | | **vs MA50 偏移 emoji** | `🟢` >5% / `🟡` 0-5% / `🔴` -10~0% / `⛔` <-10% | 同上 | ### 2.1 离均线 emoji 4 档配色 (2026-07-30 加) 帮用户一眼看股价位置: | 档 | 范围 | emoji | 语义 | |---|------|-------|------| | 强势 | 现价 > MA50 +5% | 🟢 | 强势多头, 风险/机会大 | | 偏强 | 0~+5% | 🟡 | 略高均线, 中性 | | 偏弱 | -10%~0 | 🔴 | 略低均线, 关注支撑 | | 超弱 | 现价 < MA50 -10% | ⛔ | 大幅低于均线, 反弹机会 vs 趋势向下 | **实战 (2026-07-30 cn_dividend_buy_timing)**: - 600023 浙能电力 离均线 -9.8% → 🔴 (偏弱, 等待反弹) - 601288 农业银行 离均线 +9.8% → 🟢 (强势, 等回撤到 MA50) ### 3. 多个表格分层 **不要把所有数据塞一张表** — 分 3-4 张相关小表: ``` 📊 每日做T | 2026-07-30 09:00 【基本面表 — 8 列】 | 项目 | 票1 | 票2 | ... | 【策略点位表 — 8 列】 | 策略 | 票1 | 票2 | ... | 【性价比表 — 8 列】 | 项目 | 票1 | 票2 | ... | ``` 每张表 5-10 行, 主题清晰。 ### 4. 列数最佳实践 | 列数 | 适合场景 | |------|---------| | 4-6 | 持仓 4-6 票, 完整对比 (手机最舒服) | | 8 | 候选池 8-15 票, top-N 推荐 (轻滑动) | | 12+ | ⚠️ 太多, 手机 QQ 列会挤, 考虑分页或加折叠 | ### 5. 顶部标题 ```python # 标题行 (1 行) lines.append(f"📊 [主题] | {datetime.now().strftime('%Y-%m-%d %H:%M 北京时间')}") # 副标题 (策略说明) lines.append("💰 策略: 全仓分批建仓, 单票 < 8000 元") # 空行 lines.append("") ``` ## 已迁移的脚本 | 脚本 | cron | 推送内容 | |------|------|---------| | `daily_t_analysis.py` | `cb187ab5f9fc` 21:00 | 4 列 (4 票持仓) + 策略点位 8 列 | | `dividend_alert.py` | `789a7710b1cf` 11:00 A/HK + `366934c1474c` 21:00 US | A股 12 列 + 港股 1 列 + 美股 6 列 | | `cn_dividend_buy_timing.py` | `8000d3cfed23` 11:30 | 8 列 + 点位 4 列 | ## QQ bot 渲染注意事项 - ✅ Markdown 表格在 QQ bot 渲染良好 - ✅ 可左右滑动 - ⚠️ **列宽限制**: 中文 4-6 字符最佳 (例 `📊420.57` = 7 字符) - ⚠️ **emoji 宽度**: `💰` 算 1 字符 (但实际渲染宽一点) - ⚠️ **数字格式**: 用 `:.2f` 而不是 `:.4f` (4 位挤) - ❌ **不能冻结首列** (QQ bot 不支持 markdown frozen header) - ❌ **不能加粗 + 居中** (只支持 `**bold**`, `*italic*`) ## 数据累积 + 循环外输出模式 **避免** 在循环内 `lines.append` 表格(难维护)。 **用** 累积数据字典 + 循环外拼装表格: ```python row_data = [] for c in candidates[:8]: # ... 计算 ... row_data.append({ 'sym': c['sym'], 'price': c['price'], 'yield': c['yield'], # ... }) # 循环外 if row_data: cols = [r['sym'] for r in row_data] n = len(cols) hdr = "| 项目 | " + " | ".join(cols) + " |" sep = "|:---|" + "|".join([":---"] * n) + "|" lines.append(hdr) lines.append(sep) lines.append("| 现价 | " + " | ".join([f"{r['price']:.2f}" for r in row_data]) + " |") # ... 多行 ... ``` ## 参考: dividend_alert A股 8 列表格 ```python # 实际生产代码 (dividend_alert.py fmt()) L += ['| 票 | 名称 | 每10股派 | 现价 | 股息率 | 次/年 | 连续(年) | vs MA50 |'] L += ['|:---|:---|:---|:---|:---|:---|:---|:---|'] for r in a_h[:12]: # ... 拉历史分红 (akshare) + 长桥 K 线 (MA50) ... L += [f'| {star}{c} | {n[:8]} | 💰{d:.2f} | 📊{ps} | **{ys}** | {cnt} | {cont_e}{cont} | {ma_e}{ma_str} |'] ``` ## 不要做的 - ❌ 把每行字段全写成一行 (无换行, QQ 滚得累) - ❌ 列里塞 `f"{x:.6f}"` 这种 6 位小数 - ❌ 列名用全角字符 (渲染乱) - ❌ 一次性输出 20+ 列 (挤, 滑动难受) - ❌ 混用 emoji 前缀 (`⭐600809` 和 `600809 ⭐` 风格不一致) - ❌ 在表格里用 `|` 字符 (转义难, 破表) ## 何时不用 - 单票详情 (用纵向 bullet 更清楚) - 推送字段 < 3 行 (表格无意义) - 一次性提示 (cron 启动/失败通知)