开始写策略了,建仓逻辑
This commit is contained in:
+24
-18
@@ -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
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user