完善部分逻辑

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