This commit is contained in:
2026-06-24 16:13:44 +08:00
parent 363efd6d2d
commit 5b1412eab0
5 changed files with 552 additions and 2 deletions
+41 -1
View File
@@ -17,7 +17,7 @@ from core.logger import LogLevel, PrintLog
from core.sfgrid.model import SFGridTradeTarget, STRATEGY_TYPE_GRID
from core.sfgrid.sfgrid_strategy import SFGridStrategy
from core.eventbus import event_bus, MarketDataUpdate, EventMarketActiveSwitch
from core.sfgrid.bus_events import EventTradeTargetUpdate
from core.sfgrid.bus_events import EventTradeTargetUpdate, EventPoolMark
# ── 工具函数 ──
_ORDER_STATUS = {48: '未报', 49: '待报', 50: '已报', 51: '已报待撤', 52: '部成待撤',
@@ -78,6 +78,7 @@ class _DataStore:
self.monitorPrice: float = 10.0
self.marketLog: dict[str, dict] = {} # stock_code → {name, price, time}
self.listeningStocks: list = []
self.poolLog: list[str] = [] # 股票池管理器日志(list,方便 append)
# ── 初始化 ──
@@ -903,6 +904,9 @@ class _DrawerPanel:
ft.Container(ft.Divider(height=20), width=2),
ft.ElevatedButton("同步数据", on_click=lambda e: self._run_sync(['kline', 'stocks', 'industry', 'market', 'sector']), height=32),
ft.ElevatedButton("执行评分", on_click=lambda e: self._run_scoring(), height=32),
ft.Container(ft.Divider(height=20), width=2),
ft.ElevatedButton("沉寂检测", on_click=lambda e: self._data._pool_manager.trigger_slumber(), height=32, tooltip="手动触发沉寂检测(阶段一标记)"),
ft.ElevatedButton("淘汰检测", on_click=lambda e: self._data._pool_manager.trigger_weekly_elim(), height=32, tooltip="手动触发周度淘汰检测(阶段一标记)"),
self._score_status,
], spacing=6, vertical_alignment=ft.CrossAxisAlignment.CENTER)
return ft.Column([
@@ -1329,8 +1333,14 @@ class QmtApp:
event_bus.subscribe(MarketDataUpdate, self._on_market_data)
event_bus.subscribe(EventMarketActiveSwitch, self._on_market_active)
event_bus.subscribe(EventTradeTargetUpdate, lambda t: self._refresh_ui())
event_bus.subscribe(EventPoolMark, self._on_pool_mark)
threading.Thread(target=self._refresh_loop, daemon=True).start()
# 启动股票池管理器(阶段一:T日标记)
from core.sfgrid.pool_manager import PoolManager
self._data._pool_manager = PoolManager()
self._data._pool_manager.start()
def _show_error(self, msg: str):
self.page.clean()
self.page.add(ft.Container(
@@ -1434,6 +1444,36 @@ class QmtApp:
self._prices_loaded = True
self._refresh_ui()
def _on_pool_mark(self, data: dict):
"""响应股票池标记事件,在日志区显示"""
action = data.get('action', '')
count = data.get('count', 0)
codes = data.get('stock_codes', [])
if action == 'scoring':
msg = f'[池] 评分完成,共 {count} 只候选'
elif action == 'liquidate':
msg = f'[池] 沉寂检测完成,标记 {count} 只股: {", ".join(codes)}'
elif action == 'eliminate':
msg = f'[池] 周度淘汰检测完成,标记 {count} 只股: {", ".join(codes)}'
else:
msg = f'[池] 未知事件: {data}'
self._data.poolLog.append(msg)
# 追加到 UI 日志
if hasattr(self, '_pool_log_text') and self._pool_log_text:
log = self._pool_log_text
log.value = '\n'.join(self._data.poolLog[-200:]) if self._data.poolLog else ''
log.update()
from core.logger import PrintLog, LogLevel
PrintLog(LogLevel.INFO, msg)
def trigger_pool_slumber(self):
"""供 UI 按钮手动触发沉寂检测"""
self._data._pool_manager.trigger_slumber()
def trigger_pool_elim(self):
"""供 UI 按钮手动触淘汰检测"""
self._data._pool_manager.trigger_weekly_elim()
def _on_market_active(self, is_active: bool):
from core.logger import PrintLog, LogLevel
PrintLog(LogLevel.INFO, f'[UI] 收到市场状态切换事件 is_active={is_active}')