# 关键位监控说明（自动开仓 + 人工盯盘）

**适用：Gate / Binance / OKX 三所实例（共用 `lib/key_monitor/key_auto_order_lib.py`）**

## 环境开关 `KEY_AUTO_ORDER_ENABLED`（默认 `false`）

| 计仓模式 | 开关 | 关键位程序自动单 |
|----------|------|------------------|
| `risk`（以损定仓） | `false` | **全部关闭**（含触价）；支撑/阻力微信提醒仍可用 |
| `risk` | `true` | 箱体/收敛/斐波/假突破/触价均可自动（旧行为） |
| `full_margin`（全仓） | `false` | 全部关闭（含触价） |
| `full_margin` | `true` | **仅触价**自动；箱体/斐波等仍禁止 |

**不受本开关影响：** 人工实盘下单、关键支撑/阻力提醒、**顺势加仓**（`risk` 下）、趋势回调（`risk` 下）。全仓模式下策略自动仍禁止。

修改 `.env` 后须 **重启 PM2**。复盘「开仓类型」与统计分段会随开关联动隐藏关键位选项。

---

**适用：`crypto_monitor_gate`（Gate U 本位永续）**  
Binance / OKX 见各自目录下同名文档；共享逻辑在 `lib/key_monitor/`。

本文档与 `.env`、`check_key_monitors`、`add_key`、`_key_hard_checks`、`_process_key_rs_level_alert` 一致。

---

## 一、监控类型总览

| 录入类型 | 录入时选方向 | 自动市价开仓 | 触发与结案 |
|----------|--------------|--------------|------------|
| **箱体突破** | **必选** 多/空 | **是**（门控 + RR） | 条件满足 → 开仓或 `rr_insufficient` / `exchange_failed` → **一次性删除** |
| **收敛突破** | **必选** 多/空 | **是**（同上） | 同上 |
| **关键阻力位** | **不选**（`direction=watch`） | **否** | 5m 收盘突破上/下沿 → 微信 **3 次** → `key_level_alert_done` |
| **关键支撑位** | **不选** | **否** | 同上（与阻力位**相同规则**：填上沿+下沿，程序双向监控） |
| 斐波回调 0.618 / 0.786 | 必选 | 限价挂单逻辑 | 见斐波说明（**不在下文展开**） |
| **回调触价开仓** | **必选** 多/空 | **程序盯价 → 回调触 E 后市价** | 见下文 **§四** |
| **突破触价开仓** | **必选** 多/空 | **程序盯价 → 穿越 E 立即市价** | 见下文 **§四** |

**添加时（箱体/收敛/斐波/触价）：** 品种须 **日成交量排名前 `KEY_DAILY_VOLUME_RANK_MAX`（默认 30）**；上沿 **>** 下沿（触价开仓填 E/SL/TP，上下沿仅作展示占位）。

---

## 二、关键阻力位 / 关键支撑位（人工盯盘）

### 2.1 录入

- 填写 **上沿 `upper`** 与 **下沿 `lower`**（程序同时监控两侧，**无法预先判定**做多还是做空）。
- 页面 **不显示、不要求** 方向；库中 `direction` 初始为 `watch`，**首次突破后** 写入 `long`（向上突破上沿）或 `short`（向下突破下沿）。

### 2.2 触发（极简）

- 周期：**`KLINE_TIMEFRAME`（默认 5m）最近一根已闭合 K** 的 **收盘价**（非影线）。
- **向上突破上沿：** `收盘 > upper` → 推断方向 **多 / 向上**，本次监控任务开始按节奏提醒。
- **向下突破下沿：** `收盘 < lower` → 推断方向 **空 / 向下**，本次任务同样开始提醒。
- **任一侧突破即结束本条监控周期**（不会在突破后再等待另一侧；上沿、下沿谁先满足用谁，同根 K 仅可能满足一侧）。

