调整 策略逻辑

This commit is contained in:
2025-10-29 16:54:10 +08:00
parent 3f5fc02667
commit d24bbd8c68
2 changed files with 35 additions and 47 deletions
+21 -39
View File
@@ -44,7 +44,7 @@ class SFGridController(XtQuantTraderCallback):
xtdata.unsubscribe_quote(self.seq)
def add_trade_target(self, stock_code):
def add_trade_target(self, stock_code: str):
try:
stock_name = getInstrumentName(stock_code)
new_target = strategy_db.TradeTarget.create(
@@ -188,17 +188,14 @@ class SFGridController(XtQuantTraderCallback):
# ====== 市场回调方法 -- 以下方法由XtQuantData调用 ======
def onDataUpdate(self, data):
# 遍历股池
# for stock_code, data in data.items():
# if data['lastPrice'] == 10.0:
# print(f'target = {stock_code} - {getInstrumentName(stock_code)} {data['lastPrice']}')
# self.add_trade_target(stock_code)
# self.stock_trade_ctrl[stock_code].enabledTrading(True)
# if stock_code not in self.stock_trade_ctrl:
# self.add_trade_target(stock_code)
# self.stock_trade_ctrl[stock_code].onDataUpdate(data)
if sfgrid_constants.max_enabled_targets <= 0: # 全推
for stock_code, tickData in data.items():
lastPrice = tickData['lastPrice']
if lastPrice == 10.0 and stock_code not in self.stock_trade_ctrl:
print(f'New trade target = {stock_code} - {getInstrumentName(stock_code)} {tickData['lastPrice']}')
self.add_trade_target(stock_code)
self.stock_trade_ctrl[stock_code].enabledTrading(True)
else: # 指定目标 当前主要使用这种模式
for target in self.instrument_pool:
stock_code = target.stock_code
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
@@ -230,11 +227,12 @@ class SFGridController(XtQuantTraderCallback):
:return:
"""
stockCode = order.stock_code
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if stockCode in self.stock_trade_ctrl:
ctrl:StockTradeController = self.stock_trade_ctrl[stockCode]
ctrl.onOrderUpdate(order)
print(datetime.datetime.now(), '委托回调 投资备注', order.order_remark)
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if ctrl is not None and order.order_remark == ctrl.getName():
ctrl.onOrderTrade(order)
else:
print(f"委托下单回调 投资备注 {order.order_remark} 不匹配 {ctrl.getName()}")
def on_stock_trade(self, trade:XtTrade):
"""
@@ -242,7 +240,13 @@ class SFGridController(XtQuantTraderCallback):
:param trade: XtTrade对象
:return:
"""
print(datetime.datetime.now(), '成交回调', trade.order_remark, f"委托方向(48买 49卖) {trade.offset_flag} 成交价格 {trade.traded_price} 成交数量 {trade.traded_volume}")
stockCode = trade.stock_code
ctrl:StockTradeController = self.stock_trade_ctrl[stockCode]
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if ctrl is not None and trade.order_remark == ctrl.getName():
ctrl.onOrderTrade(trade)
else:
print(f"委托回调 投资备注 {trade.order_remark} 不匹配 {ctrl.getName()}")
def on_order_error(self, order_error):
"""
@@ -254,28 +258,6 @@ class SFGridController(XtQuantTraderCallback):
# print(order_error.order_id, order_error.error_id, order_error.error_msg)
print(f"\n委托报错回调 {order_error.order_remark} {order_error.error_msg}")
def on_cancel_error(self, cancel_error):
"""
撤单失败推送
:param cancel_error: XtCancelError 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)
def on_order_stock_async_response(self, response):
"""
异步下单回报推送
:param response: XtOrderResponse 对象
:return:
"""
print(f"异步委托回调 投资备注: {response.order_remark}")
def on_cancel_order_stock_async_response(self, response):
"""
:param response: XtCancelOrderResponse 对象
:return:
"""
print(datetime.datetime.now(), sys._getframe().f_code.co_name)
def on_account_status(self, status):
"""
+6
View File
@@ -15,6 +15,9 @@ class StockTradeController:
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
@@ -40,6 +43,9 @@ class StockTradeController:
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: