From 2fdc57e2b8f8f6050e431711f875abb084d697d4 Mon Sep 17 00:00:00 2001 From: "GDP\\solonot" Date: Tue, 4 Nov 2025 12:01:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=AE=80=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/main_controller.py | 22 ++--- ...trade_controller.py => sfgrid_strategy.py} | 88 +++++-------------- 2 files changed, 32 insertions(+), 78 deletions(-) rename core/{sfgrid_trade_controller.py => sfgrid_strategy.py} (66%) diff --git a/core/main_controller.py b/core/main_controller.py index a64d699..d57678f 100644 --- a/core/main_controller.py +++ b/core/main_controller.py @@ -7,7 +7,7 @@ import xtquant.xtconstant as xtconstant sys.stdout.reconfigure(encoding='utf-8') # 设置标准输出编码为UTF-8 # type: ignore import core.strategy_db as strategy_db import sfgrid_constants -from core.sfgrid_trade_controller import StockTradeController +from core.sfgrid_strategy import SFGridStrategy from core.util import getInstrumentName, getStockPosition from xtquant.xttrader import XtQuantTrader from xtquant.xttype import StockAccount, XtAsset, XtOrder, XtOrderResponse, XtPosition, XtTrade @@ -92,7 +92,7 @@ class SFGridController(XtQuantTraderCallback): # 更新标的池 self.refresh_targets() # 添加交易控制器 - stockTradeController = StockTradeController(new_target, self.xt_trader, self.account, new_target.enabled) # type: ignore + stockTradeController = SFGridStrategy(new_target, self.xt_trader, self.account, new_target.enabled) # type: ignore self.stock_trade_ctrl[stock_code] = stockTradeController except Exception as e: @@ -115,7 +115,7 @@ class SFGridController(XtQuantTraderCallback): tradeTarget.current_position = getStockPosition(tradeTarget.stock_code, xtTrader, account) # type: ignore result = tradeTarget.save() print(f' |- 同步当前持仓信息 {tradeTarget.stock_code}, {tradeTarget.current_position}, result = {result}') - stockTradeController = StockTradeController(tradeTarget, self.xt_trader, self.account, tradeTarget.enabled) # type: ignore + stockTradeController = SFGridStrategy(tradeTarget, self.xt_trader, self.account, tradeTarget.enabled) # type: ignore self.stock_trade_ctrl[tradeTarget.stock_code] = stockTradeController print(f'- [成功]交易标的信息初始化, 共 {len(self.instrument_pool)} 个标的') @@ -180,14 +180,14 @@ class SFGridController(XtQuantTraderCallback): tradeTarget = self.instrument_pool[index] # check existing thread if tradeTarget.stock_code in self.stock_trade_ctrl: - tradeController: StockTradeController = self.stock_trade_ctrl[tradeTarget.stock_code] + tradeController: SFGridStrategy = self.stock_trade_ctrl[tradeTarget.stock_code] if tradeController.isEnabled(): print(f"标的交易控制器已存在且正在运行 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n") else: print(f"标的交易控制器已存在但未运行,重新启动 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n") tradeController.enabledTrading(True) else: - stockTradeController = StockTradeController(tradeTarget, self.xt_trader, self.account, tradeTarget.enabled) # type: ignore + stockTradeController = SFGridStrategy(tradeTarget, self.xt_trader, self.account, tradeTarget.enabled) # type: ignore self.stock_trade_ctrl[tradeTarget.stock_code] = stockTradeController print(f"\t创建标的交易控制器 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}") @@ -195,7 +195,7 @@ class SFGridController(XtQuantTraderCallback): def pause_stock_trade(self, index: int): tradeTarget = self.instrument_pool[index] if tradeTarget.stock_code in self.stock_trade_ctrl: - tradeController: StockTradeController = self.stock_trade_ctrl[tradeTarget.stock_code] + tradeController: SFGridStrategy = self.stock_trade_ctrl[tradeTarget.stock_code] if tradeController.isEnabled(): print(f"暂停标的交易 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n") tradeController.enabledTrading(False) @@ -222,7 +222,7 @@ class SFGridController(XtQuantTraderCallback): 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: SFGridStrategy = self.stock_trade_ctrl[stock_code] stock_controller.onDataUpdate(data) @@ -247,7 +247,7 @@ class SFGridController(XtQuantTraderCallback): :return: """ stockCode = order.stock_code - ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] + ctrl:SFGridStrategy = self.stock_trade_ctrl[stockCode] # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 if ctrl is not None and order.strategy_name == ctrl.getName(): ctrl.onOrderTrade(trade=order) # type: ignore @@ -256,7 +256,7 @@ class SFGridController(XtQuantTraderCallback): def test_sim_trade(self, index: int, orderType: int): tradeTarget:strategy_db.TradeTarget = self.instrument_pool[index] - ctrl:StockTradeController = self.stock_trade_ctrl[tradeTarget.stock_code] + ctrl:SFGridStrategy = self.stock_trade_ctrl[tradeTarget.stock_code] trade: XtTrade = None # type: ignore if orderType == xtconstant.STOCK_BUY: trade = XtTrade( @@ -277,7 +277,7 @@ class SFGridController(XtQuantTraderCallback): :return: """ stockCode = trade.stock_code - ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] + ctrl:SFGridStrategy = self.stock_trade_ctrl[stockCode] # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 if ctrl is not None and trade.strategy_name == ctrl.getName(): ctrl.onOrderTrade(trade) @@ -286,7 +286,7 @@ class SFGridController(XtQuantTraderCallback): def on_order_stock_async_response(self, response:XtOrderResponse): stockCode = response.order_remark - ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] + ctrl:SFGridStrategy = self.stock_trade_ctrl[stockCode] # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 if ctrl is not None and response.strategy_name == ctrl.getName(): ctrl.onAsyncOrderResponse(response) diff --git a/core/sfgrid_trade_controller.py b/core/sfgrid_strategy.py similarity index 66% rename from core/sfgrid_trade_controller.py rename to core/sfgrid_strategy.py index c7082a5..631d988 100644 --- a/core/sfgrid_trade_controller.py +++ b/core/sfgrid_strategy.py @@ -1,15 +1,15 @@ from re import L from core import util from core.strategy_db import TradeTarget -from core.util import is_trading_time, queryPendingOrder +from core.util import queryPendingOrder from xtquant import xttrader, xtconstant -from xtquant.xttype import StockAccount, XtOrder, XtOrderResponse, XtTrade +from xtquant.xttype import StockAccount, XtOrderResponse, XtTrade import sfgrid_constants import threading -class StockTradeController: +class SFGridStrategy: def __init__(self, tradeTarget: TradeTarget, xt_trader: xttrader.XtQuantTrader, account: StockAccount, enabled: bool = False): self.tradeTarget:TradeTarget = tradeTarget @@ -38,8 +38,15 @@ class StockTradeController: if int(self.tradeTarget.current_position) == 0 and int(self.tradeTarget.status) == 0: # type: ignore self.tradeTarget.grid_index = 1 # type: ignore self.tradeTarget.save() - self.init_stock_position() - print(f" |- 标的{self.tradeTarget.targetName()}建初始仓 买单已发出 InitBuyOrderId: {self.initBuyOrderId} Price: {sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)]} Volume: {sfgrid_constants.grid_volume}") # type: ignore + self.initBuyOrderId = self.xt_trader.order_stock_async( + self.account, + str(self.tradeTarget.stock_code), + xtconstant.STOCK_BUY, + sfgrid_constants.grid_volume, + xtconstant.FIX_PRICE, + sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)], # type: ignore + 'sf_grid', f'{self.tradeTarget.stock_code}_init_buy') + print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 建初始仓 买单已发出 InitBuyOrderSeq: {self.initBuyOrderId} Price: {sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)]} Volume: {sfgrid_constants.grid_volume}\n") # type: ignore else: # 交易阶段,检查仓位,检查现有订单 print(f" |- 标的{self.tradeTarget.targetName()}已有仓位或非初始状态 无需建初始仓 当前仓位: {self.tradeTarget.current_position} 状态: {self.tradeTarget.status}") @@ -112,15 +119,16 @@ class StockTradeController: self.dataUpdateLock.acquire() stockCode = order.order_remark orderSeq = order.seq - if self.tradeTarget.current_buy_order_no == order.seq: - self.tradeTarget.current_buy_order_no = order.order_id - elif self.tradeTarget.current_sell_order_no == order.seq: - self.tradeTarget.current_sell_order_no = order.order_id - else: - print(f' |- 委托回调: 委托单 {order.order_id} {stockCode} {orderSeq} 不在策略监控范围内') - return + if (self.tradeTarget.status == 1): # 正常交易阶段订单下单成功 + if self.tradeTarget.current_buy_order_no == order.seq: + self.tradeTarget.current_buy_order_no = order.order_id + elif self.tradeTarget.current_sell_order_no == order.seq: + self.tradeTarget.current_sell_order_no = order.order_id + else: + print(f' |- 委托回调: 委托单 {order.order_id} {stockCode} {orderSeq} 不在策略监控范围内') + return rc = self.tradeTarget.save() - print(f' |- 委托回调: 委托单 {order.order_id} {stockCode} {orderSeq} 处理结果: {rc}') + print(f' |- 委托下单成功[{rc}]: 委托单 {order.order_id} {stockCode} {orderSeq} ') self.dataUpdateLock.release() def onOrderTrade(self, trade:XtTrade): @@ -146,8 +154,6 @@ class StockTradeController: print(f' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}') print(f' 当前持仓: {self.tradeTarget.current_position}') print(f' 网格坐标: {self.tradeTarget.grid_index}') - cancelResult = self.xt_trader.cancel_order_stock_async(self.account, self.tradeTarget.current_buy_order_no) - print(f' 上涨一格,空单成交,对侧买单已撤单 cancelResult: {cancelResult > 0}') elif trade.order_id == self.tradeTarget.current_buy_order_no and int(self.tradeTarget.status) == 1: # type: ignore # 下跌一格:此时多单成交 self.tradeTarget.current_position = int(self.tradeTarget.current_position) + trade.traded_volume # type: ignore @@ -158,60 +164,8 @@ class StockTradeController: print(f' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}') print(f' 当前持仓: {self.tradeTarget.current_position}') print(f' 网格坐标: {self.tradeTarget.grid_index}') - cancelResult = self.xt_trader.cancel_order_stock_async(self.account, self.tradeTarget.current_sell_order_no) - print(f' 下跌一格,多单成交,对侧卖单已撤单 cancelResult: {cancelResult > 0}') else: # 打印订单信息和订单状态 print(f'|- 非策略内部订单,或订单状态不满足监控条件 {trade.order_id} {trade.stock_code}-{trade.instrument_name} {trade.commission}') self.dataUpdateLock.release() - - - # Description: 新标的,建基础仓 - def init_stock_position(self): - self.initBuyOrderId = self.xt_trader.order_stock( - self.account, - str(self.tradeTarget.stock_code), - xtconstant.STOCK_BUY, - sfgrid_constants.grid_volume, - xtconstant.FIX_PRICE, - sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)], # type: ignore - 'sf_grid', f'{self.tradeTarget.stock_code}_init_buy') - print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 建初始仓 买单已发出 InitBuyOrderId: {self.initBuyOrderId} Price: {sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)]} Volume: {sfgrid_constants.grid_volume}\n") # type: ignore - - - # Description: 网格跳格,双向下单 - # def two_way_order(self, buy, sell): - # print(f'|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 网格跳格,双向下单') - # print(f' |- 网格坐标: {self.tradeTarget.grid_index}, buy:{buy}, sell:{sell}') - # if buy and int(self.tradeTarget.grid_index)+1 < len(sfgrid_constants.grid_price): # 价格没有超过网格下边界,可以下多单 # type: ignore - # currentPrice = sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)] # type: ignore - # buyPrice = sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)+1] # type: ignore - # self.tradeTarget.current_buy_order_no = self.xt_trader.order_stock_async( - # self.account, - # str(self.tradeTarget.stock_code), - # xtconstant.STOCK_BUY, - # sfgrid_constants.grid_volume, - # xtconstant.FIX_PRICE, - # buyPrice, - # self.getName(), # strategy_name - # self.tradeTarget.stock_code # remark # type: ignore - # ) - # self.tradeTarget.current_buy_price = float(buyPrice) # type: ignore - # print(f' |- 下网格多单 OrderId {self.tradeTarget.current_buy_order_no}, 网格基准价 {currentPrice}, 下单价 {buyPrice}, 下单量 {sfgrid_constants.grid_volume}') - - # if sell and int(self.tradeTarget.grid_index)-1 >=0: # 价格没有超过网格上边界,可以下空单 # type: ignore - # currentPrice = sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)] # type: ignore - # sellPrice = sfgrid_constants.grid_price[int(self.tradeTarget.grid_index)-1] # type: ignore - # self.tradeTarget.current_sell_order_no = self.xt_trader.order_stock_async( - # self.account, - # str(self.tradeTarget.stock_code), - # xtconstant.STOCK_SELL, - # sfgrid_constants.grid_volume, - # xtconstant.FIX_PRICE, - # sellPrice, - # self.getName(), - # self.tradeTarget.stock_code) # type: ignore - # self.tradeTarget.current_sell_price = float(sellPrice) # type: ignore - # print(f' |- 下网格空单 OrderId {self.tradeTarget.current_sell_order_no}, 网格基准价 {currentPrice}, 下单价 {sellPrice}, 下单量 {sfgrid_constants.grid_volume}') - # self.tradeTarget.save() \ No newline at end of file