TypeScript · 47 行
1import { useDS, StackedBars } from "@quant/runtime";
2import { movingAvg, aggregateByDay } from "@quant/utils";
3
4export default function BidAskRatio({ symbol = "2330", days = 30, showMA = true }) {
5 // 平台依 dataSpec 自動載入;模組只負責渲染。
6 const ticks = useDS({
7 kind: "tick-stream",
8 symbol,
9 range: `-${days}d`,
10 refresh: "1m",
11 });
12
13 const daily = aggregateByDay(ticks);
14 const ma5 = movingAvg(daily.map(d => d.innerPct), 5);
15
16 return (
17 <StackedBars
18 data={daily}
19 stacks={[
20 { key: "inner", color: "var(--up)", label: "內盤" },
21 { key: "outer", color: "var(--down)", label: "外盤" },
22 ]}
23 overlay={showMA && {
24 data: ma5,
25 color: "var(--brand)",
26 dash: true,
27 label: "5MA",
28 }}
29 />
30 );
31}
32
33export const meta = {
34 name: "內外盤比例",
35 description: "每分鐘 tick 內外盤量堆疊 + 5MA 比率線",
36 category: "chip",
37 sizeVariants: [[2,2], [4,2], [6,3]],
38 config: {
39 symbol: { type: "string", default: "2330" },
40 days: { type: "integer", default: 30, min: 1, max: 90 },
41 showMA: { type: "boolean", default: true },
42 },
43};