# 币安持仓与 DB 同步说明

当出现「币安有仓、数据库没有 open 记录」时，仪表盘/持仓列表会显示这些仓位没有 `id`、`stop_loss_price`、`take_profit_price`，且点「补挂止盈止损」依赖接口侧用配置比例计算（已支持无 DB 补挂）。若希望**在 trading_system 里为这些仓位补建 DB 记录**，并自动挂止损止盈、纳入监控，需正确配置以下项。

## 为何会“跳过补建”

逻辑顺序：

1. **ONLY_AUTO_TRADE_CREATES_RECORDS**（默认 `True`）  
   为 True 时表示「只允许自动开仓写入 DB」，会**强制关闭**补建与手动开仓建记录，即：
   - `SYNC_RECOVER_MISSING_POSITIONS` 被置为 False  
   - `SYNC_CREATE_MANUAL_ENTRY_RECORD` 被置为 False  
   因此日志会看到“已跳过自动创建交易记录”。

2. **SYNC_RECOVER_MISSING_POSITIONS**（默认 `True`）  
   为 True 时，在**未**被上一条关闭的前提下，会对「币安有仓、DB 无 open」的 symbol 做**补建**：写 DB、挂 SL/TP、纳入监控。

## 让币安持仓与 DB 一致（推荐配置）

目标：让那 15 个（或更多）「仅币安有仓」的持仓在下次同步时自动写入 DB、挂止损止盈并进入监控。

1. **ONLY_AUTO_TRADE_CREATES_RECORDS = False**  
   允许同步/补建时创建 DB 记录（必改，否则补建永远关闭）。

2. **SYNC_RECOVER_MISSING_POSITIONS = True**  
   开启「补建缺失持仓」（通常已是 True，只要没被上一条覆盖即可）。

3. 修改方式：  
   - **推荐**：在**后台配置/仪表盘**的「持仓」类配置中，将 `ONLY_AUTO_TRADE_CREATES_RECORDS` 设为 `false`（保存后会写入 Redis，trading_system 下次拉取配置即生效）。  
   - 或直接在 Redis / 数据库配置表中把 `ONLY_AUTO_TRADE_CREATES_RECORDS` 设为 false。  
   - 若策略从本地 `config.py` 读配置，则在该处将 `ONLY_AUTO_TRADE_CREATES_RECORDS` 设为 False。

4. **重启 trading_system** 或等待下一次持仓同步（例如定时 sync 或启动时 sync），即可对当前「币安有、DB 无」的持仓执行补建。

补建时会：

- 为每个 symbol 创建一条 open 交易记录（`entry_reason` 为 `sync_recovered` 或 `sync_recovered_unknown_origin`）；
- 先读交易所已有止损/止盈（若有且已达保本则沿用），否则用配置的 `STOP_LOSS_PERCENT` / `TAKE_PROFIT_PERCENT` 计算并挂单；
- 将仓位加入内存监控（保本/移动止损等）。

## 可选配置

- **SYNC_RECOVER_ONLY_WHEN_HAS_SLTP**（默认 True）  
  未配置 `SYSTEM_ORDER_ID_PREFIX` 时：仅对「已有止损/止盈单」的持仓补建。若希望**无 SL/TP 的仓位也补建**，可设为 False。

- **SYSTEM_ORDER_ID_PREFIX**  
  若配置了系统单前缀（如 `SYS`），补建会尝试用开仓订单的 `clientOrderId` 识别是否为本系统单；无论是否带前缀，当前逻辑都会**一律补建并挂 SL/TP**（不再因“来历不明”或“无 SL/TP”跳过）。

- **SYNC_CREATE_MANUAL_ENTRY_RECORD**（默认 False）  
  仅当 `sync_recover` 为 False 时生效：为 True 时会对「仅币安有仓」走另一条「手动开仓」建记录分支。通常只要把 `ONLY_AUTO_TRADE_CREATES_RECORDS=False` 且 `SYNC_RECOVER_MISSING_POSITIONS=True` 即可，不必单独开这个。

## 日志说明

- 若看到：  
  `因 ONLY_AUTO_TRADE_CREATES_RECORDS=True 已关闭补建，共 N 个仅币安持仓未写入 DB。`  
  表示当前配置不允许补建，按上文把 `ONLY_AUTO_TRADE_CREATES_RECORDS` 设为 False 并保证 `SYNC_RECOVER_MISSING_POSITIONS=True` 即可。

- 若看到：  
  `→ 补建缺失持仓：一律写入 DB、自动挂止损止盈并纳入监控`  
  表示补建已开启，下次同步会对缺失的 symbol 执行补建。
