@363045841yyt/klinechart 0.6.5 → 0.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,189 @@
1
+ import { KLineData } from '../../types/price';
2
+ import { MAFlags, BOLLPoint, EXPMAPoint, ENEPoint, STOCHPoint, KSTPoint, MACDPoint } from './calculators';
3
+ export interface BOLLSchedulerConfig {
4
+ period: number;
5
+ multiplier: number;
6
+ showUpper: boolean;
7
+ showMiddle: boolean;
8
+ showLower: boolean;
9
+ showBand: boolean;
10
+ }
11
+ export interface EXPMASchedulerConfig {
12
+ fastPeriod: number;
13
+ slowPeriod: number;
14
+ }
15
+ export interface ENESchedulerConfig {
16
+ period: number;
17
+ deviation: number;
18
+ }
19
+ export interface RSISchedulerConfig {
20
+ period1: number;
21
+ period2: number;
22
+ period3: number;
23
+ showRSI1: boolean;
24
+ showRSI2: boolean;
25
+ showRSI3: boolean;
26
+ }
27
+ export interface CCISchedulerConfig {
28
+ period: number;
29
+ showCCI: boolean;
30
+ }
31
+ export interface STOCHSchedulerConfig {
32
+ n: number;
33
+ m: number;
34
+ showK: boolean;
35
+ showD: boolean;
36
+ }
37
+ export interface MOMSchedulerConfig {
38
+ period: number;
39
+ showMOM: boolean;
40
+ }
41
+ export interface WMSRSchedulerConfig {
42
+ period: number;
43
+ showWMSR: boolean;
44
+ }
45
+ export interface KSTSchedulerConfig {
46
+ roc1: number;
47
+ roc2: number;
48
+ roc3: number;
49
+ roc4: number;
50
+ signalPeriod: number;
51
+ showKST: boolean;
52
+ showSignal: boolean;
53
+ }
54
+ export interface FASTKSchedulerConfig {
55
+ period: number;
56
+ showFASTK: boolean;
57
+ }
58
+ export interface MACDSchedulerConfig {
59
+ fastPeriod: number;
60
+ slowPeriod: number;
61
+ signalPeriod: number;
62
+ showDIF: boolean;
63
+ showDEA: boolean;
64
+ showBAR: boolean;
65
+ }
66
+ export interface InitRequest {
67
+ type: 'init';
68
+ protocolVersion: number;
69
+ }
70
+ export interface SetDataRequest {
71
+ type: 'setData';
72
+ dataVersion: number;
73
+ format: 'aos' | 'soa';
74
+ data: KLineData[];
75
+ }
76
+ export interface SetConfigRequest {
77
+ type: 'setConfig';
78
+ configVersion: number;
79
+ configs: IndicatorConfigSnapshot;
80
+ }
81
+ export interface ComputeSeriesRequest {
82
+ type: 'computeSeries';
83
+ requestId: number;
84
+ dataVersion: number;
85
+ configVersion: number;
86
+ }
87
+ export interface DisposeRequest {
88
+ type: 'dispose';
89
+ }
90
+ export type IndicatorWorkerRequest = InitRequest | SetDataRequest | SetConfigRequest | ComputeSeriesRequest | DisposeRequest;
91
+ export interface ReadyResponse {
92
+ type: 'ready';
93
+ protocolVersion: number;
94
+ }
95
+ export interface SeriesResultResponse {
96
+ type: 'seriesResult';
97
+ requestId: number;
98
+ dataVersion: number;
99
+ configVersion: number;
100
+ results: IndicatorSeriesBundle;
101
+ metrics?: {
102
+ computeMs: number;
103
+ dataLength: number;
104
+ };
105
+ }
106
+ export interface ErrorResponse {
107
+ type: 'error';
108
+ requestId?: number;
109
+ stage: 'init' | 'setData' | 'setConfig' | 'computeSeries';
110
+ message: string;
111
+ }
112
+ export type IndicatorWorkerResponse = ReadyResponse | SeriesResultResponse | ErrorResponse;
113
+ export interface IndicatorConfigSnapshot {
114
+ ma: MAFlags;
115
+ boll: BOLLSchedulerConfig;
116
+ expma: EXPMASchedulerConfig;
117
+ ene: ENESchedulerConfig;
118
+ rsi: RSISchedulerConfig;
119
+ cci: CCISchedulerConfig;
120
+ stoch: STOCHSchedulerConfig;
121
+ mom: MOMSchedulerConfig;
122
+ wmsr: WMSRSchedulerConfig;
123
+ kst: KSTSchedulerConfig;
124
+ fastk: FASTKSchedulerConfig;
125
+ macd: MACDSchedulerConfig;
126
+ rsiPaneId: string;
127
+ cciPaneId: string;
128
+ stochPaneId: string;
129
+ momPaneId: string;
130
+ wmsrPaneId: string;
131
+ kstPaneId: string;
132
+ fastkPaneId: string;
133
+ macdPaneId: string;
134
+ }
135
+ export interface IndicatorSeriesBundle {
136
+ ma: {
137
+ series: Record<number, (number | undefined)[]>;
138
+ enabledPeriods: number[];
139
+ };
140
+ boll: {
141
+ series: BOLLPoint[];
142
+ params: BOLLSchedulerConfig;
143
+ };
144
+ expma: {
145
+ series: EXPMAPoint[];
146
+ params: EXPMASchedulerConfig;
147
+ };
148
+ ene: {
149
+ series: ENEPoint[];
150
+ params: ENESchedulerConfig;
151
+ };
152
+ rsi: {
153
+ series: Record<number, (number | undefined)[]>;
154
+ enabledPeriods: number[];
155
+ params: RSISchedulerConfig;
156
+ };
157
+ cci: {
158
+ series: (number | undefined)[];
159
+ params: CCISchedulerConfig;
160
+ };
161
+ stoch: {
162
+ series: STOCHPoint[];
163
+ params: STOCHSchedulerConfig;
164
+ };
165
+ mom: {
166
+ series: (number | undefined)[];
167
+ params: MOMSchedulerConfig;
168
+ };
169
+ wmsr: {
170
+ series: (number | undefined)[];
171
+ params: WMSRSchedulerConfig;
172
+ };
173
+ kst: {
174
+ series: KSTPoint[];
175
+ params: KSTSchedulerConfig;
176
+ };
177
+ fastk: {
178
+ series: (number | undefined)[];
179
+ params: FASTKSchedulerConfig;
180
+ };
181
+ macd: {
182
+ series: MACDPoint[];
183
+ params: MACDSchedulerConfig;
184
+ };
185
+ /** 本次计算中实际变更的指标列表 */
186
+ _changed: string[];
187
+ }
188
+ export declare const PROTOCOL_VERSION = 1;
189
+ export declare function isWorkerResponse(msg: unknown): msg is IndicatorWorkerResponse;
@@ -1,6 +1,5 @@
1
1
  import { RendererPluginWithHost } from '../../../plugin';
