From bd7a6e3048b6b4895391d5a99dcb20c6c034392c Mon Sep 17 00:00:00 2001 From: "GDP\\solonot" Date: Fri, 31 Oct 2025 18:11:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8F=82=E6=95=B0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.ini | 6 ++++++ core/main_controller.py | 20 ++++++++++-------- core/sfgrid_trade_controller.py | 14 ++++++------- core/strategy_db.py | 3 +++ example.db | Bin 12288 -> 12288 bytes sfgrid_constants.py | 36 +++++++++++++++++--------------- 6 files changed, 46 insertions(+), 33 deletions(-) create mode 100644 config.ini diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..dcaccbd --- /dev/null +++ b/config.ini @@ -0,0 +1,6 @@ +[config] +miniQMTPath=D:\Programs\DTQMT\userdata_mini +grid_price=1.665,1.660,1.655,1.650,1.645,1.640,1.635,1.630,1.625,1.620,1.615 +grid_volume = 100 +account_no = '99082560' +max_enabled_targets = 10 ; not enabled this limitation \ No newline at end of file diff --git a/core/main_controller.py b/core/main_controller.py index 5fa7601..6708dee 100644 --- a/core/main_controller.py +++ b/core/main_controller.py @@ -19,10 +19,12 @@ import datetime class SFGridController(XtQuantTraderCallback): def __init__(self, account_no: str, miniQmtPath: str): super().__init__() + + sfgrid_constants.initConfig() xtdata.enable_hello = False strategy_db.db.connect() strategy_db.db.create_tables([strategy_db.TradeTarget]) - print('- 数据库模块初始化完成') + print('- [成功]数据库模块初始化') session_id = int(time.time()) @@ -30,16 +32,16 @@ class SFGridController(XtQuantTraderCallback): self.xt_trader.register_callback(self) self.xt_trader.start() connect_result = self.xt_trader.connect() - print(f'- 市场交易连接{connect_result}: {'成功' if self.xt_trader.connected else '失败'}') + print(f'- [{'成功' if self.xt_trader.connected else '失败'}]市场交易连接{connect_result}:') self.account= StockAccount(account_no, 'STOCK') - print(f'- 交易账号对象初始化完成, 账号: {self.account.account_id}') + print(f'- [成功]交易账号对象初始化完成, 账号: {self.account.account_id}') subscribe_result = self.xt_trader.subscribe(self.account) - print(f'- 交易状态订阅{'成功' if subscribe_result == 0 else '失败'}') + print(f'- [{'成功' if subscribe_result == 0 else '失败'}]交易状态订阅') self.stock_trade_ctrl = {} self.init_instrument_pool(self.xt_trader, self.account) self.seq = None - print('- 三疯交易系统初始化完成') + print('- [成功]三疯交易系统初始化完成') def startMarketData(self): @@ -105,20 +107,20 @@ class SFGridController(XtQuantTraderCallback): stockTradeController = StockTradeController(tradeTarget, self.xt_trader, self.account, tradeTarget.enabled) self.stock_trade_ctrl[tradeTarget.stock_code] = stockTradeController - print(f'- 初始化标的池初始化完成 , 共 {len(self.instrument_pool)} 个标的') + 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): - print("- 标的池信息") + print("- [信息]标的池信息") for i in range(len(self.instrument_pool)): target: strategy_db.TradeTarget = self.instrument_pool[i] 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} Price {sfgrid_constants.grid_price[target.grid_index]} 状态: {status} 启用交易线程: {target.enabled}') + 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 '交易已停止'}') def print_position_info(self): positions = self.xt_trader.query_stock_positions(self.account) diff --git a/core/sfgrid_trade_controller.py b/core/sfgrid_trade_controller.py index 8d3f308..8d4e73a 100644 --- a/core/sfgrid_trade_controller.py +++ b/core/sfgrid_trade_controller.py @@ -30,21 +30,21 @@ class StockTradeController: self.xt_trader.cancel_order_stock(self.account, order.order_id) if enabled: - print(f" |- 标的交易启动 {self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}, position {self.tradeTarget.current_position}") + print(f" |- 标的{self.tradeTarget.targetName()}交易启动, position {self.tradeTarget.current_position}") # 建仓状态检查 if self.tradeTarget.current_position == 0 and self.tradeTarget.status == 0: - print(f" |- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 建初始仓 买单准备中...") self.tradeTarget.grid_index = 1 self.tradeTarget.save() self.init_stock_position() - 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}") + print(f" |- 标的{self.tradeTarget.targetName()}建初始仓 买单已发出 InitBuyOrderId: {self.initBuyOrderId} Price: {sfgrid_constants.grid_price[self.tradeTarget.grid_index]} Volume: {sfgrid_constants.grid_volume}") else: # 交易阶段,检查仓位,检查现有订单 - print(f" |- 标的{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} 已有仓位或非初始状态 无需建初始仓 当前仓位: {self.tradeTarget.current_position} 状态: {self.tradeTarget.status}") - if sfgrid_constants.grid_volume * self.tradeTarget.grid_index <= self.tradeTarget.current_position: - print(f' |- 仓位检查: 持仓需求充足, (gridVolume*gridIndex)={sfgrid_constants.grid_volume * self.tradeTarget.grid_index}, 当前持仓:{self.tradeTarget.current_position}') + print(f" |- 标的{self.tradeTarget.targetName()}已有仓位或非初始状态 无需建初始仓 当前仓位: {self.tradeTarget.current_position} 状态: {self.tradeTarget.status}") + minRequirePosition:int = sfgrid_constants.grid_volume * self.tradeTarget.grid_index + if minRequirePosition <= self.tradeTarget.current_position: + print(f' |- 仓位检查: 持仓需求充足, (gridVolume*gridIndex)={minRequirePosition}, 当前持仓:{self.tradeTarget.current_position}') else: - print(f' |- 仓位检查: 持仓需求不足, (gridVolume*gridIndex)={sfgrid_constants.grid_volume * self.tradeTarget.grid_index}, 当前持仓:{self.tradeTarget.current_position}') + print(f' |- 仓位检查: 持仓需求不足, (gridVolume*gridIndex)={minRequirePosition}, 当前持仓:{self.tradeTarget.current_position}') if is_trading_time(): self.two_way_order(True, True) diff --git a/core/strategy_db.py b/core/strategy_db.py index 4986488..afaf972 100644 --- a/core/strategy_db.py +++ b/core/strategy_db.py @@ -21,3 +21,6 @@ class TradeTarget(BaseModel): current_sell_order_no = CharField(default='') status = IntegerField(default=0) # 0表示新标的,1表示已建初始仓,正常交易中 enabled = BooleanField(default=False) # 是否启动交易线程 + + def targetName(self): + return f'{self.stock_name}[{self.stock_code}]' diff --git a/example.db b/example.db index dc9205d220186f97f271c1978d243cbbfd0126c4..f9d6fcf2433ceab4355733057db5969c1bd368ed 100644 GIT binary patch delta 198 zcmZojXh@hK#l-x2qKp%e+?cSCpPPY!fsubZ1OImZzRf%WP5kvr%)AWpsvMjg9K0O7 zoSdeH#s;Padcht~cC3B2tm#Q0Sel8^li3}jkdcF3kzEl};jT$98mF+>|EhZEzD}gt z$iUFV*wDn()WH7N;_Fe7c}BR+%&0s700=be delta 127 zcmZojXh@hK#l(1OqKp%e+?cSCpPT;<10(-#2L9dryEpR)H1SVt&{dUZ;$@JR=iubv z-~~cXV*>*N3uC?DsHYvXpX`|SeAg-l1_qUhg$g`eKn5fKCkFmc{7*OYDBR$eVc=z! LXM}4&;V=OJ)>9zF diff --git a/sfgrid_constants.py b/sfgrid_constants.py index f781c07..6feaa77 100644 --- a/sfgrid_constants.py +++ b/sfgrid_constants.py @@ -1,20 +1,22 @@ +import configparser + # miniQMTPath = r'D:\\Programs\\DTQMT_MN\\userdata_mini' # miniQMT软件的安装路径 -miniQMTPath = r'D:\\Programs\\DTQMT\\userdata_mini' +miniQMTPath = 'D:\\Programs\\DTQMT\\userdata_mini' # grid_price = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1] # 网格价格设置,从高到低 -grid_price = [ - 1.665, - 1.660, - 1.655, - 1.650, - 1.645, - 1.640, - 1.635, - 1.630, - 1.625, - 1.620, - 1.615 - ] # 网格价格设置,从高到低 -grid_volume = 200 # 每个网格的交易手数 -account_no = '99082560' +grid_price = [] # 网格价格设置,从高到低 +grid_volume:int = 100 # 每个网格的交易手数 +account_no:str = '' # account_no = '89009170' # 交易账号 -max_enabled_targets = 10 \ No newline at end of file +max_enabled_targets:int = 10 + +def initConfig(): + global miniQMTPath, grid_price, grid_volume, account_no, max_enabled_targets + config = configparser.ConfigParser() + config.read('config.ini') + miniQMTPath = config.get('config','miniQMTPath') + str_list = config.get('config','grid_price').split(',') + grid_price = [float(item) for item in str_list] + print(f'网格设置:{grid_price}') + grid_volume = config.getint('config','grid_volume') + account_no = config.get('config','account_no') + max_enabled_targets = config.getint('config','max_enabled_targets')