Files
Hermes-Skills/okx-auto-position/references/v4.5.48-2026-08-07-five-new-pitfalls.md

7.3 KiB
Raw Permalink Blame History

v4.5.48 (2026-08-07) 5 个新硬规则 — 用户明确报错要求

背景

用户在 8/7 这一天密集发火,5 次指出同一流程反复出问题:

  1. "刚才的做多的能开仓了吗" —— 推了性价比低还下
  2. "还有一点,刚才下单的有提示性价比低的,还是下了,这种不该下"
  3. "这个是多余的消息吧" —— 无持仓平仓信号还推
  4. "你算不出来就把字段删了吧" (前一天,本质同) + "刚才的BTC空单信号再处理一次"
  5. "这种报错你要主动记录的,不然跟那个定时任务一样,我根本不知道有没有成功"
  6. "那我根本不知道有没有成功" —— 错误不主动记
  7. "信号源不对" —— trader 标了 "X聚合社区" 但实际是 "未知"

5 个新硬规则(每条都对应"用户原话" + 修复路径)

1. 性价比低不自动下 (v4.5.48 P1)

用户原话: "刚才下单的有提示性价比低的,还是下了,这种不该下"

旧行为 process_signal.py:

auto_execute = rec.get('contracts', 0) > 0  # 有可开张数 = 自动执行

→ 性价比低(rating_text='性价比低')也照样下。

新行为 (2026-08-07):

cc_check = rec.get('cost_check', {})
rating_text_check = cc_check.get('rating_text', '')
is_low_rating = '性价比低' in rating_text_check
auto_execute = contracts > 0 and not is_low_rating  # 性价比低**不**自动下

为什么: 性价比低 = 期望收益 < 手续费 = 净亏,自动下是亏钱。用户原话"这种不该下"。

注意: 不下 ≠ 不推。仍推 QQ 告知"性价比低,跳过"。

2. D 类信号"无持仓可平"静默 (v4.5.48 P2)

用户原话: "这个是多余的消息吧"

旧行为 process_signal.py format_close_message:

elif action == 'none':
    return f"""ℹ️ {symbol} {side_cn} 平仓信号 | {trader}

无持仓可平"""

→ 推 QQ,但实际没平,纯冗余。

新行为 (2026-08-07):

if signal_type == 'close':
    close_result = close_position_raw(symbol_usdt, signal_side_en)
    action = close_result['action']
    if action == 'none':
        # 静默: 仍记录去重 + 释放锁 + 不推 QQ
        record_signal(...)
        dedup_conn.close()
        release_lock(symbol_usdt, trader, auto=True)
        return f"⏭️ 平仓信号无持仓静默 | {symbol_usdt} {signal_side_en}"
    # 否则正常推

为什么: 用户之前多次说"只要有错就推,正常就静默" — close=none 不算错,也不算事件。主动记日志但 QQ 静默。

3. trader default 改 "未知" (v4.5.48 P3)

用户原话: "信号源不对,之前修复了一版,是脚本都没了吗?"

诊断: process_signal.py parse_signal 第 87 行:

# 旧
fields['trader'] = 'X聚合社区'  # 默认值

问题: 当 raw_text 里没 trader 标记时,被标成 "X聚合社区"(误导)。

新行为 (2026-08-07):

# 2026-08-07: 不要硬编码 'X聚合社区', 标 '未知'
fields['trader'] = '未知'

为什么: 之前修复 v4.5.36 时把 "X聚合社区"写死当默认值,但很多信号 trader 标记缺失,这条会被错误归类成"X聚合社区"。

trader 解析 3 层 fallback:

  1. 【交易员】XXX
  2. 👉 跟单就选 X
  3. 第一个非字段【xx】(币种/方向/杠杆/仓位等跳过)
  4. 全失败 → "未知"

4. 订单错误主动记录 (v4.5.48 P4)

用户原话: "这种报错你要主动记录的,不然跟那个定时任务一样,我根本不知道有没有成功"

背景: 之前 okx_position_advisor.py execute_order() 失败只 results['steps'].append({status: error, msg: ...}) —— 只在内存,不写日志。Cron 失败不主动告警。

