@363045841yyt/klinechart 0.1.5 → 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 +140 -187
- 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
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"$id": "https://kmap.dev/schemas/semantic-chart-config/1.0.0",
|
|
4
|
+
"title": "SemanticChartConfig",
|
|
5
|
+
"description": "Agent 语义化图表配置",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": ["version", "data"],
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"version": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
|
|
13
|
+
"description": "semver 版本号"
|
|
14
|
+
},
|
|
15
|
+
"data": { "$ref": "#/$defs/DataConfig" },
|
|
16
|
+
"indicators": { "$ref": "#/$defs/IndicatorsConfig" },
|
|
17
|
+
"markers": { "$ref": "#/$defs/MarkersConfig" },
|
|
18
|
+
"chart": { "$ref": "#/$defs/ChartOptions" },
|
|
19
|
+
"theme": { "$ref": "#/$defs/ThemeConfig" }
|
|
20
|
+
},
|
|
21
|
+
"$defs": {
|
|
22
|
+
"DataConfig": {
|
|
23
|
+
"type": "object",
|
|
24
|
+
"required": ["source", "symbol", "startDate", "endDate", "period", "adjust"],
|
|
25
|
+
"additionalProperties": false,
|
|
26
|
+
"properties": {
|
|
27
|
+
"source": { "type": "string", "enum": ["baostock", "dongcai"] },
|
|
28
|
+
"symbol": { "type": "string", "pattern": "^[0-9]{6}$" },
|
|
29
|
+
"exchange": { "type": "string", "enum": ["SH", "SZ", "BJ"] },
|
|
30
|
+
"startDate": { "type": "string", "format": "date" },
|
|
31
|
+
"endDate": { "type": "string", "format": "date" },
|
|
32
|
+
"period": {
|
|
33
|
+
"type": "string",
|
|
34
|
+
"enum": ["daily", "weekly", "monthly", "5min", "15min", "30min", "60min"]
|
|
35
|
+
},
|
|
36
|
+
"adjust": { "type": "string", "enum": ["qfq", "hfq", "none"] }
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"IndicatorsConfig": {
|
|
40
|
+
"type": "object",
|
|
41
|
+
"additionalProperties": false,
|
|
42
|
+
"properties": {
|
|
43
|
+
"main": {
|
|
44
|
+
"type": "array",
|
|
45
|
+
"items": { "$ref": "#/$defs/MainIndicatorConfig" },
|
|
46
|
+
"maxItems": 5
|
|
47
|
+
},
|
|
48
|
+
"sub": {
|
|
49
|
+
"type": "array",
|
|
50
|
+
"items": { "$ref": "#/$defs/SubIndicatorConfig" },
|
|
51
|
+
"maxItems": 5
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"MainIndicatorConfig": {
|
|
56
|
+
"type": "object",
|
|
57
|
+
"required": ["type", "enabled"],
|
|
58
|
+
"additionalProperties": false,
|
|
59
|
+
"properties": {
|
|
60
|
+
"type": { "type": "string", "enum": ["MA", "BOLL"] },
|
|
61
|
+
"enabled": { "type": "boolean" },
|
|
62
|
+
"params": { "type": "object" }
|
|
63
|
+
},
|
|
64
|
+
"allOf": [
|
|
65
|
+
{
|
|
66
|
+
"if": {
|
|
67
|
+
"properties": { "type": { "const": "MA" } },
|
|
68
|
+
"required": ["type"]
|
|
69
|
+
},
|
|
70
|
+
"then": {
|
|
71
|
+
"properties": {
|
|
72
|
+
"params": {
|
|
73
|
+
"type": "object",
|
|
74
|
+
"additionalProperties": false,
|
|
75
|
+
"properties": {
|
|
76
|
+
"periods": {
|
|
77
|
+
"type": "array",
|
|
78
|
+
"items": { "type": "integer", "minimum": 1, "maximum": 250 },
|
|
79
|
+
"minItems": 1,
|
|
80
|
+
"maxItems": 5
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"else": {
|
|
87
|
+
"properties": {
|
|
88
|
+
"params": {
|
|
89
|
+
"type": "object",
|
|
90
|
+
"additionalProperties": false,
|
|
91
|
+
"properties": {
|
|
92
|
+
"period": { "type": "integer", "minimum": 1, "maximum": 100 },
|
|
93
|
+
"multiplier": { "type": "number", "minimum": 0.1, "maximum": 5 }
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"SubIndicatorConfig": {
|
|
102
|
+
"type": "object",
|
|
103
|
+
"required": ["type", "enabled"],
|
|
104
|
+
"additionalProperties": false,
|
|
105
|
+
"properties": {
|
|
106
|
+
"type": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"enum": ["VOLUME", "MACD", "RSI", "CCI", "STOCH", "MOM", "WMSR", "KST", "FASTK"]
|
|
109
|
+
},
|
|
110
|
+
"enabled": { "type": "boolean" },
|
|
111
|
+
"params": { "type": "object" }
|
|
112
|
+
},
|
|
113
|
+
"allOf": [
|
|
114
|
+
{
|
|
115
|
+
"if": { "properties": { "type": { "const": "MACD" } } },
|
|
116
|
+
"then": {
|
|
117
|
+
"properties": {
|
|
118
|
+
"params": {
|
|
119
|
+
"type": "object",
|
|
120
|
+
"additionalProperties": false,
|
|
121
|
+
"properties": {
|
|
122
|
+
"fast": { "type": "integer", "minimum": 1, "maximum": 50 },
|
|
123
|
+
"slow": { "type": "integer", "minimum": 1, "maximum": 100 },
|
|
124
|
+
"signal": { "type": "integer", "minimum": 1, "maximum": 50 }
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"if": { "properties": { "type": { "const": "RSI" } } },
|
|
132
|
+
"then": {
|
|
133
|
+
"properties": {
|
|
134
|
+
"params": {
|
|
135
|
+
"type": "object",
|
|
136
|
+
"additionalProperties": false,
|
|
137
|
+
"properties": {
|
|
138
|
+
"period1": { "type": "integer", "minimum": 1, "maximum": 100 },
|
|
139
|
+
"period2": { "type": "integer", "minimum": 1, "maximum": 100 },
|
|
140
|
+
"period3": { "type": "integer", "minimum": 1, "maximum": 100 }
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
},
|
|
148
|
+
"MarkersConfig": {
|
|
149
|
+
"type": "object",
|
|
150
|
+
"additionalProperties": false,
|
|
151
|
+
"properties": {
|
|
152
|
+
"showVolumePriceMarkers": { "type": "boolean" },
|
|
153
|
+
"showExtremaMarkers": { "type": "boolean" },
|
|
154
|
+
"customMarkers": {
|
|
155
|
+
"type": "array",
|
|
156
|
+
"items": { "$ref": "#/$defs/CustomMarker" },
|
|
157
|
+
"maxItems": 100
|
|
158
|
+
},
|
|
159
|
+
"legend": { "$ref": "#/$defs/LegendConfig" }
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"CustomMarker": {
|
|
163
|
+
"type": "object",
|
|
164
|
+
"required": ["id", "date", "shape"],
|
|
165
|
+
"additionalProperties": false,
|
|
166
|
+
"properties": {
|
|
167
|
+
"id": { "type": "string", "maxLength": 64 },
|
|
168
|
+
"date": {
|
|
169
|
+
"type": "string",
|
|
170
|
+
"description": "日期时间字符串,日K用 YYYY-MM-DD,分钟K用 YYYY-MM-DD HH:mm",
|
|
171
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}( [0-9]{2}:[0-9]{2})?$"
|
|
172
|
+
},
|
|
173
|
+
"shape": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"enum": ["arrow_up", "arrow_down", "flag", "circle", "rectangle", "diamond"]
|
|
176
|
+
},
|
|
177
|
+
"groupKey": { "type": "string", "maxLength": 32 },
|
|
178
|
+
"offset": {
|
|
179
|
+
"type": "object",
|
|
180
|
+
"additionalProperties": false,
|
|
181
|
+
"properties": {
|
|
182
|
+
"x": { "type": "number", "minimum": -500, "maximum": 500 },
|
|
183
|
+
"y": { "type": "number", "minimum": -500, "maximum": 500 }
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"style": { "$ref": "#/$defs/MarkerStyle" },
|
|
187
|
+
"label": { "$ref": "#/$defs/MarkerLabel" },
|
|
188
|
+
"metadata": {
|
|
189
|
+
"type": "object",
|
|
190
|
+
"maxProperties": 20,
|
|
191
|
+
"additionalProperties": {
|
|
192
|
+
"type": ["string", "number", "boolean", "null"],
|
|
193
|
+
"maxLength": 200
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
"MarkerStyle": {
|
|
199
|
+
"type": "object",
|
|
200
|
+
"additionalProperties": false,
|
|
201
|
+
"properties": {
|
|
202
|
+
"fillColor": { "type": "string", "pattern": "^(#[0-9a-fA-F]{3,8}|rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)|rgba\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*[\\d.]+\\s*\\))$" },
|
|
203
|
+
"strokeColor": { "type": "string", "pattern": "^(#[0-9a-fA-F]{3,8}|rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)|rgba\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*[\\d.]+\\s*\\))$" },
|
|
204
|
+
"textColor": { "type": "string", "pattern": "^(#[0-9a-fA-F]{3,8}|rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)|rgba\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*[\\d.]+\\s*\\))$" },
|
|
205
|
+
"size": { "type": "number", "minimum": 4, "maximum": 50 },
|
|
206
|
+
"lineWidth": { "type": "number", "minimum": 0.5, "maximum": 10 },
|
|
207
|
+
"opacity": { "type": "number", "minimum": 0, "maximum": 1 }
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"MarkerLabel": {
|
|
211
|
+
"type": "object",
|
|
212
|
+
"required": ["text"],
|
|
213
|
+
"additionalProperties": false,
|
|
214
|
+
"properties": {
|
|
215
|
+
"text": { "type": "string", "maxLength": 50 },
|
|
216
|
+
"position": { "type": "string", "enum": ["left", "right", "top", "bottom", "inside"] },
|
|
217
|
+
"align": { "type": "string", "enum": ["start", "center", "end"] },
|
|
218
|
+
"fontSize": { "type": "number", "minimum": 8, "maximum": 24 },
|
|
219
|
+
"offset": {
|
|
220
|
+
"type": "object",
|
|
221
|
+
"additionalProperties": false,
|
|
222
|
+
"properties": {
|
|
223
|
+
"x": { "type": "number", "minimum": -500, "maximum": 500 },
|
|
224
|
+
"y": { "type": "number", "minimum": -500, "maximum": 500 }
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
"LegendConfig": {
|
|
230
|
+
"type": "object",
|
|
231
|
+
"additionalProperties": false,
|
|
232
|
+
"properties": {
|
|
233
|
+
"enabled": { "type": "boolean" },
|
|
234
|
+
"position": { "type": "string", "enum": ["bottom-right", "bottom-left", "top-right", "top-left"] },
|
|
235
|
+
"onClick": { "type": "string", "enum": ["highlight", "toggle", "none"] }
|
|
236
|
+
}
|
|
237
|
+
},
|
|
238
|
+
"ChartOptions": {
|
|
239
|
+
"type": "object",
|
|
240
|
+
"additionalProperties": false,
|
|
241
|
+
"properties": {
|
|
242
|
+
"kWidth": { "type": "number", "minimum": 2, "maximum": 50 },
|
|
243
|
+
"kGap": { "type": "number", "minimum": 0, "maximum": 20 },
|
|
244
|
+
"autoScrollToRight": { "type": "boolean" }
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
"ThemeConfig": {
|
|
248
|
+
"type": "object",
|
|
249
|
+
"additionalProperties": false,
|
|
250
|
+
"properties": {
|
|
251
|
+
"priceUpColor": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
|
|
252
|
+
"priceDownColor": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
;
|
|
258
|
+
|
|
259
|
+
export default _default;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 语义化图表配置类型定义
|
|
3
|
+
* 用于 Agent JSON 控制图表渲染
|
|
4
|
+
*/
|
|
5
|
+
/** 语义化图表配置 */
|
|
6
|
+
export interface SemanticChartConfig {
|
|
7
|
+
/** 版本号,使用 semver 格式 */
|
|
8
|
+
version: `${number}.${number}.${number}`;
|
|
9
|
+
data: DataConfig;
|
|
10
|
+
indicators?: IndicatorsConfig;
|
|
11
|
+
markers?: MarkersConfig;
|
|
12
|
+
chart?: ChartOptions;
|
|
13
|
+
theme?: ThemeConfig;
|
|
14
|
+
}
|
|
15
|
+
/** 数据配置 */
|
|
16
|
+
export interface DataConfig {
|
|
17
|
+
source: 'baostock' | 'dongcai';
|
|
18
|
+
/** 股票代码(6位数字,不含前缀) */
|
|
19
|
+
symbol: string;
|
|
20
|
+
/** 交易所(可选,默认根据代码自动识别) */
|
|
21
|
+
exchange?: 'SH' | 'SZ' | 'BJ';
|
|
22
|
+
/** 开始日期 YYYY-MM-DD */
|
|
23
|
+
startDate: string;
|
|
24
|
+
/** 结束日期 YYYY-MM-DD */
|
|
25
|
+
endDate: string;
|
|
26
|
+
period: 'daily' | 'weekly' | 'monthly' | '5min' | '15min' | '30min' | '60min';
|
|
27
|
+
adjust: 'qfq' | 'hfq' | 'none';
|
|
28
|
+
}
|
|
29
|
+
/** 指标配置 */
|
|
30
|
+
export interface IndicatorsConfig {
|
|
31
|
+
main?: MainIndicatorConfig[];
|
|
32
|
+
sub?: SubIndicatorConfig[];
|
|
33
|
+
}
|
|
34
|
+
/** MA 均线参数 */
|
|
35
|
+
export interface MAParams {
|
|
36
|
+
periods: number[];
|
|
37
|
+
}
|
|
38
|
+
/** BOLL 布林带参数 */
|
|
39
|
+
export interface BOLLParams {
|
|
40
|
+
period?: number;
|
|
41
|
+
multiplier?: number;
|
|
42
|
+
}
|
|
43
|
+
/** 主图指标配置(判别联合) */
|
|
44
|
+
export type MainIndicatorConfig = {
|
|
45
|
+
type: 'MA';
|
|
46
|
+
enabled: boolean;
|
|
47
|
+
params?: MAParams;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'BOLL';
|
|
50
|
+
enabled: boolean;
|
|
51
|
+
params?: BOLLParams;
|
|
52
|
+
};
|
|
53
|
+
/** 副图指标参数映射 */
|
|
54
|
+
export interface SubIndicatorParams {
|
|
55
|
+
VOLUME?: never;
|
|
56
|
+
MACD?: {
|
|
57
|
+
fast?: number;
|
|
58
|
+
slow?: number;
|
|
59
|
+
signal?: number;
|
|
60
|
+
};
|
|
61
|
+
RSI?: {
|
|
62
|
+
period1?: number;
|
|
63
|
+
period2?: number;
|
|
64
|
+
period3?: number;
|
|
65
|
+
};
|
|
66
|
+
CCI?: {
|
|
67
|
+
period?: number;
|
|
68
|
+
};
|
|
69
|
+
STOCH?: {
|
|
70
|
+
n?: number;
|
|
71
|
+
m?: number;
|
|
72
|
+
};
|
|
73
|
+
MOM?: {
|
|
74
|
+
period?: number;
|
|
75
|
+
};
|
|
76
|
+
WMSR?: {
|
|
77
|
+
period?: number;
|
|
78
|
+
};
|
|
79
|
+
KST?: {
|
|
80
|
+
roc1?: number;
|
|
81
|
+
roc2?: number;
|
|
82
|
+
roc3?: number;
|
|
83
|
+
roc4?: number;
|
|
84
|
+
signal?: number;
|
|
85
|
+
};
|
|
86
|
+
FASTK?: {
|
|
87
|
+
period?: number;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** 副图指标类型 */
|
|
91
|
+
export type SubIndicatorType = keyof SubIndicatorParams;
|
|
92
|
+
/** 副图指标配置 */
|
|
93
|
+
export type SubIndicatorConfig = {
|
|
94
|
+
[K in SubIndicatorType]: {
|
|
95
|
+
type: K;
|
|
96
|
+
enabled: boolean;
|
|
97
|
+
params?: SubIndicatorParams[K];
|
|
98
|
+
};
|
|
99
|
+
}[SubIndicatorType];
|
|
100
|
+
/** 标记配置 */
|
|
101
|
+
export interface MarkersConfig {
|
|
102
|
+
showVolumePriceMarkers?: boolean;
|
|
103
|
+
showExtremaMarkers?: boolean;
|
|
104
|
+
customMarkers?: CustomMarker[];
|
|
105
|
+
legend?: LegendConfig;
|
|
106
|
+
}
|
|
107
|
+
/** 预设图形形状 */
|
|
108
|
+
export type MarkerShapeType = 'arrow_up' | 'arrow_down' | 'flag' | 'circle' | 'rectangle' | 'diamond';
|
|
109
|
+
/** 自定义标记 */
|
|
110
|
+
export interface CustomMarker {
|
|
111
|
+
id: string;
|
|
112
|
+
/**
|
|
113
|
+
* 日期时间字符串
|
|
114
|
+
* - 日K/周K/月K: "YYYY-MM-DD" (如 "2025-01-15")
|
|
115
|
+
* - 分钟K: "YYYY-MM-DD HH:mm" (如 "2025-01-15 09:30")
|
|
116
|
+
*/
|
|
117
|
+
date: string;
|
|
118
|
+
shape: MarkerShapeType;
|
|
119
|
+
/** 图例分组键(可选,用于区分同形状不同含义的标记) */
|
|
120
|
+
groupKey?: string;
|
|
121
|
+
/** 标记位置偏移(相对K线中心) */
|
|
122
|
+
offset?: {
|
|
123
|
+
x?: number;
|
|
124
|
+
y?: number;
|
|
125
|
+
};
|
|
126
|
+
/** 样式配置 */
|
|
127
|
+
style?: MarkerStyle;
|
|
128
|
+
/** 文本标注 */
|
|
129
|
+
label?: MarkerLabel;
|
|
130
|
+
/** 元数据(点击弹窗展示,渲染时必须转义防XSS) */
|
|
131
|
+
metadata?: Record<string, unknown>;
|
|
132
|
+
}
|
|
133
|
+
/** 标记样式 */
|
|
134
|
+
export interface MarkerStyle {
|
|
135
|
+
fillColor?: string;
|
|
136
|
+
strokeColor?: string;
|
|
137
|
+
textColor?: string;
|
|
138
|
+
size?: number;
|
|
139
|
+
lineWidth?: number;
|
|
140
|
+
opacity?: number;
|
|
141
|
+
}
|
|
142
|
+
/** 文本标注 */
|
|
143
|
+
export interface MarkerLabel {
|
|
144
|
+
text: string;
|
|
145
|
+
position?: 'left' | 'right' | 'top' | 'bottom' | 'inside';
|
|
146
|
+
align?: 'start' | 'center' | 'end';
|
|
147
|
+
fontSize?: number;
|
|
148
|
+
offset?: {
|
|
149
|
+
x?: number;
|
|
150
|
+
y?: number;
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/** 图例配置 */
|
|
154
|
+
export interface LegendConfig {
|
|
155
|
+
enabled?: boolean;
|
|
156
|
+
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
157
|
+
/** 点击图例项的行为 */
|
|
158
|
+
onClick?: 'highlight' | 'toggle' | 'none';
|
|
159
|
+
}
|
|
160
|
+
/** 图表选项 */
|
|
161
|
+
export interface ChartOptions {
|
|
162
|
+
kWidth?: number;
|
|
163
|
+
kGap?: number;
|
|
164
|
+
autoScrollToRight?: boolean;
|
|
165
|
+
}
|
|
166
|
+
/** 主题配置 */
|
|
167
|
+
export interface ThemeConfig {
|
|
168
|
+
priceUpColor?: string;
|
|
169
|
+
priceDownColor?: string;
|
|
170
|
+
}
|
|
171
|
+
/** 应用结果 */
|
|
172
|
+
export interface ApplyResult {
|
|
173
|
+
success: boolean;
|
|
174
|
+
errors?: string[];
|
|
175
|
+
}
|
|
176
|
+
/** 校验结果 */
|
|
177
|
+
export interface ValidationResult {
|
|
178
|
+
valid: boolean;
|
|
179
|
+
errors?: string[];
|
|
180
|
+
}
|
|
181
|
+
/** 安全校验结果 */
|
|
182
|
+
export interface SecurityResult {
|
|
183
|
+
passed: boolean;
|
|
184
|
+
violations?: string[];
|
|
185
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { SemanticChartConfig, ValidationResult, SecurityResult } from './types';
|
|
2
|
+
export declare class SemanticConfigValidator {
|
|
3
|
+
private ajv;
|
|
4
|
+
private limits;
|
|
5
|
+
constructor();
|
|
6
|
+
/**
|
|
7
|
+
* 入口校验(在 JSON.parse 之前调用)
|
|
8
|
+
* 检查原始字符串大小
|
|
9
|
+
*/
|
|
10
|
+
validateRawInput(raw: string): ValidationResult;
|
|
11
|
+
/**
|
|
12
|
+
* JSON Schema 校验
|
|
13
|
+
*/
|
|
14
|
+
validate(config: unknown): ValidationResult;
|
|
15
|
+
/**
|
|
16
|
+
* 安全校验(纯同步)
|
|
17
|
+
*/
|
|
18
|
+
securityCheck(config: SemanticChartConfig): SecurityResult;
|
|
19
|
+
private checkPrototypePollution;
|
|
20
|
+
private checkDateRange;
|
|
21
|
+
private checkSymbol;
|
|
22
|
+
private checkMarkerStyle;
|
|
23
|
+
/** 日期格式正则:YYYY-MM-DD 或 YYYY-MM-DD HH:mm */
|
|
24
|
+
private static readonly DATE_PATTERN;
|
|
25
|
+
private checkMarkerDate;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 净化参数对象(防止原型污染)
|
|
29
|
+
*/
|
|
30
|
+
export declare function sanitizeParams(params: Record<string, unknown>): Record<string, unknown>;
|
|
31
|
+
/**
|
|
32
|
+
* 净化颜色值(浏览器环境)
|
|
33
|
+
*/
|
|
34
|
+
export declare function sanitizeColor(input: string): string | null;
|
|
35
|
+
/**
|
|
36
|
+
* 校验颜色值格式
|
|
37
|
+
*/
|
|
38
|
+
export declare function validateColor(color: string): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 校验股票代码
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateSymbol(symbol: string, exchange?: 'SH' | 'SZ' | 'BJ'): boolean;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 量价关系类型枚举
|
|
3
|
+
*/
|
|
4
|
+
export declare enum VolumePriceRelation {
|
|
5
|
+
/** 量价齐升(放量上涨)- 价格上涨且成交量显著放大 */
|
|
6
|
+
RISE_WITH_VOLUME = "rise_with_volume",
|
|
7
|
+
/** 量价背离(缩量上涨)- 价格上涨但成交量萎缩 */
|
|
8
|
+
RISE_WITHOUT_VOLUME = "rise_without_volume",
|
|
9
|
+
/** 量增价跌 - 价格下跌且成交量放大 */
|
|
10
|
+
FALL_WITH_VOLUME = "fall_with_volume",
|
|
11
|
+
/** 量缩价跌 - 价格下跌且成交量萎缩 */
|
|
12
|
+
FALL_WITHOUT_VOLUME = "fall_without_volume",
|
|
13
|
+
/** 中性状态 - 其他情况 */
|
|
14
|
+
OTHERS = "others"
|
|
15
|
+
}
|
|
16
|
+
/** 量价关系计算配置 */
|
|
17
|
+
export interface VolumePriceConfig {
|
|
18
|
+
/** 成交量放大阈值(相对于均值的倍数) */
|
|
19
|
+
volumeAmplifyThreshold: number;
|
|
20
|
+
/** 成交量萎缩阈值(相对于均值的倍数) */
|
|
21
|
+
volumeShrinkThreshold: number;
|
|
22
|
+
/** 计算均值的周期 */
|
|
23
|
+
avgPeriod: number;
|
|
24
|
+
}
|
|
25
|
+
/** 默认量价关系计算配置 */
|
|
26
|
+
export declare const DEFAULT_VOLUME_PRICE_CONFIG: VolumePriceConfig;
|
|
@@ -5,8 +5,8 @@ export declare const MA10_COLOR: "rgba(190, 131, 12, 1)";
|
|
|
5
5
|
export declare const MA20_COLOR: "rgba(69, 112, 249, 1)";
|
|
6
6
|
export declare const MA30_COLOR: "rgba(76, 175, 80, 1)";
|
|
7
7
|
export declare const MA60_COLOR: "rgba(156, 39, 176, 1)";
|
|
8
|
-
export declare function drawMA5Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange): void;
|
|
9
|
-
export declare function drawMA10Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange): void;
|
|
10
|
-
export declare function drawMA20Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange): void;
|
|
11
|
-
export declare function drawMA30Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange): void;
|
|
12
|
-
export declare function drawMA60Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange): void;
|
|
8
|
+
export declare function drawMA5Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange, kLinePositions?: number[]): void;
|
|
9
|
+
export declare function drawMA10Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange, kLinePositions?: number[]): void;
|
|
10
|
+
export declare function drawMA20Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange, kLinePositions?: number[]): void;
|
|
11
|
+
export declare function drawMA30Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange, kLinePositions?: number[]): void;
|
|
12
|
+
export declare function drawMA60Line(ctx: CanvasRenderingContext2D, data: KLineData[], option: drawOption, logicHeight: number, dpr?: number, startIndex?: number, endIndex?: number, priceRange?: PriceRange, kLinePositions?: number[]): void;
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
type TagLevel = 'info' | 'success' | 'warn' | 'error';
|
|
2
|
+
export declare function reloadConfig(): void;
|
|
2
3
|
export declare function tagLog(level: TagLevel | string, value: unknown): void;
|
|
3
4
|
export declare function tagLogThrottle(level: TagLevel | string, value: unknown, key: string, wait?: number): void;
|
|
4
5
|
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { KLineData } from '../types/price';
|
|
2
|
+
import { VolumePriceRelation, VolumePriceConfig, DEFAULT_VOLUME_PRICE_CONFIG } from '../types/volumePrice';
|
|
3
|
+
export { DEFAULT_VOLUME_PRICE_CONFIG };
|
|
4
|
+
/**
|
|
5
|
+
* 成交量前缀和计算器
|
|
6
|
+
* 用于优化成交量移动平均的计算,避免重复遍历
|
|
7
|
+
*/
|
|
8
|
+
export declare class VolumePrefixSum {
|
|
9
|
+
private prefixSum;
|
|
10
|
+
private dataLength;
|
|
11
|
+
/**
|
|
12
|
+
* 构建前缀和数组
|
|
13
|
+
* @param data - K线数据数组
|
|
14
|
+
*/
|
|
15
|
+
build(data: KLineData[]): void;
|
|
16
|
+
/**
|
|
17
|
+
* 查询区间 [start, end] 的成交量之和
|
|
18
|
+
* @param start - 起始索引(包含)
|
|
19
|
+
* @param end - 结束索引(包含)
|
|
20
|
+
* @returns 区间成交量之和
|
|
21
|
+
*/
|
|
22
|
+
query(start: number, end: number): number;
|
|
23
|
+
/**
|
|
24
|
+
* 计算成交量移动平均
|
|
25
|
+
* @param index - 当前K线索引
|
|
26
|
+
* @param period - 计算周期
|
|
27
|
+
* @returns 成交量移动平均值
|
|
28
|
+
*/
|
|
29
|
+
getVolumeMA(index: number, period: number): number;
|
|
30
|
+
/**
|
|
31
|
+
* 获取数据长度
|
|
32
|
+
*/
|
|
33
|
+
get length(): number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 计算量价关系
|
|
37
|
+
*
|
|
38
|
+
* @param data - K线数据数组
|
|
39
|
+
* @param index - 要分析的K线索引
|
|
40
|
+
* @param config - 量价关系计算配置
|
|
41
|
+
* @returns 量价关系类型
|
|
42
|
+
*/
|
|
43
|
+
export declare function analyzeVolumePriceRelation(data: KLineData[], index: number, config: VolumePriceConfig): VolumePriceRelation;
|
|
44
|
+
/**
|
|
45
|
+
* 批量计算量价关系(推荐用于渲染器中)
|
|
46
|
+
* 显式传入前缀和实例,避免重复构建
|
|
47
|
+
*
|
|
48
|
+
* @param data - K线数据数组
|
|
49
|
+
* @param startIndex - 起始索引
|
|
50
|
+
* @param endIndex - 结束索引
|
|
51
|
+
* @param config - 量价关系计算配置
|
|
52
|
+
* @returns 量价关系数组
|
|
53
|
+
*/
|
|
54
|
+
export declare function analyzeVolumePriceRelationBatch(data: KLineData[], startIndex: number, endIndex: number, config?: VolumePriceConfig): VolumePriceRelation[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@363045841yyt/klinechart",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": "^20.19.0 || >=22.12.0"
|
|
@@ -36,25 +36,26 @@
|
|
|
36
36
|
"vue": "^3.5.0"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"
|
|
39
|
+
"ajv": "^8.18.0",
|
|
40
|
+
"axios": "^1.15.0"
|
|
40
41
|
},
|
|
41
42
|
"devDependencies": {
|
|
42
43
|
"@tsconfig/node24": "^24.0.4",
|
|
43
44
|
"@types/jsdom": "^27.0.0",
|
|
44
|
-
"@types/node": "^24.
|
|
45
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
46
|
-
"@vitest/coverage-v8": "^4.
|
|
45
|
+
"@types/node": "^24.12.2",
|
|
46
|
+
"@vitejs/plugin-vue": "^6.0.6",
|
|
47
|
+
"@vitest/coverage-v8": "^4.1.4",
|
|
47
48
|
"@vue/test-utils": "^2.4.6",
|
|
48
49
|
"@vue/tsconfig": "^0.8.1",
|
|
49
50
|
"jsdom": "^27.4.0",
|
|
50
51
|
"npm-run-all2": "^8.0.4",
|
|
51
52
|
"prettier": "3.7.4",
|
|
52
|
-
"typedoc": "^0.28.
|
|
53
|
+
"typedoc": "^0.28.19",
|
|
53
54
|
"typescript": "~5.9.3",
|
|
54
|
-
"vite": "
|
|
55
|
+
"vite": "^8.0.0",
|
|
55
56
|
"vite-plugin-dts": "^4.5.4",
|
|
56
|
-
"vite-plugin-vue-devtools": "^8.
|
|
57
|
-
"vitest": "^4.
|
|
58
|
-
"vue-tsc": "^3.2.
|
|
57
|
+
"vite-plugin-vue-devtools": "^8.1.1",
|
|
58
|
+
"vitest": "^4.1.4",
|
|
59
|
+
"vue-tsc": "^3.2.6"
|
|
59
60
|
}
|
|
60
61
|
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Pane } from '../layout/pane';
|
|
2
|
-
import { KLineData } from '../../types/price';
|
|
3
|
-
/**
|
|
4
|
-
* 为 Pane 绘制十字光标价格标签
|
|
5
|
-
* @param ctx Canvas 上下文
|
|
6
|
-
* @param pane 布局 Pane 对象
|
|
7
|
-
* @param axisWidth 坐标轴宽度
|
|
8
|
-
* @param dpr 设备像素比
|
|
9
|
-
* @param crosshairY 十字光标 Y 坐标
|
|
10
|
-
* @param yPaddingPx Y 轴内边距
|
|
11
|
-
* @param lastPrice 最新价格
|
|
12
|
-
*/
|
|
13
|
-
export declare function drawCrosshairPriceLabelForPane(args: {
|
|
14
|
-
ctx: CanvasRenderingContext2D;
|
|
15
|
-
pane: Pane;
|
|
16
|
-
axisWidth: number;
|
|
17
|
-
dpr: number;
|
|
18
|
-
crosshairY: number;
|
|
19
|
-
yPaddingPx: number;
|
|
20
|
-
lastPrice?: number;
|
|
21
|
-
}): void;
|
|
22
|
-
/**
|
|
23
|
-
* 全局绘制十字光标时间标签
|
|
24
|
-
* @param ctx Canvas 上下文
|
|
25
|
-
* @param data K 线数据
|
|
26
|
-
* @param dpr 设备像素比
|
|
27
|
-
* @param crosshairX 十字光标 X 坐标
|
|
28
|
-
* @param index 十字光标对应的数据索引
|
|
29
|
-
*/
|
|
30
|
-
export declare function drawCrosshairTimeLabelGlobal(args: {
|
|
31
|
-
ctx: CanvasRenderingContext2D;
|
|
32
|
-
data: KLineData[];
|
|
33
|
-
dpr: number;
|
|
34
|
-
crosshairX: number;
|
|
35
|
-
index: number;
|
|
36
|
-
}): void;
|