代码简化
This commit is contained in:
+11
-11
@@ -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,6 +119,7 @@ class StockTradeController:
|
||||
self.dataUpdateLock.acquire()
|
||||
stockCode = order.order_remark
|
||||
orderSeq = order.seq
|
||||
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:
|
||||
@@ -120,7 +128,7 @@ class StockTradeController:
|
||||
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()
|
||||
Reference in New Issue
Block a user