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
});
});