From de96fa5910d0680fddce7888202bb82c265fb239 Mon Sep 17 00:00:00 2001 From: discountry Date: Wed, 24 Sep 2025 02:56:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20MakerEngine=E3=80=81Offset?= =?UTF-8?q?MakerEngine=20=E5=92=8C=20TrendEngine=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=92=A4=E5=8D=95=E9=80=BB=E8=BE=91=E4=BB=A5=E6=B8=85?= =?UTF-8?q?=E7=90=86=E6=9C=AC=E5=9C=B0=E7=BC=93=E5=AD=98=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E8=AE=A2=E5=8D=95=EF=BC=8C=E7=A1=AE=E4=BF=9D?= =?UTF-8?q?=E5=9C=A8=E8=AE=A2=E5=8D=95=E6=B5=81=E6=8E=A8=E9=80=81=E9=87=8D?= =?UTF-8?q?=E5=BB=BA=E6=97=B6=E7=8A=B6=E6=80=81=E4=B8=80=E8=87=B4=E6=80=A7?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/maker-engine.ts | 3 +++ src/core/offset-maker-engine.ts | 4 ++++ src/core/trend-engine.ts | 13 +++++++++++++ 3 files changed, 20 insertions(+) diff --git a/src/core/maker-engine.ts b/src/core/maker-engine.ts index f2ce301..e9a33d1 100644 --- a/src/core/maker-engine.ts +++ b/src/core/maker-engine.ts @@ -288,6 +288,7 @@ export class MakerEngine { } else { this.tradeLog.push("error", `撤销订单失败: ${String(error)}`); this.pendingCancelOrders.delete(order.orderId); + this.openOrders = this.openOrders.filter((existing) => existing.orderId !== order.orderId); } } } @@ -386,6 +387,8 @@ export class MakerEngine { } else { this.tradeLog.push("error", `撤销订单失败: ${String(error)}`); this.pendingCancelOrders.delete(order.orderId); + // 与偏移做市保持一致:移除本地缓存中的异常订单,等待订单流推送重建 + this.openOrders = this.openOrders.filter((existing) => existing.orderId !== order.orderId); } } } diff --git a/src/core/offset-maker-engine.ts b/src/core/offset-maker-engine.ts index 797f64d..a207ae6 100644 --- a/src/core/offset-maker-engine.ts +++ b/src/core/offset-maker-engine.ts @@ -374,6 +374,8 @@ export class OffsetMakerEngine { } else { this.tradeLog.push("error", `撤销订单失败: ${String(error)}`); this.pendingCancelOrders.delete(order.orderId); + // 避免同一轮内重复操作同一张已出错的本地挂单,直接从本地缓存移除,等待下一次订单推送重建 + this.openOrders = this.openOrders.filter((existing) => existing.orderId !== order.orderId); } } } @@ -472,6 +474,8 @@ export class OffsetMakerEngine { } else { this.tradeLog.push("error", `撤销订单失败: ${String(error)}`); this.pendingCancelOrders.delete(order.orderId); + // 与同步撤单路径保持一致,移除本地异常订单,等待订单流重建 + this.openOrders = this.openOrders.filter((existing) => existing.orderId !== order.orderId); } } } diff --git a/src/core/trend-engine.ts b/src/core/trend-engine.ts index ff5ec4e..97991b6 100644 --- a/src/core/trend-engine.ts +++ b/src/core/trend-engine.ts @@ -252,10 +252,16 @@ export class TrendEngine { try { await this.exchange.cancelAllOrders({ symbol: this.config.symbol }); this.cancelAllRequested = true; + // 清空本地挂单与撤单队列,避免在下一轮中基于过期快照继续操作 + this.pendingCancelOrders.clear(); + this.openOrders = []; } catch (err) { if (isUnknownOrderError(err)) { this.tradeLog.push("order", "撤单时部分订单已不存在,忽略"); this.cancelAllRequested = true; + // 与成功撤单路径保持一致,立即清空本地缓存,等待订单流推送重建 + this.pendingCancelOrders.clear(); + this.openOrders = []; } else { this.tradeLog.push("error", `撤销挂单失败: ${String(err)}`); this.cancelAllRequested = false; @@ -379,6 +385,11 @@ export class TrendEngine { } catch (err) { if (isUnknownOrderError(err)) { this.tradeLog.push("order", "止损前撤单发现订单已不存在"); + // 清理本地缓存,避免重复对同一订单执行撤单 + for (const id of orderIdList) { + this.pendingCancelOrders.delete(id); + } + this.openOrders = this.openOrders.filter((o) => !orderIdList.includes(o.orderId)); } else { throw err; } @@ -446,6 +457,8 @@ export class TrendEngine { } catch (err) { if (isUnknownOrderError(err)) { this.tradeLog.push("order", "原止损单已不存在,跳过撤销"); + // 订单已不存在,移除本地记录,防止后续重复匹配 + this.openOrders = this.openOrders.filter((o) => o.orderId !== currentOrder.orderId); } else { this.tradeLog.push("error", `取消原止损单失败: ${String(err)}`); }