@363045841yyt/klinechart 0.1.4 → 0.2.0
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.
- package/README.md +142 -243
- package/dist/components/IndicatorParams.vue.d.ts +28 -0
- package/dist/components/IndicatorSelector.vue.d.ts +10 -0
- package/dist/components/KLineChart.vue.d.ts +14 -17
- package/dist/components/MarkerTooltip.vue.d.ts +10 -0
- package/dist/core/chart.d.ts +84 -47
- package/dist/core/controller/interaction.d.ts +56 -18
- package/dist/core/layout/pane.d.ts +2 -0
- package/dist/core/marker/registry.d.ts +174 -0
- package/dist/core/paneRenderer.d.ts +7 -40
- package/dist/core/renderers/Indicator/boll.d.ts +28 -0
- package/dist/core/renderers/Indicator/bollLegend.d.ts +16 -0
- package/dist/core/renderers/Indicator/cci.d.ts +34 -0
- package/dist/core/renderers/Indicator/fastk.d.ts +34 -0
- package/dist/core/renderers/Indicator/index.d.ts +31 -0
- package/dist/core/renderers/Indicator/kst.d.ts +49 -0
- package/dist/core/renderers/Indicator/ma.d.ts +12 -0
- package/dist/core/renderers/Indicator/maLegend.d.ts +9 -0
- package/dist/core/renderers/Indicator/macd.d.ts +46 -0
- package/dist/core/renderers/Indicator/macdLegend.d.ts +10 -0
- package/dist/core/renderers/Indicator/mom.d.ts +34 -0
- package/dist/core/renderers/Indicator/rsi.d.ts +42 -0
- package/dist/core/renderers/Indicator/stoch.d.ts +43 -0
- package/dist/core/renderers/Indicator/wmsr.d.ts +34 -0
- package/dist/core/renderers/candle.d.ts +17 -4
- package/dist/core/renderers/crosshair.d.ts +13 -20
- package/dist/core/renderers/customMarkers.d.ts +6 -0
- package/dist/core/renderers/extremaMarkers.d.ts +3 -4
- package/dist/core/renderers/globalBorders.d.ts +8 -13
- package/dist/core/renderers/gridLines.d.ts +4 -3
- package/dist/core/renderers/lastPrice.d.ts +3 -3
- package/dist/core/renderers/paneTitle.d.ts +37 -10
- package/dist/core/renderers/subVolume.d.ts +7 -3
- package/dist/core/renderers/timeAxis.d.ts +9 -22
- package/dist/core/renderers/yAxis.d.ts +5 -12
- package/dist/core/scale/priceScale.d.ts +1 -0
- package/dist/core/theme/colors.d.ts +80 -0
- package/dist/core/utils/klineConfig.d.ts +28 -0
- package/dist/core/utils/tickCount.d.ts +7 -0
- package/dist/core/viewport/viewport.d.ts +5 -5
- package/dist/index.cjs +16 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +10540 -1064
- package/dist/klinechart.css +1 -1
- package/dist/plugin/ConfigManager.d.ts +31 -0
- package/dist/plugin/EventBus.d.ts +34 -0
- package/dist/plugin/HookSystem.d.ts +28 -0
- package/dist/plugin/PluginHost.d.ts +47 -0
- package/dist/plugin/PluginRegistry.d.ts +40 -0
- package/dist/plugin/index.d.ts +11 -0
- package/dist/plugin/rendererPluginManager.d.ts +73 -0
- package/dist/plugin/types.d.ts +185 -0
- package/dist/semantic/controller.d.ts +29 -0
- package/dist/semantic/drawShape.d.ts +14 -0
- package/dist/semantic/index.d.ts +8 -0
- package/dist/semantic/schema.json.d.ts +259 -0
- package/dist/semantic/types.d.ts +185 -0
- package/dist/semantic/validator.d.ts +42 -0
- package/dist/types/volumePrice.d.ts +26 -0
- package/dist/utils/kLineDraw/MA.d.ts +5 -5
- package/dist/utils/logger.d.ts +1 -0
- package/dist/utils/volumePrice.d.ts +54 -0
- package/package.json +11 -10
- package/dist/core/renderers/crosshairLabels.d.ts +0 -36
- package/dist/core/renderers/grid.d.ts +0 -6
- package/dist/core/renderers/ma.d.ts +0 -15
- package/dist/core/renderers/maLegend.d.ts +0 -19
- package/dist/core/renderers/paneBorder.d.ts +0 -26
- package/dist/core/renderers/paneSeparator.d.ts +0 -18
package/dist/core/chart.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { KLineData } from '../types/price';
|
|
2
|
-
import {
|
|
2
|
+
import { VisibleRange } from './layout/pane';
|
|
3
3
|
import { InteractionController } from './controller/interaction';
|
|
4
4
|
import { PaneRenderer } from './paneRenderer';
|
|
5
|
+
import { MarkerManager, CustomMarkerEntity } from './marker/registry';
|
|
6
|
+
import { getPhysicalKLineConfig, calcKWidthPx } from './utils/klineConfig';
|
|
7
|
+
import { PluginHostImpl, RendererPlugin, RendererPluginWithHost } from '../plugin';
|
|
8
|
+
import { SubIndicatorType } from './renderers/Indicator';
|
|
9
|
+
export { getPhysicalKLineConfig, calcKWidthPx };
|
|
5
10
|
/**
|
|
6
11
|
* 图表 DOM 元素引用
|
|
7
12
|
* @property container 图表容器 div
|
|
@@ -19,10 +24,12 @@ export type ChartDom = {
|
|
|
19
24
|
* Pane 面板配置
|
|
20
25
|
* @property id Pane 标识符
|
|
21
26
|
* @property ratio Pane 高度占比
|
|
27
|
+
* @property visible 是否可见(默认 true)
|
|
22
28
|
*/
|
|
23
29
|
export type PaneSpec = {
|
|
24
30
|
id: string;
|
|
25
31
|
ratio: number;
|
|
32
|
+
visible?: boolean;
|
|
26
33
|
};
|
|
27
34
|
export type PaneRendererDom = {
|
|
28
35
|
plotCanvas: HTMLCanvasElement;
|
|
@@ -42,30 +49,6 @@ export type ChartOptions = {
|
|
|
42
49
|
/** 价格标签额外宽度(用于显示涨跌幅,默认 60px) */
|
|
43
50
|
priceLabelWidth?: number;
|
|
44
51
|
};
|
|
45
|
-
/**
|
|
46
|
-
* 计算奇数化后的 K 线宽度(物理像素),确保影线能完美居中显示
|
|
47
|
-
* @param kWidth K 线宽度(逻辑像素)
|
|
48
|
-
* @param dpr 设备像素比
|
|
49
|
-
* @returns 奇数化后的物理像素宽度
|
|
50
|
-
*/
|
|
51
|
-
export declare function calcKWidthPx(kWidth: number, dpr: number): number;
|
|
52
|
-
/**
|
|
53
|
-
* 获取图表渲染使用的物理像素配置
|
|
54
|
-
* @param kWidth K 线宽度(逻辑像素)
|
|
55
|
-
* @param kGap K 线间隙(逻辑像素)
|
|
56
|
-
* @param dpr 设备像素比
|
|
57
|
-
* @returns 物理像素和逻辑像素的配置对象
|
|
58
|
-
*/
|
|
59
|
-
export declare function getPhysicalKLineConfig(kWidth: number, kGap: number, dpr: number): {
|
|
60
|
-
kWidthPx: number;
|
|
61
|
-
kGapPx: number;
|
|
62
|
-
unitPx: number;
|
|
63
|
-
startXPx: number;
|
|
64
|
-
kWidthLogical: number;
|
|
65
|
-
kGapLogical: number;
|
|
66
|
-
unitLogical: number;
|
|
67
|
-
startXLogical: number;
|
|
68
|
-
};
|
|
69
52
|
/** K 线起始 x 坐标数组,positions[i] 表示第 i 根 K 线的起始 x 坐标(逻辑像素) */
|
|
70
53
|
export type KLinePositions = number[];
|
|
71
54
|
export type Viewport = {
|
|
@@ -83,14 +66,33 @@ export declare class Chart {
|
|
|
83
66
|
private raf;
|
|
84
67
|
private viewport;
|
|
85
68
|
private paneRenderers;
|
|
69
|
+
private markerManager;
|
|
86
70
|
readonly interaction: InteractionController;
|
|
71
|
+
/** 插件宿主 */
|
|
72
|
+
private pluginHost;
|
|
73
|
+
/** 渲染器插件管理器 */
|
|
74
|
+
private rendererPluginManager;
|
|
87
75
|
/**
|
|
88
76
|
* 创建图表实例
|
|
89
77
|
* @param dom 由 Vue 组件传入的 DOM 句柄
|
|
90
78
|
* @param opt 初始配置
|
|
91
79
|
*/
|
|
92
80
|
constructor(dom: ChartDom, opt: ChartOptions);
|
|
93
|
-
/**
|
|
81
|
+
/** 获取插件宿主 */
|
|
82
|
+
get plugin(): PluginHostImpl;
|
|
83
|
+
/** 安装渲染器插件 */
|
|
84
|
+
useRenderer(plugin: RendererPlugin | RendererPluginWithHost, config?: Record<string, unknown>): void;
|
|
85
|
+
/** 移除渲染器插件 */
|
|
86
|
+
removeRenderer(name: string): void;
|
|
87
|
+
/** 获取渲染器插件 */
|
|
88
|
+
getRenderer<T extends RendererPlugin = RendererPlugin>(name: string): T | undefined;
|
|
89
|
+
/** 更新渲染器配置(自动重绘) */
|
|
90
|
+
updateRendererConfig(name: string, config: Record<string, unknown>): void;
|
|
91
|
+
/** 启用/禁用渲染器 */
|
|
92
|
+
setRendererEnabled(name: string, enabled: boolean): void;
|
|
93
|
+
/** 获取所有渲染器 */
|
|
94
|
+
getAllRenderers(): RendererPlugin[];
|
|
95
|
+
/** 绘制一帧 */
|
|
94
96
|
draw(): void;
|
|
95
97
|
/**
|
|
96
98
|
* 以鼠标位置为中心缩放 K 线,保持鼠标指向的 K 线位置不变
|
|
@@ -99,6 +101,13 @@ export declare class Chart {
|
|
|
99
101
|
* @param deltaY 滚动方向(大于 0 缩小,小于 0 放大)
|
|
100
102
|
*/
|
|
101
103
|
zoomAt(mouseX: number, scrollLeft: number, deltaY: number): void;
|
|
104
|
+
/**
|
|
105
|
+
* 由外部(Vue 组件)在 scrollLeft 落地后调用,原子性地应用缩放参数
|
|
106
|
+
* 确保 draw() 看到的 (kWidth, kGap, scrollLeft) 是一致的
|
|
107
|
+
* @param kWidth 新的 K 线宽度
|
|
108
|
+
* @param kGap 新的 K 线间隙
|
|
109
|
+
*/
|
|
110
|
+
applyZoom(kWidth: number, kGap: number): void;
|
|
102
111
|
/** 缩放回调函数,用于通知外部同步 kWidth、kGap 与 scrollLeft */
|
|
103
112
|
private onZoomChange?;
|
|
104
113
|
/**
|
|
@@ -108,12 +117,12 @@ export declare class Chart {
|
|
|
108
117
|
setOnZoomChange(cb: (kWidth: number, kGap: number, targetScrollLeft: number) => void): void;
|
|
109
118
|
/** 获取所有 PaneRenderer */
|
|
110
119
|
getPaneRenderers(): PaneRenderer[];
|
|
111
|
-
/**
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
120
|
+
/** 获取 MarkerManager(供 InteractionController 使用) */
|
|
121
|
+
getMarkerManager(): MarkerManager;
|
|
122
|
+
/** 更新自定义标记 */
|
|
123
|
+
updateCustomMarkers(markers: CustomMarkerEntity[]): void;
|
|
124
|
+
/** 清除自定义标记 */
|
|
125
|
+
clearCustomMarkers(): void;
|
|
117
126
|
/** 获取 ChartDom(供 InteractionController 使用) */
|
|
118
127
|
getDom(): ChartDom;
|
|
119
128
|
/** 获取当前 ChartOptions(返回内部当前快照) */
|
|
@@ -124,25 +133,53 @@ export declare class Chart {
|
|
|
124
133
|
* @returns x 坐标数组(逻辑像素,经过物理像素对齐)
|
|
125
134
|
*/
|
|
126
135
|
calcKLinePositions(range: VisibleRange): KLinePositions;
|
|
127
|
-
/**
|
|
128
|
-
* 获取 K 线渲染使用的物理像素配置,确保渲染器和交互逻辑使用一致的坐标计算
|
|
129
|
-
* @returns 物理像素配置对象
|
|
130
|
-
*/
|
|
131
|
-
getKLinePhysicalConfig(): {
|
|
132
|
-
kWidthPx: number;
|
|
133
|
-
kGapPx: number;
|
|
134
|
-
unitPx: number;
|
|
135
|
-
startXPx: number;
|
|
136
|
-
kWidthLogical: number;
|
|
137
|
-
kGapLogical: number;
|
|
138
|
-
unitLogical: number;
|
|
139
|
-
startXLogical: number;
|
|
140
|
-
};
|
|
141
136
|
/**
|
|
142
137
|
* 更新配置并触发布局/重绘
|
|
143
138
|
* @param partial 部分配置项
|
|
144
139
|
*/
|
|
145
140
|
updateOptions(partial: Partial<ChartOptions>): void;
|
|
141
|
+
/**
|
|
142
|
+
* 更新 pane 布局配置
|
|
143
|
+
* @param panes 新的 pane 配置数组
|
|
144
|
+
*/
|
|
145
|
+
updatePaneLayout(panes: PaneSpec[]): void;
|
|
146
|
+
/**
|
|
147
|
+
* 动态添加 pane
|
|
148
|
+
* @param paneId pane 标识符
|
|
149
|
+
*/
|
|
150
|
+
addPane(paneId: string): void;
|
|
151
|
+
/**
|
|
152
|
+
* 动态移除 pane
|
|
153
|
+
* @param paneId pane 标识符
|
|
154
|
+
*/
|
|
155
|
+
removePane(paneId: string): void;
|
|
156
|
+
/**
|
|
157
|
+
* 检查 pane 是否存在
|
|
158
|
+
* @param paneId pane 标识符
|
|
159
|
+
*/
|
|
160
|
+
hasPane(paneId: string): boolean;
|
|
161
|
+
/** 副图渲染器名称前缀 */
|
|
162
|
+
private static readonly SUB_PANE_PREFIX;
|
|
163
|
+
/**
|
|
164
|
+
* 创建副图面板并注册指标渲染器
|
|
165
|
+
* @param indicatorId 指标类型
|
|
166
|
+
* @param params 指标参数
|
|
167
|
+
* @returns 是否创建成功
|
|
168
|
+
*/
|
|
169
|
+
createSubPane(indicatorId: SubIndicatorType, params?: Record<string, number>): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* 移除副图面板及其渲染器
|
|
172
|
+
* @param indicatorId 指标类型
|
|
173
|
+
*/
|
|
174
|
+
removeSubPane(indicatorId: SubIndicatorType): void;
|
|
175
|
+
/**
|
|
176
|
+
* 清除所有副图面板
|
|
177
|
+
*/
|
|
178
|
+
clearSubPanes(): void;
|
|
179
|
+
/**
|
|
180
|
+
* 获取当前所有副图指标类型
|
|
181
|
+
*/
|
|
182
|
+
getSubPaneIndicators(): SubIndicatorType[];
|
|
146
183
|
/**
|
|
147
184
|
* 更新数据并请求重绘
|
|
148
185
|
* @param data K 线数据数组
|
|
@@ -157,7 +194,7 @@ export declare class Chart {
|
|
|
157
194
|
/** 请求下一帧重绘(RAF 合并) */
|
|
158
195
|
scheduleDraw(): void;
|
|
159
196
|
/** 销毁图表实例 */
|
|
160
|
-
destroy(): void
|
|
197
|
+
destroy(): Promise<void>;
|
|
161
198
|
/** 初始化所有 pane */
|
|
162
199
|
private initPanes;
|
|
163
200
|
/** 计算每个 pane 的布局(top 和 height) */
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { Chart } from '../chart';
|
|
2
|
+
import { MarkerEntity, CustomMarkerEntity } from '../marker/registry';
|
|
3
|
+
/** 标记 hover 事件数据 */
|
|
4
|
+
export interface MarkerHoverEvent {
|
|
5
|
+
type: 'volume-price' | 'custom';
|
|
6
|
+
marker: MarkerEntity | CustomMarkerEntity;
|
|
7
|
+
}
|
|
2
8
|
/**
|
|
3
9
|
* 交互控制器,处理拖拽滚动、缩放、十字线 hover 等交互逻辑
|
|
4
|
-
* 只依赖 Chart 公共 API,不依赖 Vue
|
|
5
10
|
*/
|
|
6
11
|
export declare class InteractionController {
|
|
7
12
|
private chart;
|
|
8
13
|
private isDragging;
|
|
9
14
|
private dragStartX;
|
|
10
15
|
private scrollStartX;
|
|
11
|
-
/**
|
|
16
|
+
/** [触屏]:触摸会话标记,避免触摸触发的模拟 mouse 事件干扰 */
|
|
12
17
|
private isTouchSession;
|
|
13
18
|
/** 十字线位置 */
|
|
14
19
|
crosshairPos: {
|
|
@@ -31,21 +36,49 @@ export declare class InteractionController {
|
|
|
31
36
|
width: number;
|
|
32
37
|
height: number;
|
|
33
38
|
};
|
|
39
|
+
/** 当前 hover 的 marker ID */
|
|
40
|
+
hoveredMarkerId: string | null;
|
|
41
|
+
/** 当前点击的 marker ID */
|
|
42
|
+
clickedMarkerId: string | null;
|
|
43
|
+
/** 当前 hover 的 marker 数据(供外部显示 tooltip 使用) */
|
|
44
|
+
hoveredMarkerData: MarkerEntity | null;
|
|
45
|
+
/** 当前点击的 marker 数据(供外部显示 tooltip 使用) */
|
|
46
|
+
clickedMarkerData: MarkerEntity | null;
|
|
47
|
+
/** marker hover 回调函数 */
|
|
48
|
+
private onMarkerHoverCallback?;
|
|
49
|
+
/** marker click 回调函数 */
|
|
50
|
+
private onMarkerClickCallback?;
|
|
51
|
+
/** 当前 hover 的自定义标记 */
|
|
52
|
+
hoveredCustomMarker: CustomMarkerEntity | null;
|
|
53
|
+
/** 自定义标记 hover 回调 */
|
|
54
|
+
private onCustomMarkerHoverCallback?;
|
|
55
|
+
/** 自定义标记 click 回调 */
|
|
56
|
+
private onCustomMarkerClickCallback?;
|
|
34
57
|
/** 当前帧的 K 线起始 x 坐标数组 */
|
|
35
58
|
private kLinePositions;
|
|
36
59
|
/** 当前帧的可见 K 线索引范围 */
|
|
37
60
|
private visibleRange;
|
|
61
|
+
/** K 线宽度(物理像素),用于计算 K 线中心偏移 */
|
|
62
|
+
private kWidthPx;
|
|
38
63
|
constructor(chart: Chart);
|
|
39
64
|
/**
|
|
40
|
-
*
|
|
65
|
+
* 处理滚轮缩放事件
|
|
66
|
+
* @param e WheelEvent
|
|
67
|
+
*/
|
|
68
|
+
onWheel(e: WheelEvent): void;
|
|
69
|
+
/**
|
|
70
|
+
* [触屏]:处理 Pointer 按下事件
|
|
41
71
|
* @param e PointerEvent
|
|
42
72
|
*/
|
|
43
73
|
onPointerDown(e: PointerEvent): void;
|
|
44
74
|
/**
|
|
45
|
-
*
|
|
46
|
-
* @param
|
|
75
|
+
* 设置 tooltip 尺寸
|
|
76
|
+
* @param size 宽高对象
|
|
47
77
|
*/
|
|
48
|
-
|
|
78
|
+
setTooltipSize(size: {
|
|
79
|
+
width: number;
|
|
80
|
+
height: number;
|
|
81
|
+
}): void;
|
|
49
82
|
/**
|
|
50
83
|
* 处理 Pointer 抬起事件
|
|
51
84
|
* @param e PointerEvent
|
|
@@ -73,29 +106,30 @@ export declare class InteractionController {
|
|
|
73
106
|
/** 处理滚动事件 */
|
|
74
107
|
onScroll(): void;
|
|
75
108
|
/**
|
|
76
|
-
*
|
|
77
|
-
* @param e
|
|
78
|
-
*/
|
|
79
|
-
onWheel(e: WheelEvent): void;
|
|
80
|
-
/**
|
|
81
|
-
* 设置 tooltip 尺寸
|
|
82
|
-
* @param size 宽高对象
|
|
109
|
+
* [触屏]:处理 Pointer 移动事件
|
|
110
|
+
* @param e PointerEvent
|
|
83
111
|
*/
|
|
84
|
-
|
|
85
|
-
width: number;
|
|
86
|
-
height: number;
|
|
87
|
-
}): void;
|
|
112
|
+
onPointerMove(e: PointerEvent): void;
|
|
88
113
|
/**
|
|
89
114
|
* 设置当前帧的 K 线起始 x 坐标数组和可见范围
|
|
90
115
|
* @param positions K 线起始 x 坐标数组
|
|
91
116
|
* @param visibleRange 可见 K 线索引范围
|
|
117
|
+
* @param kWidthPx K 线宽度(物理像素)
|
|
92
118
|
*/
|
|
93
119
|
setKLinePositions(positions: number[] | null, visibleRange: {
|
|
94
120
|
start: number;
|
|
95
121
|
end: number;
|
|
96
|
-
} | null): void;
|
|
122
|
+
} | null, kWidthPx?: number): void;
|
|
97
123
|
/** 检查是否正在拖拽 */
|
|
98
124
|
isDraggingState(): boolean;
|
|
125
|
+
/** 设置 marker hover 回调 */
|
|
126
|
+
setOnMarkerHover(callback: (marker: MarkerEntity | null) => void): void;
|
|
127
|
+
/** 设置 marker click 回调 */
|
|
128
|
+
setOnMarkerClick(callback: (marker: MarkerEntity) => void): void;
|
|
129
|
+
/** 设置自定义标记 hover 回调 */
|
|
130
|
+
setOnCustomMarkerHover(callback: (marker: CustomMarkerEntity | null) => void): void;
|
|
131
|
+
/** 设置自定义标记 click 回调 */
|
|
132
|
+
setOnCustomMarkerClick(callback: (marker: CustomMarkerEntity) => void): void;
|
|
99
133
|
/** 清除 hover 状态 */
|
|
100
134
|
private clearHover;
|
|
101
135
|
/**
|
|
@@ -109,4 +143,8 @@ export declare class InteractionController {
|
|
|
109
143
|
* @param clientY 屏幕 y 坐标
|
|
110
144
|
*/
|
|
111
145
|
private updateHoverFromPoint;
|
|
146
|
+
/**
|
|
147
|
+
* 重置所有交互状态(数据更新时调用)
|
|
148
|
+
*/
|
|
149
|
+
reset(): void;
|
|
112
150
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { KLineData } from '../../types/price';
|
|
2
2
|
import { PriceRange } from '../scale/price';
|
|
3
3
|
import { PriceScale } from '../scale/priceScale';
|
|
4
|
+
import { MarkerManager } from '../marker/registry';
|
|
4
5
|
export type VisibleRange = {
|
|
5
6
|
start: number;
|
|
6
7
|
end: number;
|
|
@@ -33,6 +34,7 @@ export interface PaneRenderer {
|
|
|
33
34
|
dpr: number;
|
|
34
35
|
paneWidth: number;
|
|
35
36
|
kLinePositions: number[];
|
|
37
|
+
markerManager?: MarkerManager;
|
|
36
38
|
}): void;
|
|
37
39
|
}
|
|
38
40
|
/**
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 标记类型
|
|
3
|
+
*/
|
|
4
|
+
export type MarkerShape = 'triangle' | 'circle';
|
|
5
|
+
/**
|
|
6
|
+
* 标记状态
|
|
7
|
+
*/
|
|
8
|
+
export type MarkerState = 'normal' | 'hovered';
|
|
9
|
+
/**
|
|
10
|
+
* 标记类型描述注册表
|
|
11
|
+
*/
|
|
12
|
+
export declare const MARKER_TYPE_DESCRIPTIONS: Record<string, string>;
|
|
13
|
+
/**
|
|
14
|
+
* 注册新的标记类型描述
|
|
15
|
+
* @param type 标记类型
|
|
16
|
+
* @param description 描述文本
|
|
17
|
+
*/
|
|
18
|
+
export declare function registerMarkerTypeDescription(type: string, description: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* 标记实体
|
|
21
|
+
*/
|
|
22
|
+
export interface MarkerEntity {
|
|
23
|
+
id: string;
|
|
24
|
+
type: MarkerShape;
|
|
25
|
+
/** 标记类型描述 */
|
|
26
|
+
markerType: string;
|
|
27
|
+
/** 包围盒左上角 x 坐标 */
|
|
28
|
+
x: number;
|
|
29
|
+
/** 包围盒左上角 y 坐标 */
|
|
30
|
+
y: number;
|
|
31
|
+
/** 包围盒宽度 */
|
|
32
|
+
width: number;
|
|
33
|
+
/** 包围盒高度 */
|
|
34
|
+
height: number;
|
|
35
|
+
/** 对应的 K 线索引 */
|
|
36
|
+
dataIndex: number;
|
|
37
|
+
/** 额外元数据(如量价关系类型等) */
|
|
38
|
+
metadata: Record<string, any>;
|
|
39
|
+
}
|
|
40
|
+
/** 自定义标记形状 */
|
|
41
|
+
export type CustomMarkerShape = 'arrow_up' | 'arrow_down' | 'flag' | 'circle' | 'rectangle' | 'diamond';
|
|
42
|
+
/** 自定义标记样式 */
|
|
43
|
+
export interface CustomMarkerStyle {
|
|
44
|
+
fillColor?: string;
|
|
45
|
+
strokeColor?: string;
|
|
46
|
+
textColor?: string;
|
|
47
|
+
size?: number;
|
|
48
|
+
lineWidth?: number;
|
|
49
|
+
opacity?: number;
|
|
50
|
+
}
|
|
51
|
+
/** 自定义标记标签 */
|
|
52
|
+
export interface CustomMarkerLabel {
|
|
53
|
+
text: string;
|
|
54
|
+
position?: 'left' | 'right' | 'top' | 'bottom' | 'inside';
|
|
55
|
+
align?: 'start' | 'center' | 'end';
|
|
56
|
+
fontSize?: number;
|
|
57
|
+
offset?: {
|
|
58
|
+
x?: number;
|
|
59
|
+
y?: number;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** 自定义标记实体 */
|
|
63
|
+
export interface CustomMarkerEntity {
|
|
64
|
+
id: string;
|
|
65
|
+
/**
|
|
66
|
+
* 日期时间字符串
|
|
67
|
+
* - 日K/周K/月K: "YYYY-MM-DD"
|
|
68
|
+
* - 分钟K: "YYYY-MM-DD HH:mm"
|
|
69
|
+
*/
|
|
70
|
+
date: string;
|
|
71
|
+
/** Unix 毫秒时间戳(由 date 解析生成,用于二分查找) */
|
|
72
|
+
timestamp: number;
|
|
73
|
+
shape: CustomMarkerShape;
|
|
74
|
+
groupKey?: string;
|
|
75
|
+
offset?: {
|
|
76
|
+
x?: number;
|
|
77
|
+
y?: number;
|
|
78
|
+
};
|
|
79
|
+
style?: CustomMarkerStyle;
|
|
80
|
+
label?: CustomMarkerLabel;
|
|
81
|
+
metadata?: Record<string, unknown>;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 标记 Manager
|
|
85
|
+
*/
|
|
86
|
+
export declare class MarkerManager {
|
|
87
|
+
/** 当前帧可见的标记集合(key: marker.id) */
|
|
88
|
+
private markers;
|
|
89
|
+
/** 当前 hover 的标记 ID(跨帧持久) */
|
|
90
|
+
private hoveredMarkerId;
|
|
91
|
+
/** 上一帧 hover 的标记 ID(用于触发 enter/leave 事件) */
|
|
92
|
+
private lastHoveredId;
|
|
93
|
+
/** 自定义标记集合 */
|
|
94
|
+
private customMarkers;
|
|
95
|
+
/** 自定义标记位置缓存(用于 hitTest) */
|
|
96
|
+
private customMarkerPositions;
|
|
97
|
+
/**
|
|
98
|
+
* 清空标记集合
|
|
99
|
+
* 注意:不清除 hoveredMarkerId,保持 hover 状态跨帧持久
|
|
100
|
+
*/
|
|
101
|
+
clear(): void;
|
|
102
|
+
/**
|
|
103
|
+
* 注册标记
|
|
104
|
+
* @param marker 标记实体
|
|
105
|
+
*/
|
|
106
|
+
register(marker: MarkerEntity): void;
|
|
107
|
+
/**
|
|
108
|
+
* 获取标记状态
|
|
109
|
+
* @param id 标记 ID
|
|
110
|
+
* @returns 'hovered' 或 'normal'
|
|
111
|
+
*/
|
|
112
|
+
getState(id: string): MarkerState;
|
|
113
|
+
/**
|
|
114
|
+
* 命中测试
|
|
115
|
+
* @param x 鼠标 x 坐标
|
|
116
|
+
* @param y 鼠标 y 坐标
|
|
117
|
+
* @param padding 命中区域扩展(默认 3px)
|
|
118
|
+
* @returns 命中的标记,未命中返回 null
|
|
119
|
+
*/
|
|
120
|
+
hitTest(x: number, y: number, padding?: number): MarkerEntity | null;
|
|
121
|
+
/**
|
|
122
|
+
* 设置 hover 状态
|
|
123
|
+
* @param id 标记 ID,null 表示清除 hover
|
|
124
|
+
*/
|
|
125
|
+
setHover(id: string | null): void;
|
|
126
|
+
/**
|
|
127
|
+
* 验证 hover 状态
|
|
128
|
+
* 检查当前 hover 的标记是否仍在视口内,不在则清除
|
|
129
|
+
*/
|
|
130
|
+
validateHoverState(): void;
|
|
131
|
+
/**
|
|
132
|
+
* 获取当前 hover 的标记实体
|
|
133
|
+
* @returns hover 的标记,不存在返回 null
|
|
134
|
+
*/
|
|
135
|
+
getHoveredMarker(): MarkerEntity | null;
|
|
136
|
+
/**
|
|
137
|
+
* 获取上一帧 hover 的标记 ID
|
|
138
|
+
* 用于检测 hover 状态变化
|
|
139
|
+
* @returns 上一帧的 hover ID
|
|
140
|
+
*/
|
|
141
|
+
getLastHoverId(): string | null;
|
|
142
|
+
/**
|
|
143
|
+
* 获取所有当前可见的标记
|
|
144
|
+
* @returns 标记数组
|
|
145
|
+
*/
|
|
146
|
+
getAllMarkers(): MarkerEntity[];
|
|
147
|
+
/**
|
|
148
|
+
* 注册自定义标记
|
|
149
|
+
*/
|
|
150
|
+
registerCustomMarker(marker: CustomMarkerEntity): void;
|
|
151
|
+
/**
|
|
152
|
+
* 批量设置自定义标记
|
|
153
|
+
*/
|
|
154
|
+
setCustomMarkers(markers: CustomMarkerEntity[]): void;
|
|
155
|
+
/**
|
|
156
|
+
* 清空自定义标记(含位置缓存)
|
|
157
|
+
*/
|
|
158
|
+
clearCustomMarkers(): void;
|
|
159
|
+
/**
|
|
160
|
+
* 获取所有自定义标记
|
|
161
|
+
*/
|
|
162
|
+
getCustomMarkers(): CustomMarkerEntity[];
|
|
163
|
+
/**
|
|
164
|
+
* 记录自定义标记位置(render 时调用)
|
|
165
|
+
*/
|
|
166
|
+
setCustomMarkerPosition(id: string, x: number, y: number, size: number, shape: CustomMarkerShape): void;
|
|
167
|
+
/**
|
|
168
|
+
* 自定义标记点击测试
|
|
169
|
+
* @param x 鼠标 x 坐标
|
|
170
|
+
* @param y 鼠标 y 坐标
|
|
171
|
+
* @returns 命中的自定义标记,未命中返回 null
|
|
172
|
+
*/
|
|
173
|
+
hitTestCustomMarker(x: number, y: number): CustomMarkerEntity | null;
|
|
174
|
+
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { KLineData } from '../types/price';
|
|
2
|
-
import { Pane, VisibleRange } from './layout/pane';
|
|
3
1
|
export type PaneRendererDom = {
|
|
4
2
|
plotCanvas: HTMLCanvasElement;
|
|
5
3
|
yAxisCanvas: HTMLCanvasElement;
|
|
@@ -8,29 +6,19 @@ export type PaneRendererOptions = {
|
|
|
8
6
|
rightAxisWidth: number;
|
|
9
7
|
yPaddingPx: number;
|
|
10
8
|
priceLabelWidth?: number;
|
|
11
|
-
isLast?: boolean;
|
|
12
9
|
};
|
|
13
10
|
/**
|
|
14
|
-
* PaneRenderer:负责单个 Pane
|
|
11
|
+
* PaneRenderer:负责单个 Pane 的 Canvas 管理
|
|
12
|
+
* 渲染逻辑由 Chart 通过 RendererPluginManager 统一调度
|
|
15
13
|
*/
|
|
16
14
|
export declare class PaneRenderer {
|
|
17
15
|
private dom;
|
|
18
16
|
private pane;
|
|
19
17
|
private opt;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
* @param opt 渲染选项
|
|
25
|
-
*/
|
|
26
|
-
constructor(dom: PaneRendererDom, pane: Pane, opt: PaneRendererOptions);
|
|
27
|
-
/**
|
|
28
|
-
* 获取关联的 Pane 实例
|
|
29
|
-
*/
|
|
30
|
-
getPane(): Pane;
|
|
31
|
-
/**
|
|
32
|
-
* 获取 DOM 元素
|
|
33
|
-
*/
|
|
18
|
+
constructor(dom: PaneRendererDom, pane: import('./layout/pane').Pane, opt: PaneRendererOptions);
|
|
19
|
+
/** 获取关联的 Pane 实例 */
|
|
20
|
+
getPane(): import('./layout/pane').Pane;
|
|
21
|
+
/** 获取 DOM 元素 */
|
|
34
22
|
getDom(): PaneRendererDom;
|
|
35
23
|
/**
|
|
36
24
|
* 调整 Canvas 尺寸
|
|
@@ -39,27 +27,6 @@ export declare class PaneRenderer {
|
|
|
39
27
|
* @param dpr 设备像素比
|
|
40
28
|
*/
|
|
41
29
|
resize(width: number, height: number, dpr: number): void;
|
|
42
|
-
/**
|
|
43
|
-
* 绘制该 Pane 的内容
|
|
44
|
-
* @param args 绘制参数,包含 K 线数据、可见范围、滚动位置、K 线尺寸、DPR、十字线位置和标题
|
|
45
|
-
*/
|
|
46
|
-
draw(args: {
|
|
47
|
-
data: KLineData[];
|
|
48
|
-
range: VisibleRange;
|
|
49
|
-
scrollLeft: number;
|
|
50
|
-
kWidth: number;
|
|
51
|
-
kGap: number;
|
|
52
|
-
dpr: number;
|
|
53
|
-
crosshairPos?: {
|
|
54
|
-
x: number;
|
|
55
|
-
y: number;
|
|
56
|
-
} | null;
|
|
57
|
-
crosshairIndex?: number | null;
|
|
58
|
-
title?: string;
|
|
59
|
-
kLinePositions: number[];
|
|
60
|
-
}): void;
|
|
61
|
-
/**
|
|
62
|
-
* 销毁 PaneRenderer 实例
|
|
63
|
-
*/
|
|
30
|
+
/** 销毁 PaneRenderer 实例 */
|
|
64
31
|
destroy(): void;
|
|
65
32
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { RendererPlugin } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
|
+
export interface BOLLConfig {
|
|
4
|
+
/** 周期(默认20) */
|
|
5
|
+
period?: number;
|
|
6
|
+
/** 标准差倍数(默认2) */
|
|
7
|
+
multiplier?: number;
|
|
8
|
+
/** 是否显示上轨 */
|
|
9
|
+
showUpper?: boolean;
|
|
10
|
+
/** 是否显示下轨 */
|
|
11
|
+
showMiddle?: boolean;
|
|
12
|
+
/** 是否显示下轨 */
|
|
13
|
+
showLower?: boolean;
|
|
14
|
+
/** 是否填充带状区域 */
|
|
15
|
+
showBand?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 创建 BOLL(布林带)渲染器插件
|
|
19
|
+
*/
|
|
20
|
+
export declare function createBOLLRendererPlugin(initialConfig?: BOLLConfig): RendererPlugin;
|
|
21
|
+
/**
|
|
22
|
+
* 计算指定索引处的 BOLL 值(供图例使用)
|
|
23
|
+
*/
|
|
24
|
+
export declare function calcBOLLAtIndex(data: KLineData[], index: number, period?: number, multiplier?: number): {
|
|
25
|
+
upper: number;
|
|
26
|
+
middle: number;
|
|
27
|
+
lower: number;
|
|
28
|
+
} | null;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RendererPlugin } from '../../../plugin';
|
|
2
|
+
export interface BOLLLegendConfig {
|
|
3
|
+
/** 周期(默认20) */
|
|
4
|
+
period?: number;
|
|
5
|
+
/** 标准差倍数(默认2) */
|
|
6
|
+
multiplier?: number;
|
|
7
|
+
/** 是否显示图例 */
|
|
8
|
+
show?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 创建 BOLL 图例渲染器插件
|
|
12
|
+
*/
|
|
13
|
+
export declare function createBOLLLegendRendererPlugin(options: {
|
|
14
|
+
yPaddingPx: number;
|
|
15
|
+
config?: BOLLLegendConfig;
|
|
16
|
+
}): RendererPlugin;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { RendererPlugin } from '../../../plugin';
|
|
2
|
+
import { KLineData } from '../../../types/price';
|
|
3
|
+
export interface CCIConfig {
|
|
4
|
+
/** 周期(默认 14) */
|
|
5
|
+
period?: number;
|
|
6
|
+
/** 是否显示 CCI 线 */
|
|
7
|
+
showCCI?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface CCIRendererOptions {
|
|
10
|
+
/** 目标 pane ID(默认 'sub') */
|
|
11
|
+
paneId?: string;
|
|
12
|
+
/** 初始配置 */
|
|
13
|
+
config?: CCIConfig;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 创建 CCI 渲染器插件
|
|
17
|
+
*/
|
|
18
|
+
export declare function createCCIRendererPlugin(options?: CCIRendererOptions): RendererPlugin;
|
|
19
|
+
/**
|
|
20
|
+
* 计算指定索引处的 CCI 值
|
|
21
|
+
*/
|
|
22
|
+
export declare function calcCCIAtIndex(data: KLineData[], index: number, period: number): number | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* 获取 CCI 标题信息(供 paneTitle 使用)
|
|
25
|
+
*/
|
|
26
|
+
export declare function getCCITitleInfo(data: KLineData[], index: number, period?: number): {
|
|
27
|
+
name: string;
|
|
28
|
+
params: number[];
|
|
29
|
+
values: Array<{
|
|
30
|
+
label: string;
|
|
31
|
+
value: number;
|
|
32
|
+
color: string;
|
|
33
|
+
}>;
|
|
34
|
+
} | null;
|