初步完成网格交易统计重构

This commit is contained in:
2025-11-19 14:14:37 +08:00
parent 0262bfc71b
commit 4c4c8730f2
4 changed files with 35 additions and 43 deletions
+1 -1
View File
@@ -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(
+4 -8
View File
@@ -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) # 是否启动交易线程
+5 -2
View File
@@ -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 = "保持格, 理论上不应该输出"
+25 -32
View File
@@ -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):
"""获取选中的交易标的"""