调整 策略逻辑
This commit is contained in:
+29
-47
@@ -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,25 +188,22 @@ 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)
|
||||
for target in self.instrument_pool:
|
||||
stock_code = target.stock_code
|
||||
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
|
||||
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.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方法
|
||||
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.onDataUpdate(data)
|
||||
|
||||
|
||||
# ====== 市场回调方法 -- 以下方法由XtQuantTrader调用 ======
|
||||
@@ -230,11 +227,12 @@ class SFGridController(XtQuantTraderCallback):
|
||||
:return:
|
||||
"""
|
||||
stockCode = order.stock_code
|
||||
ctrl:StockTradeController = self.stock_trade_ctrl[stockCode]
|
||||
# 如果存在对应的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)
|
||||
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):
|
||||
"""
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user