**不参与：** 量能、二确 K、越过幅度下限、日成交排名（运行时）、计划 RR、自动开仓。

### 2.3 微信提醒次数

| 配置 | 默认 | 含义 |
|------|------|------|
| `KEY_ALERT_MAX_TIMES` | `3` | 突破后最多推送 3 次 |
| `KEY_ALERT_INTERVAL_MINUTES` | `5` | 相邻两次推送至少间隔 5 分钟 |

- 第 1 次：首次检测到突破的当次轮询（若已闭合 5m 满足条件）。
- 第 2、3 次：仅按间隔推送（**不要求**价格仍在箱外）。
- 第 3 次推送后：写入 `key_monitor_history`，`close_reason=**key_level_alert_done**`，从 `key_monitors` **删除**。

### 2.4 与箱体/收敛的区别

| 项目 | 阻力/支撑 | 箱体/收敛 |
|------|-----------|-----------|
| 方向 | 程序推断 | 人工选择 |
| K 线根数 | 1 根闭合 5m | 2 根（突破 K + 确认 K） |
| 提醒次数 | 3 次后结案 | 自动单：触发后 1 次业务推送并结案 |

---

## 三、箱体突破 / 收敛突破（自动开仓）

### 3.1 K 线结构（默认索引）

| 角色 | 环境变量 | 默认 | 含义 |
|------|----------|------|------|
| 突破 K | `KEY_CONFIRM_BREAKOUT_BAR` | `-2` | 倒数第 2 根闭合 K |
| 确认 K | `KEY_CONFIRM_BAR` | `-1` | 倒数第 1 根闭合 K |

### 3.2 硬门控（须全部通过）

1. **有效突破（收盘越界）**  
   - 多：`突破 K 收盘 > upper`  
   - 空：`突破 K 收盘 < lower`

2. **突破越过幅度（仅下限）**  
   - 多：`(突破 K 收盘 − upper) / upper × 100 > KEY_BREAKOUT_AMP_MIN_PCT`（默认 **0.03%**）  
   - 空：`(lower − 突破 K 收盘) / lower × 100 >` 同上  
   - **无上限**；突破过猛由 **计划 RR** 过滤。  
   - **不再**使用 K 线实体占开盘价比例；`KEY_BREAKOUT_AMP_MAX_PCT` **已不参与门控**。

3. **确认 K 不进箱体**  
   - 多：确认 K 收盘 **`> upper`**（不得在 `[lower, upper]` 内）  
   - 空：确认 K 收盘 **`< lower`**

4. **量能：** 突破 K 成交量 > 前 `KEY_VOLUME_MA_BARS`（默认 20）根均量 × `KEY_VOLUME_RATIO_MIN`（默认 1.3）

5. **日成交量排名：** 运行时仍须前 `KEY_DAILY_VOLUME_RANK_MAX`（默认 30）

6. **计划 RR（最后经济门控）：** 按确认 K 收盘 **E** 计算 SL/TP 后，`RR` **严格大于** `KEY_AUTO_MIN_PLANNED_RR`（默认 1.5）才市价开仓

### 3.3 止损 / 止盈（确认 K 收盘为 E）

箱体高 **H = |upper − lower|**。止损锚在 **突破 K 极值** 外侧：

| 方向 | 止损（标准/趋势方案） |
|------|------------------------|
| 多 | 突破 K **最低价** × (1 − `KEY_STOP_OUTSIDE_BREAKOUT_PCT`%) |
| 空 | 突破 K **最高价** × (1 + `KEY_STOP_OUTSIDE_BREAKOUT_PCT`%) |

止盈方案见下表（与改版前一致）：

