187 lines
7.9 KiB
HTML
187 lines
7.9 KiB
HTML
<!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">×</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> |