This commit is contained in:
薇薇安 2026-02-15 14:24:09 +08:00
parent 9cd39c3655
commit f6f4ca11ae

View File

@ -854,68 +854,58 @@ class PositionManager:
position_info = self.active_positions[symbol] position_info = self.active_positions[symbol]
trade_id = position_info.get('tradeId') trade_id = position_info.get('tradeId')
if trade_id: if trade_id:
try: logger.info(f"{symbol} [平仓] 更新数据库状态为已平仓 (ID: {trade_id})...")
logger.info(f"{symbol} [平仓] 更新数据库状态为已平仓 (ID: {trade_id})...") ticker = await self.client.get_ticker_24h(symbol)
# 获取当前价格作为平仓价格 exit_price = float(ticker['price']) if ticker else float(position_info['entryPrice'])
ticker = await self.client.get_ticker_24h(symbol) entry_price = float(position_info['entryPrice'])
exit_price = float(ticker['price']) if ticker else float(position_info['entryPrice']) quantity = float(position_info['quantity'])
if position_info['side'] == 'BUY':
# 确保所有值都是float类型 pnl = (exit_price - entry_price) * quantity
entry_price = float(position_info['entryPrice']) pnl_percent = ((exit_price - entry_price) / entry_price) * 100
quantity = float(position_info['quantity']) else:
if position_info['side'] == 'BUY': pnl = (entry_price - exit_price) * quantity
pnl = (exit_price - entry_price) * quantity pnl_percent = ((entry_price - exit_price) / entry_price) * 100
pnl_percent = ((exit_price - entry_price) / entry_price) * 100 entry_time = position_info.get('entryTime')
else: duration_minutes = None
pnl = (entry_price - exit_price) * quantity if entry_time:
pnl_percent = ((entry_price - exit_price) / entry_price) * 100 try:
if isinstance(entry_time, str):
# 同步平仓时没有订单号设为None entry_dt = datetime.strptime(entry_time, '%Y-%m-%d %H:%M:%S')
# 计算持仓持续时间和策略类型 else:
entry_time = position_info.get('entryTime') entry_dt = entry_time
duration_minutes = None exit_dt = get_beijing_time()
if entry_time: duration = exit_dt - entry_dt
try: duration_minutes = int(duration.total_seconds() / 60)
if isinstance(entry_time, str): except Exception as e:
entry_dt = datetime.strptime(entry_time, '%Y-%m-%d %H:%M:%S') logger.debug(f"计算持仓持续时间失败: {e}")
else: strategy_type = position_info.get('strategyType', 'trend_following')
entry_dt = entry_time db_update_retries = 3
exit_dt = get_beijing_time() # 使用北京时间计算持续时间 for db_attempt in range(db_update_retries):
duration = exit_dt - entry_dt try:
duration_minutes = int(duration.total_seconds() / 60) Trade.update_exit(
except Exception as e: trade_id=trade_id,
logger.debug(f"计算持仓持续时间失败: {e}") exit_price=exit_price,
exit_reason=reason,
strategy_type = position_info.get('strategyType', 'trend_following') pnl=pnl,
pnl_percent=pnl_percent,
# 网络/DB 超时时可重试,避免 TimeoutError 导致状态未更新 exit_order_id=None,
db_update_retries = 3 strategy_type=strategy_type,
for db_attempt in range(db_update_retries): duration_minutes=duration_minutes
try: )
Trade.update_exit( logger.info(f"{symbol} [平仓] ✓ 数据库状态已更新")
trade_id=trade_id, updated = True
exit_price=exit_price, break
exit_reason=reason, except Exception as e:
pnl=pnl, err_msg = str(e).strip() or f"{type(e).__name__}"
pnl_percent=pnl_percent, if db_attempt < db_update_retries - 1:
exit_order_id=None, # 同步平仓时没有订单号 wait_sec = 2
strategy_type=strategy_type, logger.warning(
duration_minutes=duration_minutes f"{symbol} [平仓] 更新数据库失败 (第 {db_attempt + 1}/{db_update_retries} 次): {err_msg}"
f"{wait_sec}秒后重试"
) )
logger.info(f"{symbol} [平仓] ✓ 数据库状态已更新") await asyncio.sleep(wait_sec)
updated = True else:
break logger.error(f"{symbol} [平仓] ❌ 更新数据库状态失败: {err_msg}")
except Exception as e:
err_msg = str(e).strip() or f"{type(e).__name__}"
if db_attempt < db_update_retries - 1:
wait_sec = 2
logger.warning(
f"{symbol} [平仓] 更新数据库失败 (第 {db_attempt + 1}/{db_update_retries} 次): {err_msg}"
f"{wait_sec}秒后重试"
)
await asyncio.sleep(wait_sec)
else:
logger.error(f"{symbol} [平仓] ❌ 更新数据库状态失败: {err_msg}")
# 清理本地记录 # 清理本地记录
await self._stop_position_monitoring(symbol) await self._stop_position_monitoring(symbol)
@ -1157,6 +1147,11 @@ class PositionManager:
logger.error(f" 错误类型: {type(e).__name__}") logger.error(f" 错误类型: {type(e).__name__}")
import traceback import traceback
logger.error(f" 错误详情:\n{traceback.format_exc()}") logger.error(f" 错误详情:\n{traceback.format_exc()}")
except Exception as db_error:
logger.error(f"{symbol} [平仓] 更新平仓记录到数据库时发生异常: {db_error}")
logger.error(f" 错误类型: {type(db_error).__name__}")
import traceback
logger.error(f" 错误详情:\n{traceback.format_exc()}")
else: else:
logger.warning(f"{symbol} 没有关联的数据库交易ID无法更新平仓记录") logger.warning(f"{symbol} 没有关联的数据库交易ID无法更新平仓记录")
elif not DB_AVAILABLE: elif not DB_AVAILABLE: