diff --git a/backend/app/crypto_agent/crypto_agent.py b/backend/app/crypto_agent/crypto_agent.py index 4844fc0..77c672c 100644 --- a/backend/app/crypto_agent/crypto_agent.py +++ b/backend/app/crypto_agent/crypto_agent.py @@ -70,7 +70,7 @@ class CryptoAgent: ) monitor.update_config("crypto_agent", { "symbols": self.symbols, - "paper_trading_enabled": self.paper_trading_enabled, + "auto_trading_enabled": self.paper_trading_enabled, # 改名为自动交易 "analysis_interval": "每5分钟整点" }) diff --git a/backend/app/stock_agent/stock_agent.py b/backend/app/stock_agent/stock_agent.py index e3ec701..9782e25 100644 --- a/backend/app/stock_agent/stock_agent.py +++ b/backend/app/stock_agent/stock_agent.py @@ -15,6 +15,7 @@ from app.services.telegram_service import get_telegram_service from app.services.signal_database_service import get_signal_db_service from app.services.fundamental_service import get_fundamental_service from app.crypto_agent.llm_signal_analyzer import LLMSignalAnalyzer +from app.utils.system_status import get_system_monitor, AgentStatus # 股票名称映射表 @@ -104,7 +105,28 @@ class StockAgent: self._event_loop = None self._task = None - logger.info(f"股票智能体初始化完成 - 美股: {len(us_symbols)}只, 港股: {len(hk_symbols)}只, 总计: {len(self.symbols)}只") + # 注册到系统监控 + monitor = get_system_monitor() + self._monitor_info = monitor.register_agent( + agent_id="stock_agent", + name="股票智能体", + agent_type="stock" + ) + + # 分类美股和港股数量 + us_count = len([s for s in self.symbols if not s.endswith('.HK')]) + hk_count = len([s for s in self.symbols if s.endswith('.HK')]) + + monitor.update_config("stock_agent", { + "us_symbols": us_symbols, + "hk_symbols": hk_symbols, + "total_symbols": len(self.symbols), + "us_count": us_count, + "hk_count": hk_count, + "analysis_interval": f"{self.settings.stock_analysis_interval}秒" + }) + + logger.info(f"股票智能体初始化完成 - 美股: {us_count}只, 港股: {hk_count}只, 总计: {len(self.symbols)}只") @staticmethod def get_stock_name(symbol: str) -> str: @@ -120,14 +142,26 @@ class StockAgent: self.running = True self._event_loop = asyncio.get_event_loop() + # 更新状态为启动中 + monitor = get_system_monitor() + monitor.update_status("stock_agent", AgentStatus.STARTING) + logger.info("美股智能体已启动") # 启动分析任务 self._task = asyncio.create_task(self._analysis_loop()) + # 更新状态为运行中 + monitor.update_status("stock_agent", AgentStatus.RUNNING) + async def stop(self): """停止智能体""" self.running = False + + # 更新状态为已停止 + monitor = get_system_monitor() + monitor.update_status("stock_agent", AgentStatus.STOPPED) + if self._task: self._task.cancel() try: diff --git a/frontend/status.html b/frontend/status.html index b61630c..c4ff2bc 100644 --- a/frontend/status.html +++ b/frontend/status.html @@ -2,181 +2,222 @@ - - 系统状态监控 - Stock Agent + + 系统状态 - Stock Agent + -
-
-

🚀 系统状态监控

-

实时监控所有 Agent 的运行状态

-
- - 加载中... -
-
+
+
+
+ -
+
-
-
-
运行时长
-
-
-
-
-
Agent 总数
-
-
-
-
-
运行中
-
-
-
-
-
错误
-
-
-
-
+
+
+
运行时长
+
-
+
+
+
Agent 总数
+
-
+
+
+
运行中
+
-
+
+
+
错误
+
-
+
+
-
-

🤖 Agent 详情

-
-
加载中...
+
+

🤖 Agent 详情

+
+
加载中...
+
+
@@ -291,11 +344,11 @@ } else if (seconds < 86400) { const hours = Math.floor(seconds / 3600); const minutes = Math.floor((seconds % 3600) / 60); - return `${hours} 小时 ${minutes} 分钟`; + return `${hours}小时 ${minutes}分`; } else { const days = Math.floor(seconds / 86400); const hours = Math.floor((seconds % 86400) / 3600); - return `${days} 天 ${hours} 小时`; + return `${days}天 ${hours}小时`; } } @@ -322,10 +375,70 @@ } function formatSymbols(symbols) { + if (!symbols) return '-'; if (Array.isArray(symbols)) { - return symbols.join(', '); + return '
' + + symbols.map(s => `${s}`).join('') + + '
'; } - return symbols || '-'; + if (typeof symbols === 'string') { + return symbols; + } + return '-'; + } + + function isCryptoAgent(type) { + return type === 'crypto'; + } + + function formatStockAgentConfig(config) { + if (!config) return ''; + + let html = ''; + + // 显示美股和港股数量 + if (config.us_count !== undefined || config.hk_count !== undefined) { + const usCount = config.us_count || 0; + const hkCount = config.hk_count || 0; + html += ` +
+ 股票分布 + 🇺🇸 美股 ${usCount}只 | 🇭🇰 港股 ${hkCount}只 +
+ `; + } + + // 显示美股列表 + if (config.us_symbols && config.us_symbols.length > 0) { + html += ` +
+ 美股列表 + ${formatSymbols(config.us_symbols)} +
+ `; + } + + // 显示港股列表 + if (config.hk_symbols && config.hk_symbols.length > 0) { + html += ` +
+ 港股列表 + ${formatSymbols(config.hk_symbols)} +
+ `; + } + + // 显示分析间隔 + if (config.analysis_interval) { + html += ` +
+ 分析间隔 + ${config.analysis_interval} +
+ `; + } + + return html; } async function loadStatus() { @@ -366,9 +479,12 @@ return; } - container.innerHTML = '
' + agents.map(([id, agent]) => { + container.innerHTML = '
' + agents.map(([id, agent]) => { const statusClass = getStatusClass(agent.status); - const symbols = agent.config?.symbols || []; + + // 判断 Agent 类型 + const isStockAgent = agent.type === 'stock'; + const isCryptoAgent = agent.type === 'crypto'; return `
@@ -389,22 +505,30 @@ 最后活动 ${agent.last_activity || '-'}
- ${symbols.length > 0 ? ` -
- 监控标的 - ${formatSymbols(symbols)} -
- ` : ''} - ${agent.config?.paper_trading_enabled !== undefined ? ` -
- 模拟交易 - ${agent.config.paper_trading_enabled ? '✅ 已启用' : '❌ 未启用'} -
- ` : ''} + ${isStockAgent ? formatStockAgentConfig(agent.config) : ` + ${agent.config?.symbols && agent.config.symbols.length > 0 ? ` +
+ 监控标的 + ${formatSymbols(agent.config.symbols)} +
+ ` : ''} + ${isCryptoAgent && agent.config?.auto_trading_enabled !== undefined ? ` +
+ 自动交易 + ${agent.config.auto_trading_enabled ? '✅ 已启用' : '❌ 未启用'} +
+ ` : ''} + ${agent.config?.analysis_interval ? ` +
+ 分析间隔 + ${agent.config.analysis_interval} +
+ ` : ''} + `} ${agent.error_message ? `
错误信息 - ${agent.error_message} + ${agent.error_message}
` : ''}