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:
@@ -241,16 +241,6 @@ def format_message(fields, rec, signal_type):
|
|||||||
if 'error' in rec:
|
if 'error' in rec:
|
||||||
return f"⚠️ advisor错误: {rec['error']}"
|
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):
|
def _fmt(x, n=4):
|
||||||
"""格式化数字: 字符串保留原样, 数字 round 到 n 位."""
|
"""格式化数字: 字符串保留原样, 数字 round 到 n 位."""
|
||||||
try:
|
try:
|
||||||
@@ -258,8 +248,11 @@ def format_message(fields, rec, signal_type):
|
|||||||
except (ValueError, TypeError):
|
except (ValueError, TypeError):
|
||||||
return str(x)
|
return str(x)
|
||||||
|
|
||||||
|
symbol = fields.get('symbol', '?')
|
||||||
|
side_cn = fields.get('side', '做多')
|
||||||
emoji = '🟩' if fields.get('side_en') == 'long' else '🟥'
|
emoji = '🟩' if fields.get('side_en') == 'long' else '🟥'
|
||||||
leverage = fields.get('leverage', '10')
|
leverage = fields.get('leverage', '10')
|
||||||
|
trader = fields.get('trader', '?')
|
||||||
size = fields.get('size', '?')
|
size = fields.get('size', '?')
|
||||||
unit = fields.get('unit', '') # 仓位单位: BTC/USDT/张
|
unit = fields.get('unit', '') # 仓位单位: BTC/USDT/张
|
||||||
value = fields.get('value', '?')
|
value = fields.get('value', '?')
|
||||||
@@ -760,6 +753,11 @@ def process_signal(text):
|
|||||||
rr = cc.get('rr_ratio', rec.get('rr', 0))
|
rr = cc.get('rr_ratio', rec.get('rr', 0))
|
||||||
profit = cc.get('profit_amount', rec.get('tp_pnl', 0))
|
profit = cc.get('profit_amount', rec.get('tp_pnl', 0))
|
||||||
fee_pct = cc.get('fee_pct', 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 # 有可开张数=自动执行
|
auto_execute = rec.get('contracts', 0) > 0 # 有可开张数=自动执行
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user