diff --git a/core/sfgrid/sfgrid_strategy.py b/core/sfgrid/sfgrid_strategy.py index 3283b99..9ff22d1 100644 --- a/core/sfgrid/sfgrid_strategy.py +++ b/core/sfgrid/sfgrid_strategy.py @@ -55,12 +55,8 @@ class SFGridStrategy: print(f'|- 检查交易状态[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}] - {self.tradeTarget.enabled}') return bool(self.tradeTarget.enabled) # 修复返回类型问题 - def onDataUpdate(self, data): + def onDataUpdate(self, inTradeTarget:model.SFGridTradeTarget): print(f'|- 市价更新[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}] - START') - - lastPrice = float("{:.3f}".format(data[self.tradeTarget.stock_code]['lastPrice'])) - self.tradeTarget.market_price = lastPrice # type: ignore - self.saveProxy() if not is_trading_time(): print(f"|- 市价更新[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}] - 非交易时间,不进行自动交易") @@ -74,6 +70,7 @@ class SFGridStrategy: print(f'|- 市价更新[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}] - LOCKED') try: + lastPrice = inTradeTarget.market_price orderPrice:float = -1 orderType = -1 index: int = self.tradeTarget.grid_index # pyright: ignore[reportAssignmentType] diff --git a/core/sfgrid/sfgrid_ui.py b/core/sfgrid/sfgrid_ui.py index 5e9cfd7..f3463cd 100644 --- a/core/sfgrid/sfgrid_ui.py +++ b/core/sfgrid/sfgrid_ui.py @@ -20,7 +20,9 @@ class TradeTargetUI(ttk.Frame): def __init__(self, parent): super().__init__(parent) self.tradeTargetData:dict[int, SFGridTradeTarget] = {} # id->trade_target + self.stockCodeIdMap:dict[str, int] = {} self.strategy_ctrl:dict[int, SFGridStrategy] = {} # stock_code->trade_target + self.listening_stock = [] self.init_trade_target_pool() eBus.event_bus.subscribe(eBus.MarketDataUpdate, self.onMarketDataUpdated) @@ -36,19 +38,30 @@ class TradeTargetUI(ttk.Frame): self.start_ui_refresh() def onMarketDataUpdated(self, data): - # 更新市场监控数据 - for item in data: - if item['stock_code'] in self.tradeTargetData: - # 更新交易标准池信息 - continue + # 收集所有市场数据用于市场监控 + for stock_code, tickData in data.items(): + id = self.stockCodeIdMap.get(stock_code) + if id is not None and stock_code in self.tradeTargetData: + tradeTarget = self.tradeTargetData[id] + PrintLog(LogLevel.INFO, f' [市价更新 序号-{id}] {stock_code} - {tickData}') + + lastPrice = float("{:.3f}".format(tickData['lastPrice'])) + tradeTarget.market_price = lastPrice # type: ignore + stock_controller: SFGridStrategy = self.strategy_ctrl[id] + stock_controller.onDataUpdate(tradeTarget) else: - # 监控10元的票 - current_time = datetime.now().strftime("%H:%M:%S") - self.marketData[str(item['stock_code'])] = { - 'stock_name': item['stock_name'], - 'last_price': item['market_price'] if item['market_price'] is not None else 0.0, - 'time': current_time - } + # 非目标交易,发布市场数据更新事件用于市场监控 + lastPrice = tickData['lastPrice'] + if lastPrice == 10 or stock_code in self.listening_stock: + PrintLog(LogLevel.INFO, f' [市价更新 序号-X] {stock_code} - {lastPrice}') + # 发布市场数据更新事件用于市场监控 + market_target = SFGridTradeTarget() + market_target.stock_code = stock_code + market_target.stock_name = qmtv.getInstrumentName(stock_code) # type: ignore + market_target.market_price = lastPrice # type: ignore + if stock_code not in self.listening_stock: + self.listening_stock.append(stock_code) + def refresh_targets(self): # 更新标的池 @@ -56,6 +69,7 @@ class TradeTargetUI(ttk.Frame): for temp in results: result :SFGridTradeTarget = temp self.tradeTargetData[result.get_id()] = result + self.stockCodeIdMap[str(result.stock_code)] = result.get_id() def init_trade_target_pool(self): @@ -85,6 +99,7 @@ class TradeTargetUI(ttk.Frame): """刷新循环""" while self.refresh_thread_running: # 在主线程中更新UI + PrintLog(LogLevel.INFO, "刷新UI") self.after(0, self.refresh_table) time.sleep(0.5) # 每0.5秒刷新一次 @@ -103,6 +118,7 @@ class TradeTargetUI(ttk.Frame): def updateTradeTarget(self, target: SFGridTradeTarget): # 更新或添加数据到本地缓存 self.tradeTargetData[target.get_id()] = target + self.stockCodeIdMap[target.stock_code] = target.get_id() # type: ignore def create_ui(self): """创建UI界面""" @@ -442,6 +458,7 @@ class TradeTargetUI(ttk.Frame): del self.tradeTargetData[id] del self.strategy_ctrl[id] + del self.stockCodeIdMap[str(target.stock_code)] # 添加日志 PrintLog(LogLevel.INFO, f"交易标的已删除,ID: {id} {target.targetName()}") except Exception as e: