diff --git a/core/qmt.py b/core/qmt.py index 1dd8f6f..bd49599 100644 --- a/core/qmt.py +++ b/core/qmt.py @@ -54,7 +54,6 @@ class QmtV(XtQuantTraderCallback): def getStockPosition(self, stock_code: str): - print(f'获取股票持仓: {stock_code}, {self.xttrader.connected}, {self.account.account_id if self.account else None}') # pyright: ignore[reportAttributeAccessIssue] positions = self.xttrader.query_stock_positions(self.account) if positions: for temp in positions: @@ -94,7 +93,10 @@ class QmtV(XtQuantTraderCallback): return self.cacheStockDetail(stock_code)['InstrumentName'] def dailyUpStop(self, stock_code:str): - return self.cacheStockDetail(stock_code)['UpStopPrice'] + cacheStock = self.cacheStockDetail(stock_code) + PrintLog(LogLevel.INFO, f'- [成功]获取股票详情: {stock_code} {cacheStock["InstrumentName"]} {cacheStock['UpStopPrice']}') + return cacheStock['UpStopPrice'] + def dailyDownStop(self, stock_code:str): return self.cacheStockDetail(stock_code)['DownStopPrice'] @@ -135,7 +137,7 @@ class QmtV(XtQuantTraderCallback): if tmpMarketStatus and self.isMarketActive: if tmpTime - self.lastMarketDataUpdateTimestamp > 10: # 上次更新市场状态已经超过10秒 self.isMarketActive = False - PrintLog(LogLevel.INFO, f'- [市场状态变更] 市场已 inactive') # 市场已 inactive + PrintLog(LogLevel.INFO, f'- [市场状态] {self.isMarketActive}') # 市场已 inactive # ====== 市场回调方法 -- 以下方法由XtQuantTrader调用 ====== diff --git a/core/sfgrid/sfgrid_ui.py b/core/sfgrid/sfgrid_ui.py index dfb2f11..1383bcb 100644 --- a/core/sfgrid/sfgrid_ui.py +++ b/core/sfgrid/sfgrid_ui.py @@ -48,7 +48,12 @@ class TradeTargetUI(ttk.Frame): tradeTarget:SFGridTradeTarget = temp pos = qmtv.getStockPosition(tradeTarget.stock_code) tradeTarget.current_position = 0 if pos is None else pos.volume # type: ignore - self.targetAvgPrice[tradeTarget.get_id()] = pos.avg_price if pos is not None else 0.0 + if pos is None: + self.targetAvgPrice[tradeTarget.get_id()] = 0.0 + else: + self.targetAvgPrice[tradeTarget.get_id()] = pos.avg_price + PrintLog(LogLevel.INFO, f'- [成功]获取持仓信息: {tradeTarget.stock_code} {tradeTarget.targetName()} {tradeTarget.current_position} {pos.avg_price}') + self.updateTradeTarget(tradeTarget, True) # 初始化的时候 PrintLog(LogLevel.INFO, f'- [成功]交易标的信息初始化, 共 {len(self.tradeTargetData)} 个标的') @@ -100,9 +105,12 @@ class TradeTargetUI(ttk.Frame): self.tradeTargetData[id] = target if id not in self.strategy_ctrl: - self.targetAvgPrice[id] = 0.0 self.stockCodeIdMap[target.stock_code] = id # type: ignore self.strategy_ctrl[id] = SFGridStrategy(target) # pyright: ignore[reportArgumentType] + if id in self.targetAvgPrice: + pos = qmtv.getStockPosition(target.stock_code) + if pos is not None: + self.targetAvgPrice[id] = pos.avg_price # UI CREATE def create_ui(self): @@ -189,14 +197,14 @@ class TradeTargetUI(ttk.Frame): # 专业化的列配置 column_configs = { "ID": (50, tk.CENTER), - "股票代码": (90, tk.CENTER), + "股票代码": (80, tk.CENTER), "股票名称": (80, tk.E), "市场价": (70, tk.E), "当前持仓": (80, tk.E), - "建仓成本": (70, tk.E), - "平均成本": (70, tk.E), - "网格匹配次数": (90, tk.E), - "网格收益": (90, tk.E), + "建仓成本": (60, tk.E), + "平均成本": (60, tk.E), + "网格匹配次数": (60, tk.E), + "网格收益": (60, tk.E), "交易状态": (80, tk.CENTER) } @@ -326,12 +334,21 @@ class TradeTargetUI(ttk.Frame): # 发布事件通知主控制器添加标的 self.addTradeTarget(stock_code) - def get_trade_enabled_indicator(self, enabled: bool) -> str: + def get_trade_enabled_indicator(self, target: SFGridTradeTarget) -> str: """获取交易状态指示器""" - if enabled: - return "▶ 运行中" + if target.status == -1: + return "未配置交易参数" + elif target.status == 0: + if target.enabled: + return "▶ 运行中(未建初始仓)" + else: + return "⏸ 已停止(未建初始仓)" else: - return "⏸ 已停止" + if target.enabled: + return "▶ 运行中" + else: + return "⏸ 已停止" + def populate_trade_table(self): """填充交易标的表格数据""" @@ -343,10 +360,10 @@ class TradeTargetUI(ttk.Frame): f"{self.targetMarketPrice[id]:.3f}" if id in self.targetMarketPrice else '-', # "市场价" target.current_position, # "当前持仓" '-' if target.init_price is None else f"{target.init_price:.3f}", # "建仓成本" - '-' if id not in self.targetMarketPrice else f"{self.targetAvgPrice[id]:.3f}", # "平均成本" + f"{self.targetAvgPrice[id]:.3f}", # "平均成本" target.grid_match_count, # "网格匹配次数" f"{target.grid_total_profit:.3f}", # "网格收益" - self.get_trade_enabled_indicator(target.enabled) # type: ignore + self.get_trade_enabled_indicator(target) # type: ignore ] self.trade_table.insert('', tk.END, values=values) @@ -818,6 +835,10 @@ class TradeTargetUI(ttk.Frame): if not target: return + if target.status < 0: + messagebox.showinfo("提示", f"{target.stock_code} ({target.stock_name}) 未配置交易参数, 请做交易设置。") + return + if target.enabled: # type: ignore messagebox.showinfo("提示", f"{target.stock_code} ({target.stock_name}) 已经在运行中") return