代码简化

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
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)
@@ -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()