Files
mike 1877a85cc5 feat: 迁移 trading 相关脚本到 skill 仓库 (第1批: 🔴 高优先级)
【迁移内容】
- crypto-t-monitor/scripts/t_monitor.py (币圈做T, 25.5 KB)
- strategy-management/scripts/us_t_levels.sh + hk_t_levels.sh (做T点位)
- intraday-trading/scripts/us_intraday_{scanner,monitor,close}_cron.sh + .py
- intraday-trading/scripts/hk_intraday_{scanner,monitor,close}_cron.sh + .py

【配套修改】
- 8 个 cron 任务 script 路径更新 (jobs.json):
  - db03f9255ad0 (币圈OKX做T) → crypto-t-monitor/scripts/
  - cfa0c1d6 (美股日内盘前) → intraday-trading/scripts/
  - bcdf7039 (美股日内交易监控) → intraday-trading/scripts/
  - d1acad61 (美股日内平仓) → intraday-trading/scripts/
  - c3401d72 (港股日内盘前) → intraday-trading/scripts/
  - e3667cb0 (港股日内交易监控) → intraday-trading/scripts/
  - 303ec320 (港股日内平仓) → intraday-trading/scripts/
  - c4dc9ac8 (港股做T点位) → strategy-management/scripts/
  - 70d24624 (美股做T点位) → strategy-management/scripts/
- prompt 字段里路径同步更新
- crypto-t-monitor/SKILL.md scripts 段加 t_monitor.py 描述

【删除】本地旧副本 ~/.hermes/scripts/{t_monitor,us_t_levels,hk_t_levels,us_intraday*,hk_intraday*}.{py,sh}
【保留】~/.hermes/scripts/fetch_policy.py 已迁未删 (本次删)

【测试】us_intraday_scanner.py 跑通 (有 shebang, no_agent cron 自动用 python3)
【未改】devops/ + software-development/ 不在 trading git 仓库, 引用已本地更新
2026-07-24 11:39:52 +08:00

