添加编译文件、打包瘦身、UI逻辑调整
This commit is contained in:
+82
-38
@@ -1,10 +1,12 @@
|
||||
# coding:utf-8
|
||||
from core.strategy_db import TradeTarget
|
||||
from typing import Any
|
||||
from core.eventbus import ActionDisableMarketData, ActionEnableMarketData, ActionEventDisableTrade, ActionEventEnableTrade, MarketDataUpdate, MarketDataEnabled, MarketDataDisabled, ResultEventTradeDisabled, ResultEventTradeEnabled, event_bus
|
||||
from xtquant.xttrader import XtQuantTrader
|
||||
import time, sys
|
||||
import time
|
||||
from peewee import ModelSelect
|
||||
|
||||
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_strategy import SFGridStrategy
|
||||
@@ -14,11 +16,15 @@ from xtquant.xttype import StockAccount, XtAsset, XtOrder, XtOrderResponse, XtPo
|
||||
from xtquant import xtdata
|
||||
from xtquant.xttrader import XtQuantTraderCallback
|
||||
import datetime
|
||||
import core.ui as ui
|
||||
|
||||
# 量化核心控制对象
|
||||
class SFGridController(XtQuantTraderCallback):
|
||||
def __init__(self, account_no: str, miniQmtPath: str):
|
||||
super().__init__()
|
||||
|
||||
self.registerEventHandler()
|
||||
self.appUi = ui.TradeTargetUI()
|
||||
|
||||
xtdata.enable_hello = False
|
||||
|
||||
@@ -49,8 +55,35 @@ class SFGridController(XtQuantTraderCallback):
|
||||
|
||||
self.seq = None
|
||||
print('- [成功]三疯交易系统初始化完成')
|
||||
# self.startMarketData()
|
||||
|
||||
def registerEventHandler(self):
|
||||
event_bus.subscribe(ActionEventEnableTrade, self.onEnableTrade)
|
||||
event_bus.subscribe(ActionEventDisableTrade, self.onDisableTrade)
|
||||
event_bus.subscribe(ActionEnableMarketData, self.onMarketDataEnabled)
|
||||
event_bus.subscribe(ActionDisableMarketData, self.onMarketDataDisabled)
|
||||
event_bus.subscribe("add_trade_target", self.onAddTradeTarget)
|
||||
|
||||
def onAddTradeTarget(self, stock_code: str):
|
||||
"""处理添加交易标的事件"""
|
||||
self.add_trade_target(stock_code)
|
||||
|
||||
def onMarketDataEnabled(self, data):
|
||||
"""处理市场数据监听启用事件"""
|
||||
self.startMarketData()
|
||||
|
||||
def onMarketDataDisabled(self, data):
|
||||
"""处理市场数据监听禁用事件"""
|
||||
self.stopMarketData()
|
||||
|
||||
def onEnableTrade(self, id: int):
|
||||
self.start_stock_trade(id)
|
||||
|
||||
def onDisableTrade(self, id: int):
|
||||
self.pause_stock_trade(id)
|
||||
|
||||
def hold(self):
|
||||
self.appUi.run()
|
||||
|
||||
def startMarketData(self):
|
||||
print('- 启动市场数据订阅')
|
||||
@@ -58,6 +91,7 @@ class SFGridController(XtQuantTraderCallback):
|
||||
if self.seq == -1:
|
||||
print('- 市场数据订阅失败')
|
||||
else:
|
||||
event_bus.publish(MarketDataEnabled, True)
|
||||
print(f'- 市场数据订阅成功, 订阅号={self.seq}')
|
||||
|
||||
|
||||
@@ -65,11 +99,22 @@ class SFGridController(XtQuantTraderCallback):
|
||||
print('- 停止市场数据订阅')
|
||||
if self.seq is not None and self.seq > 0:
|
||||
xtdata.unsubscribe_quote(self.seq)
|
||||
event_bus.publish(MarketDataDisabled, False)
|
||||
|
||||
|
||||
def add_trade_target(self, stock_code: str):
|
||||
try:
|
||||
stock_name = getInstrumentName(stock_code)
|
||||
if not stock_name:
|
||||
print(f'无法获取股票代码 {stock_code} 的名称,请检查代码是否正确')
|
||||
return
|
||||
|
||||
# 检查是否已存在该标的
|
||||
existing_target = strategy_db.TradeTarget.get_or_none(strategy_db.TradeTarget.stock_code == stock_code)
|
||||
if existing_target:
|
||||
print(f'交易标的 {stock_code} {stock_name} 已存在')
|
||||
return
|
||||
|
||||
new_target = strategy_db.TradeTarget.create(
|
||||
stock_name=stock_name,
|
||||
stock_code=stock_code,
|
||||
@@ -96,8 +141,8 @@ class SFGridController(XtQuantTraderCallback):
|
||||
print(f'新增交易标的失败 {stock_code} {e}')
|
||||
|
||||
|
||||
def del_trade_target(self, index:int):
|
||||
target: strategy_db.TradeTarget = self.instrument_pool[index]
|
||||
def del_trade_target(self, id:int):
|
||||
target: strategy_db.TradeTarget = self.instrument_pool[id]
|
||||
# self.stock_trade_ctrl.
|
||||
del self.stock_trade_ctrl[target.stock_code]
|
||||
target.delete_instance()
|
||||
@@ -107,28 +152,33 @@ class SFGridController(XtQuantTraderCallback):
|
||||
def init_instrument_pool(self, xtTrader:XtQuantTrader, account:StockAccount):
|
||||
self.refresh_targets()
|
||||
|
||||
for temp in self.instrument_pool:
|
||||
tradeTarget:strategy_db.TradeTarget = temp
|
||||
for id in self.instrument_pool:
|
||||
tradeTarget:strategy_db.TradeTarget = self.instrument_pool[id]
|
||||
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 = SFGridStrategy(tradeTarget, self.xt_trader, self.account, tradeTarget.enabled) # type: ignore
|
||||
stockTradeController = SFGridStrategy(tradeTarget, self.xt_trader, self.account) # type: ignore
|
||||
self.stock_trade_ctrl[tradeTarget.stock_code] = stockTradeController
|
||||
event_bus.publish(MarketDataUpdate, tradeTarget)
|
||||
|
||||
print(f'- [成功]交易标的信息初始化, 共 {len(self.instrument_pool)} 个标的')
|
||||
|
||||
|
||||
def refresh_targets(self):
|
||||
# 更新标的池
|
||||
self.instrument_pool:ModelSelect = strategy_db.TradeTarget.select()
|
||||
results:ModelSelect = strategy_db.TradeTarget.select()
|
||||
self.instrument_pool: dict[int, strategy_db.TradeTarget] = {}
|
||||
for temp in results:
|
||||
result :strategy_db.TradeTarget = temp
|
||||
self.instrument_pool[result.get_id()] = result
|
||||
self.print_pool()
|
||||
|
||||
def print_pool(self):
|
||||
print("- [信息]标的池信息")
|
||||
for i in range(len(self.instrument_pool)):
|
||||
target: strategy_db.TradeTarget = self.instrument_pool[i]
|
||||
for id in self.instrument_pool:
|
||||
target: strategy_db.TradeTarget = self.instrument_pool[id]
|
||||
status = "新建" if target.status == 0 else "已建初始仓"
|
||||
print(f' [序号-{i}] 股票代码: {target.stock_code}-{target.stock_name} 当前持仓: {getStockPosition(target.stock_code, self.xt_trader, self.account)} 网格索引: {target.grid_index} 基准价格 {sfgrid_constants.grid_price[target.grid_index]} 状态: {status} 启用交易线程: {'自动交易中' if target.enabled else '交易已停止'}') # type: ignore
|
||||
print(f' [序号-{id}] 股票代码: {target.stock_code}-{target.stock_name} 当前持仓: {getStockPosition(target.stock_code, self.xt_trader, self.account)} 网格索引: {target.grid_index} 基准价格 {sfgrid_constants.grid_price[target.grid_index]} 状态: {status} 启用交易线程: {'自动交易中' if target.enabled else '交易已停止'}') # type: ignore
|
||||
|
||||
def print_position_info(self):
|
||||
positions:list[XtPosition] = self.xt_trader.query_stock_positions(self.account)
|
||||
@@ -173,34 +223,29 @@ class SFGridController(XtQuantTraderCallback):
|
||||
|
||||
|
||||
# 初始化指定标的交易控制器
|
||||
def start_stock_trade(self, index: int):
|
||||
tradeTarget = self.instrument_pool[index]
|
||||
def start_stock_trade(self, id: int):
|
||||
tradeTarget: TradeTarget = self.instrument_pool[id]
|
||||
# check existing thread
|
||||
if tradeTarget.stock_code in self.stock_trade_ctrl:
|
||||
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)
|
||||
|
||||
tradeTarget = tradeController.enabledTrading(True)
|
||||
self.instrument_pool[id] = tradeTarget
|
||||
event_bus.publish(ResultEventTradeEnabled, tradeTarget)
|
||||
else:
|
||||
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)}")
|
||||
|
||||
|
||||
def pause_stock_trade(self, index: int):
|
||||
tradeTarget = self.instrument_pool[index]
|
||||
if tradeTarget.stock_code in self.stock_trade_ctrl:
|
||||
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)
|
||||
else:
|
||||
print(f"标的交易已暂停 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n")
|
||||
def pause_stock_trade(self, id: int):
|
||||
localTarget: strategy_db.TradeTarget = self.instrument_pool[id]
|
||||
print(f'暂停标的交易 {localTarget.stock_code} - enabled {localTarget.enabled}')
|
||||
if localTarget.stock_code in self.stock_trade_ctrl:
|
||||
tradeController: SFGridStrategy = self.stock_trade_ctrl[localTarget.stock_code]
|
||||
tradeTarget = tradeController.enabledTrading(False)
|
||||
self.instrument_pool[id] = tradeTarget
|
||||
event_bus.publish(ResultEventTradeDisabled, tradeTarget)
|
||||
else:
|
||||
print(f"标的交易控制器不存在 {tradeTarget.stock_code} {getInstrumentName(tradeTarget.stock_code)}\n")
|
||||
|
||||
print(f"标的交易控制器不存在 {localTarget.stock_code} {localTarget.stock_name}\n")
|
||||
|
||||
|
||||
# ====== 市场回调方法 -- 以下方法由XtQuantData调用 ======
|
||||
@@ -213,8 +258,8 @@ class SFGridController(XtQuantTraderCallback):
|
||||
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
|
||||
for id in self.instrument_pool:
|
||||
stock_code = self.instrument_pool[id].stock_code
|
||||
# 如果存在对应的StockTradeController,则调用其onDataUpdate方法
|
||||
if stock_code not in self.stock_trade_ctrl or stock_code not in data:
|
||||
# print(f"股票代码 {stock_code} 未在交易控制器中找到,跳过处理。\n")
|
||||
@@ -251,8 +296,8 @@ class SFGridController(XtQuantTraderCallback):
|
||||
else:
|
||||
print(f"委托下单回调 投资备注 orderId: {order.order_sysid} [{order.stock_code}-{order.instrument_name}] volume: {order.order_volume} 订单策略: '{order.strategy_name}'<-->'{ctrl.getName()}'")
|
||||
|
||||
def test_sim_trade(self, index: int, orderType: int):
|
||||
tradeTarget:strategy_db.TradeTarget = self.instrument_pool[index]
|
||||
def test_sim_trade(self, id: int, orderType: int):
|
||||
tradeTarget:strategy_db.TradeTarget = self.instrument_pool[id]
|
||||
ctrl:SFGridStrategy = self.stock_trade_ctrl[tradeTarget.stock_code]
|
||||
trade: XtTrade = None # type: ignore
|
||||
if orderType == xtconstant.STOCK_BUY:
|
||||
@@ -260,7 +305,7 @@ class SFGridController(XtQuantTraderCallback):
|
||||
sfgrid_constants.account_no,
|
||||
'300083.SZ',
|
||||
xtconstant.STOCK_BUY,
|
||||
1, 1, tradeTarget.current_buy_price, sfgrid_constants.grid_volume, 1000,
|
||||
1, 1, tradeTarget.plan_buy_price, sfgrid_constants.grid_volume, 1000,
|
||||
tradeTarget.current_buy_order_no,
|
||||
None, ctrl.getName(), None, None, None, None, None, tradeTarget.stock_name)
|
||||
else:
|
||||
@@ -306,5 +351,4 @@ class SFGridController(XtQuantTraderCallback):
|
||||
:param response: XtAccountStatus 对象
|
||||
:return:
|
||||
"""
|
||||
print(datetime.datetime.now(), sys._getframe().f_code.co_name)
|
||||
|
||||
print(datetime.datetime.now(), status)
|
||||
Reference in New Issue
Block a user