89 lines
5.2 KiB
Markdown
89 lines
5.2 KiB
Markdown
# 买卖方向冲突修复开发规格
|
||
|
||
2026-10-19,北京时间。用户已授权修复并检查其他流程。
|
||
|
||
## 目标与已核实反例
|
||
|
||
科士达旧建仓目标600股,累计买入400股。今天09:51风控清仓400股,卖出200股。
|
||
旧建仓仍活跃,剩余200股可能隔日再买。实际子委托均已成交,页面却写已挂单。
|
||
原始卖出理由在audit_reason及component_scores.reason,PMS解析遗漏。
|
||
证据保存在155 ~/pms_logs/kstar-conflict-20261019-1402.json及kstar-signal-20261019.json。
|
||
|
||
## 实现与边界
|
||
|
||
1. 停止依据追加到动作账本,不依赖可被并发覆盖的进度JSON。下发回写不得复活终态指令。
|
||
全部完整清仓指令在执行前统一停买入侧。复用既有策略、提议、指令撤销路径。
|
||
覆盖信号自动清仓、命令清仓、人工采纳、技术面离场及跟踪止盈。
|
||
每跳重试未完成收尾,也覆盖上线前遗留的清仓指令。不修改已成交数量、成本或盈亏。
|
||
2. 同票有活跃EXIT或TRIM时,买入发出前再检查。查询失败停止买入。
|
||
普通减仓只暂缓买入,不永久撤销建仓或策略。做T自身T0_ROUND不当清仓。
|
||
完整清仓期间,做T买回也不能抵消清仓;没有清仓时原有配对流程不变。
|
||
3. 待确认卖出仅阻止新的自主增持提议,不自动撤销已有买单。
|
||
用户采纳买入前核对已生效的卖出指令,冲突时保留提议和说明,不写已采纳。
|
||
4. 出口队列先处理撤单,认领时排除待撤单。发送前重查买入冲突及父指令状态。
|
||
尚未发出且已失效的买单本地作废,已经发出的买单走撤单回执。
|
||
撤单受理不冒充成交撤回,迟到成交继续按已有逐笔路径记账。
|
||
5. 页面读取实际子委托状态。没有活跃子单时显示等待下一批、等待可卖或执行等待。
|
||
技术单号只在详情出现。卖出理由采用原文,不新调用模型。
|
||
|
||
## 预判与验证
|
||
|
||
先建立科士达跨日反例,再验证各入口共用的执行终检。
|
||
覆盖部分成交、T+1、普通减仓、T0配对、撤单失败重试、排队后清仓、查询失败、重复执行。
|
||
页面验证已发出且终态的子单不能显示为挂单,取数失败明确为状态待核实。
|
||
全部测试使用配置隔离与禁网入口。运行三页面守卫。
|
||
155部署前保存参数、账务、指令与镜像证据。只修模拟实例,188不动。
|
||
上线后先查自然调度清理旧建仓,保留真实400股买入与200股卖出。
|
||
不采纳提议、不制造成交,不改交易时段或业务阈值。
|
||
|
||
## 回退
|
||
|
||
保留成交与撤销审计。155挂载/app,须反向提交、git pull后重建四容器。
|
||
回退不恢复已经撤销的买入指令。撤销前保存旧镜像与证据。
|
||
|
||
## 本地验证记录
|
||
|
||
22项专项回归通过,覆盖五类清仓入口共用执行器、撤单失败与旧进度覆盖、T0不误挡、人工确认被拦时保持待确认。
|
||
45批配置隔离、禁止联网的回归通过,包含三页面守卫。生产状态另记部署判收。
|
||
原临时虚拟环境被系统清理,本轮另建 /private/tmp/pms-conflict-20261019-venv。
|
||
|
||
## 人工清仓补查
|
||
|
||
人工采纳EXIT原来按当日可卖量裁剪,T+1可卖量为零时会返回已采纳却不留清仓指令。
|
||
改为按已确认数量与当前总持仓取较小值,执行器继续按当日可卖量分批,不扩大用户授权数量。
|
||
持仓已经归零时不再生成卖单,但仍停止未完成的旧买入。普通减仓保持按可卖量处理。
|
||
增加两项回归,专项共24例。此项为代码发现的边界,尚无自然人工确认事件判收。
|
||
|
||
## 最终交付与验证入口
|
||
|
||
功能28053f3已于2026-10-19 14:27:22在155四容器生效。
|
||
镜像06493afa19ec4cd61d07b7834472a11c550d0ec0a341e251dcdb64626a4139c0。
|
||
本地和候选镜像45批全部通过,专项24例。
|
||
科士达旧建仓已终止,真实600/400及清仓400/200保留。
|
||
参数与全部持仓、批次账一致,零新增委托,对账正常。
|
||
两条system审计6912、6913未重复。完整证据见同仓每日计划交接14:30节。
|
||
|
||
```bash
|
||
# 开发机 · tradingSystem 仓库根目录
|
||
/private/tmp/pms-conflict-20261019-venv/bin/python scripts/unit_test_guard.py scripts/test_batch41_units.py
|
||
/private/tmp/pms-conflict-20261019-venv/bin/python scripts/run_tests.py
|
||
```
|
||
|
||
预期24项专项OK,完整入口ALL SUITES PASS。测试中故意注入失败的日志属于回归场景。
|
||
|
||
```bash
|
||
# 155模拟机 · ~/project/tradingSystem,只读
|
||
cd ~/project/tradingSystem
|
||
docker compose exec -T -e PYTHONPATH=/app pms-web python - <<'CHECK'
|
||
from app.repo import pms_repo
|
||
from app.services.execution_conflicts import instruction_progress
|
||
for r in instruction_progress(pms_repo.list_instructions(ts_code='002518.SZ', limit=10)):
|
||
print(r['instruction_id'], r['status'], r['qty'], r['exec_qty'], r.get('execution_label'))
|
||
CHECK
|
||
```
|
||
|
||
14:28判收时旧建仓CANCELLED、600/400、已撤销;清仓DISPATCHED、400/200、等待可卖。
|
||
后续真实成交会推进清仓进度,不能恢复判收时点的历史数量。
|
||
人工T+1与故障竞态尚无本轮自然生产事件,禁止为验收造单。
|
||
本地Chrome替身渲染和生产接口读数已核验;未直接操作用户登录的生产浏览器。
|