This commit is contained in:
aaron 2026-02-21 02:02:24 +08:00
parent 01a0d1fdfc
commit a4bb3856ff
2 changed files with 24 additions and 23 deletions

View File

@ -12,7 +12,6 @@ from app.services.binance_service import binance_service
from app.services.feishu_service import get_feishu_service from app.services.feishu_service import get_feishu_service
from app.services.telegram_service import get_telegram_service from app.services.telegram_service import get_telegram_service
from app.services.paper_trading_service import get_paper_trading_service from app.services.paper_trading_service import get_paper_trading_service
from app.services.price_monitor_service import get_price_monitor_service
from app.services.signal_database_service import get_signal_db_service from app.services.signal_database_service import get_signal_db_service
from app.crypto_agent.llm_signal_analyzer import LLMSignalAnalyzer from app.crypto_agent.llm_signal_analyzer import LLMSignalAnalyzer
@ -47,11 +46,8 @@ class CryptoAgent:
self.paper_trading_enabled = self.settings.paper_trading_enabled self.paper_trading_enabled = self.settings.paper_trading_enabled
if self.paper_trading_enabled: if self.paper_trading_enabled:
self.paper_trading = get_paper_trading_service() self.paper_trading = get_paper_trading_service()
self.price_monitor = get_price_monitor_service()
self.price_monitor.add_price_callback(self._on_price_update)
else: else:
self.paper_trading = None self.paper_trading = None
self.price_monitor = None
# 状态管理 # 状态管理
self.last_signals: Dict[str, Dict[str, Any]] = {} self.last_signals: Dict[str, Dict[str, Any]] = {}
@ -206,19 +202,10 @@ class CryptoAgent:
logger.info(f" 模拟交易: 已启用") logger.info(f" 模拟交易: 已启用")
logger.info("=" * 60 + "\n") logger.info("=" * 60 + "\n")
# 启动价格监控(轮询模式) # 注意:不再启动独立的价格监控
if self.paper_trading_enabled and self.symbols: # 价格监控由 main.py 中的 price_monitor_loop 统一处理,避免重复检查
try: if self.paper_trading_enabled:
from app.services.price_monitor_service import get_price_monitor_service logger.info(f"模拟交易已启用(由后台统一监控)")
self.price_monitor = get_price_monitor_service()
for symbol in self.symbols:
self.price_monitor.subscribe_symbol(symbol)
self.price_monitor.add_price_callback(self._on_price_update)
logger.info(f"已启动轮询模式价格监控: {', '.join(self.symbols)}")
except Exception as e:
logger.error(f"价格监控启动失败: {e}")
# 发送启动通知 # 发送启动通知
await self.feishu.send_text( await self.feishu.send_text(
@ -259,11 +246,6 @@ class CryptoAgent:
def stop(self): def stop(self):
"""停止运行""" """停止运行"""
self.running = False self.running = False
# 停止轮询价格监控
if hasattr(self, 'price_monitor') and self.price_monitor:
self.price_monitor.stop()
logger.info("加密货币智能体已停止") logger.info("加密货币智能体已停止")
async def analyze_symbol(self, symbol: str): async def analyze_symbol(self, symbol: str):

View File

@ -96,12 +96,21 @@ class PaperTradingService:
# 使用 make_transient 将对象从会话中分离,使其成为独立对象 # 使用 make_transient 将对象从会话中分离,使其成为独立对象
from sqlalchemy.orm import make_transient from sqlalchemy.orm import make_transient
loaded_count = 0
skipped_count = 0
for order in orders: for order in orders:
# 跳过异常订单OPEN 状态但 filled_price 为 0 或 None
if order.status == OrderStatus.OPEN and (not order.filled_price or order.filled_price <= 0):
logger.warning(f"跳过异常订单 {order.order_id} | {order.symbol} | 状态: {order.status.value} | filled_price: {order.filled_price}")
skipped_count += 1
continue
db.expunge(order) # 从会话中移除 db.expunge(order) # 从会话中移除
make_transient(order) # 使对象独立 make_transient(order) # 使对象独立
self.active_orders[order.order_id] = order self.active_orders[order.order_id] = order
loaded_count += 1
logger.info(f"已加载 {len(orders)} 个活跃订单") logger.info(f"已加载 {loaded_count} 个活跃订单 (跳过 {skipped_count} 个异常订单)")
except Exception as e: except Exception as e:
logger.error(f"加载活跃订单失败: {e}") logger.error(f"加载活跃订单失败: {e}")
finally: finally:
@ -470,6 +479,11 @@ class PaperTradingService:
def _check_order_trigger(self, order: PaperOrder, current_price: float) -> Optional[Dict[str, Any]]: def _check_order_trigger(self, order: PaperOrder, current_price: float) -> Optional[Dict[str, Any]]:
"""检查单个订单是否触发""" """检查单个订单是否触发"""
# 防御性检查:如果 filled_price 为 0 或 None说明订单未正确激活跳过检查
if not order.filled_price or order.filled_price <= 0:
logger.warning(f"订单 {order.order_id} 的成交价无效: {order.filled_price},跳过止盈止损检查")
return None
triggered = False triggered = False
new_status = None new_status = None
exit_price = current_price exit_price = current_price
@ -518,6 +532,11 @@ class PaperTradingService:
logger.error(f"数据库中未找到订单: {order.order_id}") logger.error(f"数据库中未找到订单: {order.order_id}")
return None return None
# 防御性检查:如果 filled_price 为 0 或 None无法计算盈亏
if not db_order.filled_price or db_order.filled_price <= 0:
logger.error(f"订单 {db_order.order_id} 的成交价无效: {db_order.filled_price},无法平仓")
return None
# 计算盈亏 # 计算盈亏
if db_order.side == OrderSide.LONG: if db_order.side == OrderSide.LONG:
pnl_percent = ((exit_price - db_order.filled_price) / db_order.filled_price) * 100 pnl_percent = ((exit_price - db_order.filled_price) / db_order.filled_price) * 100