From 6810b55cbb41078b10bbbec167397e3ee2e3b4c2 Mon Sep 17 00:00:00 2001 From: "GDP\\solonot" Date: Fri, 14 Nov 2025 18:09:20 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=80=E4=B8=AAAlpha=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.ini | 1 - core/eventbus.py | 1 - core/main_ui.py | 11 ++++++++++- core/qmt.py | 16 ++++++++++------ core/sfgrid/bus_events.py | 2 +- core/sfgrid/sfgrid_ui.py | 13 ++++++++----- starter.py | 1 - starter.spec | 4 ++-- 8 files changed, 31 insertions(+), 18 deletions(-) diff --git a/config.ini b/config.ini index 603b484..af7c380 100644 --- a/config.ini +++ b/config.ini @@ -2,5 +2,4 @@ miniqmtpath = D:/Programs/DTQMT/userdata_mini account_no = 99082560 log_level = INFO -; account_no = 89009170 diff --git a/core/eventbus.py b/core/eventbus.py index 7c5a498..d2a28d8 100644 --- a/core/eventbus.py +++ b/core/eventbus.py @@ -10,7 +10,6 @@ MarketOrderTraded = "market_order_traded" # Pring Log EventPrintLog = "print_log" - class EventBus: def __init__(self): self.listeners = {} # 管理各种event的订阅情况 diff --git a/core/main_ui.py b/core/main_ui.py index 5e67b26..08cbee7 100644 --- a/core/main_ui.py +++ b/core/main_ui.py @@ -1,21 +1,30 @@ import tkinter as tk from tkinter import ttk from core.logger import LogLevel +from core.qmt import qmtv from core.sfgrid.sfgrid_ui import TradeTargetUI +from tkinter import ttk, messagebox class MainWindow: def __init__(self): self.root = tk.Tk() self.root.title("神之一手 - 交易系统") self.root.geometry("1400x700") - + # 当前选中的策略Tab索引 self.current_strategy_index = 0 # 存储各个Frame的引用 self.strategy_frames = {} # 日志面板可见性标志 self.log_visible = False + result:bool = qmtv.connect() + + if not result: + messagebox.showinfo("提示", "QMT连接失败,请修改配置文件。") + self.root.destroy() + return + # 创建界面 print(f'创建界面') self.create_ui() diff --git a/core/qmt.py b/core/qmt.py index 3f67e1c..06456fc 100644 --- a/core/qmt.py +++ b/core/qmt.py @@ -23,7 +23,7 @@ class QmtV(XtQuantTraderCallback): self.xttrader = XtQuantTrader(config.miniQMTPath, sessionId) xtdata.enable_hello = False - def connect(self): + def connect(self) -> bool: self.xttrader.register_callback(self) self.xttrader.start() self.xttrader.connect() @@ -31,7 +31,7 @@ class QmtV(XtQuantTraderCallback): PrintLog(LogLevel.INFO, f'- [{'成功' if self.xttrader.connected else '失败'}]市场交易连接: {config.miniQMTPath}') if self.xttrader.connected == False: self.inited = False - return + return self.inited else: self.inited = True @@ -41,8 +41,9 @@ class QmtV(XtQuantTraderCallback): PrintLog(LogLevel.INFO, f'- [{'成功' if subscribe_result == 0 else '失败'}:{subscribe_result}]交易状态订阅') if subscribe_result != 0: self.inited = False - return + return self.inited self.startMarketDataSubscription() + return self.inited def getStockPosition(self, stock_code: str): @@ -129,9 +130,12 @@ class QmtV(XtQuantTraderCallback): # ========================================# def startMarketDataSubscription(self): - self.subscriptionId = xtdata.subscribe_whole_quote(['SH', 'SZ'], self.onDataUpdate) - - PrintLog(LogLevel.INFO, f'- [市场数据订阅成功-{self.subscriptionId}]') + try: + self.subscriptionId = xtdata.subscribe_whole_quote(['SH', 'SZ'], self.onDataUpdate) + + PrintLog(LogLevel.INFO, f'- [市场数据订阅成功-{self.subscriptionId}]') + except Exception as e: + PrintLog(LogLevel.ERROR, f'- [市场数据订阅失败-{e}]') def stopMarketDataSubscription(self): PrintLog(LogLevel.INFO, '- 停止市场数据订阅') diff --git a/core/sfgrid/bus_events.py b/core/sfgrid/bus_events.py index c4c234e..1b2bad9 100644 --- a/core/sfgrid/bus_events.py +++ b/core/sfgrid/bus_events.py @@ -9,4 +9,4 @@ ResultEventTradeTargetDeleted = "trade_target_deleted" ActionEventEnableTrade = "enable_trade" ResultEventTradeEnabled = "trade_enabled" ActionEventDisableTrade = "disable_trade" -ResultEventTradeDisabled = "trade_disabled" \ No newline at end of file +ResultEventTradeDisabled = "trade_disabled" diff --git a/core/sfgrid/sfgrid_ui.py b/core/sfgrid/sfgrid_ui.py index e636fb5..d279f6e 100644 --- a/core/sfgrid/sfgrid_ui.py +++ b/core/sfgrid/sfgrid_ui.py @@ -1,3 +1,4 @@ +from mimetypes import inited from typing import Any import tkinter as tk @@ -21,9 +22,8 @@ class TradeTargetUI(ttk.Frame): self.stockCodeIdMap:dict[str, int] = {} self.strategy_ctrl:dict[int, SFGridStrategy] = {} # stock_code->trade_target self.listening_stock = [] - self.init_trade_target_pool() - eBus.event_bus.subscribe(eBus.MarketDataUpdate, self.onMarketDataUpdated) - eBus.event_bus.subscribe(bus_events.EventTradeTargetUpdate, self.onStrategyUpdate) + if qmtv.inited: + self.init_trade_target_pool() # 市场监控数据 self.marketData: dict[str, Any] = {} # 存储市场数据 {stock_code: {stock_name, last_price, time}} @@ -33,6 +33,9 @@ class TradeTargetUI(ttk.Frame): # 创建界面 self.create_ui() + + eBus.event_bus.subscribe(eBus.MarketDataUpdate, self.onMarketDataUpdated) + eBus.event_bus.subscribe(bus_events.EventTradeTargetUpdate, self.onStrategyUpdate) def init_trade_target_pool(self): @@ -123,9 +126,9 @@ class TradeTargetUI(ttk.Frame): command=self.btnHandlerStopSelectedTrade, width=12).pack(side=tk.LEFT, padx=2) ttk.Button(toolbar_frame, text="🛠 交易设置", command=self.btnHandlerTradeSettings, width=12).pack(side=tk.LEFT, padx=2) - ttk.Button(toolbar_frame, text="🛠 网格修正(停用)", + # ttk.Button(toolbar_frame, text="🛠 网格修正(停用)", # command=self.btnHandlerGridCorrect, - width=12).pack(side=tk.LEFT, padx=2) + # width=12).pack(side=tk.LEFT, padx=2) ttk.Button(toolbar_frame, text="▣ 实时监控", command=self.btnHandlerToggleMarketMonitor, width=12).pack(side=tk.RIGHT, padx=2) diff --git a/starter.py b/starter.py index 8bca37e..379284a 100644 --- a/starter.py +++ b/starter.py @@ -7,6 +7,5 @@ from core.qmt import qmtv if __name__ == '__main__': sdConstants.initConfig() qmtv.init_qmtv() - qmtv.connect() window = MainWindow() window.run() diff --git a/starter.spec b/starter.spec index 4b70f6e..16d04d6 100644 --- a/starter.spec +++ b/starter.spec @@ -4,7 +4,7 @@ a = Analysis( ['starter.py'], pathex=[], binaries=[], - datas=[('config.ini', '.')], # 明确包含配置文件 + datas=[('config.ini', '.'), ('xtquant/xtdata.ini', 'xtquant')], # 明确包含配置文件和xtdata.ini hiddenimports=['brotli', 'brotli.encoding'], hookspath=[], hooksconfig={}, @@ -28,7 +28,7 @@ exe = EXE( upx=True, upx_exclude=[], runtime_tmpdir=None, - console=True, + console=False, disable_windowed_traceback=False, argv_emulation=False, target_arch=None,