fix(qmt): 消除静默异常处理并统一日志系统

- 修复6处静默except块(撤单、错误回调、线程停止、健康检查等)
- 统一入口模块使用logging替代print
- 增强交易日志可追踪性
- 添加完整堆栈跟踪日志
This commit is contained in:
2026-01-27 01:21:22 +08:00
parent ec41783155
commit 086af75b3e
5 changed files with 178 additions and 37 deletions

View File

@@ -172,11 +172,17 @@ class DailySettlement:
logger.info("执行收盘清算流程...")
try:
orders = self.trader.query_stock_orders(self.acc, cancelable_only=True)
logger.info(f"收盘清算 - 查询可撤单订单: 获取到 {len(orders) if orders else 0} 个订单")
if orders:
for o in orders:
logger.info(f"收盘清算 - 撤单: OrderID={o.order_id}, Stock={o.stock_code}")
self.trader.cancel_order_stock(self.acc, o.order_id)
time.sleep(2)
except: pass
logger.info(f"收盘清算 - 完成撤单操作,共处理 {len(orders)} 个订单")
else:
logger.info("收盘清算 - 无待撤单订单")
except Exception as e:
logger.error(f"收盘清算 - 查询/撤单失败: {str(e)}", exc_info=True)
real_positions = self.trader.query_stock_positions(self.acc)
real_pos_map = {p.stock_code: p.volume for p in real_positions if p.volume > 0} if real_positions else {}
@@ -214,15 +220,19 @@ class MyXtQuantTraderCallback(XtQuantTraderCallback):
logger.info(f">>> [成交] {strategy} {trade.stock_code} {trade.traded_volume}")
if action == 'BUY': self.pos_mgr.update_actual_volume(strategy, trade.stock_code, trade.traded_volume)
elif action == 'SELL': self.pos_mgr.update_actual_volume(strategy, trade.stock_code, -trade.traded_volume)
except: traceback.print_exc()
except Exception as e:
logger.error(f"on_stock_trade 成交回调处理失败: {str(e)}", exc_info=True)
def on_order_error(self, err):
try:
logger.error(f"下单失败回调: {err.error_msg} OrderID:{err.order_id}")
logger.error(f"下单失败回调: OrderID={err.order_id}, 错误信息={err.error_msg}")
cache = ORDER_CACHE.get(err.order_id)
if cache and cache[2] == 'BUY':
logger.info(f"回滚持仓: Strategy={cache[0]}, Stock={cache[1]}")
self.pos_mgr.rollback_holding(cache[0], cache[1])
del ORDER_CACHE[err.order_id]
except: pass
except Exception as e:
logger.error(f"on_order_error 错误回调处理失败: {str(e)}", exc_info=True)
# ================= 5. 核心消息处理 (重写版:拒绝静默失败) =================
def process_strategy_queue(strategy_name, r_client, xt_trader, acc, pos_manager):
@@ -327,20 +337,26 @@ def process_strategy_queue(strategy_name, r_client, xt_trader, acc, pos_manager)
# 7. 卖出逻辑
elif action == 'SELL':
v_vol = pos_manager.get_position(strategy_name, stock_code)
logger.info(f"Redis 记录持仓: {v_vol}")
logger.info(f"卖出 - Redis 记录虚拟持仓: {v_vol}")
if v_vol > 0:
logger.info(f"卖出 - 正在查询实盘持仓: {stock_code}")
real_pos = xt_trader.query_stock_positions(acc)
logger.info(f"卖出 - 实盘持仓查询完成,获取到 {len(real_pos) if real_pos else 0} 条记录")
if real_pos is None:
logger.error("API 错误: query_stock_positions 返回 None")
return
rp = next((p for p in real_pos if p.stock_code==stock_code), None)
can_use = rp.can_use_volume if rp else 0
logger.info(f"实盘可用持仓: {can_use}")
logger.info(f"卖出 - 股票 {stock_code} 实盘可用持仓: {can_use}")
final = min(v_vol, can_use)
logger.info(f"卖出 - 计算卖出量: min({v_vol}, {can_use}) = {final}")
if final > 0:
logger.info(f"卖出 - 执行卖出订单: {stock_code} @ {price}, 数量: {final}")
oid = xt_trader.order_stock(acc, stock_code, xtconstant.STOCK_SELL, final, xtconstant.FIX_PRICE, price, strategy_name, 'PySell')
if oid != -1:
logger.info(f"√√√ 下单成功: ID={oid} {stock_code} 卖出 {final}")
@@ -470,8 +486,11 @@ def trading_loop():
logger.warning("🚫 确认连接丢失,执行重连...")
if GLOBAL_STATE.xt_trader:
try: GLOBAL_STATE.xt_trader.stop()
except: pass
try:
GLOBAL_STATE.xt_trader.stop()
logger.info("已停止旧交易实例")
except Exception as e:
logger.error(f"停止旧交易实例失败: {str(e)}", exc_info=True)
new_trader, new_acc, new_cb = init_qmt_trader(
qmt_cfg['path'], qmt_cfg['account_id'], qmt_cfg['account_type'], pos_manager