# DB 与币安订单对账说明

## 一、查询系统今日落入 DB 的单子

### 1. 命令行脚本（推荐）

```bash
# 今日、默认账号、按创建时间（落库时间）
python scripts/query_trades_today.py

# 指定账号
python scripts/query_trades_today.py --account 2

# 指定日期
python scripts/query_trades_today.py --date 2026-02-21

# 按入场时间筛选
python scripts/query_trades_today.py --time-filter entry

# 仅可对账记录（有开仓/平仓订单号）
python scripts/query_trades_today.py --reconciled-only

# 导出到 JSON 文件
python scripts/query_trades_today.py -o today_trades.json
```

### 2. API 接口

```
GET /api/trades?period=today&time_filter=created&reconciled_only=false
```

- `period=today`：今天
- `time_filter=created`：按创建时间（落库时间），便于对照「何时写入 DB」
- `time_filter=entry`：按入场时间
- `time_filter=exit`：按平仓时间
- `reconciled_only=false`：包含所有记录（含取消、无订单号）

### 3. 前端导出

交易记录页面 → 选择「今天」→ 导出 JSON / Excel。

---

## 二、币安订单推送日志

系统会将收到的 **ORDER_TRADE_UPDATE**、**ALGO_UPDATE** 写入日志，便于与 DB 对照。

### 日志路径

```
{项目根}/logs/binance_order_events.log
```

### 格式

每行一条 JSON，例如：

```json
{"ts":1737500000000,"event_type":"ORDER_TRADE_UPDATE","account_id":1,"E":1737500000123,"symbol":"BTCUSDT","orderId":123456,"clientOrderId":"SYS_1737500000_abcd","event":"TRADE","status":"FILLED","reduceOnly":false,"avgPrice":"95000","executedQty":"0.01","realizedPnl":"0"}
```

### 字段说明

| 字段 | 说明 |
|------|------|
| ts | 本机接收时间戳 |
| event_type | ORDER_TRADE_UPDATE / ALGO_UPDATE |
| account_id | 账号 ID |
| E | 币安事件时间（毫秒） |
| symbol | 交易对 |
| orderId | 币安订单号 |
| clientOrderId | 自定义订单号（系统前缀） |
| event | NEW/TRADE/CANCELED |
| status | NEW/FILLED/CANCELED 等 |
| reduceOnly | 是否只减仓（平仓单） |
| avgPrice/executedQty | 成交价/成交量（FILLED 时） |
| realizedPnl | 实现盈亏（平仓时） |
| algoId/triggeredOrderId | ALGO_UPDATE 专用 |

### 对账用法

```bash
# 查看今天收到的所有订单推送
grep "ORDER_TRADE_UPDATE" logs/binance_order_events.log

# 查看 FILLED 成交
grep '"status":"FILLED"' logs/binance_order_events.log

# 按 clientOrderId 对照
grep "SYS_1737500000_abcd" logs/binance_order_events.log
```

---

## 三、从币安拉取订单/成交（DB 缺失时）

当 DB 记录查不到或需直接从币安做策略分析时，可用脚本拉取：

```bash
# 拉取最近 7 天成交记录（默认，适合策略分析）
python scripts/fetch_binance_orders.py --account 2 --symbol BTCUSDT

# 多个交易对
python scripts/fetch_binance_orders.py --account 2 --symbols ASTERUSDT,FILUSDT,PENGUUSDT

# 拉取订单列表
python scripts/fetch_binance_orders.py --account 2 --symbol BTCUSDT --type orders

# 指定天数、导出
python scripts/fetch_binance_orders.py --account 2 --symbol BTCUSDT --days 7 -o binance_trades.json
```

- `--type trades`：成交记录（含价格、数量、盈亏，策略分析推荐）
- `--type orders`：订单列表（含 FILLED/CANCELED）
- 币安单次时间范围最多 7 天

---

## 四、对账流程建议

1. **查 DB 今日记录**：`python scripts/query_trades_today.py -o db_today.json`
2. **查币安推送日志**：`tail -f logs/binance_order_events.log` 或 `grep "ORDER_TRADE_UPDATE" logs/binance_order_events.log`
3. **对照**：用 `clientOrderId` 或 `orderId` 关联 DB 记录与推送日志，确认：
   - DB 有 pending 且收到 FILLED 推送 → 应更新为 open
   - DB 有 open 且收到 reduceOnly FILLED → 应更新 exit_order_id
   - 收到推送但 DB 无对应记录 → 可能漏建或为手动单
