This commit is contained in:
Dobromir Popov
2025-08-04 20:28:48 +03:00
parent fd6ec4eb40
commit 42cf02cf3a
6 changed files with 1226 additions and 0 deletions

187
COBY/web/static/index.html Normal file
View File

@ -0,0 +1,187 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>COBY - Market Data Dashboard</title>
<link rel="stylesheet" href="/static/css/dashboard.css">
<link rel="stylesheet" href="/static/css/heatmap.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://unpkg.com/d3@7"></script>
</head>
<body>
<div id="app">
<!-- Header -->
<header class="dashboard-header">
<div class="header-content">
<h1 class="logo">COBY</h1>
<div class="header-info">
<span class="connection-status" id="connectionStatus">Connecting...</span>
<span class="last-update" id="lastUpdate">Never</span>
</div>
</div>
</header>
<!-- Main Dashboard -->
<main class="dashboard-main">
<!-- Symbol Selector -->
<div class="symbol-selector">
<select id="symbolSelect" class="symbol-dropdown">
<option value="BTCUSDT">BTC/USDT</option>
<option value="ETHUSDT">ETH/USDT</option>
</select>
<div class="exchange-toggles" id="exchangeToggles">
<!-- Exchange toggles will be populated dynamically -->
</div>
</div>
<!-- Market Overview Cards -->
<div class="market-overview">
<div class="metric-card">
<h3>Mid Price</h3>
<div class="metric-value" id="midPrice">--</div>
<div class="metric-change" id="priceChange">--</div>
</div>
<div class="metric-card">
<h3>Spread</h3>
<div class="metric-value" id="spread">--</div>
<div class="metric-change" id="spreadChange">--</div>
</div>
<div class="metric-card">
<h3>Volume Imbalance</h3>
<div class="metric-value" id="volumeImbalance">--</div>
<div class="imbalance-bar" id="imbalanceBar"></div>
</div>
<div class="metric-card">
<h3>Liquidity Score</h3>
<div class="metric-value" id="liquidityScore">--</div>
<div class="liquidity-indicator" id="liquidityIndicator"></div>
</div>
</div>
<!-- Main Heatmap Container -->
<div class="heatmap-container">
<div class="heatmap-header">
<h2>Order Book Heatmap</h2>
<div class="heatmap-controls">
<button class="control-btn" id="zoomInBtn">Zoom In</button>
<button class="control-btn" id="zoomOutBtn">Zoom Out</button>
<button class="control-btn" id="resetZoomBtn">Reset</button>
<label class="control-label">
<input type="checkbox" id="smoothingToggle"> Smoothing
</label>
</div>
</div>
<div class="heatmap-wrapper">
<div class="price-axis" id="priceAxis"></div>
<div class="heatmap-canvas-container">
<canvas id="heatmapCanvas" width="800" height="600"></canvas>
<div class="heatmap-overlay" id="heatmapOverlay"></div>
</div>
<div class="volume-axis" id="volumeAxis"></div>
</div>
<div class="heatmap-legend">
<div class="legend-item">
<div class="legend-color bid-color"></div>
<span>Bids</span>
</div>
<div class="legend-item">
<div class="legend-color ask-color"></div>
<span>Asks</span>
</div>
<div class="intensity-scale">
<span>Low</span>
<div class="intensity-gradient"></div>
<span>High</span>
</div>
</div>
</div>
<!-- Side Panels -->
<div class="side-panels">
<!-- Order Book Panel -->
<div class="panel order-book-panel">
<h3>Order Book</h3>
<div class="order-book-container">
<div class="asks-section">
<div class="section-header">Asks</div>
<div class="order-levels" id="askLevels"></div>
</div>
<div class="spread-indicator" id="spreadIndicator">
<span class="spread-value">Spread: --</span>
</div>
<div class="bids-section">
<div class="section-header">Bids</div>
<div class="order-levels" id="bidLevels"></div>
</div>
</div>
</div>
<!-- Exchange Status Panel -->
<div class="panel exchange-status-panel">
<h3>Exchange Status</h3>
<div class="exchange-list" id="exchangeList">
<!-- Exchange status items will be populated dynamically -->
</div>
</div>
<!-- Statistics Panel -->
<div class="panel stats-panel">
<h3>Statistics</h3>
<div class="stats-grid" id="statsGrid">
<div class="stat-item">
<span class="stat-label">Updates/sec</span>
<span class="stat-value" id="updatesPerSec">0</span>
</div>
<div class="stat-item">
<span class="stat-label">Total Points</span>
<span class="stat-value" id="totalPoints">0</span>
</div>
<div class="stat-item">
<span class="stat-label">Bid Points</span>
<span class="stat-value" id="bidPoints">0</span>
</div>
<div class="stat-item">
<span class="stat-label">Ask Points</span>
<span class="stat-value" id="askPoints">0</span>
</div>
</div>
</div>
</div>
</main>
<!-- Footer -->
<footer class="dashboard-footer">
<div class="footer-content">
<span>COBY Market Data Dashboard v1.0</span>
<span id="systemStatus">System: Online</span>
</div>
</footer>
</div>
<!-- Loading Overlay -->
<div id="loadingOverlay" class="loading-overlay">
<div class="loading-spinner"></div>
<div class="loading-text">Loading market data...</div>
</div>
<!-- Error Modal -->
<div id="errorModal" class="modal">
<div class="modal-content">
<div class="modal-header">
<h3>Error</h3>
<button class="modal-close" id="errorModalClose">&times;</button>
</div>
<div class="modal-body">
<p id="errorMessage">An error occurred</p>
</div>
</div>
</div>
<!-- Scripts -->
<script src="/static/js/websocket-client.js"></script>
<script src="/static/js/heatmap-renderer.js"></script>
<script src="/static/js/dashboard-controller.js"></script>
<script src="/static/js/app.js"></script>
</body>
</html>