fix: 锁检查挪到 execute_order 之前

【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 → 自动锁
This commit is contained in:
2026-07-23 22:13:45 +08:00
parent 25812bb905
commit 06d2e69a0d
+8 -10
View File
@@ -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 # 有可开张数=自动执行