diff --git a/config.ini b/config.ini index 8900e3b..603b484 100644 --- a/config.ini +++ b/config.ini @@ -1,5 +1,6 @@ [config] miniqmtpath = D:/Programs/DTQMT/userdata_mini account_no = 99082560 +log_level = INFO ; account_no = 89009170 diff --git a/config.py b/config.py index b6fe98e..04aaebb 100644 --- a/config.py +++ b/config.py @@ -7,6 +7,7 @@ miniQMTPath = r'D:\\Programs\\DTQMT\\userdata_mini' # miniQMT软件的安装路 # miniQMTPath = '' account_no:str = '99082560' console_log = True +log_level = "INFO" def get_config_path() -> Path: """获取配置文件的正确路径(兼容开发环境和打包后的可执行文件)""" @@ -26,7 +27,8 @@ def create_default_config(): config = configparser.ConfigParser() config['config'] = { 'miniQMTPath': r'D:/Programs/QMT/userdata_mini', - 'account_no': '00000000' + 'account_no': '00000000', + 'log_level' : 'INFO' } config_path = get_config_path() with open(config_path, 'w') as configfile: diff --git a/core/qmt.py b/core/qmt.py index fa95008..3f67e1c 100644 --- a/core/qmt.py +++ b/core/qmt.py @@ -165,7 +165,7 @@ class QmtV(XtQuantTraderCallback): :param order: XtOrder对象 :return: """ - print(f"委托回调 on_stock_order 投资备注 {order.strategy_name} {order.order_remark}") + print(f"委托回调 on_stock_order 投资备注 {order.order_id} {order.strategy_name} {order.order_remark}") # print(f'orderd {order.strategy_name}-{order.stock_code} {order.order_id} {order.order_volume}-{order.order_status}') # stockCode = order.stock_code # ctrl:SFGridStrategy = self.stock_trade_ctrl[stockCode] @@ -193,7 +193,8 @@ class QmtV(XtQuantTraderCallback): # print(f"委托回调 投资备注 {trade.strategy_name} 不匹配 {ctrl.getName()}") def on_order_stock_async_response(self, response:XtOrderResponse): - print(f"委托回调 on_order_stock_async_response 投资备注 {response.error_msg}{response.strategy_name} {response.order_remark}") + print(f"委托回调 on_order_stock_async_response 投资备注 {response.order_id} {response.seq} {response.error_msg}{response.strategy_name} {response.order_remark}") + eBus.event_bus.publish(eBus.MarketOrderCreated, response) # stockCode = response.order_remark # ctrl:SFGridStrategy = self.stock_trade_ctrl[stockCode] diff --git a/core/sfgrid/sfgrid_strategy.py b/core/sfgrid/sfgrid_strategy.py index 341a5c6..60f268a 100644 --- a/core/sfgrid/sfgrid_strategy.py +++ b/core/sfgrid/sfgrid_strategy.py @@ -8,7 +8,7 @@ from core.constants import OrderTypeBuy, OrderTypeInit, OrderTypeSell from core.util import is_trading_time from xtquant import xtconstant -from xtquant.xttype import XtOrder, XtOrderResponse, XtTrade +from xtquant.xttype import XtOrderResponse, XtTrade import threading import core.eventbus as eBus @@ -18,6 +18,7 @@ class SFGridStrategy: def __init__(self, tradeTarget: model.SFGridTradeTarget): self.tradeTarget:model.SFGridTradeTarget = tradeTarget self.enabledTrading(tradeTarget.enabled) # type: ignore + event_bus.subscribe(eBus.MarketOrderCreated, self.onOrderCreateAsync) event_bus.subscribe(eBus.MarketOrderTraded, self.onOrderTrade) self.refreshPlanPrice() self.dataUpdateLock = threading.Lock() @@ -91,7 +92,7 @@ class SFGridStrategy: PrintLog(LogLevel.INFO, f'|- 市价更新[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}] - 计划买入价{self.tradeTarget.plan_buy_price}, 计划卖出价{self.tradeTarget.plan_sell_price}') if self.tradeTarget.enabled and self.tradeTarget.status == 0 and lastPrice <= inTradeTarget.getPriceGrid()[1]: # 已启用,未建仓,准备建仓单信息 PrintLog(LogLevel.INFO, f'|- 市价更新[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}] - 准备建仓单信息') - orderPrice = inTradeTarget.getPriceGrid()[index] + orderPrice = inTradeTarget.getPriceGrid()[1] orderType = xtconstant.STOCK_BUY orderRemark = OrderTypeInit elif self.tradeTarget.enabled and self.tradeTarget.status == 1 and self.tradeTarget.plan_buy_price > 0 and lastPrice <= self.tradeTarget.plan_buy_price: @@ -139,17 +140,15 @@ class SFGridStrategy: self.dataUpdateLock.release() print(f'|- 市价更新[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}] - END') - def onOrderCreate(self, order:XtOrder): - if order.strategy_name == self.getName(): - print(f"委托创建通知 onOrderCreate[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}]: {order.order_id}") - self.tradeTarget.current_order_no = order.order_id - self.saveProxy() - def onOrderCreateAsync(self, response:XtOrderResponse): - if response.strategy_name == self.getName(): - print(f"委托创建通知 onOrderCreateAsync[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}]: {response.order_id}") - self.tradeTarget.current_order_no = response.order_id - self.saveProxy() + self.dataUpdateLock.acquire() + try: + if response.strategy_name == self.getName() and response.seq == self.tradeTarget.current_order_no: + print(f"委托创建通知 onOrderCreateAsync[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}]: {response.order_id}") + self.tradeTarget.current_order_no = response.order_id + self.saveProxy() + finally: + self.dataUpdateLock.release() def onOrderTrade(self, trade:XtTrade): if trade.strategy_name != self.getName(): diff --git a/core/sfgrid/sfgrid_ui.py b/core/sfgrid/sfgrid_ui.py index c02dffa..e636fb5 100644 --- a/core/sfgrid/sfgrid_ui.py +++ b/core/sfgrid/sfgrid_ui.py @@ -54,7 +54,7 @@ class TradeTargetUI(ttk.Frame): tradeTarget = self.tradeTargetData[id] lastPrice = float("{:.3f}".format(tickData['lastPrice'])) tradeTarget.market_price = lastPrice # type: ignore - self.updateTradeTarget(tradeTarget, False) + self.updateTradeTarget(tradeTarget, False, True) else: # 非目标交易,发布市场数据更新事件用于市场监控 lastPrice = tickData['lastPrice'] @@ -82,7 +82,7 @@ class TradeTargetUI(ttk.Frame): self.tradeTargetData[id] = target - def updateTradeTarget(self, target: SFGridTradeTarget, save: bool = True): + def updateTradeTarget(self, target: SFGridTradeTarget, save: bool = True, priceChange:bool = False): if save: target.save() @@ -98,6 +98,8 @@ class TradeTargetUI(ttk.Frame): self.strategy_ctrl[id] = SFGridStrategy(target) # pyright: ignore[reportArgumentType] else: self.strategy_ctrl[id].updateTradeTarget(target) + if priceChange: + self.strategy_ctrl[id].onDataUpdate(target) # UI CREATE def create_ui(self): diff --git a/starter.spec b/starter.spec index b44d58c..4b70f6e 100644 --- a/starter.spec +++ b/starter.spec @@ -5,7 +5,7 @@ a = Analysis( pathex=[], binaries=[], datas=[('config.ini', '.')], # 明确包含配置文件 - hiddenimports=[], + hiddenimports=['brotli', 'brotli.encoding'], hookspath=[], hooksconfig={}, runtime_hooks=[],