From f1ef2702d72417bdcce9758d70e08291d2337d92 Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Wed, 18 Jun 2025 18:11:53 +0300 Subject: [PATCH] COB working excelent --- web/cob_dashboard.html | 49 +++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/web/cob_dashboard.html b/web/cob_dashboard.html index 3457035..3b390e3 100644 --- a/web/cob_dashboard.html +++ b/web/cob_dashboard.html @@ -655,7 +655,7 @@ // Use wider price range for higher resolution multipliers to maintain depth const baseRange = 0.02; // 2% base range - const expandedRange = baseRange * Math.max(1, resolutionMultiplier * 0.5); // Expand range for higher multipliers + const expandedRange = baseRange * Math.max(1, resolutionMultiplier * 2.5); // Very aggressive expansion const priceRange = midPrice * expandedRange; const minPrice = midPrice - priceRange; const maxPrice = midPrice + priceRange; @@ -664,23 +664,56 @@ function aggregateOrders(orders, isAsk = false) { const buckets = new Map(); - orders.forEach(order => { + // First, filter orders within the expanded price range + const filteredOrders = orders.filter(order => { + return order.price >= minPrice && order.price <= maxPrice && + (isAsk ? order.price >= midPrice : order.price <= midPrice); + }); + + // Aggregate into buckets + filteredOrders.forEach(order => { const bucketPrice = resolutionFunc(order.price); if (!buckets.has(bucketPrice)) { buckets.set(bucketPrice, { price: bucketPrice, volume: 0, - value: 0 + value: 0, + orderCount: 0 }); } const bucket = buckets.get(bucketPrice); bucket.volume += order.volume || 0; bucket.value += (order.volume || 0) * order.price; + bucket.orderCount += 1; }); - return Array.from(buckets.values()) - .filter(bucket => bucket.price >= minPrice && bucket.price <= maxPrice) - .filter(bucket => isAsk ? bucket.price >= midPrice : bucket.price <= midPrice); + // Convert to array and ensure minimum buckets + let result = Array.from(buckets.values()); + + // If we have very few buckets, create additional empty ones + if (result.length > 0 && result.length < 5) { + const bucketSize = resolutionMultiplier * (prefix === 'btc' ? 10 : 1); + const baseBucket = result[isAsk ? 0 : result.length - 1]; + + for (let i = 0; i < 8; i++) { // Create up to 8 additional buckets + const newPrice = isAsk + ? baseBucket.price + (bucketSize * (i + 1)) + : baseBucket.price - (bucketSize * (i + 1)); + + if (newPrice > 0 && + newPrice >= minPrice && newPrice <= maxPrice && + (isAsk ? newPrice >= midPrice : newPrice <= midPrice)) { + result.push({ + price: newPrice, + volume: 0, + value: 0, + orderCount: 0 + }); + } + } + } + + return result; } // Aggregate or use raw data based on resolution multiplier @@ -732,7 +765,7 @@ allOrders.push({ ...ask, side: 'ASK', - showPrice: index % 10 === 0, // Show every 10th price for readability + showPrice: resolutionMultiplier > 1 ? true : (index % 10 === 0), // Show every price when using multiplier volumePercent: (ask.volume / maxVolume) * 100 }); }); @@ -753,7 +786,7 @@ allOrders.push({ ...bid, side: 'BID', - showPrice: index % 10 === 0, // Show every 10th price for readability + showPrice: resolutionMultiplier > 1 ? true : (index % 10 === 0), // Show every price when using multiplier volumePercent: (bid.volume / maxVolume) * 100 }); });