---
name: trade-detail-chart
description: Use when 画交易详情图或交易抽样图. 定稿模板v3, 10行×4列连续K线+成交量+信号链+关键节点日期x轴.
---

# 交易详情图定稿模板v3(2026-08-29用户最终确认"固定这个模板,以后就按这个来")

完整可运行脚本: `scripts/trade_detail_template.py`(基于 plot_ideal_top10.py 最终形态)。

## 触发条件
- 画交易详情图 / 交易抽样图 / "40个交易详情" / 每池N笔K线图
- 画法一律按本模板,不要再按用户逐条反馈调整(已全部固化)

## 定稿规范(全部已确认,勿改动)
1. **布局**: 10行×4列=40格(每池10笔:8笔占2行+2笔补位行8-9,补位笔标题含池名)
2. **每格结构**: 上部K线蜡烛图(红涨绿跌) + 下部成交量bar(同色), subgridspec height_ratios=[2.6,1], sharex
3. **标题**: `{股票中文名}·{行业}\n{代码} {池名} 持{N}天` (名称行业来自 stock_basic.pkl 的 ts_code/name/industry)
4. **连续K线**: x轴用**交易序号**(np.arange(len(sub)))而非日期——去非交易日空隙, K线紧密相连
5. **信号链**: 三条竖虚线 + **图内顶部白底小标签**(不在图外): 红"T0涨停" / 蓝"ta缩量" / 橙"tb突破"; 文字位置 ymin+(ymax-ymin)*0.97, bbox白底alpha0.7, fontsize 8
6. **买卖点**: 粉红▲买入(次日开盘价+价格,文字在点上方) + 紫▼卖出(文字在点下方,标注原因[止盈/回撤/止损/超时]+收益率), fontsize 8
7. **关键节点日期**: 收集T0/ta/tb/买入/卖出5个日期 → axv.set_xticks(关键节点序号) + 年月日标签`yy-mm-dd`(如25-01-20), fontsize 6 rotation 45; **ax隐藏刻度, axv显示**; 文字标注中不含日期
8. **强度标注(可选)**: 读strength_baseline.csv的raw_score→rank(pct)×100→0-100, 每格右下角"强度NN·强/中/弱"彩色框(强≥70粉/中30-70橙/弱<30灰)
9. **图例**: 底部统一图例 ncol=5, bbox_to_anchor=(0.5,0.012), **不得遮挡最后一行日期刻度**
10. **留白**: top=0.968 / bottom=0.05 / suptitle y=0.994 / figsize(26,31), hspace=0.34, wspace=0.22, left=0.05, right=0.985
11. **保存**: `plt.savefig(out, dpi=200)` — **禁用 bbox_inches='tight'**(会重算留白)
12. **抽样**: random.seed(7), 优先抽"信号链可匹配"(chain_for_buy)的交易; 改 sorted(key=ret_net, reverse=True/False) 可选收益最高/最低10笔

## 关键代码片段
- 板块涨停阈值: code.startswith(('60','00'))→0.099; ('30','68')→0.199; else 0.299
- chain_for_buy(d, code, bp, buy_date) → (t0_idx, ta_idx, tb_idx): 复刻 signal_detect 逻辑, 匹配 buy_date=tb次日
- 字体: Noto Sans CJK SC; axes.unicode_minus=False
- 关键节点tick: `ticks=sorted(set(p for p,_ in key_ticks)); labs=dict(key_ticks); axv.set_xticklabels([f"{labs[p][2:4]}-{labs[p][4:6]}-{labs[p][6:]}" for p in ticks], fontsize=6, rotation=45)`

## 陷阱
- dailies CSV 无 code 列, 板块判断须外部传入 code
- subplots_adjust 后不要再调 tight_layout
- 图例与末行日期冲突 → bottom 至少 0.05
- 信号链/买卖点坐标必须用序号位置(np.where(sub['trade_date']==日期)[0][0]), 不能再用 mdates.date2num
- 若T0/ta/tb日期在窗口外(win_start= t0-4天~sd+3天), 竖线跳过(len(pos)==0)
