| 層級 | 方案 | 代表庫/工具 |
|---|---|---|
| 渲染引擎 | Canvas 2D / WebGL / SVG | Canvas 2D 輕量、WebGL 高性能、SVG 交互友好 |
| 圖表庫 | 成熟開源庫 | ECharts、Highcharts、TradingView Lightweight Charts、uCharts、Apache ECharts |
| 數據源 | WebSocket / SSE / REST 分頁 | 實時推送或定時輪詢 |
| 十字光標/Tooltip | 滑鼠移動事件 + 坐標映射 + 數據插值 | 庫內建或自定義 Canvas 繪製 |
tooltip: { trigger: 'axis', axisPointer: { type: 'cross' } } 一行配置實現指示線。Highcharts.stockChart 開箱即用。<div id="chart" style="width:100%; height:500px"></div>
<script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
<script>
var chart = echarts.init(document.getElementById('chart'));
var option = {
tooltip: { trigger: 'axis', axisPointer: { type: 'cross' } }, // 十字光標
xAxis: { type: 'category', data: [] },
yAxis: { type: 'value', scale: true },
series: [{ type: 'candlestick', data: [] }],
dataZoom: [{ type: 'inside' }, { type: 'slider' }]
};
chart.setOption(option);
// WebSocket 接收實時 K 線
var ws = new WebSocket('wss://api.example.com/kline');
ws.onmessage = function(e) {
var k = JSON.parse(e.data); // {t: timestamp, o,h,l,c: prices}
chart.appendData([{ seriesIndex: 0, data: [[k.t, k.o, k.c, k.l, k.h]] }]);
};
</script>
setOption({ series: [{ data: newData }] }) 熱更新。不用重複造輪子,**直接使用 ECharts 或 TradingView Lightweight Charts**,配置 tooltip.axisPointer.type='cross' 即得十字光標。核心精力應放在實時數據清洗、WebSocket 重連、多周期同步、指標計算等業務邏輯上。