完善部分逻辑
This commit is contained in:
+5
-3
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user