实现策略核心交易逻辑

This commit is contained in:
2025-10-29 15:26:34 +08:00
parent c928b79c83
commit 3f5fc02667
6 changed files with 159 additions and 54 deletions
+40 -13
View File
@@ -1,12 +1,15 @@
# coding:utf-8
from os import popen
import time, sys
from peewee import ModelSelect
sys.stdout.reconfigure(encoding='utf-8') # 设置标准输出编码为UTF-8
import strategy_db
import sfgrid_constants
from sfgrid_trade_controller import StockTradeController
from util import getInstrumentName, getStockPosition
from xtquant.xttrader import XtQuantTrader
from xtquant.xttype import StockAccount, XtOrder
from xtquant.xttype import StockAccount, XtOrder, XtTrade
from xtquant import xtdata
from xtquant.xttrader import XtQuantTraderCallback
import datetime
@@ -51,7 +54,9 @@ class SFGridController(XtQuantTraderCallback):
grid_index=0,
last_trade_price=0.0,
current_buy_price=0.0,
current_sell_price=0.0
current_buy_order_no='',
current_sell_price=0.0,
current_sell_order_no=''
)
new_target.save()
print(f'新增交易标的 {stock_code} {stock_name}, {new_target.id}')
@@ -59,13 +64,21 @@ class SFGridController(XtQuantTraderCallback):
pos = getStockPosition(stock_code, self.xt_trader, self.account)
strategy_db.TradeTarget.update(current_position=pos).where(strategy_db.TradeTarget.stock_code == stock_code).execute()
# 更新标的池
self.instrument_pool = strategy_db.TradeTarget.select()
self.refresh_targets()
# 添加交易控制器
stockTradeController = StockTradeController(new_target, self.xt_trader, self.account, new_target.enabled)
self.stock_trade_ctrl[stock_code] = stockTradeController
except Exception as e:
print(f'新增交易标的失败 {stock_code} {e}')
def del_trade_target(self, index:int):
target: strategy_db.TradeTarget = self.instrument_pool[index]
# self.stock_trade_ctrl.
del self.stock_trade_ctrl[target.stock_code]
target.delete_instance()
self.refresh_targets()
def init_trader(self, path):
session_id = int(time.time())
@@ -79,14 +92,20 @@ class SFGridController(XtQuantTraderCallback):
self.account= StockAccount(account_id, account_type)
print(f'- 交易账号对象初始化完成, 账号: {self.account.account_id}')
def init_instrument_pool(self):
self.instrument_pool = strategy_db.TradeTarget.select()
self.refresh_targets()
for tradeTarget in self.instrument_pool:
stockTradeController = StockTradeController(tradeTarget, self.xt_trader, self.account, tradeTarget.enabled)
self.stock_trade_ctrl[tradeTarget.stock_code] = stockTradeController
print(f'- 初始化标的池初始化完成 , 共 {len(self.instrument_pool)} 个标的')
def refresh_targets(self):
# 更新标的池
self.instrument_pool:ModelSelect = strategy_db.TradeTarget.select()
self.print_pool()
def print_pool(self):
@@ -170,19 +189,26 @@ 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:
print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n")
continue
if stock_code not in data:
print(f"股票代码 {stock_code} 未在行情数据中找到,跳过处理。\n")
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调用 ======
def on_connected(self):
"""
@@ -205,11 +231,12 @@ class SFGridController(XtQuantTraderCallback):
"""
stockCode = order.stock_code
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
if stockCode not in self.stock_trade_ctrl:
self.stock_trade_ctrl[stockCode].onOrderUpdate(order)
if stockCode in self.stock_trade_ctrl:
ctrl:StockTradeController = self.stock_trade_ctrl[stockCode]
ctrl.onOrderUpdate(order)
print(datetime.datetime.now(), '委托回调 投资备注', order.order_remark)
def on_stock_trade(self, trade):
def on_stock_trade(self, trade:XtTrade):
"""
成交变动推送
:param trade: XtTrade对象