diff --git a/docs/AI.md b/docs/AI.md new file mode 100644 index 0000000..4da5a9b --- /dev/null +++ b/docs/AI.md @@ -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) — 配置入口 diff --git a/docs/FEATURES.md b/docs/FEATURES.md index f6912fb..4b5e46f 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -2,6 +2,9 @@ 国内期货 · 交易复盘系统(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` | 是 | | 交易记录与复盘 | `/records` | 否 | | 统计分析 | `/stats` | 否 | +| AI 分析 | `/ai` | 是 | | 手续费配置 | `/fees` | 是 | | 系统设置 | `/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 持仓监控) - 策略记录单独归档 @@ -82,7 +86,7 @@ ## 开单计划 -**路径**:`/plans` +**路径**:`/plans` · 详见 [PLANS.md](./PLANS.md) - 录入当日计划:主力合约、方向、决策区间、止损、止盈 - 状态:`planned` → `active` → `closed` / `expired` @@ -104,7 +108,7 @@ ## 行情 K 线 -**路径**:`/market` +**路径**:`/market` · 详见 [MARKET.md](./MARKET.md) - 多周期 K 线(TradingView Lightweight Charts) - 支持 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` @@ -168,7 +182,7 @@ ## 系统设置 -**路径**:`/settings` +**路径**:`/settings` · 详见 [SETTINGS.md](./SETTINGS.md) | 功能 | 说明 | |------|------| @@ -178,7 +192,7 @@ | 保证金上限、移动保本缓冲、挂单超时 | 保证金上限默认 30%;移动保本缓冲为达 1R 后止损相对开仓价的跳数(默认 2 跳) | | CTP 连接 | SimNow / 实盘前置与账号(可覆盖 `.env`) | | 参考资金 | CTP 未连接时用于可开仓筛选与估算 | -| 企业微信 Webhook | 计划/关键位推送 | +| 企业微信 Webhook | 计划/关键位/交易/AI 推送 · 见 [WECHAT.md](./WECHAT.md) | | 登录账号 | 用户名/密码,同步写入 `.env` | | 数据备份与恢复 | 自动/手动备份、下载压缩包、恢复说明 | | 深色/浅色主题 | 页头切换 | diff --git a/docs/INDEX.md b/docs/INDEX.md new file mode 100644 index 0000000..4ddde62 --- /dev/null +++ b/docs/INDEX.md @@ -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) | diff --git a/docs/KEY_MONITORS.md b/docs/KEY_MONITORS.md index 49dc3c2..d0a6821 100644 --- a/docs/KEY_MONITORS.md +++ b/docs/KEY_MONITORS.md @@ -4,6 +4,8 @@ 关键位监控用于在指定价格区间上设置 **5 分钟收盘** 触发规则,分为 **自动单**(箱体/收敛突破)与 **仅微信提醒**(关键支阻区)两类。 +**文档索引**:[INDEX.md](./INDEX.md) · 微信模板:[WECHAT.md §6–§8](./WECHAT.md) · 风控:[RISK.md](./RISK.md) + --- ## 监控类型 @@ -30,7 +32,7 @@ |------|------| | 区间 | **上沿 = 阻力**,**下沿 = 支撑**,合并为一个关键支阻区 | | 触发 | 5m 收盘突破上沿或跌破下沿 | -| 推送 | 企业微信,格式含突破方向、触发收盘、区间上下沿等 | +| 推送 | 企业微信,见 [WECHAT §8](./WECHAT.md#8-关键支阻区提醒) | | 次数 | 最多 **3 次**,间隔约 **5 分钟**(人工盯盘提醒) | | 自动开仓 | **否** | | 结案 | 第 3 次推送后自动归档 | @@ -61,4 +63,31 @@ - 自动单逻辑:`key_monitor_lib.py` + `install_trading._execute_key_breakout` - 止盈止损监控:`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) diff --git a/docs/MARKET.md b/docs/MARKET.md new file mode 100644 index 0000000..0e73dca --- /dev/null +++ b/docs/MARKET.md @@ -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) diff --git a/docs/ORDER_MONITOR.md b/docs/ORDER_MONITOR.md new file mode 100644 index 0000000..52e6cdf --- /dev/null +++ b/docs/ORDER_MONITOR.md @@ -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 | 开仓价 ± (n−1)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) diff --git a/docs/PLANS.md b/docs/PLANS.md new file mode 100644 index 0000000..dafe9d8 --- /dev/null +++ b/docs/PLANS.md @@ -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) diff --git a/docs/RECORDS.md b/docs/RECORDS.md new file mode 100644 index 0000000..3ce5812 --- /dev/null +++ b/docs/RECORDS.md @@ -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) diff --git a/docs/RISK.md b/docs/RISK.md new file mode 100644 index 0000000..b5142b3 --- /dev/null +++ b/docs/RISK.md @@ -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 上限,可滚仓不可开新仓 | diff --git a/docs/SETTINGS.md b/docs/SETTINGS.md new file mode 100644 index 0000000..82c15f0 --- /dev/null +++ b/docs/SETTINGS.md @@ -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) diff --git a/docs/STATS.md b/docs/STATS.md new file mode 100644 index 0000000..55052b4 --- /dev/null +++ b/docs/STATS.md @@ -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) — 手续费计算 diff --git a/docs/STRATEGY.md b/docs/STRATEGY.md new file mode 100644 index 0000000..75274ae --- /dev/null +++ b/docs/STRATEGY.md @@ -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) diff --git a/docs/WECHAT.md b/docs/WECHAT.md new file mode 100644 index 0000000..84799ca --- /dev/null +++ b/docs/WECHAT.md @@ -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 次推送后监控自动归档,不再推送。