# 单日开仓次数限制（三所统一）

各交易实例（Binance / OKX / Gate）在 `.env` 中独立配置，互不影响。

## 交易日口径

- 以 **北京时间** `TRADING_DAY_RESET_HOUR`（默认 **8:00**）切分交易日，与统计、顶栏「交易日」一致。
- **次日恢复**：过了切日时刻后 `session_date` 变为新日期，计数自动归零，无需清库。

## 计数口径

每成功新建一条 `order_monitors` 记录计 **1 次**，包括：

- 人工「实盘下单」
- 关键位自动开仓
- 其他写入 `order_monitors` 的成功开仓

平仓后再开仍算新的一单。当日总次数到硬上限后 **当天不再允许新开**（即使已空仓）。

## 环境变量

在「交易执行 / 人工风控」段配置：

```env
# 【单日开仓 AI 提醒】本交易日开仓次数达到该值时，企业微信推送 AI 克制提醒（不拦单）
DAILY_OPEN_ALERT_THRESHOLD=5

# 【单日开仓硬上限】本交易日开仓次数 >= 该值后，禁止一切新开仓直至下一交易日；0=不启用
DAILY_OPEN_HARD_LIMIT=0
```

### 配置示例

```env
# 保守户：3 次提醒，5 次封死
DAILY_OPEN_ALERT_THRESHOLD=3
DAILY_OPEN_HARD_LIMIT=5

# 仅提醒、不封（与旧版行为接近）
DAILY_OPEN_ALERT_THRESHOLD=5
DAILY_OPEN_HARD_LIMIT=0

# 严格户：到 3 次即封
DAILY_OPEN_ALERT_THRESHOLD=2
DAILY_OPEN_HARD_LIMIT=3
```

建议 `DAILY_OPEN_ALERT_THRESHOLD <= DAILY_OPEN_HARD_LIMIT`（硬上限为 0 时除外）。

## 程序行为

| 次数 | 行为 |
|------|------|
| 未达提醒阈值 | 正常开仓 |
| 达到 `DAILY_OPEN_ALERT_THRESHOLD` | 成功开仓后 AI 企业微信提醒 |
| 达到 `DAILY_OPEN_HARD_LIMIT`（>0） | `precheck_risk` 拒绝人工/关键位开仓；顶栏 `can_trade=false` |

硬限制与以下规则 **同时生效**（取交集）：

- `TRADING_DAY_RESET_OPEN_GUARD_ENABLED`：切日前禁止新开
- `MAX_ACTIVE_POSITIONS`：同时持仓上限
- Gate：`precheck_trend_pullback_start` 同样校验单日硬上限

## 页面与接口

- 顶栏 / `api/account_snapshot` 返回 `opens_today`、`daily_open_hard_limit`、`daily_open_alert_threshold`。
- 达硬上限时提示：`本交易日开仓 N/M 已达上限，次日 8:00 后恢复`（`M` 为配置的硬上限）。

## 部署

修改各实例 `.env` 后重启对应 pm2 进程，例如：

```bash
pm2 restart crypto_binance crypto_okx crypto_gate
```

## 实现位置

- 共享逻辑：`daily_open_limit_lib.py`
- 三所 `app.py`：`precheck_risk`、`can_trade`、`api/account_snapshot`、开仓成功后的 AI 提醒文案
- 单元测试：`tests/test_daily_open_limit_lib.py`
