Add modular docs with index, WeChat templates, and AI guide.

Document per-module order logic, risk rules, and WeChat message templates with a central INDEX for navigation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-06-28 10:49:10 +08:00
parent 840e88daad
commit 169136dd4a
13 changed files with 1327 additions and 10 deletions
+152
View File
@@ -0,0 +1,152 @@
# AI 分析
**页面路径**`/ai`(须在系统设置 → 导航显示 中开启「AI 分析」)
**相关文件**`ai_client.py``ai_worker.py``ai_messages.py``templates/ai_messages.html`
---
## 功能概述
| 能力 | 说明 |
|------|------|
| 开仓分析 | 手动/关键位开仓成交后后台分析 |
| 平仓分析 | 写入 `trade_logs` 平仓记录后分析 |
| 日终报告 | 每日定时汇总当日交易与持仓 |
| 消息存档 | 全部写入 `ai_messages` 表,页面可浏览 |
| 微信推送 | 可选:分析成功后推送到企业微信 |
---
## 配置项(系统设置 → AI 分析)
| 设置键 | 说明 | 默认 |
|--------|------|------|
| `ai_enabled` | 总开关 | 关 |
| `ai_provider` | `ollama` / `openai` | ollama |
| `ai_ollama_base_url` | Ollama 地址 | `http://127.0.0.1:11434` |
| `ai_ollama_model` | Ollama 模型 | `qwen2.5:7b` |
| `ai_openai_base_url` | OpenAI 兼容 API | `https://api.openai.com/v1` |
| `ai_openai_api_key` | API Key | 空 |
| `ai_openai_model` | 模型名 | `gpt-4o-mini` |
| `ai_daily_report_enabled` | 日终报告开关 | 开 |
| `ai_daily_report_hour` | 报告时刻(时) | 15 |
| `ai_daily_report_minute` | 报告时刻(分) | 5 |
---
## 触发时机
### 1. 开仓分析(`kind=open`
- **触发**:下单监控手动开仓 **成交** 且填写止损 → `notify_manual_open_filled()` 调度。
- **标题**`{品种名} 开仓`
- **Payload**symbol、direction、entry、stop_loss、take_profit、lots、capital
### 2. 关键位开仓(`kind=key_open`
- **触发**:箱体/收敛突破自动单成交 → `notify_key_breakout_open()` 调度。
- **标题**`{品种名} 关键位开仓`
- **Payload**monitor_type、trade_mode、break_side、entry、stop_loss、take_profit、lots
### 3. 平仓分析(`kind=close`
- **触发**`trade_logs` 新增平仓 → `notify_trade_log_close()` 调度。
- **标题**`{品种名} 平仓`
- **Payload**source、result、pnl_net、entry、close_price、lots
### 4. 日终报告(`kind=daily_report`
- **触发**:后台 `ai_worker` 每分钟检查;到达设定时刻且当日未生成过。
- **标题**`{YYYY-MM-DD} 日终持仓与交易报告`
- **Payload**:当日成交汇总、胜负次数、净盈亏、active 持仓列表
> 开仓/平仓的 AI 分析 **默认不推微信**(仅写入页面);日终报告与可在设置中开启的推送见下文。
---
## 分析逻辑
**System Prompt**(固定):
```
你是国内期货交易复盘助手。根据提供的结构化交易数据,
用简洁中文给出 3~6 条要点:风险、纪律、改进建议。
不要编造未提供的数据;金额单位为元。
```
**User Prompt**
```
事件类型:{event_kind}
数据:
{JSON payload}
```
**接口**
- Ollama`POST {base}/api/chat`
- OpenAI 兼容:`POST {base}/chat/completions`temperature=0.4
失败时内容前加 `⚠`,仍写入 `ai_messages`
---
## 微信推送
| 类型 | 条件 | 模板 |
|------|------|------|
| 事件分析 | AI 调用成功 **且** 调度时传入 `send_wechat_fn` | 见 [WECHAT.md §12](./WECHAT.md#12-ai-分析) |
| 日终报告 | `ai_daily_report_enabled=1` 且 AI 成功 | `🤖 {date} 日终持仓与交易报告\n\n{content[:1800]}` |
**说明**
- 当前实现中,开仓/平仓触发的 `schedule_ai_event_analysis()` **未绑定** `send_wechat_fn`,故 **仅存档到 /ai 页面**
- 日终报告在 `maybe_run_daily_ai_report()` 中会推微信(成功时)。
- 正文截断为 **1800 字符**,避免超长。
---
## 下单逻辑
AI **不参与下单**,仅事后分析。无 `assert_can_open` 或 CTP 交互。
---
## 风控规则
AI 模块无独立风控。其输入数据来自已发生的交易事件,不改变账户冻结、保证金等状态。
---
## 后台任务
- 线程名:`ai-worker`
- 启动延迟 30 秒后,每 **60 秒** 检查是否该跑日终报告
-`background_task`(计划/关键位)独立运行
---
## 数据存储
`ai_messages`
| 字段 | 说明 |
|------|------|
| kind | open / key_open / close / daily_report |
| title | 标题 |
| content | AI 回复正文 |
| meta | JSON payload |
| created_at | 创建时间 |
页面 `/ai` 按时间倒序展示;上方含使用说明卡片。
---
## 相关文档
- [WECHAT.md §12](./WECHAT.md#12-ai-分析) — 推送模板
- [ORDER_MONITOR.md](./ORDER_MONITOR.md) — 手动开仓触发 AI
- [KEY_MONITORS.md](./KEY_MONITORS.md) — 关键位开仓触发 AI
- [SETTINGS.md](./SETTINGS.md) — 配置入口
+22 -8
View File
@@ -2,6 +2,9 @@
国内期货 · 交易复盘系统(Flask + SQLite + vnpy_ctp + PM2)。 国内期货 · 交易复盘系统(Flask + SQLite + vnpy_ctp + PM2)。
> **分板块详细说明(含下单逻辑、风控、微信模板)** → [INDEX.md](./INDEX.md)
> 重点:[WECHAT.md](./WECHAT.md) · [AI.md](./AI.md) · [RISK.md](./RISK.md)
--- ---
## 系统概览 ## 系统概览
@@ -26,6 +29,7 @@
| 行情 K 线 | `/market` | 是 | | 行情 K 线 | `/market` | 是 |
| 交易记录与复盘 | `/records` | 否 | | 交易记录与复盘 | `/records` | 否 |
| 统计分析 | `/stats` | 否 | | 统计分析 | `/stats` | 否 |
| AI 分析 | `/ai` | 是 |
| 手续费配置 | `/fees` | 是 | | 手续费配置 | `/fees` | 是 |
| 系统设置 | `/settings` | 否 | | 系统设置 | `/settings` | 否 |
@@ -35,7 +39,7 @@
## 下单监控 ## 下单监控
**路径**`/positions` **路径**`/positions` · 详见 [ORDER_MONITOR.md](./ORDER_MONITOR.md)
### 顶栏 ### 顶栏
@@ -73,7 +77,7 @@
## 策略交易 ## 策略交易
**路径**`/strategy``/strategy/records` **路径**`/strategy``/strategy/records` · 详见 [STRATEGY.md](./STRATEGY.md)
- 趋势回调自动补仓、顺势加仓等(需 CTP 已连接且有 active 持仓监控) - 趋势回调自动补仓、顺势加仓等(需 CTP 已连接且有 active 持仓监控)
- 策略记录单独归档 - 策略记录单独归档
@@ -82,7 +86,7 @@
## 开单计划 ## 开单计划
**路径**`/plans` **路径**`/plans` · 详见 [PLANS.md](./PLANS.md)
- 录入当日计划:主力合约、方向、决策区间、止损、止盈 - 录入当日计划:主力合约、方向、决策区间、止损、止盈
- 状态:`planned``active``closed` / `expired` - 状态:`planned``active``closed` / `expired`
@@ -104,7 +108,7 @@
## 行情 K 线 ## 行情 K 线
**路径**`/market` **路径**`/market` · 详见 [MARKET.md](./MARKET.md)
- 多周期 K 线(TradingView Lightweight Charts - 多周期 K 线(TradingView Lightweight Charts
- 支持 CTP 连接后部分数据增强 - 支持 CTP 连接后部分数据增强
@@ -114,7 +118,7 @@
## 交易记录与复盘 ## 交易记录与复盘
**路径**`/records``/trades` 重定向至此) **路径**`/records``/trades` 重定向至此) · 详见 [RECORDS.md](./RECORDS.md)
### 资金曲线 ### 资金曲线
@@ -140,7 +144,7 @@
## 统计分析 ## 统计分析
**路径**`/stats` **路径**`/stats` · 详见 [STATS.md](./STATS.md)
### 汇总指标(单行卡片) ### 汇总指标(单行卡片)
@@ -156,6 +160,16 @@
--- ---
## AI 分析
**路径**`/ai` · 详见 [AI.md](./AI.md)
- 开仓/平仓/关键位成交后后台 AI 复盘(Ollama 或 OpenAI 兼容 API
- 日终持仓与交易报告(可推微信)
- 消息存档于 `/ai` 页面;配置见系统设置 → AI 分析
---
## 手续费配置 ## 手续费配置
**路径**`/fees` **路径**`/fees`
@@ -168,7 +182,7 @@
## 系统设置 ## 系统设置
**路径**`/settings` **路径**`/settings` · 详见 [SETTINGS.md](./SETTINGS.md)
| 功能 | 说明 | | 功能 | 说明 |
|------|------| |------|------|
@@ -178,7 +192,7 @@
| 保证金上限、移动保本缓冲、挂单超时 | 保证金上限默认 30%;移动保本缓冲为达 1R 后止损相对开仓价的跳数(默认 2 跳) | | 保证金上限、移动保本缓冲、挂单超时 | 保证金上限默认 30%;移动保本缓冲为达 1R 后止损相对开仓价的跳数(默认 2 跳) |
| CTP 连接 | SimNow / 实盘前置与账号(可覆盖 `.env` | | CTP 连接 | SimNow / 实盘前置与账号(可覆盖 `.env` |
| 参考资金 | CTP 未连接时用于可开仓筛选与估算 | | 参考资金 | CTP 未连接时用于可开仓筛选与估算 |
| 企业微信 Webhook | 计划/关键位推送 | | 企业微信 Webhook | 计划/关键位/交易/AI 推送 · 见 [WECHAT.md](./WECHAT.md) |
| 登录账号 | 用户名/密码,同步写入 `.env` | | 登录账号 | 用户名/密码,同步写入 `.env` |
| 数据备份与恢复 | 自动/手动备份、下载压缩包、恢复说明 | | 数据备份与恢复 | 自动/手动备份、下载压缩包、恢复说明 |
| 深色/浅色主题 | 页头切换 | | 深色/浅色主题 | 页头切换 |
+55
View File
@@ -0,0 +1,55 @@
# 文档索引
国内期货 · 交易复盘系统各板块说明。每篇文档包含 **下单逻辑**、**风控规则**,并在需要时引用 [微信推送模板](./WECHAT.md)。
---
## 总览
| 文档 | 说明 |
|------|------|
| [FEATURES.md](./FEATURES.md) | 功能总览与导航结构 |
| [RISK.md](./RISK.md) | **全局账户风控**(冷静期、仓位上限、保证金、品种范围) |
| [WECHAT.md](./WECHAT.md) | **企业微信推送**(全部消息类型与完整模板) |
| [AI.md](./AI.md) | **AI 分析**(配置、触发、输出、推送) |
---
## 各板块说明
| 板块 | 路径 | 文档 |
|------|------|------|
| 下单监控 | `/positions` | [ORDER_MONITOR.md](./ORDER_MONITOR.md) |
| 策略交易 | `/strategy` | [STRATEGY.md](./STRATEGY.md) |
| 开单计划 | `/plans` | [PLANS.md](./PLANS.md) |
| 关键位监控 | `/keys` | [KEY_MONITORS.md](./KEY_MONITORS.md) |
| 行情 K 线 | `/market` | [MARKET.md](./MARKET.md) |
| 交易记录与复盘 | `/records` | [RECORDS.md](./RECORDS.md) |
| 统计分析 | `/stats` | [STATS.md](./STATS.md) |
| 手续费配置 | `/fees` | [FEES.md](./FEES.md) |
| 系统设置 | `/settings` | [SETTINGS.md](./SETTINGS.md) |
---
## 部署与运维
| 文档 | 说明 |
|------|------|
| [TRADING.md](./TRADING.md) | 可开仓品种、计仓、SimNow/实盘 |
| [DEPLOY.md](./DEPLOY.md) | 部署说明 |
| [BACKUP.md](./BACKUP.md) | 数据备份与恢复 |
| [SIMNOW.md](./SIMNOW.md) | SimNow 模拟盘 |
---
## 快速查找
| 想了解… | 看这里 |
|---------|--------|
| 手动下单怎么校验 | [ORDER_MONITOR.md](./ORDER_MONITOR.md) |
| 关键位自动单规则 | [KEY_MONITORS.md](./KEY_MONITORS.md) |
| 开单计划何时推送 | [PLANS.md](./PLANS.md) + [WECHAT.md#开单计划](./WECHAT.md) |
| 开仓/平仓微信长文格式 | [WECHAT.md#结构化推送](./WECHAT.md) |
| AI 何时分析、推什么 | [AI.md](./AI.md) |
| 手动平仓后为何冻结 | [RISK.md#冷静期与日冻结](./RISK.md) |
| 移动保本怎么抬止损 | [ORDER_MONITOR.md#移动保本](./ORDER_MONITOR.md) |
+31 -2
View File
@@ -4,6 +4,8 @@
关键位监控用于在指定价格区间上设置 **5 分钟收盘** 触发规则,分为 **自动单**(箱体/收敛突破)与 **仅微信提醒**(关键支阻区)两类。 关键位监控用于在指定价格区间上设置 **5 分钟收盘** 触发规则,分为 **自动单**(箱体/收敛突破)与 **仅微信提醒**(关键支阻区)两类。
**文档索引**[INDEX.md](./INDEX.md) · 微信模板:[WECHAT.md §6–§8](./WECHAT.md) · 风控:[RISK.md](./RISK.md)
--- ---
## 监控类型 ## 监控类型
@@ -30,7 +32,7 @@
|------|------| |------|------|
| 区间 | **上沿 = 阻力**,**下沿 = 支撑**,合并为一个关键支阻区 | | 区间 | **上沿 = 阻力**,**下沿 = 支撑**,合并为一个关键支阻区 |
| 触发 | 5m 收盘突破上沿或跌破下沿 | | 触发 | 5m 收盘突破上沿或跌破下沿 |
| 推送 | 企业微信,格式含突破方向、触发收盘、区间上下沿等 | | 推送 | 企业微信,见 [WECHAT §8](./WECHAT.md#8-关键支阻区提醒) |
| 次数 | 最多 **3 次**,间隔约 **5 分钟**(人工盯盘提醒) | | 次数 | 最多 **3 次**,间隔约 **5 分钟**(人工盯盘提醒) |
| 自动开仓 | **否** | | 自动开仓 | **否** |
| 结案 | 第 3 次推送后自动归档 | | 结案 | 第 3 次推送后自动归档 |
@@ -61,4 +63,31 @@
- 自动单逻辑:`key_monitor_lib.py` + `install_trading._execute_key_breakout` - 自动单逻辑:`key_monitor_lib.py` + `install_trading._execute_key_breakout`
- 止盈止损监控:`sl_tp_guard.py`(移动保本 + 显式止盈价可同时生效) - 止盈止损监控:`sl_tp_guard.py`(移动保本 + 显式止盈价可同时生效)
详见 [FEATURES.md](./FEATURES.md) 功能总览。 ## 下单逻辑(自动单)
1. 后台 `background_task` 约每 3 秒调用 `run_key_monitor_check()`
2. 拉取 5m K 线(优先 CTP),判断收盘价是否突破上/下沿。
3. **箱体突破 / 收敛突破**
- 顺势/反转决定方向(上破做多或做空等)。
- 校验:交易时段、CTP、`assert_can_open()`、[RISK.md](./RISK.md) 全部规则。
- 手数:按 `risk_percent` + `max_margin_pct` 计算。
- **止损**:突破 K 线最低(多)/ 最高(空)± **2 跳**
- **止盈**:默认盈亏比 **2**(可改 0.5~10);开启移动保本时默认 **3R** TP。
- **报单**:CTP 市价开仓 → 写入 `trade_order_monitors``sl_tp_guard` 守护。
4. 同一根 5m K 线只触发一次;触发后移入历史(成败皆然)。
5. 成交:微信 [§7](./WECHAT.md#7-关键位开仓成功);失败/摘要:[§6](./WECHAT.md#6-关键位自动单)。
## 风控规则
| 规则 | 自动单 | 支阻区 |
|------|--------|--------|
| assert_can_open | ✓ | — |
| 保证金 / 品种 | ✓ | — |
| 交易时段 | ✓ | — |
| 自动下单 | ✓ | ✗ |
全局规则见 [RISK.md](./RISK.md)。
---
详见 [FEATURES.md](./FEATURES.md) · [INDEX.md](./INDEX.md)
+51
View File
@@ -0,0 +1,51 @@
# 行情 K 线
**页面路径**`/market`
**相关文件**`market.py``kline_chart.py``templates/market.html`
---
## 功能概述
- 多周期 K 线图表(TradingView Lightweight Charts
- 品种选择与周期切换
- CTP 连接后部分品种可获取更及时数据
须在 **系统设置 → 导航显示** 开启「行情 K 线」;关闭后直接访问 URL 会提示并跳回下单监控。
---
## 下单逻辑
**本板块无下单功能**,纯行情展示。
---
## 风控规则
无独立风控。不涉及报单、推送或账户状态变更。
---
## 微信推送
**无**。行情页不发送任何企业微信消息。
---
## 数据来源
| 优先级 | 来源 |
|--------|------|
| 1 | CTP tick/K 线(已连接时) |
| 2 | 新浪 / 同花顺 iFinD(见 `QUOTE_SOURCE` 配置) |
合约代码格式见 [FEATURES.md](./FEATURES.md#合约代码格式)。
---
## 相关文档
- [FEATURES.md](./FEATURES.md)
- [SETTINGS.md](./SETTINGS.md)
+151
View File
@@ -0,0 +1,151 @@
# 下单监控
**页面路径**`/positions`(默认首页)
**相关文件**`install_trading.py``sl_tp_guard.py``pending_order_worker.py``product_recommend.py`
---
## 功能结构
| 区域 | 说明 |
|------|------|
| 顶栏 | 模拟/实盘、CTP 状态、风险状态、权益、连接按钮 |
| 期货下单 | 手动开仓/平仓表单 |
| 当前持仓 | pending 挂单 + active 持仓卡片 |
| 可开仓品种 | 按权益与保证金筛选的推荐表 |
---
## 下单逻辑
### 手动开仓
1. 选择品种、方向、限价/市价(FAK)、手数或计仓模式。
2. **前置校验**(全部通过才报单):
- CTP 已连接且不在连接中
- 处于 **交易时段**
- `assert_can_open()` — 见 [RISK.md](./RISK.md)
- `assert_product_allowed_for_capital()` — 小账户四品种限制
- 固定金额模式须填 **止损价**
- 开启 **移动保本** 须填止损(不可只填止盈)
- 保证金占用 ≤ `max_margin_pct`
- 单笔手数 ≤ 50
3. **计仓**
- 固定手数 → 使用 `fixed_lots`
- 固定金额 → `calc_lots_by_amount()` 按止损距离算手数
4. **报单**`execute_order()` → CTP。
5. **成交后**
- 写入 `trade_order_monitors`status=active 或 pending
- 注册本地 SL/TP 守护(`sl_tp_guard`
- 微信:结构化开仓推送(有止损)或简版
- AI:后台开仓分析(有止损时)
### 挂单(限价未立即成交)
- status=`pending`,显示「挂单中」。
- **超时撤单**`pending_order_worker` 每 10 秒 reconcile(有 pending 时);默认超时见系统设置 `pending_order_timeout_sec`
- 微信:`委托已提交 · … 挂单中(N 分钟未成交自动撤单)`
### 手动平仓
- 市价平仓当前品种方向持仓。
- 关闭对应 monitor,写入 `trade_logs`
- 若当日手动平仓次数超限 → 触发冷静期([RISK.md](./RISK.md))。
- 微信:结构化平仓推送(成交同步后)。
### 止盈止损守护
后台 `sl_tp_guard` 线程 + tick 事件:
| 条件 | 动作 |
|------|------|
| 价格触及 **止盈价** | 市价平仓,结果=止盈 |
| 价格触及 **止损价** | 市价平仓,结果=止损 |
| 开启 **移动保本** | 见下节 |
触发时先推简版「平仓委托已提交」,成交写入 trade_logs 后推 **结构化平仓**
---
## 移动保本
**开启条件**:下单表单勾选「移动保本」,**必须填写止损**,不设固定止盈。
**逻辑**`sl_tp_guard._update_trailing_stop_loss`):
| 浮盈 R 倍数 | 止损移动至 |
|-------------|------------|
| ≥ 1R | 开仓价 ± `trailing_be_tick_buffer` 跳(保本) |
| ≥ 2R | 开仓价 ± 1R |
| ≥ nR | 开仓价 ± (n1)R |
**平仓结果标签**
- 1R 锁定后止损出场 → **保本止盈**
- 2R 及以上锁定后止损出场 → **移动止盈**
关键位自动单若开启移动保本且设目标盈亏比(默认 3R),达 TP 仍按 **止盈** 平仓;移动止损与显式 TP **可同时生效**
---
## 风控规则
本板块执行 [RISK.md](./RISK.md) 全部规则,另加:
| 规则 | 说明 |
|------|------|
| 非交易时段 | 禁止开仓 |
| 移动保本 | 必须填止损 |
| 固定金额 | 必须填止损才能算手数 |
| 保证金 | 新开仓前校验总占用 |
| 单笔 50 手 | 超限拒绝 |
顶栏 **风险状态** 实时反映:正常 / 冷静期 / 日冻结 / 仓位上限。
---
## 可开仓品种表
- 按当前权益、`max_margin_pct`、合约保证金计算可开手数。
- 权益 ≤20 万或 CTP 未连接:仅四品种;未连接按 10 万权益估算。
- 夜盘时段过滤无夜盘品种。
- 每日后台刷新 `product_recommend_cache`
详见 [TRADING.md](./TRADING.md)。
---
## 微信推送
| 事件 | 模板 |
|------|------|
| 开仓成交(有止损) | [WECHAT §1](./WECHAT.md#1-手动开仓成功) |
| 开仓成交(无止损) | [WECHAT §2](./WECHAT.md#2-简版开仓) |
| 挂单提交 | [WECHAT §3](./WECHAT.md#3-挂单提交) |
| 平仓完成 | [WECHAT §4](./WECHAT.md#4-平仓完成) |
| SL/TP 触发 | [WECHAT §5](./WECHAT.md#5-本地止盈止损触发) |
| AI 分析 | [AI.md](./AI.md)(仅页面,默认不推微信) |
---
## 数据流
```
用户下单 → API /api/trade/order
→ CTP 报单
→ trade_order_monitors
→ sl_tp_guard 监控
→ 平仓 → trade_logs → 微信 + AI
```
SSE`/api/trading/stream` 推送持仓快照,无需整页刷新。
---
## 相关文档
- [RISK.md](./RISK.md)
- [WECHAT.md](./WECHAT.md)
- [TRADING.md](./TRADING.md)
- [SETTINGS.md](./SETTINGS.md)
+108
View File
@@ -0,0 +1,108 @@
# 开单计划
**页面路径**`/plans`
**相关文件**`app.py``check_order_plans``background_task`
---
## 功能概述
录入 **当日交易计划**:品种、方向、决策价格区间、止损、止盈、决策理由。系统轮询现价,进入区间后 **微信提醒** 并激活监控;触及 TP/SL 后记录结果并结案。
> **不自动向 CTP 下单**,仅提醒 + 记录。
---
## 计划状态
```
planned → active → closed
↘ expired(过期,非当日)
```
| 状态 | 含义 |
|------|------|
| `planned` | 已录入,等待价格进入决策区间 |
| `active` | 已进入区间,监控 TP/SL |
| `closed` | 触及止盈或止损,已结案 |
| `expired` | 非当日计划自动过期 |
---
## 下单逻辑
本模块 **无 CTP 报单**
### 1. 录入(用户操作)
- 主力合约、方向(多/空)
- **决策区间**`zone_lower` ~ `zone_upper`
- 止损价、止盈价
- 决策理由(可选,推送时展示)
### 2. 触发激活(后台 ~3 秒)
条件:`status=planned``zone_lower ≤ 现价 ≤ zone_upper`
动作:
1. 发送微信 [WECHAT §9](./WECHAT.md#9-开单计划)
2. `status → active`,记录 `triggered_at`
### 3. 止盈止损监控(active
| 方向 | 止盈 | 止损 |
|------|------|------|
| 多 | 现价 ≥ take_profit | 现价 ≤ stop_loss |
| 空 | 现价 ≤ take_profit | 现价 ≥ stop_loss |
触发后:
1. 微信 [WECHAT §10](./WECHAT.md#10-开单计划结果)
2. 写入 `trade_records`monitor_type=开单计划)
3. `status → closed`
### 4. 前端轮询
列表约 1 秒请求 `/api/plan_prices` 刷新现价。
---
## 风控规则
| 项 | 说明 |
|----|------|
| 账户冷静期 | **不校验** — 计划不自动开仓 |
| 保证金 / 品种 | **不校验** |
| 交易时段 | 轮询全天运行,非交易时段仍可推送 |
| 同日计划 | `plan_date` 为当日;跨日 `expire_old_plans()` |
用户收到提醒后若手动下单,须自行遵守 [RISK.md](./RISK.md)。
---
## 微信推送
| 事件 | 文档 |
|------|------|
| 进入决策区间 | [WECHAT §9](./WECHAT.md#9-开单计划) |
| 触及 TP/SL | [WECHAT §10](./WECHAT.md#10-开单计划结果) |
**配置**:系统设置 → 企业微信 Webhook。
---
## 数据库
`order_plans`symbol、direction、zone_upper/lower、stop_loss、take_profit、status、plan_date 等。
触发结果写入 `trade_records`(非 `trade_logs`,不计入 CTP 同步统计主表)。
---
## 相关文档
- [WECHAT.md](./WECHAT.md)
- [ORDER_MONITOR.md](./ORDER_MONITOR.md) — 收到提醒后手动下单
- [RECORDS.md](./RECORDS.md)
+85
View File
@@ -0,0 +1,85 @@
# 交易记录与复盘
**页面路径**`/records``/trades` 重定向)
**相关文件**`app.py``ctp_trade_sync.py``sl_tp_guard.py`write_trade_log
---
## 功能结构
| 区域 | 说明 |
|------|------|
| 资金曲线 | Lightweight Charts,随主题变色 |
| 交易记录 | `trade_logs` 主表 |
| 复盘表单 | 手动复盘 + 截图 + 自动 K 线图 |
| 复盘历史 | 按日/周/月/自定义筛选 |
---
## 下单逻辑
本板块 **不提供报单**。记录来源:
| 来源 | source / monitor_type | 写入方式 |
|------|----------------------|----------|
| 程序平仓 | 本地 | sl_tp_guard、手动平仓 API |
| 柜台同步 | 柜台 | CTP 成交同步 `ctp_trade_sync` |
| 开单计划 | 开单计划 | 仅 `trade_records`,非 trade_logs 主统计 |
### CTP 同步
打开页面且 CTP 已连接时,自动拉取柜台成交写入 `trade_logs`(去重键 `ctp_trade_key`)。
### 手动编辑
「修改/核对开关」开启后可编辑字段并「核对修改」。
---
## 风控规则
### 复盘与账户冻结
提交复盘表单时若勾选 **情绪问题选项**(怕踏空、报复开仓等),可能触发:
- **日冻结** — 当日禁止新开仓([RISK.md](./RISK.md)
- 手动平仓超限后的冷静期可因填写日记缩短为 **1 小时**
### 记录本身
交易记录页不改变持仓;删除/编辑仅影响本地数据库。
---
## 平仓后的联动
`trade_logs` 新增平仓记录时:
1. **微信**:结构化平仓 [WECHAT §4](./WECHAT.md#4-平仓完成)
2. **AI**:后台平仓分析 → `/ai` 页面([AI.md](./AI.md)
---
## 主要字段
品种、类型(monitor_type)、方向、开仓/平仓价、止损/止盈、手数、保证金、盈亏、手续费、净盈亏、最新资金、结果、持仓时长。
---
## 微信推送
| 事件 | 模板 |
|------|------|
| 程序/同步平仓 | [WECHAT §4](./WECHAT.md#4-平仓完成) |
开单计划结果见 [PLANS.md](./PLANS.md)(§10 简版模板)。
---
## 相关文档
- [STATS.md](./STATS.md) — 统计来源 trade_logs
- [RISK.md](./RISK.md) — 复盘触发冻结
- [WECHAT.md](./WECHAT.md)
- [AI.md](./AI.md)
+115
View File
@@ -0,0 +1,115 @@
# 全局账户风控
本文汇总 **所有板块共用** 的风控规则。各板块下单前均会调用 `assert_can_open()` 或等价校验。
相关代码:`risk/account_risk_lib.py``position_sizing.py``product_recommend.py`
---
## 仓位上限
| 项 | 默认值 | 说明 |
|----|--------|------|
| `MAX_ACTIVE_POSITIONS` | 1 | 同时 **active** 持仓监控数量上限 |
| 环境变量 | `.env` | `MAX_ACTIVE_POSITIONS=1` |
- 达到上限后:**禁止新开仓**,但允许 **滚仓/顺势加仓**`can_roll=True`)。
- 状态标签:**仓位上限冻结**。
---
## 冷静期与日冻结
| 项 | 默认值 | 说明 |
|----|--------|------|
| `RISK_CONTROL_ENABLED` | true | 关闭后跳过冷静期逻辑 |
| `RISK_MANUAL_CLOSE_DAILY_LIMIT` | 2 | 当日 **手动平仓** 次数上限 |
| `RISK_COOLING_HOURS_MANUAL` | 4 | 超限后冷静期(小时) |
| `RISK_COOLING_HOURS_MANUAL_JOURNAL` | 1 | 填写复盘情绪日记后缩短为 1 小时 |
| `TRADING_DAY_RESET_HOUR` | 8 | 交易日重置时刻(8 点前算上一交易日) |
### 触发流程
1. 用户在下单监控 **手动平仓**,且当日手动平仓次数 ≥ 上限。
2. 进入 **4h 冻结**(或填写复盘表单中的情绪问题选项后 → **1h 冻结**)。
3. 冻结期间 `can_trade=False`,禁止一切新开仓。
### 日冻结
- 复盘表单勾选情绪问题(怕踏空、报复开仓、盈利飘了、拿不住单、扛单、重仓违规等)并提交后,可触发 **当日日冻结**
- 日冻结期间禁止新开仓,次日(按 `TRADING_DAY_RESET_HOUR`)重置。
---
## 保证金占用上限
| 项 | 配置位置 | 默认值 |
|----|----------|--------|
| 新开仓上限 | 系统设置 `max_margin_pct` | 30% |
| 滚仓上限 | 系统设置 `roll_max_margin_pct` | 单独配置 |
- 新开仓前计算:现有持仓保证金 + 拟开仓位保证金,占权益比例不得超过 `max_margin_pct`
- **滚仓/顺势加仓** 使用 `roll_max_margin_pct` 单独收紧手数(见 [STRATEGY.md](./STRATEGY.md))。
---
## 计仓与单笔手数
| 模式 | 说明 |
|------|------|
| 固定手数 | 使用系统设置 `fixed_lots` |
| 固定金额(以损定仓) | 须填止损价;手数 = 固定风险金额 ÷ 每手风险;同时受保证金上限约束 |
| 单笔上限 | `DEFAULT_MAX_ORDER_LOTS = 50` |
固定金额模式公式(简化):
```
每手风险 = |入场价 − 止损价| × 合约乘数
手数 = floor(固定风险金额 / 每手风险)
再按 max_margin_pct 收紧
```
---
## 可交易品种范围
| 条件 | 规则 |
|------|------|
| 权益 ≤ 20 万 **或** CTP 未连接 | 仅可交易:**玉米、豆粕、甲醇、螺纹钢** |
| CTP 未连接时估算 | 可开仓表按 **10 万权益** 估算最大手数 |
| 夜盘时段 | 可开仓表仅显示有夜盘品种 |
详见 [TRADING.md](./TRADING.md)、[ORDER_MONITOR.md](./ORDER_MONITOR.md)。
---
## 交易时段
- 非交易时段:**禁止报单**(开仓/平仓 API 返回 403)。
- CTP 未连接:禁止下单;连接中提示稍候。
---
## 各板块风控对照
| 板块 | 开仓前校验 | 特殊规则 |
|------|------------|----------|
| 下单监控 | 全部全局规则 + 保证金 + 品种 | 移动保本须填止损 |
| 关键位自动单 | 同上 + 交易时段 + CTP | 手数按 risk_percent 计算 |
| 策略首仓 | 同上 | 趋势回调计划单独表 |
| 滚仓/加仓 | 仓位上限冻结时仍可滚仓 | 滚仓保证金单独上限 |
| 开单计划 | **不自动下单**,仅提醒 | 无 assert_can_open |
| 关键支阻区 | 不自动下单 | 仅微信提醒 |
---
## 风险状态展示
下单监控顶栏显示当前状态:
| 状态 | 含义 |
|------|------|
| 正常 | 可新开仓 |
| 1h / 4h 冻结 | 冷静期中 |
| 日冻结 | 当日禁止新开仓 |
| 仓位上限冻结 | 已达 active 上限,可滚仓不可开新仓 |
+79
View File
@@ -0,0 +1,79 @@
# 系统设置
**页面路径**`/settings`
**相关文件**`app.py``install_trading.py``nav_settings.py`
---
## 配置分区
| 分区 | 主要项 | 影响板块 |
|------|--------|----------|
| 导航显示 | 策略、计划、行情、手续费、AI 等开关 | 全部可关闭菜单 |
| 交易模式 | SimNow / 实盘 CTP | 下单、策略、同步 |
| 计仓与风险 | 固定手数/固定金额、risk_percent、max_margin_pct、roll_max_margin_pct | [ORDER_MONITOR](./ORDER_MONITOR.md)、[STRATEGY](./STRATEGY.md) |
| 移动保本 | trailing_be_tick_buffer | 下单、关键位自动单 |
| 挂单超时 | pending_order_timeout_sec | 下单监控 pending |
| CTP 连接 | 前置、账号(可覆盖 .env) | 全部交易 |
| 参考资金 | CTP 未连接时权益估算 | 可开仓品种表 |
| 企业微信 | wechat_webhook | [WECHAT.md](./WECHAT.md) 全部推送 |
| AI 分析 | 见 [AI.md](./AI.md) | /ai 页面 |
| 登录账号 | 用户名/密码 → .env | 登录 |
| 备份恢复 | 见 [BACKUP.md](./BACKUP.md) | 数据库 |
---
## 下单逻辑
设置页 **不直接下单**。修改项在下次 API 调用时生效;部分 CTP 配置需重连。
---
## 风控相关默认值
| 设置键 | 默认 | 说明 |
|--------|------|------|
| risk_percent | 1 | 单笔风险占权益 % |
| max_margin_pct | 30 | 新开仓保证金上限 |
| roll_max_margin_pct | 单独 | 滚仓保证金上限 |
| fixed_lots / fixed_amount | — | 计仓模式 |
| trailing_be_tick_buffer | 2 | 移动保本 1R 缓冲跳数 |
环境变量风控(冷静期、仓位上限)见 [RISK.md](./RISK.md),通常在 `.env` 配置。
---
## 微信推送
配置 **企业微信 Webhook** 后,以下模块推送生效:
- 开单计划、关键位、下单、策略、AI 日终(见 [WECHAT.md](./WECHAT.md) 索引)
未配置 Webhook:所有 `send_wechat_msg()` 静默跳过。
---
## 导航开关
`nav_settings.py``NAV_TOGGLES` 控制菜单可见性;`@require_nav` 保护路由。
| 键 | 菜单 |
|----|------|
| strategy | 策略交易 |
| plans | 开单计划 |
| market | 行情 K 线 |
| fees | 手续费配置 |
| ai | AI 分析 |
下单监控、关键位、记录、统计、设置 **不可关闭**
---
## 相关文档
- [INDEX.md](./INDEX.md)
- [RISK.md](./RISK.md)
- [WECHAT.md](./WECHAT.md)
- [AI.md](./AI.md)
- [BACKUP.md](./BACKUP.md)
+56
View File
@@ -0,0 +1,56 @@
# 统计分析
**页面路径**`/stats`
**相关文件**`stats_engine.py``app.py``/api/stats`
---
## 功能概述
### 汇总指标(页顶卡片)
总交易次数、胜率、平均盈利/亏损、盈亏比、连续亏损、最大回撤、最大盈亏金额及占比、累计手续费、情绪单数量/占比。
进入页面自动加载 `/api/stats`,无手动「重新计算」按钮。
### 分项统计
下拉维度:按时间、周、月、品种、手续费、方向、交易类型、情绪单等,表格展示分组指标。
---
## 下单逻辑
**无**。只读展示,不触发报单。
---
## 风控规则
**无**。统计结果不影响账户状态。
---
## 数据来源
| 表 | 用途 |
|----|------|
| `trade_logs` | 主:成交、盈亏、手续费 |
| `review_records` | 情绪单标记等 |
| `stats_cache` | 缓存加速 |
开单计划的 `trade_records` **不计入** 此处主统计(除非另有合并逻辑)。
---
## 微信推送
**无**
---
## 相关文档
- [RECORDS.md](./RECORDS.md)
- [FEES.md](./FEES.md) — 手续费计算
+117
View File
@@ -0,0 +1,117 @@
# 策略交易
**页面路径**`/strategy``/strategy/records`
**相关文件**`install_trading.py`(趋势回调、顺势加仓/滚仓)
---
## 功能概述
| 策略 | 说明 |
|------|------|
| 趋势回调 | 首仓 + 网格补仓 + 统一止盈 |
| 顺势加仓(滚仓) | 对已有 active 持仓加仓,单独保证金上限 |
均需 **CTP 已连接** 且有对应持仓监控。
---
## 趋势回调 — 下单逻辑
### 1. 创建计划(预览 → 确认首仓)
用户填写:品种、方向、止损、补仓上沿、止盈、风险比例等 → 系统预览手数/网格 → 确认后 **市价开首仓**
**校验**(与下单监控相同):
- 交易时段、CTP 连接
- `assert_can_open()`、[RISK.md](./RISK.md)
- 品种范围、保证金上限
**成交后**
- 写入 `trend_pullback_plans`status=active
- 创建/关联 `trade_order_monitors`monitor_type=trend
- 微信:`趋势回调首仓 {sym} {first_lots}手`
### 2. 运行中监控
后台扫描 active 计划:
| 条件 | 动作 |
|------|------|
| 价格触及 **take_profit** | 全部平仓,计划结案 |
| 价格回落至 **网格档位** | 按档位补仓(不超过 remainder_lots |
**补仓**:市价加仓,更新均价与监控。
**止盈**:市价全平。
微信:
- 止盈 → `趋势回调止盈 {sym}`
- 补仓 → `趋势回调补仓 {sym} +{add_lots}手 @档位{N}`
### 3. 策略记录
`/strategy/records` 单独归档已结束计划。
---
## 顺势加仓(滚仓)— 下单逻辑
针对 **已有 active 持仓** 的加仓预览与执行。
**特殊风控**
| 项 | 说明 |
|----|------|
| 仓位上限冻结 | **仍允许滚仓**`can_roll=True` |
| `roll_max_margin_pct` | 滚仓后总保证金占用单独上限 |
| 手数收紧 | `cap_lots_for_margin_budget()` 按滚仓上限裁剪 |
流程:预览加仓价/手数/新止损 → 确认 → CTP 市价加仓 → 更新 monitor。
---
## 风控规则
| 规则 | 趋势首仓 | 滚仓 |
|------|----------|------|
| assert_can_open | ✓ | 仓位冻结时仍可 |
| max_margin_pct | ✓ 首仓 | — |
| roll_max_margin_pct | — | ✓ |
| 交易时段 | ✓ | ✓ |
| 品种范围 | ✓ | ✓ |
| 单笔 50 手 | ✓ | ✓ |
全局规则见 [RISK.md](./RISK.md)。
---
## 止盈止损
趋势持仓纳入 `sl_tp_guard` 本地监控(与下单监控相同机制)。
- monitor_type = `trend` / `roll`
- 平仓写入 `trade_logs`,来源标签「趋势回调」「顺势加仓」
---
## 微信推送
| 事件 | 模板 |
|------|------|
| 首仓 | [WECHAT §11](./WECHAT.md#11-策略趋势回调) |
| 止盈 | 同上 |
| 补仓 | 同上 |
| 结构化平仓 | [WECHAT §4](./WECHAT.md#4-平仓完成) |
---
## 相关文档
- [ORDER_MONITOR.md](./ORDER_MONITOR.md)
- [RISK.md](./RISK.md)
- [WECHAT.md](./WECHAT.md)
+305
View File
@@ -0,0 +1,305 @@
# 企业微信推送
**配置**:系统设置 → 企业微信 Webhook(`wechat_webhook`)。
**发送函数**`app.send_wechat_msg()` — 所有推送正文前自动加前缀:
```
【国内期货】
{正文}
```
未配置 Webhook 时静默跳过,不报错。
---
## 推送类型索引
| # | 类型 | 触发场景 | 模板章节 |
|---|------|----------|----------|
| 1 | 手动开仓成功(结构化) | 下单监控成交且填写止损 | [§1](#1-手动开仓成功) |
| 2 | 手动开仓(简版) | 成交但未填止损 | [§2](#2-简版开仓) |
| 3 | 挂单提交 | 限价单未立即成交 | [§3](#3-挂单提交) |
| 4 | 平仓完成(结构化) | trade_logs 写入平仓记录 | [§4](#4-平仓完成) |
| 5 | SL/TP 触发(简版) | 本地止盈止损市价平仓委托已提交 | [§5](#5-本地止盈止损触发) |
| 6 | 关键位自动单结果 | 箱体/收敛突破尝试下单 | [§6](#6-关键位自动单) |
| 7 | 关键位开仓成功(结构化) | 自动单成交 | [§7](#7-关键位开仓成功) |
| 8 | 关键支阻区提醒 | 5m 收盘突破区间 | [§8](#8-关键支阻区提醒) |
| 9 | 开单计划触发 | 现价进入决策区间 | [§9](#9-开单计划) |
| 10 | 开单计划止盈/止损 | 激活后价格触及 TP/SL | [§10](#10-开单计划结果) |
| 11 | 策略趋势回调 | 首仓/止盈/补仓 | [§11](#11-策略趋势回调) |
| 12 | AI 分析 | 开仓/平仓/日终报告 | [§12](#12-ai-分析) |
实现文件:`wechat_notify.py``trade_notify.py``key_monitor_lib.py``app.py``install_trading.py``ai_worker.py`
---
## 结构化推送
以下模板由 `wechat_notify.py` 生成,字段随实际成交数据填充。
### 1. 手动开仓成功
**函数**`format_open_success()` · **来源**`trade_notify.notify_manual_open_filled()`
**触发**:下单监控开仓 **成交** 且填写了 **止损价**
**模板**
```
📈 {品种名} 开仓成功
💼 账户:{模拟盘/实盘}
🧾 订单基础信息
📌 来源:期货下单
🔖 委托号:{order_id}
📈 方向:多头(long)/ 空头(short
⚠ 单笔风控:{risk_percent}%≈{risk_amount}元
📊 仓位配置
账户权益:{capital} 元
开仓手数:{lots} 手
占用保证金:{margin} 元
仓位占比:{margin_pct}%
🎯 价位 & 盈亏比
开仓价:{entry}
止损价:{stop_loss}
止盈价:{take_profit}
计划盈亏比:RR {rr} : 1
移动保本:1.0R → {be_px}(缓冲 {be_tick_buffer} 跳) ← 仅开启移动保本时
📌 状态
✅ 已进入下单监控,本地 SL/TP 守护
```
**示例**
```
📈 螺纹钢 开仓成功
💼 账户:SimNow 模拟
🧾 订单基础信息
📌 来源:期货下单
📈 方向:多头(long
⚠ 单笔风控:1%≈1000.00元
📊 仓位配置
账户权益:100000.00 元
开仓手数:2 手
占用保证金:8500.00 元
仓位占比:8.50%
🎯 价位 & 盈亏比
开仓价:3200
止损价:3180
止盈价:3240
计划盈亏比:RR 2 : 1
📌 状态
✅ 已进入下单监控,本地 SL/TP 守护
```
---
### 4. 平仓完成
**函数**`format_close_done()` · **来源**`trade_notify.notify_trade_log_close()`
**触发**`trade_logs` 新增平仓记录(SL/TP 守护、CTP 同步、手动平仓等)。
**模板**
```
📈/📉 {品种名} 平仓完成
💼 账户:{mode_label}
🧾 平仓概要
📌 方向:多头(long)/ 空头(short
📌 平仓结果:{止盈|止损|保本止盈|移动止盈|手动平仓}
💰 本单净盈亏:+/-{pnl_net} 元
⏱ 持仓时长:{N分钟|N小时N分钟|N天…}
💵 账户权益:{equity_after} 元
🎯 价位(计划)
开仓价:{entry}
平仓价:{close_price}
止盈价:{take_profit}
止损价:{stop_loss}
📎 备注
成交价不在计划止盈/止损带内(可能为手动或其他类型平仓) ← 可选
```
---
### 7. 关键位开仓成功
**函数**`format_key_open_success()` — 在 §1 基础上追加:
```
📎 关键位触发
类型:{箱体突破|收敛突破}
模式:{顺势|反转} · {向上突破|向下突破}
5m 收盘:{bar_time}
```
**来源字段**`{monitor_type}·{trade_mode}`(如「箱体突破·顺势」)。
---
### 8. 关键支阻区提醒
**函数**`format_zone_alert()` · **最多 3 次**,间隔约 **5 分钟**
**模板**
```
📌 {品种名} 关键位突破提醒({1|2|3}/3
🧾 突破概要
📌 类型:关键支阻区
⏱ 触发时间:{bar_time}
📊 上沿:{upper}|下沿:{lower}
💹 触发收盘:{close_price}
🎯 {向上突破/向下突破}({多头/空头})
📍 突破价位:{boundary}
📎 说明
· 人工盯盘,共推送 3 次(间隔约 5 分钟)
· 推送完毕后本条监控自动结案
· 不参与自动开仓
```
---
## 简版与业务推送
### 2. 简版开仓
**触发**:成交但未填止损。
```
{模拟盘/实盘} 开仓 {symbol} {direction} {lots}手 @{price}
```
---
### 3. 挂单提交
**触发**:限价开仓委托已提交、尚未成交。
```
委托已提交 · {symbol} {direction} {lots}手挂单中({N} 分钟未成交自动撤单)
```
---
### 5. 本地止盈止损触发
**触发**`sl_tp_guard` 本地检测到 TP/SL,已提交市价平仓委托(结构化平仓推送在成交写入 trade_logs 后另行发送)。
```
{止盈|止损} {symbol} {direction} {lots}手 @{mark},平仓委托已提交
```
---
### 6. 关键位自动单
**函数**`format_auto_breakout_msg()` · **成败均推送**
**模板**
```
✅/❌ {品种名} {箱体突破|收敛突破}自动单
⏱ 5m 收盘:{bar_time}
🎯 {向上突破|向下突破} · {顺势|反转} · {做多|做空}
💹 入场:{entry} 止损:{sl} 止盈:{tp}(盈亏比 {rr}
📦 手数:{lots}
🛡 已开启移动保本(达目标盈亏比自动止盈) ← 可选
{detail} ← 失败原因等
```
---
### 9. 开单计划
**触发**`planned` → 现价进入 `[zone_lower, zone_upper]`
```
【开单计划触发】{name} ({symbol})
方向:做多/做空
决策区间:{zone_lower} ~ {zone_upper}
决策理由:{reason}
当前价:{p}
止损:{stop_loss} 止盈:{take_profit}
```
---
### 10. 开单计划结果
**触发**`active` 状态下触及止盈或止损。
```
[做多/做空] {name} 已{止盈|止损}
决策区间:{zone_lower} ~ {zone_upper}
止损:{stop_loss} 止盈:{take_profit}
当前价:{p}
```
> 开单计划 **不自动下单**,仅微信提醒并写入 `trade_records`。
---
### 11. 策略趋势回调
| 事件 | 模板 |
|------|------|
| 首仓成交 | `趋势回调首仓 {sym} {first_lots}手` |
| 止盈平仓 | `趋势回调止盈 {sym}` |
| 补仓成交 | `趋势回调补仓 {sym} +{add_lots}手 @档位{done+1}` |
---
### 12. AI 分析
详见 [AI.md#微信推送](./AI.md#微信推送)。
**事件分析**(开仓/平仓后,AI 成功时):
```
🤖 AI 分析 · {title}
{content 前 1800 字}
```
**日终报告**
```
🤖 {YYYY-MM-DD} 日终持仓与交易报告
{content 前 1800 字}
```
---
## 推送与板块对照
| 板块 | 推送类型 |
|------|----------|
| 下单监控 | §1 §2 §3 §4 §5 §12 |
| 关键位监控 | §6 §7 §8 |
| 开单计划 | §9 §10 |
| 策略交易 | §11 §4 |
| AI 分析 | §12 |
---
## 注意事项
1. 所有消息经 `【国内期货】` 前缀发送,企业微信群机器人 `msgtype=text`
2. 结构化开仓/平仓需 **填写止损** 才会发送完整模板;否则为简版。
3. AI 推送仅在 AI 调用 **成功** 时发送;失败内容只写入 `/ai` 页面。
4. 关键支阻区第 3 次推送后监控自动归档,不再推送。