From 95426e222b29d0078655bd66708331d258eb4d32 Mon Sep 17 00:00:00 2001 From: discountry Date: Wed, 8 Oct 2025 02:34:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=BD=91=E6=A0=BC?= =?UTF-8?q?=E5=BC=95=E6=93=8E=EF=BC=8C=E4=BC=98=E5=8C=96=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=AE=A1=E5=88=92=E8=AE=A2=E5=8D=95=E8=AE=A1=E6=95=B0=E4=B8=8E?= =?UTF-8?q?=E5=94=AF=E4=B8=80=E6=80=A7=E6=A3=80=E6=9F=A5=E4=BB=A5=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E8=AE=A2=E5=8D=95=E7=AE=A1=E7=90=86=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/strategy/grid-engine.ts | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/strategy/grid-engine.ts b/src/strategy/grid-engine.ts index 43e3b12..899322b 100644 --- a/src/strategy/grid-engine.ts +++ b/src/strategy/grid-engine.ts @@ -593,6 +593,8 @@ export class GridEngine { // Desired open orders according to locked sides const desired: DesiredGridOrder[] = []; + const desiredKeySet = new Set(); + const plannedKeyCounts = new Map(activeKeyCounts); const halfTick = this.config.priceTick / 2; const activeKeySet = new Set( activeOrders.map((o) => this.getOrderKey(o.side, this.normalizePrice(o.price))) @@ -603,9 +605,11 @@ export class GridEngine { if (this.immediateCloseToPlace.length) { for (const item of this.immediateCloseToPlace) { const key = this.getOrderKey(item.side, item.price); - const count = activeKeyCounts.get(key) ?? 0; - if (count < 1) { + const count = plannedKeyCounts.get(key) ?? 0; + if (count < 1 && !desiredKeySet.has(key)) { desired.push({ level: item.targetLevel, side: item.side, price: item.price, amount: this.config.orderSize }); + desiredKeySet.add(key); + plannedKeyCounts.set(key, count + 1); } if (!this.closeKeyBySourceLevel.has(item.sourceLevel)) { this.closeKeyBySourceLevel.set(item.sourceLevel, key); @@ -623,8 +627,12 @@ export class GridEngine { if (this.pendingLongLevels.has(level)) continue; // wait until close filled const key = this.getOrderKey("BUY", this.formatPrice(levelPrice)); const targetMax = this.isCloseDesiredForSideAtLevel("BUY", level) ? 2 : 1; - if ((activeKeyCounts.get(key) ?? 0) >= targetMax) continue; - desired.push({ level, side: "BUY", price: this.formatPrice(levelPrice), amount: this.config.orderSize }); + if ((plannedKeyCounts.get(key) ?? 0) >= targetMax) continue; + if (!desiredKeySet.has(key)) { + desired.push({ level, side: "BUY", price: this.formatPrice(levelPrice), amount: this.config.orderSize }); + desiredKeySet.add(key); + plannedKeyCounts.set(key, (plannedKeyCounts.get(key) ?? 0) + 1); + } } // opens above price (SELL) @@ -635,8 +643,12 @@ export class GridEngine { if (this.pendingShortLevels.has(level)) continue; const key = this.getOrderKey("SELL", this.formatPrice(levelPrice)); const targetMax = this.isCloseDesiredForSideAtLevel("SELL", level) ? 2 : 1; - if ((activeKeyCounts.get(key) ?? 0) >= targetMax) continue; - desired.push({ level, side: "SELL", price: this.formatPrice(levelPrice), amount: this.config.orderSize }); + if ((plannedKeyCounts.get(key) ?? 0) >= targetMax) continue; + if (!desiredKeySet.has(key)) { + desired.push({ level, side: "SELL", price: this.formatPrice(levelPrice), amount: this.config.orderSize }); + desiredKeySet.add(key); + plannedKeyCounts.set(key, (plannedKeyCounts.get(key) ?? 0) + 1); + } } // close orders for pending levels (now non-reduce-only) @@ -645,8 +657,10 @@ export class GridEngine { if (target == null) continue; const priceStr = this.formatPrice(this.gridLevels[target]!); const closeKey = this.getOrderKey("SELL", priceStr); - if ((activeKeyCounts.get(closeKey) ?? 0) < 1) { + if ((plannedKeyCounts.get(closeKey) ?? 0) < 1 && !desiredKeySet.has(closeKey)) { desired.push({ level: target, side: "SELL", price: priceStr, amount: this.config.orderSize }); + desiredKeySet.add(closeKey); + plannedKeyCounts.set(closeKey, (plannedKeyCounts.get(closeKey) ?? 0) + 1); } if (!this.closeKeyBySourceLevel.has(source)) { this.closeKeyBySourceLevel.set(source, closeKey); @@ -657,8 +671,10 @@ export class GridEngine { if (target == null) continue; const priceStr = this.formatPrice(this.gridLevels[target]!); const closeKey = this.getOrderKey("BUY", priceStr); - if ((activeKeyCounts.get(closeKey) ?? 0) < 1) { + if ((plannedKeyCounts.get(closeKey) ?? 0) < 1 && !desiredKeySet.has(closeKey)) { desired.push({ level: target, side: "BUY", price: priceStr, amount: this.config.orderSize }); + desiredKeySet.add(closeKey); + plannedKeyCounts.set(closeKey, (plannedKeyCounts.get(closeKey) ?? 0) + 1); } if (!this.closeKeyBySourceLevel.has(source)) { this.closeKeyBySourceLevel.set(source, closeKey);