From 4c4c8730f24b9ecac935eafa8938e0b9215d4594 Mon Sep 17 00:00:00 2001 From: "GDP\\solonot" Date: Wed, 19 Nov 2025 14:14:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90=E7=BD=91?= =?UTF-8?q?=E6=A0=BC=E4=BA=A4=E6=98=93=E7=BB=9F=E8=AE=A1=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/main_ui.py | 2 +- core/sfgrid/model.py | 12 +++---- core/sfgrid/sfgrid_strategy.py | 7 +++-- core/sfgrid/sfgrid_ui.py | 57 +++++++++++++++------------------- 4 files changed, 35 insertions(+), 43 deletions(-) diff --git a/core/main_ui.py b/core/main_ui.py index 07c8bae..f200fc1 100644 --- a/core/main_ui.py +++ b/core/main_ui.py @@ -40,7 +40,7 @@ class MainWindow: # 创建Tab按钮(垂直排列,文字垂直显示) self.tab_buttons = [] - strategy_names = ["蒙派\n策略", "涨停\n复盘"] + strategy_names = ["蒙派", "复盘"] for idx, name in enumerate(strategy_names): btn = ttk.Button( diff --git a/core/sfgrid/model.py b/core/sfgrid/model.py index 7a89ee6..5878143 100644 --- a/core/sfgrid/model.py +++ b/core/sfgrid/model.py @@ -7,15 +7,11 @@ from core.database import BaseModel, db class SFGridTradeTarget(BaseModel): stock_code = CharField(unique=True) stock_name = CharField() - market_price = FloatField() current_position = IntegerField() - grid_index = IntegerField() - last_trade_price = FloatField() - plan_buy_price = FloatField() - plan_sell_price = FloatField() - current_order_price = FloatField() - current_order_no = CharField(default='') - current_order_type = CharField(default='') + grid_index = IntegerField(default=0) + init_price = FloatField(null=True) # 建仓成本 + grid_match_count = IntegerField(default=0) + grid_total_profit = FloatField(default=0.0) status = IntegerField(default=0) # -1表示新标的,未完成交易配置,0表示新标的,已完成交易配置,1表示已建初始仓,正常交易中 enabled = BooleanField(default=False) # 是否启动交易线程 diff --git a/core/sfgrid/sfgrid_strategy.py b/core/sfgrid/sfgrid_strategy.py index 7608bb3..3142fe6 100644 --- a/core/sfgrid/sfgrid_strategy.py +++ b/core/sfgrid/sfgrid_strategy.py @@ -40,12 +40,12 @@ class SFGridStrategy: self.refreshGridOrder() def refreshGridOrder(self): # 下网格单 - if not qmtv.isMarketActive: + if not qmtv.isMarketActive or not self.tradeTarget.enabled: return currentIdx:int = 0 - if self.tradeTarget.status == 0: + if self.tradeTarget.status == 0: # status == 0 表示已配置好交易参数 price = self.tradeTarget.getPriceGrid()[0] tmpOrderSeq = qmtv.orderAsync( str(self.tradeTarget.stock_code), @@ -167,6 +167,7 @@ class SFGridStrategy: if trade.order_remark == OrderTypeInit: PrintLog(LogLevel.INFO, f'|- 委托成交通知[{self.tradeTarget.targetName()}-{trade.order_id}] - 建仓单成交') self.tradeTarget.status = 1 # type: ignore + self.tradeTarget.init_price = trade.traded_price # type: ignore self.tradeTarget.grid_index = 1 # type: ignore self.saveProxy() type = "建仓单" @@ -180,6 +181,8 @@ class SFGridStrategy: self.tradeTarget.grid_index +=1 elif idx < self.tradeTarget.grid_index: type = "上移一格" + self.tradeTarget.grid_match_count += 1 + self.tradeTarget.grid_total_profit += self.tradeTarget.grid_size * trade.traded_volume self.tradeTarget.grid_index -= 1 elif idx == self.tradeTarget.grid_index: type = "保持格, 理论上不应该输出" diff --git a/core/sfgrid/sfgrid_ui.py b/core/sfgrid/sfgrid_ui.py index 912fb79..f008fff 100644 --- a/core/sfgrid/sfgrid_ui.py +++ b/core/sfgrid/sfgrid_ui.py @@ -6,7 +6,6 @@ from tkinter import ttk, messagebox from datetime import datetime import threading import time -from core import constants import core.eventbus as eBus from core.logger import LogLevel, PrintLog from core.sfgrid import bus_events @@ -21,6 +20,7 @@ class TradeTargetUI(ttk.Frame): self.tradeTargetData:dict[int, SFGridTradeTarget] = {} # id->trade_target self.stockCodeIdMap:dict[str, int] = {} self.strategy_ctrl:dict[int, SFGridStrategy] = {} # stock_code->trade_target + self.targetMarketPrice: dict[int, float] = {} self.listening_stock = [] # 监控价格,默认值为10 self.monitor_price = 10.0 @@ -35,8 +35,8 @@ class TradeTargetUI(ttk.Frame): # 创建界面 self.create_ui() - eBus.event_bus.subscribe(eBus.MarketDataUpdate, self.onMarketDataUpdated) + eBus.event_bus.subscribe(bus_events.EventTradeTargetUpdate, self.onStrategyUpdate) eBus.event_bus.subscribe(bus_events.EventTradeTargetDeleted, self.onTradeTargetDeleted) @@ -56,6 +56,7 @@ class TradeTargetUI(ttk.Frame): for stock_code, tickData in data.items(): if stock_code in self.stockCodeIdMap: id:int = self.stockCodeIdMap[stock_code] + self.targetMarketPrice[id] = tickData['lastPrice'] tradeTarget = self.tradeTargetData[id] # timeStr = datetime.fromtimestamp(tickData['time']/1000) lastPrice = float("{:.3f}".format(tickData['lastPrice'])) @@ -137,8 +138,11 @@ class TradeTargetUI(ttk.Frame): ttk.Label(toolbar_frame, text="价格").pack(side=tk.RIGHT, padx=(20, 2)) ttk.Label(toolbar_frame, text="监控配置").pack(side=tk.RIGHT, padx=(20, 2)) + + PrintLog(LogLevel.INFO, "构建交易池列表") # 表格区域 self.create_tables_area(main_frame) + PrintLog(LogLevel.INFO, "启动UI刷新线程") # 启动刷新线程 self.refresh_thread = threading.Thread(target=self.refresh_loop, daemon=True) @@ -179,9 +183,8 @@ class TradeTargetUI(ttk.Frame): """创建交易标的表格""" columns = ("ID", - "股票代码", "股票名称", "市场价", "持仓数量", - "最新成交价", "计划买入价", "计划卖出价", "当前订单价", "当前订单号", "当前订单类型", - "交易状态" + "股票代码", "股票名称", "市场价", "当前持仓", "建仓成本", + "平均成本", "网格匹配次数", "网格收益", "交易状态" ) self.trade_table = ttk.Treeview(parent, columns=columns, show='headings', height=15) @@ -192,13 +195,11 @@ class TradeTargetUI(ttk.Frame): "股票代码": (90, tk.CENTER), "股票名称": (80, tk.E), "市场价": (70, tk.E), - "持仓数量": (80, tk.E), - "最新成交价": (90, tk.E), - "计划买入价": (90, tk.E), - "计划卖出价": (90, tk.E), - "当前订单价": (90, tk.E), - "当前订单号": (90, tk.E), - "当前订单类型": (90, tk.E), + "当前持仓": (80, tk.E), + "建仓成本": (70, tk.E), + "平均成本": (70, tk.E), + "网格匹配次数": (90, tk.E), + "网格收益": (90, tk.E), "交易状态": (80, tk.CENTER) } @@ -337,27 +338,17 @@ class TradeTargetUI(ttk.Frame): def populate_trade_table(self): """填充交易标的表格数据""" - for temp, target in self.tradeTargetData.items(): - if target.current_order_type == constants.OrderTypeBuy: - orderTypeStr = "买" - elif target.current_order_type == constants.OrderTypeSell: - orderTypeStr = "卖" - elif target.current_order_type == constants.OrderTypeInit: - orderTypeStr = "建仓" - else: - orderTypeStr = "未知" + for id, target in self.tradeTargetData.items(): values = [ - target.id, # type: ignore - target.stock_code, - target.stock_name, - "-" if target.market_price is None else f"{target.market_price:.3f}", - target.current_position, - '-' if target.last_trade_price is None else f"{target.last_trade_price:.3f}", - '-' if target.plan_buy_price is None else f"{target.plan_buy_price:.3f}", - '-' if target.plan_sell_price is None else f"{target.plan_sell_price:.3f}", - '-' if target.current_order_price is None else f"{target.current_order_price:.3f}", - target.current_order_no, - orderTypeStr, + id, + target.stock_code, # "股票代码" + target.stock_name, # "股票名称" + 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 target.plan_buy_price is None else f"{target.plan_buy_price:.3f}", # "平均成本" + target.grid_match_count, # "网格匹配次数" + f"{target.grid_total_profit:.3f}", # "网格收益" self.get_trade_enabled_indicator(target.enabled) # type: ignore ] @@ -378,7 +369,9 @@ class TradeTargetUI(ttk.Frame): if selected: item = selected[0] values = self.trade_table.item(item)['values'] + ctrl = self.strategy_ctrl[values[0]] PrintLog(LogLevel.DEBUG, f"双击查看详情: {values[0]} - {values[1]}") + PrintLog(LogLevel.DEBUG, f"双击查看详情 - 订单网格: \n{ctrl.orderGrid}") def get_selected_target(self): """获取选中的交易标的"""