开始写策略了,建仓逻辑

This commit is contained in:
2025-10-28 18:12:15 +08:00
parent 3443271771
commit c928b79c83
2 changed files with 46 additions and 32 deletions
+24 -18
View File
@@ -6,11 +6,12 @@ import sfgrid_constants
from sfgrid_trade_controller import StockTradeController from sfgrid_trade_controller import StockTradeController
from util import getInstrumentName, getStockPosition from util import getInstrumentName, getStockPosition
from xtquant.xttrader import XtQuantTrader from xtquant.xttrader import XtQuantTrader
from xtquant.xttype import StockAccount from xtquant.xttype import StockAccount, XtOrder
from xtquant import xtdata from xtquant import xtdata
from xtquant.xttrader import XtQuantTraderCallback from xtquant.xttrader import XtQuantTraderCallback
import datetime import datetime
# 量化核心控制对象
class SFGridController(XtQuantTraderCallback): class SFGridController(XtQuantTraderCallback):
def __init__(self, account_no: str, miniQmtPath: str): def __init__(self, account_no: str, miniQmtPath: str):
super().__init__() super().__init__()
@@ -40,20 +41,6 @@ class SFGridController(XtQuantTraderCallback):
xtdata.unsubscribe_quote(self.seq) xtdata.unsubscribe_quote(self.seq)
def onDataUpdate(self, data):
# 遍历股池
for target in self.instrument_pool:
stock_code = target.stock_code
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if stock_code not in self.stock_trade_ctrl:
print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n")
continue
if stock_code not in data:
print(f"股票代码 {stock_code} 未在行情数据中找到,跳过处理。\n")
continue
stock_controller: StockTradeController = self.stock_trade_ctrl[stock_code]
stock_controller.onDataUpdate(data)
def add_trade_target(self, stock_code): def add_trade_target(self, stock_code):
try: try:
stock_name = getInstrumentName(stock_code) stock_name = getInstrumentName(stock_code)
@@ -179,9 +166,24 @@ class SFGridController(XtQuantTraderCallback):
print(f"标的交易控制器不存在 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n") print(f"标的交易控制器不存在 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n")
# ====== 市场回调方法 -- 以下方法由XtQuantData调用 ======
def onDataUpdate(self, data):
# 遍历股池
for target in self.instrument_pool:
stock_code = target.stock_code
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if stock_code not in self.stock_trade_ctrl:
print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n")
continue
if 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调用 ====== # ====== 市场回调方法 -- 以下方法由XtQuantTrader调用 ======
def on_connected(self): def on_connected(self):
""" """
连接成功推送 连接成功推送
@@ -195,12 +197,16 @@ class SFGridController(XtQuantTraderCallback):
""" """
print(datetime.datetime.now(), '连接断开回调') print(datetime.datetime.now(), '连接断开回调')
def on_stock_order(self, order): def on_stock_order(self, order:XtOrder):
""" """
委托回报推送 委托回报推送
:param order: XtOrder对象 :param order: XtOrder对象
:return: :return:
""" """
stockCode = order.stock_code
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if stockCode not in self.stock_trade_ctrl:
self.stock_trade_ctrl[stockCode].onOrderUpdate(order)
print(datetime.datetime.now(), '委托回调 投资备注', order.order_remark) print(datetime.datetime.now(), '委托回调 投资备注', order.order_remark)
def on_stock_trade(self, trade): def on_stock_trade(self, trade):
+22 -14
View File
@@ -3,7 +3,7 @@ import strategy_db
from util import getInstrumentName, getStockPosition from util import getInstrumentName, getStockPosition
from xtquant import xttrader, xtdata, xtconstant from xtquant import xttrader, xtdata, xtconstant
from xtquant.xttype import StockAccount from xtquant.xttype import StockAccount, XtOrder
import sfgrid_constants import sfgrid_constants
@@ -21,19 +21,25 @@ class StockTradeController:
self.tradeTarget.enabled = enabled self.tradeTarget.enabled = enabled
self.tradeTarget.save() self.tradeTarget.save()
# 建仓状态检查 if enabled:
if self.tradeTarget.current_position == 0 and self.tradeTarget.status == 0: print(f"|- 标的交易启动 {self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}\n")
self.tradeTarget.grid_index = 1 # 建仓状态检查
self.tradeTarget.save() if self.tradeTarget.current_position == 0 and self.tradeTarget.status == 0:
self.initBuyOrderId = self.xt_trader.order_stock( print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 建初始仓 买单准备中...\n")
self.account, self.tradeTarget.grid_index = 1
self.tradeTarget.stock_code, self.tradeTarget.save()
xtconstant.STOCK_BUY, self.initBuyOrderId = self.xt_trader.order_stock(
sfgrid_constants.grid_volume, self.account,
xtconstant.FIX_PRICE, self.tradeTarget.stock_code,
sfgrid_constants.grid_price[self.tradeTarget.grid_index], xtconstant.STOCK_BUY,
'sf_grid', f'{self.tradeTarget.stock_code}_init_buy') sfgrid_constants.grid_volume,
print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 建初始仓 买单已发出 InitBuyOrderId: {self.initBuyOrderId} Price: {sfgrid_constants.grid_price[self.tradeTarget.grid_index]} Volume: {sfgrid_constants.grid_volume}\n") xtconstant.FIX_PRICE,
sfgrid_constants.grid_price[self.tradeTarget.grid_index],
'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[self.tradeTarget.grid_index]} Volume: {sfgrid_constants.grid_volume}\n")
else:
print(f"|- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 已有仓位或非初始状态 无需建初始仓 当前仓位: {self.tradeTarget.current_position} 状态: {self.tradeTarget.status}\n")
def isEnabled(self) -> bool: def isEnabled(self) -> bool:
return self.tradeTarget.enabled return self.tradeTarget.enabled
@@ -42,6 +48,8 @@ class StockTradeController:
if self.isEnabled(): if self.isEnabled():
print(f"标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 行情数据更新 {data[self.tradeTarget.stock_code]}\n") print(f"标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 行情数据更新 {data[self.tradeTarget.stock_code]}\n")
def onOrderUpdate(self, order:XtOrder):
pass
# Description: 程序启动后 # Description: 程序启动后
def check_stock_position(self): def check_stock_position(self):