新行为 (2026-08-07):

# 0. 写错误日志的辅助函数
import json as _json
from datetime import datetime as _dt
_ERR_LOG = os.path.expanduser('~/.hermes/trading/order_errors.log')

def _log_error(stage, err_msg, extra=None):
    """主动记录订单错误到独立文件 (用户要求 2026-08-06)"""
    try:
        log_entry = {
            'ts': _dt.now().isoformat(),
            'stage': stage,  # set_leverage / place_order / sl_algo
            'symbol': symbol, 'inst_id': inst_id, 'side': side,
            'contracts': contracts, 'leverage': leverage,
            'error': str(err_msg)[:500],
            'extra': extra or {},
        }
        with open(_ERR_LOG, 'a') as f:
            f.write(_json.dumps(log_entry, ensure_ascii=False) + '\n')
    except Exception:
        pass  # 写日志不能 fail 主流程

覆盖 4 个 stage:

  • set_leverage 失败
  • place_order 失败
  • sl_algo 没返回 algoId
  • sl_algo exception

配套 cron 监控 order-errors-monitor.sh:

# 每小时(5 分)扫 ~/.hermes/trading/order_errors.log
# 有新错误 → 推 QQ
# 无错 → silent (cron deliver: origin)

两条 cron 都创建成功:

  • order-errors-monitor (job_id: 81bd534cebfc) — 每小时 5 分
  • cron-self-check (job_id: 09ca1313822c) — 每小时 0 分

5. cron 失败不主动监控 (v4.5.48 P5)

用户原话: "修好了?测试一下" + "你看,现在这个定时任务跑失败了,你也不主动检查"

背景: 之前 lottery-hot-data cron 跑失败 30+ 小时,agent 完全没发现,直到用户看到推送告诉我。

新行为 (2026-08-07):

  • cron-self-check.sh — 每小时跑,拉 hermes cron list 拿所有 cron script,缺失从 ~/.hermes/ 自动找修复,缺失 file 推 QQ
  • order-errors-monitor.sh — order 错误监控
  • cron-self-check 默认 silent,有错才推

Cron 配置:

  • cron-self-check (09ca1313822c) — schedule: 0 * * * *, deliver: local (silent)
  • order-errors-monitor (81bd534cebfc) — schedule: 5 * * * *, deliver: origin

自我总结:8/7 用户 7 次报错 全都是"主动 vs 静默"问题

用户原话 修复
"刚才的做多的能开仓了吗" 推 OK + advisor 给
"有提示性价比低的,还是下了,这种不该下" auto_execute 跳过低 rating
"这个是多余的消息吧" close=none 静默
"这种报错你要主动记录的" _log_error → order_errors.log
"我根本不知道有没有成功" order-errors-monitor cron
"之前修复了一版,是脚本都没了吗" trader default "X聚合社区" → "未知"
"修好了?测试一下" cron-self-check + 静默模式

核心洞察: 8/7 用户的报错 = "主动 vs 静默"控制不对:

  • 错的 → 主动推 + 主动记
  • 正常的 → 静默
  • 状态询问 → 主动给[实测数据]

关联

  • v4.5.45-lock-status-push-and-auto-unlock.md — 锁状态推送(8/6)
  • v4.5.43-close-pnl-delete-display.md — 平仓 PnL 字段(8/5)
  • v4.5.42-insufficient-funds-explicit-notify.md — 余额不足(8/5)
  • forwarder-rule-enable-killer.md — forwarder silent killer(8/6)
  • agent-workflow-feedback-rules.md — 用户工作流纠错 master 文档

部署状态

  • auto_execute 跳过低 rating (process_signal.py 已改)
  • close=none 静默 (process_signal.py 已改)
  • trader default "未知" (process_signal.py 已改)
  • _log_error → order_errors.log (okx_position_advisor.py 已改)
  • order-errors-monitor cron (job_id: 81bd534cebfc)
  • cron-self-check cron (job_id: 09ca1313822c)
  • cron-self-check 改 silent (deliver: local)