| 方案 | `sl_tp_mode` | 多：SL / TP | 空：SL / TP |
|------|--------------|-------------|-------------|
| 标准突破 | `standard` | 突破 K 低外侧% / **E+H** | 突破 K 高外侧% / **E−H** |
| 箱体 1R·止盈 1.5H | `box_1p5` | **E−H** / **E+1.5×H** | **E+H** / **E−1.5×H** |
| 趋势单·自填止盈 | `trend_manual` | 突破 K 低 × (1−`KEY_TREND_STOP_OUTSIDE_PCT`%) / **录入止盈** | 突破 K 高外侧% / **录入止盈** |

### 3.4 一次性结案（`close_reason`）

| `close_reason` | 含义 |
|----------------|------|
| `box_opposite_break` | 标记价先突破反向边界（多：≤下沿；空：≥上沿） |
| `rr_insufficient` | 门控通过但 RR 不达标或 SL/TP 几何无效 |
| `exchange_failed` | RR 达标但实盘/交易所等原因未开仓 |
| `auto_opened` | RR 达标且市价开仓成功 |
| `key_level_alert_done` | 阻力/支撑 **3 次提醒** 完成 |

---

## 四、回调 / 突破触价开仓（程序触价，无交易所挂单）

### 4.1 录入

- **回调触价开仓**：方向必选多/空；填写 **计划入场价 E**、**止损 SL**、**止盈 TP**（做多须 `SL < E < TP`）。
- **突破触价开仓**：同上；添加时当前价须在突破方向一侧（做多：价低于 E；做空：价高于 E）。
- 计划 RR 以 **E** 为基准，须 **严格大于** `KEY_AUTO_MIN_PLANNED_RR`（默认 1.5）。
- 可选移动保本、时间平仓；**全仓杠杆模式**下可用。

### 4.2 触发与结案

| 类型 | 触发条件（标记价） |
|------|-------------------|
| **回调触价** | 做多 `≤ E`；做空 `≥ E` → 下一轮询市价开仓 |
| **突破触价** | 做多**向上穿越** E；做空**向下穿越** E → **立即**市价开仓 |

- 未成交前标记价先触 **TP 侧** → `trigger_tp_invalidate`。
- **突破触价**另：未穿越 E 先触 **SL 侧** → `trigger_sl_invalidate`。
- **24h** 未触发 → `trigger_entry_expired`。
- 成功 → `trigger_entry_filled`；触发后开仓失败 → `trigger_exchange_failed`。

### 4.3 计仓与占位

- **以损定仓**：按 E、SL 反推保证金，触发时重算；**全仓杠杆**：可用×缓冲比例，BTC/ETH 10x、其它 5x。
- **占当日开仓意图**（已开 + 待触发），未成交不占持仓；同币仅 1 条触价监控（含回调/突破）。

共享逻辑：`trigger_entry_key_monitor_lib.py`；轮询：`check_trigger_entry_key_monitors`。

---

## 五、环境与参数（`.env` 摘要）

| 变量 | 箱体/收敛 | 阻力/支撑 |
|------|-----------|-----------|
| `KEY_BREAKOUT_AMP_MIN_PCT` | 突破越过下限（默认 0.03） | 不用 |
| `KEY_BREAKOUT_AMP_MAX_PCT` | **已废弃门控** | 不用 |
| `KEY_VOLUME_*` / `KEY_CONFIRM_*` | 用 | 不用 |
| `KEY_AUTO_MIN_PLANNED_RR` | 用 | 不用 |
| `KEY_ALERT_MAX_TIMES` / `KEY_ALERT_INTERVAL_MINUTES` | 不用 | 用（默认 3 次 / 5 分钟） |
| `KEY_DAILY_VOLUME_RANK_MAX` | 添加时 + 运行时 | **仅添加时** |

---

## 六、相关代码

| 说明 | 位置 |
|------|------|
| 共享判定 | `key_monitor_lib.py` |
| 主循环 | `check_key_monitors` |
| 自动门控 | `_key_hard_checks` |
| 阻力/支撑提醒 | `_process_key_rs_level_alert` |
| 录入 | `add_key` |
| 开仓 | `_market_open_for_key_monitor` |
