From d24bbd8c68db411ea82ea049691db373a71b87c5 Mon Sep 17 00:00:00 2001 From: "GDP\\solonot" Date: Wed, 29 Oct 2025 16:54:10 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=20=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main_controller.py | 76 +++++++++++++++----------------------- sfgrid_trade_controller.py | 6 +++ 2 files changed, 35 insertions(+), 47 deletions(-) diff --git a/main_controller.py b/main_controller.py index 7efec97..546f3dc 100644 --- a/main_controller.py +++ b/main_controller.py @@ -44,7 +44,7 @@ class SFGridController(XtQuantTraderCallback): xtdata.unsubscribe_quote(self.seq) - def add_trade_target(self, stock_code): + def add_trade_target(self, stock_code: str): try: stock_name = getInstrumentName(stock_code) new_target = strategy_db.TradeTarget.create( @@ -188,25 +188,22 @@ class SFGridController(XtQuantTraderCallback): # ====== 市场回调方法 -- 以下方法由XtQuantData调用 ====== def onDataUpdate(self, data): - # 遍历股池 - # for stock_code, data in data.items(): - # if data['lastPrice'] == 10.0: - # print(f'target = {stock_code} - {getInstrumentName(stock_code)} {data['lastPrice']}') - # self.add_trade_target(stock_code) - # self.stock_trade_ctrl[stock_code].enabledTrading(True) - - - # if stock_code not in self.stock_trade_ctrl: - # self.add_trade_target(stock_code) - # self.stock_trade_ctrl[stock_code].onDataUpdate(data) - for target in self.instrument_pool: - stock_code = target.stock_code - # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 - if stock_code not in self.stock_trade_ctrl or stock_code not in data: - # print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n") - continue - stock_controller: StockTradeController = self.stock_trade_ctrl[stock_code] - stock_controller.onDataUpdate(data) + if sfgrid_constants.max_enabled_targets <= 0: # 全推 + for stock_code, tickData in data.items(): + lastPrice = tickData['lastPrice'] + if lastPrice == 10.0 and stock_code not in self.stock_trade_ctrl: + print(f'New trade target = {stock_code} - {getInstrumentName(stock_code)} {tickData['lastPrice']}') + self.add_trade_target(stock_code) + self.stock_trade_ctrl[stock_code].enabledTrading(True) + else: # 指定目标 当前主要使用这种模式 + for target in self.instrument_pool: + stock_code = target.stock_code + # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 + if stock_code not in self.stock_trade_ctrl or stock_code not in data: + # print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n") + continue + stock_controller: StockTradeController = self.stock_trade_ctrl[stock_code] + stock_controller.onDataUpdate(data) # ====== 市场回调方法 -- 以下方法由XtQuantTrader调用 ====== @@ -230,11 +227,12 @@ class SFGridController(XtQuantTraderCallback): :return: """ stockCode = order.stock_code + ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 - if stockCode in self.stock_trade_ctrl: - ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] - ctrl.onOrderUpdate(order) - print(datetime.datetime.now(), '委托回调 投资备注', order.order_remark) + if ctrl is not None and order.order_remark == ctrl.getName(): + ctrl.onOrderTrade(order) + else: + print(f"委托下单回调 投资备注 {order.order_remark} 不匹配 {ctrl.getName()}") def on_stock_trade(self, trade:XtTrade): """ @@ -242,7 +240,13 @@ class SFGridController(XtQuantTraderCallback): :param trade: XtTrade对象 :return: """ - print(datetime.datetime.now(), '成交回调', trade.order_remark, f"委托方向(48买 49卖) {trade.offset_flag} 成交价格 {trade.traded_price} 成交数量 {trade.traded_volume}") + stockCode = trade.stock_code + ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] + # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 + if ctrl is not None and trade.order_remark == ctrl.getName(): + ctrl.onOrderTrade(trade) + else: + print(f"委托回调 投资备注 {trade.order_remark} 不匹配 {ctrl.getName()}") def on_order_error(self, order_error): """ @@ -254,28 +258,6 @@ class SFGridController(XtQuantTraderCallback): # print(order_error.order_id, order_error.error_id, order_error.error_msg) print(f"\n委托报错回调 {order_error.order_remark} {order_error.error_msg}") - def on_cancel_error(self, cancel_error): - """ - 撤单失败推送 - :param cancel_error: XtCancelError 对象 - :return: - """ - print(datetime.datetime.now(), sys._getframe().f_code.co_name) - - def on_order_stock_async_response(self, response): - """ - 异步下单回报推送 - :param response: XtOrderResponse 对象 - :return: - """ - print(f"异步委托回调 投资备注: {response.order_remark}") - - def on_cancel_order_stock_async_response(self, response): - """ - :param response: XtCancelOrderResponse 对象 - :return: - """ - print(datetime.datetime.now(), sys._getframe().f_code.co_name) def on_account_status(self, status): """ diff --git a/sfgrid_trade_controller.py b/sfgrid_trade_controller.py index a9f60fc..0f8d258 100644 --- a/sfgrid_trade_controller.py +++ b/sfgrid_trade_controller.py @@ -14,6 +14,9 @@ class StockTradeController: self.xt_trader = xt_trader self.account = account self.currentPosition = getStockPosition(self.tradeTarget.stock_code, self.xt_trader, self.account) + + def getName(self): + return "SFGRID" def enabledTrading(self, enabled: bool): @@ -39,6 +42,9 @@ class StockTradeController: def onDataUpdate(self, data): if self.isEnabled(): print(f"\n标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 行情数据更新 {data[self.tradeTarget.stock_code]}") + + def onOrderUpdate(self, order:XtOrder): + pass def onOrderTrade(self, trade:XtTrade): indicator = False