from strategy_db import TradeTarget import strategy_db from util import getInstrumentName, getStockPosition from xtquant import xttrader, xtdata, xtconstant from xtquant.xttype import StockAccount, XtOrder, XtTrade import sfgrid_constants class StockTradeController: def __init__(self, tradeTarget: TradeTarget, xt_trader: xttrader.XtQuantTrader, account: StockAccount, enabled: bool = False): self.tradeTarget = tradeTarget 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): self.tradeTarget.enabled = enabled self.tradeTarget.save() 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.init_stock_position() 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 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 if trade.order_id == self.initBuyOrderId and self.tradeTarget.status == 0: # 此时为建仓成交 self.tradeTarget.current_position += sfgrid_constants.grid_volume # 当前持仓数,账户原有持仓不在策略范围内 self.tradeTarget.last_trade_price = trade.traded_price self.tradeTarget.grid_index = 1 self.tradeTarget.status = 1 self.tradeTarget.save() print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 建初始仓订单ID: {self.initBuyOrderId}已成交 \n") print(f' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}\n') print(f' 当前持仓: {self.tradeTarget.current_position}\n') print(f' 网格坐标: {self.tradeTarget.grid_index}\n') indicator = True # 双向下单 elif trade.order_id == self.sellOrderId and self.tradeTarget.status == 1: # 上涨一格:此时空单成交 print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 上涨 卖单已成交 订单ID: {self.sellOrderId} Price: {sfgrid_constants.grid_price[self.tradeTarget.grid_index]} Volume: {sfgrid_constants.grid_volume} 手续费: {trade.commission}\n") self.tradeTarget.current_position = -sfgrid_constants.grid_volume self.tradeTarget.last_trade_price = trade.traded_price self.tradeTarget.grid_index += 1 self.tradeTarget.save() print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 上涨 卖单已成交 订单ID: {self.sellOrderId} Price: {sfgrid_constants.grid_price[self.tradeTarget.grid_index]} Volume: {sfgrid_constants.grid_volume} 手续费: {trade.commission}\n") print(f' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}\n') print(f' 当前持仓: {self.tradeTarget.current_position}\n') print(f' 网格坐标: {self.tradeTarget.grid_index}\n') indicator = True # 双向下单 elif trade.order_id == self.buyOrderId and self.tradeTarget.status == 1: # 下跌一格:此时多单成交 self.tradeTarget.current_position = +sfgrid_constants.grid_volume self.tradeTarget.last_trade_price = trade.traded_price self.tradeTarget.grid_index -= 1 self.tradeTarget.save() print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 下跌 买单已成交 订单ID: {self.buyOrderId} Price: {sfgrid_constants.grid_price[self.tradeTarget.grid_index]} Volume: {sfgrid_constants.grid_volume} 手续费: {trade.commission}\n") print(f' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}\n') print(f' 当前持仓: {self.tradeTarget.current_position}\n') print(f' 网格坐标: {self.tradeTarget.grid_index}\n') indicator = True # 双向下单 else: # 打印订单信息和订单状态 print(f'非策略内部订单,或订单状态不满足监控条件 {trade.order_id} {trade.stock_code}-{trade.instrument_name} {trade.commission}') if indicator and self.isEnabled(): self.two_way_order() # 双向下单 # Description: 新标的,建基础仓 def init_stock_position(self): 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") # Description: 网格跳格,双向下单 def two_way_order(self): if self.tradeTarget.grid_index+1 < len(sfgrid_constants.grid_price): # 价格没有超过网格下边界,可以下多单 currentPrice = sfgrid_constants.grid_price[self.tradeTarget.grid_index] buyPrice = sfgrid_constants.grid_price[self.tradeTarget.grid_index+1] self.buyOrderId = self.xt_trader.order_stock( self.account, self.tradeTarget.stock_code, xtconstant.STOCK_BUY, sfgrid_constants.grid_volume, xtconstant.FIX_PRICE, buyPrice, 'sf_grid', f'{self.tradeTarget.stock_code}_grid_down_{self.tradeTarget.grid_index}_{currentPrice}_{buyPrice}') self.tradeTarget.current_buy_price = buyPrice if self.tradeTarget.grid_index-1 >=0: # 价格没有超过网格上边界,可以下空单 currentPrice = sfgrid_constants.grid_price[self.tradeTarget.grid_index] sellPrice = sfgrid_constants.grid_price[self.tradeTarget.grid_index-1] self.sellOrderId = self.xt_trader.order_stock( self.account, self.tradeTarget.stock_code, xtconstant.STOCK_SELL, sfgrid_constants.grid_volume, xtconstant.FIX_PRICE, sellPrice, 'sf_grid', f'{self.tradeTarget.stock_code}_grid_up_{self.tradeTarget.grid_index}_{currentPrice}_{sellPrice}') self.tradeTarget.current_sell_price = sellPrice self.tradeTarget.save()