diff --git a/main_controller.py b/main_controller.py index 1900022..ea15e6a 100644 --- a/main_controller.py +++ b/main_controller.py @@ -6,11 +6,12 @@ import sfgrid_constants from sfgrid_trade_controller import StockTradeController from util import getInstrumentName, getStockPosition from xtquant.xttrader import XtQuantTrader -from xtquant.xttype import StockAccount +from xtquant.xttype import StockAccount, XtOrder from xtquant import xtdata from xtquant.xttrader import XtQuantTraderCallback import datetime +# 量化核心控制对象 class SFGridController(XtQuantTraderCallback): def __init__(self, account_no: str, miniQmtPath: str): super().__init__() @@ -40,20 +41,6 @@ class SFGridController(XtQuantTraderCallback): xtdata.unsubscribe_quote(self.seq) - def onDataUpdate(self, data): - # 遍历股池 - for target in self.instrument_pool: - stock_code = target.stock_code - # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 - if stock_code not in self.stock_trade_ctrl: - print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n") - continue - if stock_code not in data: - print(f"股票代码 {stock_code} 未在行情数据中找到,跳过处理。\n") - continue - stock_controller: StockTradeController = self.stock_trade_ctrl[stock_code] - stock_controller.onDataUpdate(data) - def add_trade_target(self, stock_code): try: stock_name = getInstrumentName(stock_code) @@ -179,9 +166,24 @@ class SFGridController(XtQuantTraderCallback): print(f"标的交易控制器不存在 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n") - # ====== 市场回调方法 -- 以下方法由XtQuantTrader调用 ====== + + # ====== 市场回调方法 -- 以下方法由XtQuantData调用 ====== + def onDataUpdate(self, data): + # 遍历股池 + for target in self.instrument_pool: + stock_code = target.stock_code + # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 + if stock_code not in self.stock_trade_ctrl: + print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n") + continue + if 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调用 ====== def on_connected(self): """ 连接成功推送 @@ -195,12 +197,16 @@ class SFGridController(XtQuantTraderCallback): """ print(datetime.datetime.now(), '连接断开回调') - def on_stock_order(self, order): + def on_stock_order(self, order:XtOrder): """ 委托回报推送 :param order: XtOrder对象 :return: """ + stockCode = order.stock_code + # 如果存在对应的StockTradeController,则调用其onDataUpdate方法 + if stockCode not in self.stock_trade_ctrl: + self.stock_trade_ctrl[stockCode].onOrderUpdate(order) print(datetime.datetime.now(), '委托回调 投资备注', order.order_remark) def on_stock_trade(self, trade): diff --git a/sfgrid_trade_controller.py b/sfgrid_trade_controller.py index 07d0005..71a7b54 100644 --- a/sfgrid_trade_controller.py +++ b/sfgrid_trade_controller.py @@ -3,7 +3,7 @@ import strategy_db from util import getInstrumentName, getStockPosition from xtquant import xttrader, xtdata, xtconstant -from xtquant.xttype import StockAccount +from xtquant.xttype import StockAccount, XtOrder import sfgrid_constants @@ -21,20 +21,26 @@ class StockTradeController: self.tradeTarget.enabled = enabled self.tradeTarget.save() - # 建仓状态检查 - if self.tradeTarget.current_position == 0 and self.tradeTarget.status == 0: - self.tradeTarget.grid_index = 1 - self.tradeTarget.save() - self.initBuyOrderId = self.xt_trader.order_stock( - self.account, - self.tradeTarget.stock_code, - xtconstant.STOCK_BUY, - sfgrid_constants.grid_volume, - xtconstant.FIX_PRICE, - sfgrid_constants.grid_price[self.tradeTarget.grid_index], - '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[self.tradeTarget.grid_index]} Volume: {sfgrid_constants.grid_volume}\n") - + if enabled: + print(f"|- 标的交易启动 {self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}\n") + # 建仓状态检查 + if self.tradeTarget.current_position == 0 and self.tradeTarget.status == 0: + print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 建初始仓 买单准备中...\n") + self.tradeTarget.grid_index = 1 + self.tradeTarget.save() + self.initBuyOrderId = self.xt_trader.order_stock( + self.account, + self.tradeTarget.stock_code, + xtconstant.STOCK_BUY, + sfgrid_constants.grid_volume, + xtconstant.FIX_PRICE, + sfgrid_constants.grid_price[self.tradeTarget.grid_index], + '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[self.tradeTarget.grid_index]} Volume: {sfgrid_constants.grid_volume}\n") + else: + print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 已有仓位或非初始状态 无需建初始仓 当前仓位: {self.tradeTarget.current_position} 状态: {self.tradeTarget.status}\n") + + def isEnabled(self) -> bool: return self.tradeTarget.enabled @@ -42,6 +48,8 @@ class StockTradeController: if self.isEnabled(): print(f"标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 行情数据更新 {data[self.tradeTarget.stock_code]}\n") + def onOrderUpdate(self, order:XtOrder): + pass # Description: 程序启动后 def check_stock_position(self):