代码简化

This commit is contained in:
2025-11-04 12:01:18 +08:00
parent c6d253b293
commit 2fdc57e2b8
2 changed files with 32 additions and 78 deletions
+11 -11
View File
@@ -7,7 +7,7 @@ import xtquant.xtconstant as xtconstant
sys.stdout.reconfigure(encoding='utf-8') # 设置标准输出编码为UTF-8 # type: ignore sys.stdout.reconfigure(encoding='utf-8') # 设置标准输出编码为UTF-8 # type: ignore
import core.strategy_db as strategy_db import core.strategy_db as strategy_db
import sfgrid_constants import sfgrid_constants
from core.sfgrid_trade_controller import StockTradeController from core.sfgrid_strategy import SFGridStrategy
from core.util import getInstrumentName, getStockPosition from core.util import getInstrumentName, getStockPosition
from xtquant.xttrader import XtQuantTrader from xtquant.xttrader import XtQuantTrader
from xtquant.xttype import StockAccount, XtAsset, XtOrder, XtOrderResponse, XtPosition, XtTrade from xtquant.xttype import StockAccount, XtAsset, XtOrder, XtOrderResponse, XtPosition, XtTrade
@@ -92,7 +92,7 @@ class SFGridController(XtQuantTraderCallback):
# 更新标的池 # 更新标的池
self.refresh_targets() 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 self.stock_trade_ctrl[stock_code] = stockTradeController
except Exception as e: except Exception as e:
@@ -115,7 +115,7 @@ class SFGridController(XtQuantTraderCallback):
tradeTarget.current_position = getStockPosition(tradeTarget.stock_code, xtTrader, account) # type: ignore tradeTarget.current_position = getStockPosition(tradeTarget.stock_code, xtTrader, account) # type: ignore
result = tradeTarget.save() result = tradeTarget.save()
print(f' |- 同步当前持仓信息 {tradeTarget.stock_code}, {tradeTarget.current_position}, result = {result}') 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 self.stock_trade_ctrl[tradeTarget.stock_code] = stockTradeController
print(f'- [成功]交易标的信息初始化, 共 {len(self.instrument_pool)} 个标的') print(f'- [成功]交易标的信息初始化, 共 {len(self.instrument_pool)} 个标的')
@@ -180,14 +180,14 @@ class SFGridController(XtQuantTraderCallback):
tradeTarget = self.instrument_pool[index] tradeTarget = self.instrument_pool[index]
# check existing thread # check existing thread
if tradeTarget.stock_code in self.stock_trade_ctrl: 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(): if tradeController.isEnabled():
print(f"标的交易控制器已存在且正在运行 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n") print(f"标的交易控制器已存在且正在运行 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n")
else: else:
print(f"标的交易控制器已存在但未运行,重新启动 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n") print(f"标的交易控制器已存在但未运行,重新启动 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n")
tradeController.enabledTrading(True) tradeController.enabledTrading(True)
else: 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 self.stock_trade_ctrl[tradeTarget.stock_code] = stockTradeController
print(f"\t创建标的交易控制器 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}") print(f"\t创建标的交易控制器 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}")
@@ -195,7 +195,7 @@ class SFGridController(XtQuantTraderCallback):
def pause_stock_trade(self, index: int): def pause_stock_trade(self, index: int):
tradeTarget = self.instrument_pool[index] tradeTarget = self.instrument_pool[index]
if tradeTarget.stock_code in self.stock_trade_ctrl: 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(): if tradeController.isEnabled():
print(f"暂停标的交易 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n") print(f"暂停标的交易 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n")
tradeController.enabledTrading(False) 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: if stock_code not in self.stock_trade_ctrl or stock_code not in data:
# print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n") # print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n")
continue continue
stock_controller: StockTradeController = self.stock_trade_ctrl[stock_code] stock_controller: SFGridStrategy = self.stock_trade_ctrl[stock_code]
stock_controller.onDataUpdate(data) stock_controller.onDataUpdate(data)
@@ -247,7 +247,7 @@ class SFGridController(XtQuantTraderCallback):
:return: :return:
""" """
stockCode = order.stock_code stockCode = order.stock_code
ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] ctrl:SFGridStrategy = self.stock_trade_ctrl[stockCode]
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法 # 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if ctrl is not None and order.strategy_name == ctrl.getName(): if ctrl is not None and order.strategy_name == ctrl.getName():
ctrl.onOrderTrade(trade=order) # type: ignore ctrl.onOrderTrade(trade=order) # type: ignore
@@ -256,7 +256,7 @@ class SFGridController(XtQuantTraderCallback):
def test_sim_trade(self, index: int, orderType: int): def test_sim_trade(self, index: int, orderType: int):
tradeTarget:strategy_db.TradeTarget = self.instrument_pool[index] 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 trade: XtTrade = None # type: ignore
if orderType == xtconstant.STOCK_BUY: if orderType == xtconstant.STOCK_BUY:
trade = XtTrade( trade = XtTrade(
@@ -277,7 +277,7 @@ class SFGridController(XtQuantTraderCallback):
:return: :return:
""" """
stockCode = trade.stock_code stockCode = trade.stock_code
ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] ctrl:SFGridStrategy = self.stock_trade_ctrl[stockCode]
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法 # 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if ctrl is not None and trade.strategy_name == ctrl.getName(): if ctrl is not None and trade.strategy_name == ctrl.getName():
ctrl.onOrderTrade(trade) ctrl.onOrderTrade(trade)
@@ -286,7 +286,7 @@ class SFGridController(XtQuantTraderCallback):
def on_order_stock_async_response(self, response:XtOrderResponse): def on_order_stock_async_response(self, response:XtOrderResponse):
stockCode = response.order_remark stockCode = response.order_remark
ctrl:StockTradeController = self.stock_trade_ctrl[stockCode] ctrl:SFGridStrategy = self.stock_trade_ctrl[stockCode]
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法 # 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if ctrl is not None and response.strategy_name == ctrl.getName(): if ctrl is not None and response.strategy_name == ctrl.getName():
ctrl.onAsyncOrderResponse(response) ctrl.onAsyncOrderResponse(response)
@@ -1,15 +1,15 @@
from re import L from re import L
from core import util from core import util
from core.strategy_db import TradeTarget 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 import xttrader, xtconstant
from xtquant.xttype import StockAccount, XtOrder, XtOrderResponse, XtTrade from xtquant.xttype import StockAccount, XtOrderResponse, XtTrade
import sfgrid_constants import sfgrid_constants
import threading import threading
class StockTradeController: class SFGridStrategy:
def __init__(self, tradeTarget: TradeTarget, xt_trader: xttrader.XtQuantTrader, account: StockAccount, enabled: bool = False): def __init__(self, tradeTarget: TradeTarget, xt_trader: xttrader.XtQuantTrader, account: StockAccount, enabled: bool = False):
self.tradeTarget:TradeTarget = tradeTarget 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 if int(self.tradeTarget.current_position) == 0 and int(self.tradeTarget.status) == 0: # type: ignore
self.tradeTarget.grid_index = 1 # type: ignore self.tradeTarget.grid_index = 1 # type: ignore
self.tradeTarget.save() self.tradeTarget.save()
self.init_stock_position() self.initBuyOrderId = self.xt_trader.order_stock_async(
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.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: else:
# 交易阶段,检查仓位,检查现有订单 # 交易阶段,检查仓位,检查现有订单
print(f" |- 标的{self.tradeTarget.targetName()}已有仓位或非初始状态 无需建初始仓 当前仓位: {self.tradeTarget.current_position} 状态: {self.tradeTarget.status}") print(f" |- 标的{self.tradeTarget.targetName()}已有仓位或非初始状态 无需建初始仓 当前仓位: {self.tradeTarget.current_position} 状态: {self.tradeTarget.status}")
@@ -112,15 +119,16 @@ class StockTradeController:
self.dataUpdateLock.acquire() self.dataUpdateLock.acquire()
stockCode = order.order_remark stockCode = order.order_remark
orderSeq = order.seq orderSeq = order.seq
if self.tradeTarget.current_buy_order_no == order.seq: if (self.tradeTarget.status == 1): # 正常交易阶段订单下单成功
self.tradeTarget.current_buy_order_no = order.order_id if self.tradeTarget.current_buy_order_no == order.seq:
elif self.tradeTarget.current_sell_order_no == order.seq: self.tradeTarget.current_buy_order_no = order.order_id
self.tradeTarget.current_sell_order_no = order.order_id elif self.tradeTarget.current_sell_order_no == order.seq:
else: self.tradeTarget.current_sell_order_no = order.order_id
print(f' |- 委托回调: 委托单 {order.order_id} {stockCode} {orderSeq} 不在策略监控范围内') else:
return print(f' |- 委托回调: 委托单 {order.order_id} {stockCode} {orderSeq} 不在策略监控范围内')
return
rc = self.tradeTarget.save() rc = self.tradeTarget.save()
print(f' |- 委托回调: 委托单 {order.order_id} {stockCode} {orderSeq} 处理结果: {rc}') print(f' |- 委托下单成功[{rc}]: 委托单 {order.order_id} {stockCode} {orderSeq} ')
self.dataUpdateLock.release() self.dataUpdateLock.release()
def onOrderTrade(self, trade:XtTrade): def onOrderTrade(self, trade:XtTrade):
@@ -146,8 +154,6 @@ class StockTradeController:
print(f' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}') print(f' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}')
print(f' 当前持仓: {self.tradeTarget.current_position}') print(f' 当前持仓: {self.tradeTarget.current_position}')
print(f' 网格坐标: {self.tradeTarget.grid_index}') 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 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 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' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}')
print(f' 当前持仓: {self.tradeTarget.current_position}') print(f' 当前持仓: {self.tradeTarget.current_position}')
print(f' 网格坐标: {self.tradeTarget.grid_index}') 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: else:
# 打印订单信息和订单状态 # 打印订单信息和订单状态
print(f'|- 非策略内部订单,或订单状态不满足监控条件 {trade.order_id} {trade.stock_code}-{trade.instrument_name} {trade.commission}') print(f'|- 非策略内部订单,或订单状态不满足监控条件 {trade.order_id} {trade.stock_code}-{trade.instrument_name} {trade.commission}')
self.dataUpdateLock.release() 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()