483 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: crypto-t-monitor
description: "OKX 币圈日内做T监控 - 多币种 + 动态 ATR + 网络重试 + 新币自动挑选,推结果到QQ。t-monitor cron 每15分钟跑。v2.6: 加减仓 ≠ 平仓 (用户纠正) + 按比例算法 (信号强度+持仓感知)。v2.5: 新币监控但绝不开仓(只对已持仓币执行做T);cron silent模式用 `deliver: local` 真正静默。"
version: 2.6.0
author: Hermes Agent
license: MIT
platforms: [linux, macos]
metadata:
hermes:
tags: [trading, crypto, okx, t-monitor, position, automatic, backtest, multi-coin, new-coin-scanner]
related_skills: [okx-auto-position, okx-crypto, intraday-trading]
scripts:
- "scripts/t_monitor.py: '币圈做T cron 脚本 (okx t-monitor). 2026-07-24 迁移到 skill 仓库. cron db03f9255ad0 引用此路径 (no_agent=true).'"
- okx_t_monitor.py: "核心做T脚本, 多币种 + 动态 ATR + 自动重试 + 新币扫描"
- backtest.py: "回测工具, 验证策略在历史 K 线上的表现"
requires:
- python3
- OKX API 凭证 (in ~/.bashrc)
- Clash 代理 (http://127.0.0.1:7890)
- push_to_qq.sh
---
# Crypto T-Monitor (币圈日内做T) v2.6.0
## 🆕 v2.6.0 (2026-07-15): 加减仓 ≠ 平仓 + 按比例算法
**用户原话纠正 (关键)**:
> "之前你是空单时, 要加仓, 加反了吧"
> "平仓就是平仓, 加减都不是平仓"
> "能根据信号算出一个比例吗"
### Bug 现状 (v2.6 仍未修复, 记录用)
`okx_t_monitor.py` 第 512-526 行:
```python
if action == 'buy':
reduce_only = pos_qty < 0 # 空仓 buy = 平仓 ❌
```
**问题**:
- 空仓+buy1/buy2 触发 → `reduceOnly=True` 下单 → **平仓** (不是用户要的"减仓回补")
- 用户原话: "加减仓都不是平仓"
- 加减仓幅度固定 `t_qty`, 不是按比例
### 修复方向 (v2.7 实施)
详见 `references/signal-strength-and-position-aware-qty.md`:
| 持仓 | 触发 buy1/buy2 | 触发 sell1/sell2 |
|---|---|---|
| **空仓** | **sell 减仓回补** (按比例, 留底仓) | sell 加仓 (按比例) |
| **多仓** | buy 加仓 (按比例) | **buy 减仓高抛** (按比例, 留底仓) |
**关键算法**:
```python
strength = 1 - distance_pct / 0.005 # 信号强度 0-1
qty_pct = base(10-30%) × size_factor # 持仓感知
```
详见 reference 文件 + 实战示例。
OKX 币圈日内做T自动监控系统。**核心定位**:**与股票做T(长桥)完全独立**,本 skill 只负责币圈。
## 🚦 何时使用本 skill
**使用场景**:
- 用户在 OKX 持有币种(ETH/BTC/SOL/DOGE/XRP)做T
- 想在动态 ATR 价位自动低吸/高抛
- 验证策略历史表现(用 backtest)
**不要使用**:
- 跟单交易员信号 → 用 `okx-auto-position`
- 现货/DCA 长持 → 用 `dividend-investing` / `dca-monitor`
- 股票做T → 用 `longbridge-t-monitor`
## 🆕 v2.5.0 (2026-07-10): 新币只监控、绝不开仓 + cron silent 真相
**两个潜规则,反复踩坑**:
### 1. 新币扫描器只监控,不会凭空开仓
`new_coin_picks` 进了 `syms_to_monitor`,但 `monitor()` **只在 `pos_qty > 0.01` 时才进 `syms_to_trade` 触发 execute_trade**(v2.5 容错版用 `abs(pos_qty) > 0.01` 防止 OKX 浮点残值误触发)。所以:
- ✅ 新币加进池 → 看到价格触及 → 推 `📍 价格触及 buy1=...` 警告
- ❌ 不会自动开多 1.0 张(因为默认 SPECS 给了 `t_qty=1.0`, 但 `pos_qty==0`, 不进 `syms_to_trade`)
**这是 by-design**:"看着, 不抄着"。用户原话: "新币最多保留六个, 每次扫描后筛选" —— 不是"自动买新币"。要买新币得显式 `--symbol CAP --side long --leverage 10``okx-auto-position` advisor 路径。
### 2. cron `silent` 模式 ≠ 真正静默推送
`no_agent: true` 的 cron job,`last_status: "silent"` 只代表 stdout 字符串是空,**不代表 QQ 不推送**。`deliver: qqbot` 默认会推 stdout 到 QQ(连 print 都推)。
要 QQ 真正静默:
- 必须 `deliver: local` (cron `action: update` 时显式设)
- 或者让 print 也沉默 (`logger` 不 print)
`t-monitor` cron (`db03f9255ad0`) 之前 `deliver: qqbot:B1EF...` 导致每次空推到 QQ。**已改为 `deliver: local`**。
### 3. OKX `code='0'` 不等于真成交 (2026-07-10 实战)
`okx_request('POST', '/api/v5/trade/order')` 返回 `{"code": "0", "ordId": "..."}` ≠ 真成交。
**校验流程**: 下单 → 等 2s → 再调 `fetch_positions()`,对比 `pos_before` vs `pos_after`。如果持仓没变,说明订单实际被拒/失败。
详见 `references/okx-order-verification.md`
### 4. 国内 VPS 必须走 Clash (2026-07-10)
成都电信 VPS 直连 OKX `https://www.okx.com/api/v5/public/time` 返回 `No route to host`
**OKX 脚本也必须带 `--proxy http://127.0.0.1:7890`**,不只是长桥。
详见 `references/vps-proxy-requirement.md`
## ✨ v2.3.0 新功能 (2026-07-10): 新币自动挑选池
**问题**: 用户想要 **30 天内新上市的币** 自动监控,但:
- 不全要 (太多噪音)
- 每次扫描都刷新(非累积)
**解决方案** (用户原话: "新币最多保留六个, 每次扫描后筛选"):
| 常量 | 值 | 含义 |
|------|---|------|
| `NEW_COIN_PICKS` | `2` | **每次扫描后筛 X 个** (按 24h vol 排序) |
| `NEW_COIN_POOL_MAX` | `6` | **永久保留上限** (超过自动裁最早加入) |
| `NEW_COIN_DAYS` | `30` | 30 天内新列 |
| `NEW_COIN_MIN_VOLUME_USDT` | `1_000_000` | 24h vol ≥ $1M (排除无人币) |
**实现逻辑**:
```
1. 拉 OKX 所有 SWAP (公共 endpoint, 不需 credentials)
2. 筛 list_time 在 30 天内的
3. 拉每个的 24h 成交量 (tickers 端点)
4. 过滤 vol < $1M
5. 按 24h vol 降序排序, 取前 NEW_COIN_PICKS=2
6. 比对 state['_new_coin_picks'] 当前次, 变化才推 QQ
7. 加入永久池 state['_new_coin_pool']
8. 池子 > NEW_COIN_POOL_MAX=6 → 按 added_at 升序, 删最早的
```
**QQ 推送格式**:
```
🆕 新币扫描 (30 天内新上市, vol 前 2):
📊 CAP: 24h vol $442.5M | 上线 13.6 天前
📊 NES: 24h vol $67.0M | 上线 15.6 天前
💡 已自动加入监控池 (上限 6 个)
```
**裁剪通知** (超限时):
```
🗑️ 新币池超限 (>6), 移除: ['OLDXYZ', 'ABC123']
```
**代码位置**: `crypto/okx_t_monitor.py:194` (常量) + `:328` (`monitor()` 调用)
## ✨ v2.1.0 新功能 (2026-07-10): 变化驱动推送 (C 方案)
**问题**: v2.0 每次 cron 跑都推"💤 无持仓, 跳过做T",用户**嫌噪音**,问"有变化时推, 计划怎么改?"
**解决方案**: 实现 v2.1 推送规则 (用户拍板的 **C 方案**):
- ❌ 之前: 每次 cron 都推 (噪音)
- ✅ 现在: **只在有变化时推**,其他时间静默 (本地 print 但不推 QQ)
**推送触发条件 (4 类事件,任一触发就推)**:
| # | 事件 | 检测方法 | 推送格式 |
|---|------|---------|---------|
| 1 | **持仓变化** | 对比 `state[sym]_prev_pos` 与当前 `pos_qty`, 差异 > 0.001 张 | `🔄 持仓变化: 1.45 → 1.00 张` |
| 2 | **价格触及关键位** | 当前价距 buy1/buy2/sell1/sell2 任一 < 0.5% | `📍 价格触及 buy2=1762 (距 0.32%)` |
| 3 | **浮盈大幅波动** | 浮盈 ≥ 5% 且相对上次 ≥ 3% | `📈 浮盈变化: -2% → +5% (+7%)` |
| 4 | **做T成交** | buy/sell 实际成交 (原有逻辑) | `✅ 做T自动执行 v2.1` |
| 5 | **做T失败** | buy/sell `code != '0'` | `❌ {sym} {action} 失败: {msg}` |
**静默分支** (全部跳过,只本地 print):
- 没持仓 + 无变化 → `💤 静默: 无持仓, 无变化`
- 有持仓 + 价格距最近关键位 > 0.5% + 浮盈变化 < 3% → `💤 静默: 有持仓但无变化`
**详细实现**`references/change-driven-push.md`
## ✨ v2.0.0 新功能
**相比 v1.0.0**:
1. **多币种自动** (ETH/BTC/SOL/DOGE/XRP), 不再硬编码 ETH
2. **动态 ATR 价位** (基于 1H K线, 14期 ATR)
3. **网络重试机制** (Clash 抽风时自动重试 2 次)
4. **STATE_FILE 自动清理** (7 天前自动删除)
5. **支持 limit 单** (替代 market 滑点)
6. **回测工具** (`backtest.py`)
## 📦 核心组件
### 1. 监控脚本: `crypto/okx_t_monitor.py`
**位置**: `~/.hermes/scripts/crypto/okx_t_monitor.py`
**兼容**: `~/.hermes/scripts/t_monitor.py` (symlink)
**核心逻辑**:
```
1. 加载 ~/.bashrc 的 OKX_* 凭证
2. 对每个币种:
a. 查 OKX 持仓 (用 abs(pos_qty) > 0.01 容错)
b. 如果有持仓 → 拉 1H K线
c. 计算 ATR(14 期)
d. 动态算 buy1/buy2/sell1/sell2 价位 (ATR × 0.5)
3. 检查价格是否触及 buy/sell 价位
4. 拉余额/持仓, 成交 (下单后必查持仓变化验证)
5. 记录到 STATE_FILE (自动清理 7 天前)
6. 推结果到 QQ
```
### 2. 回测工具: `crypto/backtest.py`
**位置**: `~/.hermes/scripts/crypto/backtest.py`
**默认参数 (用户偏好: 默认短期做T, 2026-07-10)**:
| 参数 | 默认 | 说明 |
|------|------|------|
| `--mode` | **trend** | 用户原话"新币最多保留六个", 1H K线 + 30 天窗口。要 short 显式 `--mode short` |
| `--days` | 30 (trend) / 7 (short) | 自适应 |
| `--bar` | 4H (trend) / 1H (short) | 自适应 |
| `--atr-multiplier` | 1.5 (trend) / 0.5 (short) | 用户原话"短线推荐 0.5",**默认是 0.5** |
**用户实测发现** (2026-07-10):
- `--mode trend` 默认是 4H K线 + 翻页有 bug, 拉不到数据。**只能 stable 跑 1H**, 需要显式 `--bar 1H`
- `--mode short` 跑 1H K线稳
- ATR=0.7 在 short 模式下 200 根 K 线回测胜率 81.6%, 优于 0.5/1.0/1.5
- 但用户原话 "短线推荐 0.5", **实战用户要 0.5** (默认), backtest 验证 0.7 最好但成交频繁高手续费
**用法**:
```bash
# 默认 (trend 模式, 用户原话"短线推荐 0.5", 但默认是 trend)
python3 ~/.hermes/scripts/crypto/backtest.py ETH --mode short --days 7
# 短期 + 用户推荐参数
python3 ~/.hermes/scripts/crypto/backtest.py ETH --mode short --days 7 --atr-multiplier 0.5
# 短期 + 自测更优参数
python3 ~/.hermes/scripts/crypto/backtest.py ETH --mode short --days 7 --atr-multiplier 0.7
# 自定义
python3 ~/.hermes/scripts/crypto/backtest.py ETH \
--days 14 \
--bar 1H \
--atr-multiplier 0.5 \
--t-qty 0.03
```
**数据限制**: OKX 历史 K 线 `bar=4H` 翻页有 bug。**Backtest 实测只能用 1H K 线**, trend 模式要 `--bar 1H`
### 3. cron 任务
| Job ID | 名称(**已重命名清晰化**) | 频率 | delivery |
|--------|------|------|---------|
| `db03f9255ad0` | **币圈OKX做T** | `*/15 * * * *` | **`local`** (v2.5 真正静默) |
| `a82a3ab0d48d` | signal-queue-retry | `*/5 * * * *` | qqbot (信号重试) |
**命名教训 (2026-07-10)**: cron 名 "t-monitor" 太模糊,用户问"是币圈还是股票"。已重命名 `db03f9255ad0` 为 "币圈OKX做T"。股票侧用 `港股日内交易监控` / `美股日内交易监控` 已经清晰,**所有做T cron 一律带市场名 + 交易所** (例: `币圈OKX做T` / `港股日内交易监控` / `美股日内交易监控` / `A股...`)。**规则**: 任何新的做T cron, 名称必须显式标 "市场 + 交易所 + 动作" 三段。
## 🔧 配置 (`crypto/okx_t_monitor.py`)
### 默认币种
```python
DEFAULT_SYMBOLS = ['ETH', 'BTC', 'SPCX'] # v2.5 加了 SPCX
```
### 合约规格 (v2.5.0)
```python
SYMBOL_SPECS = {
'ETH': {'ct_val': 0.1, 'leverage': 25, 't_qty': 0.05},
'BTC': {'ct_val': 0.01, 'leverage': 25, 't_qty': 0.03},
'SOL': {'ct_val': 1.0, 'leverage': 20, 't_qty': 5.0},
'DOGE': {'ct_val': 10.0, 'leverage': 20, 't_qty': 30.0},
'XRP': {'ct_val': 10.0, 'leverage': 20, 't_qty': 30.0},
'SPCX': {'ct_val': 1.0, 'leverage': 5, 't_qty': 0.5},
# 新币默认参数 (自动加)
'NEW': {'ct_val': 1.0, 'leverage': 10, 't_qty': 1.0, 'min_sz': 0.01},
}
```
### 动态价位算法
```python
ATR = sum(trs[-14:]) / 14
buy1 = price - atr * atr_multiplier * 0.7 # 默认 atr_multiplier=0.7
buy2 = price - atr * atr_multiplier * 1.0
sell1 = price + atr * atr_multiplier * 0.7
sell2 = price + atr * atr_multiplier * 1.0
```
## 📊 STATE_FILE
`~/.hermes/trading/t_state.json`:
```json
{
"ETH_2026-07-10": ["buy1", "sell1"],
"BTC_2026-07-10": ["buy2"],
"SPCX_prev_pos": -1.45,
"SPCX_prev_upl_pct": -5.7,
"_new_coin_picks": ["CAP", "NES"],
"_new_coin_pool": [{"sym": "CAP", "added_at": 1783655143.41, "vol24h": 442053100}]
}
```
**自动清理**: `cleanup_state(state, keep_days=7)`, 跨 7 天前的 entry 自动删除。
## 📋 推送格式
**做T成交**:
```
✅ 做T自动执行 v2.5
🟢低吸 SPCX 0.5张 @ $151.12
级别: 151.54buy2
ATR: $1.17
📊 持仓: -0.95张 @ $151.05
💰 可用: $79.65
💹 浮盈: $-1.88
```
**变化提醒** (持仓变化/价格触及/浮盈大幅):
```
🔔 SPCX 变化提醒
💰 价格: $151.13
📦 持仓: -0.95张
🔄 持仓变化: -1.45 → -0.95 张
📍 价格触及 buy2=151.54 (距 0.27%)
```
## 🚨 关键避坑 (2026-07-10 实战教训)
### 1. 默认是短期做T (用户偏好)
用户原话: "默认是短期". 所以:
- 默认 `--mode short` (1H K线, 7 天窗口)
- 默认 `atr_multiplier=0.5`(用户原话"短线推荐 0.5")
- 默认单笔 t_qty 占持仓 5-10%
- 不要默认跑 `--mode trend`(那是"等回调"思路,用户没要求)
### 2. 默认监控币种必须包含持仓 (Symbol Coverage Pitfall)
用户曾在 OKX 持有 SPCX 1.45张空 @ 149.15, 但 `DEFAULT_SYMBOLS` 没列、`SYMBOL_SPECS` 也没列 → cron 多次报"💤 无持仓,跳过做T"。结果: 用户误以为 cron 没在工作,**持仓浮亏没被任何 cron 检测/推送到 QQ**, 入场保护完全失灵。
**两类 pitfall (必须同时修)**:
- `DEFAULT_SYMBOLS` 缺 → `monitor()` 跳过该币种, 没有任何监控, 静默
- `SYMBOL_SPECS` 缺 → 拉到持仓计算 LEVELS 时 `KeyError: 'SPCX'`
- `t_qty` 设错:**是"每次做T张数", 不是总持仓** (SPCX 持仓 1.45 → t_qty=0.5, 不是 1.45)
**修复** (本 skill 已应用):
1. ✅ 静态补全: 把持仓币种同时加进两个 dict (SPCX 已加)
2.**自动覆盖机制** `AUTO_INCLUDE_HOLDINGS = True` (v2.2+) — 启动时自动拉 OKX 持仓, 加进监控池
3.**`get_held_symbols()` 函数** 在 monitor() 调用, 替代死板的 DEFAULT_SYMBOLS
4. ✅ 新币池 `NEW_COIN_AUTO_WATCH = True` 自动包含新币
### 3. 实盘前必跑回测 (200 根 K 线起步)
```bash
# 测试新参数 (推荐 1H short 模式, 用户推荐 atr_multiplier=0.5)
python3 ~/.hermes/scripts/crypto/backtest.py ETH --mode short --days 7 --atr-multiplier 0.5
# 要求:
# - 胜率 ≥ 55%(预期值正)
# - 最大回撤 ≤ 15%
# - 交易频率适中(7天 20-50 次, 不要 > 100)
# - 总盈亏 > 0
# 实战第一次跑, 必须用 0.01-0.05 张试水
# (SPOT/合约都从最小单位开始, 2-3 天后验证策略再扩仓)
```
### 4. cron 失败 ≠ 没运行 (网络抽风)
**症状**: cron 报 `💤 无持仓,跳过做T`,但实际你持 ETH/SPCX。
**原因**: 在 OKX `fetch_positions` 时网络超时(Clash 抽风), 抛异常被 try/except 吞掉, 误判为空仓。
**修复**: 在 `monitor()` 函数 `fetch_positions` 失败时记 ERROR, 不要当空仓处理。
**临时绕过**: 手动 `python3 ~/.hermes/scripts/crypto/okx_t_monitor.py` 复查。
### 5. 状态文件 (t_state.json) 跨日会"恢复"
如果某天没成交 (例如网络挂了), 当天 `traded_levels` 是空。下一天 `state_key` 变了("ETH_2026-07-11"), `traded_levels` 也默认空, 所以**已经触及的价位, 隔夜会再次触发**(如果第二天价格还在那)。
**修复**: 如果你想"7日内一次性" 触发, 用 `keep_days=7` 删旧 state key 后重做。 v2.0.0 用的是 `cleanup_state(keep_days=7)` 自动删 7 天前的, 但**不**阻止"跨日重复触发同价位"。
## ⚠️ 关键限制
1. **有持仓才做T** (没持仓的币种跳过)。SPCX 这类"已有持仓"会被监听到,**纯新增的币种不会自动开仓** (v2.5 修正)。
2. **网络依赖**: Clash 死了就完全不能跑(虽然有重试,但重试也失败就崩)
3. **不支持止损** (OKX advisor v4.5.0 才有 SL conditional algo). 持仓被套只能手动 App 或调用 `okx-auto-position/scripts/okx_position_advisor.py --execute` 走 SL-only conditional。
4. **atr_multiplier=0.7** 是回测最优甜点(不要退回 0.5,见上表)。`1.5` 太宽捕捉不到。
5. **不要假设有亏损保护**: `--mode short` 时 81% 胜率不代表实战也 81%——滑点/拒单/网卡都还没建模。
## 🔄 跟其他 skill 的关系
| Skill | 用途 | 冲突? |
|-------|------|------|
| `okx-auto-position` | 信号跟单 (麻吉/熬鹰等) | ✅ 互补 |
| `okx-crypto` | OKX 数据查询 | ✅ 配合 |
| `intraday-trading` | 股票日内 | ❌ 独立 |
| `longbridge-t-monitor` | 股票做T | ❌ 独立 |
## 🔧 故障排查
### Cron 失败?
1. **检查 Clash**: `pgrep mihomo`
2. **测连通**: `curl -s --max-time 8 -x http://127.0.0.1:7890 https://www.okx.com/api/v5/public/time`
3. **看 cron output 文件**: `ls -lt ~/.hermes/cron/output/db03f9255ad0/ | head -3`
4. **看 cron delivery 是不是 local**: `cronjob list | grep -A3 db03f9255ad0`,应该 `deliver: local`(v2.5)
### 没触发做T?
1. **检查持仓**: `python3 ~/.hermes/scripts/crypto/okx_t_monitor.py` (dry-run 手动跑)
2. **看价格 vs 价位**: 脚本会 print "动态价位"
3. **手动改 LEVELS**: 不推荐 (v2.0.0 全自动)
### cron 没推 QQ 但代码说成功?
`last_status: "silent"` 误导名字,实际可能是 `deliver: qqbot` 在推 stdout。改 cron:
```bash
# 经 Hermes cronjob update 改 deliver 字段
cronjob update --job-id db03f9255ad0 --deliver local
```
## 🔴 Dedup #4: Two-phase check-then-execute (2026-07-10)
When a single cron tick triggers a trade, naive code runs change-detection FIRST then trade execution, producing two QQ pushes for the same event ("持仓变化: 1.45 → 0.95" + "✅ 做T自动执行 v2.1 @ $151.12"). The fix is a two-phase loop:
1. Pass 1: collect `pending_actions` (which symbols are about to trade)
2. Pass 2: execute trades, push only `✅ 做T自动执行`
The change-detection in Pass 1 receives `skip_for=set(pending_actions)` and suppresses "持仓变化" / "价格触及" for symbols in that set. Float P&L change notifications still push (no semantic overlap with trade confirmations).
**Crash bug**: `state[f'{sym}_trade_at']` defaults to 0 (= epoch 1970). This makes `now_ts - 0 = ~60 years` ALWAYS > 900 (15 min), so the dedup NEVER triggers via the time-based path until the symbol does its first trade. The structural fix (pass pending_actions directly) avoids this and is the correct one. If you use time-based dedup, also fix: `state.get(f'{sym}_trade_at', datetime.datetime.utcnow().timestamp())`.
Full pattern: `references/push-dedup-and-order-direction.md`
## 📚 相关文档
- `references/change-driven-push.md` - **v2.1 推送策略** (持仓/价格/浮盈变化检测细节)
- `references/push-dedup-and-order-direction.md` - **v2.4 dedup + 订单方向盲点**
- `references/symbol-coverage-pitfall.md` - **持仓币种必须列入监控池** (SPCX 案例)
- `references/vps-proxy-requirement.md` - **国内 VPS 必须走 Clash (不能直连 OKX)**
- `references/okx-order-verification.md` - **code='0' 不等于真成交,下单后必查持仓**
- `references/signal-false-trigger-pitfall.md` - **OKX 浮点残值,abs() > 0.01 容错**
- `references/backtest-usage.md` - 回测详细使用
- `references/cron-delivery-push-pitfalls.md` - **cron `silent` vs `local` 区别**(v2.5 新增)
- `references/okx-new-coin-data-sources.md` - **新币只监控不开仓**(v2.5 新增)
## 📚 相关文档
- `references/change-driven-push.md` - **v2.1 推送策略** (持仓/价格/浮盈变化检测细节)
- `references/push-dedup-and-order-direction.md` - **v2.4 dedup + 订单方向盲点**
- `references/symbol-coverage-pitfall.md` - **持仓币种必须列入监控池** (SPCX 案例)
- `references/vps-proxy-requirement.md` - **国内 VPS 必须走 Clash (不能直连 OKX)**
- `references/okx-order-verification.md` - **code='0' 不等于真成交,下单后必查持仓**
- `references/signal-false-trigger-pitfall.md` - **OKX 浮点残值,abs() > 0.01 容错**
- `references/backtest-usage.md` - 回测详细使用
- `references/cron-delivery-push-pitfalls.md` - **cron `silent` vs `local` 区别**(v2.5 新增)
- `references/okx-new-coin-data-sources.md` - **新币只监控不开仓**(v2.5 新增)
- `references/concise-output-style.md` - **风格铁律 (2026-07-13 用户偏好):** "简洁,重点" + memory vs skill 区分原则
- `references/signal-strength-and-position-aware-qty.md` - **v2.6 加减仓比例算法** (信号强度 + 持仓感知)
## 🔄 版本历史
- **v2.6.0** (2026-07-15):
- **加减仓 ≠ 平仓** (用户纠正 "平仓就是平仓, 加减都不是平仓")
- **按比例算法** (信号强度 + 持仓感知, 不是固定 t_qty)
- **永远不平光** (减仓上限 50%, 留底仓)
- **新 reference**: `signal-strength-and-position-aware-qty.md`
- ⚠️ **Bug 仍未修复**: `okx_t_monitor.py` 仍用 `reduce_only = pos_qty < 0` 走平仓路径 (v2.7 实施)
- **v2.5.0** (2026-07-10):
- **新币只监控、绝不开仓**(by-design 验证文档)
- **cron `deliver: local` 真正静默**(纠正 `silent` 误解)
- **OKX `code='0'` 不等于真成交**(强调下单后验证持仓)
- **国内 VPS 必须走 Clash**
- 修 cron 名 `t-monitor``币圈OKX做T`
- DEFAULT_SYMBOLS 加 SPCX
- 浮点残值容错 `abs(pos_qty) > 0.01`
- **v2.4.0** (2026-07-10): dedup + 订单方向盲点(详见 SKILL.md §Dedup #4)
- **v2.3.0** (2026-07-10): **新币自动挑选池** (NEW_COIN_PICKS=2, POOL_MAX=6)
- **v2.2.0** (2026-07-10): **静默模式+持仓自动包含**
- **v2.1.0** (2026-07-10): 变化驱动推送 (C 方案)
- **v2.0.0** (2026-07-10): 动态 ATR + 网络重试 + backtest
- **v1.0.0** (2026-07-10): ETH 4 张硬编码