diff --git a/core/sfgrid/sfgrid_strategy.py b/core/sfgrid/sfgrid_strategy.py index 3142fe6..80676ad 100644 --- a/core/sfgrid/sfgrid_strategy.py +++ b/core/sfgrid/sfgrid_strategy.py @@ -31,6 +31,8 @@ class SFGridStrategy: def loadExistOrders(self): orders = qmtv.queryPendingOrder(self.tradeTarget.stock_code, self.getName()) # type: ignore for order in orders: + if order.strategy_name != self.getName(): + continue gridIdx = int(order.order_remark.split(',')[1]) self.orderGrid[gridIdx] = order.order_id PrintLog(LogLevel.INFO, f'|- 标的[{self.tradeTarget.targetName()}] 初始化: 加载现有订单, grid-{gridIdx} order_id:{self.orderGrid[gridIdx]}') @@ -44,16 +46,19 @@ class SFGridStrategy: return currentIdx:int = 0 + + orders = qmtv.queryPendingOrder(self.tradeTarget.stock_code, self.getName()) # type: ignore - if self.tradeTarget.status == 0: # status == 0 表示已配置好交易参数 + if self.tradeTarget.status == 0 and len([order for order in orders if order.order_remark == f'{OrderTypeInit},1,{self.tradeTarget.stock_code}']) == 0: # status == 0 表示已配置好交易参数,且不存在执行中的建仓单 price = self.tradeTarget.getPriceGrid()[0] + remark = f'{OrderTypeInit},1,{self.tradeTarget.stock_code}' tmpOrderSeq = qmtv.orderAsync( str(self.tradeTarget.stock_code), self.tradeTarget.grid_volume, xtconstant.STOCK_BUY, price, xtconstant.FIX_PRICE, - OrderTypeInit, # remark # type: ignore + remark, # remark # type: ignore self.getName(), # strategy_name ) self.orderGrid[1] = tmpOrderSeq # seq @@ -66,7 +71,7 @@ class SFGridStrategy: if currentIdx > 0: # 可以下空单 sellIdx = currentIdx - 1 sellPrice = self.tradeTarget.getPriceGrid()[sellIdx] - remark = f'{OrderTypeSell},{sellIdx}' + remark = f'{OrderTypeSell},{sellIdx},{self.tradeTarget.stock_code}' if len([order for order in orders if order.order_type == xtconstant.STOCK_SELL and order.price == sellPrice]) == 0: # 不存在策略内同价位订单,下单 tmpOrderSeq = qmtv.orderAsync( @@ -85,7 +90,7 @@ class SFGridStrategy: if currentIdx < len(self.tradeTarget.getPriceGrid()) - 1: # 可以下多单 buyIdx = currentIdx + 1 buyPrice = self.tradeTarget.getPriceGrid()[buyIdx] - remark = f'{OrderTypeBuy},{buyIdx}' + remark = f'{OrderTypeInit},{buyIdx},{self.tradeTarget.stock_code}' if len([order for order in orders if order.order_type == xtconstant.STOCK_BUY and order.price == buyPrice]) == 0: tmpOrderSeq = qmtv.orderAsync( str(self.tradeTarget.stock_code), @@ -144,54 +149,57 @@ class SFGridStrategy: return bool(self.tradeTarget.enabled) # 修复返回类型问题 def onOrderCreateAsync(self, response:XtOrderResponse): # 下单成功回调,更新orderID到 self.orderGrid + remark = response.order_remark.split(',') + stockCode = remark[2] # 从remark中获取stockCode + if response.strategy_name != self.getName() or len(remark) < 3 or self.tradeTarget.stock_code != stockCode: + return self.dataUpdateLock.acquire() try: - if response.strategy_name == self.getName() and response.seq == self.tradeTarget.current_order_no: - PrintLog(LogLevel.INFO, f"委托创建通知 onOrderCreateAsync[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}]: {response.order_id}") - idx = response.order_remark.split(',')[1] - self.orderGrid[idx] = response.order_id - PrintLog(LogLevel.INFO, f"委托创建通知 onOrderCreateAsync 更新 grid-{idx} seq:{response.seq} -> order_id:{response.order_id}") + gridIdx = remark[1] # 从remark中获取gridIdx + PrintLog(LogLevel.INFO, f"委托创建通知 onOrderCreateAsync[{self.tradeTarget.targetName()}]: {response.order_id}") + self.orderGrid[gridIdx] = response.order_id + PrintLog(LogLevel.INFO, f"委托创建通知 onOrderCreateAsync 更新 grid-{gridIdx} seq:{response.seq} -> order_id:{response.order_id}") except Exception as e: PrintLog(LogLevel.ERROR, f"|- 委托创建通知 onOrderCreateAsync[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}]: {response.order_id} - {str(e)}") finally: self.dataUpdateLock.release() def onOrderTrade(self, trade:XtTrade): # TODO 委托成交通知,处理成交后网格切换 - if trade.strategy_name != self.getName(): + remark = response.order_remark.split(',') + if trade.strategy_name != self.getName() or len(remark) < 3 or self.tradeTarget.stock_code != trade.stock_code: return PrintLog(LogLevel.INFO, f'|- 委托成交通知[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name}-{trade.order_id}] : {trade.order_id}') self.dataUpdateLock.acquire() try: + orderType = trade.order_remark.split(',')[0] + gridIdx = trade.order_remark.split(',')[1] # 从remark中获取gridIdx type:str = "" - if trade.order_remark == OrderTypeInit: + if orderType == OrderTypeInit: PrintLog(LogLevel.INFO, f'|- 委托成交通知[{self.tradeTarget.targetName()}-{trade.order_id}] - 建仓单成交') self.tradeTarget.status = 1 # type: ignore self.tradeTarget.init_price = trade.traded_price # type: ignore self.tradeTarget.grid_index = 1 # type: ignore - self.saveProxy() type = "建仓单" else: PrintLog(LogLevel.INFO, f'|- 委托成交通知[{self.tradeTarget.targetName()}-{trade.order_id}] - 网格单成交') oriIdx = self.tradeTarget.grid_index - for idx, tmpOrderNo in self.orderGrid.items(): - if tmpOrderNo == trade.order_id: - if idx > self.tradeTarget.grid_index: - type = "下移一格" - self.tradeTarget.grid_index +=1 - elif idx < self.tradeTarget.grid_index: - type = "上移一格" - self.tradeTarget.grid_match_count += 1 - self.tradeTarget.grid_total_profit += self.tradeTarget.grid_size * trade.traded_volume - self.tradeTarget.grid_index -= 1 - elif idx == self.tradeTarget.grid_index: - type = "保持格, 理论上不应该输出" - self.saveProxy() - break + if gridIdx > self.tradeTarget.grid_index: + type = "下移一格" + self.tradeTarget.grid_index +=1 + elif gridIdx < self.tradeTarget.grid_index: + type = "上移一格" + self.tradeTarget.grid_match_count += 1 + self.tradeTarget.grid_total_profit += self.tradeTarget.grid_size * trade.traded_volume + self.tradeTarget.grid_index -= 1 + elif gridIdx == self.tradeTarget.grid_index: + type = "保持格, 理论上不应该输出" PrintLog(LogLevel.INFO, f'|- 委托成交通知[{self.tradeTarget.stock_code}-{self.tradeTarget.stock_name} - 原网格位置 {oriIdx}, 现网格位置 {self.tradeTarget.grid_index}') + self.saveProxy() + del self.orderGrid[gridIdx] PrintLog(LogLevel.INFO, f"|- 成交报告[{self.tradeTarget.targetName()}] : ====================================") - PrintLog(LogLevel.INFO, f"|- 标的[{self.tradeTarget.targetName()}] {type}-单号{self.tradeTarget.current_order_no}已成交 ") + PrintLog(LogLevel.INFO, f"|- 标的[{self.tradeTarget.targetName()}] {type}-单号{trade.order_id}已成交 ") PrintLog(LogLevel.INFO, f' 成交价: {trade.traded_price} 成交量: {trade.traded_volume}') PrintLog(LogLevel.INFO, f' 手续费 : {trade.commission:.3f}') self.refreshGridOrder() # 更新网格订单 diff --git a/core/sfgrid/sfgrid_ui.py b/core/sfgrid/sfgrid_ui.py index f008fff..4417809 100644 --- a/core/sfgrid/sfgrid_ui.py +++ b/core/sfgrid/sfgrid_ui.py @@ -139,15 +139,12 @@ class TradeTargetUI(ttk.Frame): ttk.Label(toolbar_frame, text="监控配置").pack(side=tk.RIGHT, padx=(20, 2)) - PrintLog(LogLevel.INFO, "构建交易池列表") # 表格区域 self.create_tables_area(main_frame) - PrintLog(LogLevel.INFO, "启动UI刷新线程") # 启动刷新线程 self.refresh_thread = threading.Thread(target=self.refresh_loop, daemon=True) self.refresh_thread.start() - PrintLog(LogLevel.INFO, "UI刷新线程已启动") def refresh_loop(self):