# 扫描时间差异分析

## 🔍 问题分析

### 扫描逻辑

根据代码（`trading_system/strategy.py`）：
1. **启动后立即执行第一次扫描**
2. **扫描完成后，等待 `SCAN_INTERVAL` 秒（默认3600秒=1小时）**
3. **然后执行下一次扫描**

### 问题场景

如果不同账户在不同时间启动：

**示例**：
- **account2** 在 10:00 启动
  - 第一次扫描：10:00
  - 下次扫描：11:00
  - 再下次：12:00

- **account3** 在 10:30 启动
  - 第一次扫描：10:30
  - 下次扫描：11:30
  - 再下次：12:30

- **account4** 在 11:00 启动
  - 第一次扫描：11:00
  - 下次扫描：12:00
  - 再下次：13:00

### 影响分析

#### 1. 扫描时间不同导致的问题

**问题**：
- 不同账户在不同时间扫描市场
- 可能扫描到不同的交易对（市场在变化）
- 可能扫描到不同的信号强度
- 可能错过某些交易机会

**示例**：
- 10:00 时，BTCUSDT 出现强信号（信号强度8）
- account2 在 10:00 扫描，发现并下单
- account3 在 10:30 扫描，BTCUSDT 信号可能已经减弱（信号强度5）
- account3 可能因为信号强度不足而跳过

#### 2. 为什么 account3/account4 下单少？

**可能原因**：
1. **扫描时间不同，错过了最佳入场时机**
   - account2 在信号最强时扫描并下单
   - account3/account4 在信号减弱后扫描，信号强度不足

2. **市场变化导致信号过滤**
   - 10:00 时市场状态是 `trending`
   - 10:30 时市场状态可能变成 `ranging` 或 `neutral`
   - 如果 `AUTO_TRADE_ONLY_TRENDING=True`，会被过滤

3. **4H趋势变化**
   - 10:00 时 4H 趋势是 `up`
   - 10:30 时 4H 趋势可能变成 `neutral`
   - 如果 `AUTO_TRADE_ALLOW_4H_NEUTRAL=False`（旧配置），会被过滤

#### 3. 为什么没有止盈？

**可能原因**：
1. **持仓很少**
   - 如果下单很少，持仓自然就少
   - 没有持仓，就没有止盈机会

2. **止盈价设置过高**
   - 如果止盈价设置过高，价格未达到
   - 例如：止盈价60%，但价格只涨了30%

3. **移动止损过早触发**
   - 如果移动止损过早触发，可能在达到止盈前就被平仓

4. **手动平仓干扰**
   - 如果手动平仓过早，可能导致止盈未触发

---

## ✅ 解决方案

### 方案1：同步扫描时间（推荐）

**思路**：让所有账户在相同的时间点扫描市场

**实现方式**：
1. **对齐到整点**：所有账户在整点（如 10:00、11:00、12:00）扫描
2. **对齐到固定间隔**：所有账户在固定间隔（如每小时的0分、30分）扫描

**修改代码**：
```python
# 在 strategy.py 中，修改等待逻辑
scan_interval = config.TRADING_CONFIG.get('SCAN_INTERVAL', 3600)

# 计算到下一个整点的时间
now = datetime.now()
next_hour = (now.replace(minute=0, second=0, microsecond=0) + timedelta(hours=1))
wait_seconds = (next_hour - now).total_seconds()

logger.info(f"等待到下一个整点（{next_hour.strftime('%H:%M:%S')}）进行扫描，剩余 {wait_seconds:.0f} 秒...")
await asyncio.sleep(wait_seconds)
```

**优点**：
- 所有账户在同一时间扫描，机会均等
- 避免因扫描时间不同导致的差异

**缺点**：
- 需要等待到下一个整点，可能延迟第一次扫描

### 方案2：缩短扫描间隔

**思路**：缩短 `SCAN_INTERVAL`，让扫描更频繁

**实现方式**：
- 将 `SCAN_INTERVAL` 从 3600 秒（1小时）改为 1800 秒（30分钟）或更短

**优点**：
- 扫描更频繁，减少错过机会的概率
- 不同账户的扫描时间差异影响更小

**缺点**：
- 增加API调用频率
- 可能增加系统负载

### 方案3：保持现状，但优化配置

**思路**：保持扫描时间不同，但优化配置以减少差异

**实现方式**：
1. **降低信号强度阈值**：`MIN_SIGNAL_STRENGTH` 从 7 降到 5
2. **允许4H中性趋势**：`AUTO_TRADE_ALLOW_4H_NEUTRAL=True`
3. **允许震荡行情**：`AUTO_TRADE_ONLY_TRENDING=False`（不推荐）

**优点**：
- 不需要修改代码
- 可以立即生效

**缺点**：
- 仍然存在扫描时间差异
- 可能降低信号质量

---

## 🎯 推荐方案

### 推荐：方案1（同步扫描时间）

**理由**：
1. **公平性**：所有账户在同一时间扫描，机会均等
2. **一致性**：扫描结果更一致，便于对比分析
3. **可预测性**：扫描时间可预测，便于监控

**实现步骤**：
1. 修改 `trading_system/strategy.py`，让扫描时间对齐到整点
2. 重启所有交易进程
3. 观察效果

---

## 📊 当前情况分析

### account2 表现好

**可能原因**：
1. **启动时间好**：在信号最强时启动并扫描
2. **市场时机好**：启动时市场状态良好
3. **信号质量高**：扫描到的信号强度足够

### account3/account4 表现差

**可能原因**：
1. **启动时间差**：在信号减弱后启动并扫描
2. **市场时机差**：启动时市场状态不佳
3. **信号质量低**：扫描到的信号强度不足

---

## 🔧 立即行动

### 1. 检查启动时间

```bash
# 查看各账户的启动时间
grep -E "交易策略开始执行|开始扫描市场" /www/wwwroot/autosys_new/logs/trading_*.log | head -n 10
```

### 2. 检查扫描时间

```bash
# 查看各账户的扫描时间
grep -E "等待.*秒后进行下次扫描|开始扫描市场" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 20
```

### 3. 检查扫描结果

```bash
# 查看各账户的扫描结果
grep -E "扫描完成|找到.*个符合条件的交易对" /www/wwwroot/autosys_new/logs/trading_*.log | tail -n 20
```

---

## ✅ 完成时间

2026-01-25
