From 06d2e69a0de424a1f9aa695870554f5ff13a0d09 Mon Sep 17 00:00:00 2001 From: mike Date: Thu, 23 Jul 2026 22:13:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=94=81=E6=A3=80=E6=9F=A5=E6=8C=AA?= =?UTF-8?q?=E5=88=B0=20execute=5Forder=20=E4=B9=8B=E5=89=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 【bug】format_message 里有锁检查,但 execute_order 路径不走 format_message,导致锁逻辑未生效 【症状】BTC 持仓 1h 内被 4 次'自动开仓' (0.31→0.32→0.33→0.34 张),实际是同方向加仓 原因: Jasonleo 仓位变化触发 cron → execute_order 跳过锁检查 → 4 次下单 【修复】把 check_signal_lock 挪到 execute_order 之前 (line 763) - 聚合转发 (X聚合社区) → 直接放行 - 真实 trader 已有锁 → 跳过,推 '🔒 {reason}' - 新币种/新 trader → 自动锁 --- okx-auto-position/scripts/process_signal.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/okx-auto-position/scripts/process_signal.py b/okx-auto-position/scripts/process_signal.py index 77d781f..17f586a 100644 --- a/okx-auto-position/scripts/process_signal.py +++ b/okx-auto-position/scripts/process_signal.py @@ -241,16 +241,6 @@ def format_message(fields, rec, signal_type): if 'error' in rec: return f"⚠️ advisor错误: {rec['error']}" - symbol = fields.get('symbol', '?') - side_cn = fields.get('side', '做多') - side_en = fields.get('side_en', 'long' if side_cn == '做多' else 'short') - trader = fields.get('trader', '?') - - # 锁检查: 同币种只跟一个 trader - allowed, lock_msg = check_signal_lock(symbol, trader, side_en) - if not allowed: - return f"🔒 {lock_msg}" - def _fmt(x, n=4): """格式化数字: 字符串保留原样, 数字 round 到 n 位.""" try: @@ -258,8 +248,11 @@ def format_message(fields, rec, signal_type): except (ValueError, TypeError): return str(x) + symbol = fields.get('symbol', '?') + side_cn = fields.get('side', '做多') emoji = '🟩' if fields.get('side_en') == 'long' else '🟥' leverage = fields.get('leverage', '10') + trader = fields.get('trader', '?') size = fields.get('size', '?') unit = fields.get('unit', '') # 仓位单位: BTC/USDT/张 value = fields.get('value', '?') @@ -760,6 +753,11 @@ def process_signal(text): rr = cc.get('rr_ratio', rec.get('rr', 0)) profit = cc.get('profit_amount', rec.get('tp_pnl', 0)) fee_pct = cc.get('fee_pct', 0) + # 锁检查: 同币种只跟一个 trader (在 execute 之前检查) + side_en = 'long' if 'long' in str(side).lower() or side == '做多' else 'short' + allowed, lock_msg = check_signal_lock(symbol, trader, side_en) + if not allowed: + return f"🔒 {lock_msg}" # 用户要求:所有信号自动执行,只有余额不足才跳过 auto_execute = rec.get('contracts', 0) > 0 # 有可开张数=自动执行