2
- /**
3
- * 创建 ENE(轨道线)渲染器插件(无状态版本)
2
+ /** 创建 ENE(轨道线)渲染器插件(无状态版本)
4
3
  *
5
4
  * 设计原则:
6
5
  * 1. 不持有任何计算缓存或配置状态
@@ -1,4 +1,4 @@
1
- import { RendererPluginWithHost } from '../../../plugin';
1
+ import { RendererPluginWithHost, PluginHost } from '../../../plugin';
2
2
  import { KLineData } from '../../../types/price';
3
3
  export interface MACDConfig {
4
4
  /** 快线周期(默认 12) */
@@ -36,8 +36,9 @@ export declare function calcMACDAtIndex(data: KLineData[], index: number, fastPe
36
36
  } | null;
37
37
  /**
38
38
  * 获取 MACD 标题信息(供 paneTitle 使用)
39
+ * 从 pluginHost 获取已计算好的数据,避免重复计算
39
40
  */
40
- export declare function getMACDTitleInfo(data: KLineData[], index: number, fastPeriod?: number, slowPeriod?: number, signalPeriod?: number): {
41
+ export declare function getMACDTitleInfo(index: number, fastPeriod: number, slowPeriod: number, signalPeriod: number, pluginHost: PluginHost, paneId?: string): {
41
42
  name: string;
42
43
  params: number[];
43
44
  values: Array<{
@@ -1,10 +1,12 @@
1
- import { RendererPlugin } from '../../../plugin';
1
+ import { RendererPluginWithHost } from '../../../plugin';
2
2
  export interface MACDLegendOptions {
3
3
  /** Y 轴内边距(与主图保持一致) */
4
4
  yPaddingPx?: number;
5
+ /** 目标 pane ID(默认 'sub') */
6
+ paneId?: string;
5
7
  }
6
8
  /**
7
9
  * 创建 MACD 图例渲染器插件
8
- * 在副图左上角显示当前 MACD 指标值
10
+ * StateStore 读取 MACD 状态,不再在 draw 时计算
9
11
  */
10
- export declare function createMACDLegendRendererPlugin(options?: MACDLegendOptions): RendererPlugin;
12
+ export declare function createMACDLegendRendererPlugin(options?: MACDLegendOptions): RendererPluginWithHost;
@@ -11,6 +11,19 @@ type LineStrip = {
11
11
  }>;
12
12
  width: number;
13
13
  };
14
+ type ColoredLineStrip = LineStrip & {
15
+ color: string;
16
+ };
17
+ type FilledBand = {
18
+ upperPoints: Array<{
19
+ x: number;
20
+ y: number;
21
+ }>;
22
+ lowerPoints: Array<{
23
+ x: number;
24
+ y: number;
25
+ }>;
26
+ };
14
27
  export declare class CandleWebGLSurface {
15
28
  private canvas;
16
29
  private handles;
@@ -36,12 +49,18 @@ export declare class LineWebGLSurface {
36
49
  private dpr;
37
50
  private available;
38
51
  private vertexCapacity;
52
+ private fillScratch;
53
+ private geoCache;
39
54
  constructor(canvas?: HTMLCanvasElement);
40
55
  isAvailable(): boolean;
41
56
  getCanvas(): HTMLCanvasElement;
42
57
  resize(width: number, height: number, dpr: number): void;
43
58
  clear(): void;
44
59
  drawLineStrip(line: LineStrip, color: string, scrollLeft: number): boolean;
60
+ drawLineStrips(lines: ColoredLineStrip[], scrollLeft: number): boolean;
61
+ private getThinLineVertices;
62
+ private getLineGeometry;
63
+ drawFilledBand(band: FilledBand, color: string, scrollLeft: number): boolean;
45
64
  destroy(): void;
46
65
  private initLineHandles;
47
66
  }
@@ -16,8 +16,8 @@ export interface ZoomResult {
16
16
  }
17
17
  /** 将缩放级别转换为 K 线宽度(逻辑像素) */
18
18
  export declare function zoomLevelToKWidth(level: number, config: ZoomConfig): number;
19
- /** DPR 推导 K 线间隙(逻辑像素) */
20
- export declare function kGapFromDpr(dpr: number): number;
19
+ /** 根据K线宽度和DPR推导间隙(逻辑像素),K线越窄间距越小 */
20
+ export declare function kGapFromKWidth(kWidth: number, dpr: number): number;
21
21
  /**
22
22
  * 缩放一级(+1 放大 / -1 缩小)
23
23
  * 返回新状态或 null(已达边界)
@@ -17,5 +17,11 @@ declare global {
17
17
  resetCanvasReport?: () => void;
18
18
  }
19
19
  }
20
+ /** 启用/禁用 Canvas Profiler */
21
+ export declare function setCanvasProfilerEnabled(enabled: boolean): void;
22
+ /** 获取 Canvas Profiler 启用状态 */
23
+ export declare function isCanvasProfilerEnabled(): boolean;
20
24
  export declare function installCanvasProfiler(): void;
25
+ /** 卸载 Canvas Profiler,恢复原始方法 */
26
+ export declare function uninstallCanvasProfiler(): void;
21
27
  export {};
@@ -51,7 +51,15 @@ export declare function formatMonthOrYear(timestamp: number): {
51
51
  * @example
52
52
  * monthKey(1736793600000) // "2025-1"
53
53
  */
54
- export declare function monthKey(timestamp: number): string;
54
+ /**
55
+ * 生成月份键值用于比较
56
+ * 返回数字 year * 12 + month,比字符串比较更快且无分配
57
+ * 使用 new Date 保证本地时区正确(与显示一致)
58
+ *
59
+ * @example
60
+ * monthKey(1736793600000) // 24301 (2025*12 + 0)
61
+ */
62
+ export declare function monthKey(timestamp: number): number;
55
63
  /**
56
64
  * formatDateToYYYYMMDD 的别名,保持与历史代码的兼容性
57
65
  * timestamp 是"上海时区当天 00:00:00"映射到 UTC 的值;显示时强制按上海时区格式化
@@ -68,13 +76,7 @@ export declare const formatShanghaiDate: typeof formatDateToYYYYMMDD;
68
76
  export declare const formatYMDShanghai: typeof formatDateToYYYYMMDD;
69
77
  /**
70
78
  * 查找每个月份第一个K线的索引
71
- * @param data - K线数据数组(按时间升序排列)
72
- * @returns 月边界索引数组,例如 [0, 30, 60] 表示第0、30、60个K线分别是每月的第一个交易日
73
- *
74
- * @example
75
- * // 假设数据:[1/2, 1/3, 2/1, 2/2, 3/1, 3/2]
76
- * findMonthBoundaries(data) // [0, 2, 4]
77
- * // 解释:第0个K线是1月第一个,第2个K线是2月第一个,第4个K线是3月第一个
79
+ * 结果按数据引用缓存,同一份数据多次调用直接返回缓存
78
80
  */
79
81
  export declare function findMonthBoundaries(data: Array<{
80
82
  timestamp: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@363045841yyt/klinechart",
3
- "version": "0.6.5",
3
+ "version": "0.6.8",
4
4
  "description": "A lightweight financial K-line charting library with first-class AI Agent support, crisp ResizeObserver-driven rendering, and plugin-based architecture. Focused on quantitative trading scenarios with TradingView-level interaction experience.",
5
5
  "author": "363045841 <slslswbsy@qq.com>",
6
6
  "license": "MIT",
@@ -12,6 +12,16 @@
12
12
  "homepage": "https://363045841.github.io/KLineChartQuant/",
13
13
  "keywords": [
14
14
  "kline-chart",
15
+ "plugin-architecture",
16
+ "webgl",
17
+ "high-performance",
18
+ "ai",
19
+ "crisp-rendering",
20
+ "sharp-rendering",
21
+ "agent",
22
+ "ai-chart",
23
+ "modern-ui",
24
+ "device-pixel-ratio",
15
25
  "candlestick-chart",
16
26
  "financial-chart",
17
27
  "tradingview",
@@ -23,19 +33,11 @@
23
33
  "chart-drawing",
24
34
  "trend-line",
25
35
  "fibonacci",
26
- "high-performance",
27
36
  "pixel-perfect",
28
- "crisp-rendering",
29
- "sharp-rendering",
30
- "device-pixel-ratio",
31
37
  "responsive",
32
- "modern-ui",
33
- "agent",
34
- "ai-chart",
35
38
  "visualization",
36
39
  "quantitative-trading",
37
40
  "technical-analysis",
38
- "plugin-architecture",
39
41
  "typescript"
40
42
  ],
41
43
  "type": "module",