stock-sdk 1.2.2 → 1.3.0-beta.2

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 CHANGED
@@ -42,12 +42,13 @@
42
42
 
43
43
  ## 特性
44
44
 
45
- - ✅ **零依赖**,轻量级(压缩后 < 10KB
45
+ - ✅ **零依赖**,轻量级(压缩后 < 20KB
46
46
  - ✅ 支持 **浏览器** 和 **Node.js 18+** 双端运行
47
47
  - ✅ 同时提供 **ESM** 和 **CommonJS** 两种模块格式
48
- - ✅ 完整的 **TypeScript** 类型定义的单元测试覆盖
48
+ - ✅ 完整的 **TypeScript** 类型定义和单元测试覆盖
49
49
  - ✅ **A 股、港股、美股、公募基金**实时行情
50
50
  - ✅ **历史 K 线**(日/周/月)、**分钟 K 线**(1/5/15/30/60 分钟)和**当日分时走势**数据
51
+ - ✅ **技术指标**:内置 MA、MACD、BOLL、KDJ、RSI、WR 等常用指标计算
51
52
  - ✅ **资金流向**、**盘口大单**等扩展数据
52
53
  - ✅ 获取全部 **A 股代码列表**(5000+ 只股票)和批量获取**全市场行情**(内置并发控制)
53
54
 
@@ -111,9 +112,26 @@ console.log(`共获取 ${allQuotes.length} 只股票`);
111
112
 
112
113
  | 方法 | 说明 |
113
114
  |------|------|
114
- | [`getHistoryKline`](#gethistoryklinesymbol-options-promisehistorykline) | 历史 K 线(日/周/月) |
115
- | [`getMinuteKline`](#getminuteklinesymbol-options-promiseminutetimeline--minutekline) | 分钟 K 线(1/5/15/30/60 分钟) |
116
- | [`getTodayTimeline`](#gettodaytimelinecode-promisetodaytimelineresponse) | 当日分时走势 |
115
+ | [`getHistoryKline`](#gethistoryklinesymbol-options-promisehistorykline) | A 股历史 K 线(日/周/月) |
116
+ | [`getHKHistoryKline`](#gethkhistoryklinesymbol-options-promisehkushistorykline) | 港股历史 K 线(日/周/月) |
117
+ | [`getUSHistoryKline`](#getushistoryklinesymbol-options-promisehkushistorykline) | 美股历史 K 线(日/周/月) |
118
+ | [`getMinuteKline`](#getminuteklinesymbol-options-promiseminutetimeline--minutekline) | A 股分钟 K 线(1/5/15/30/60 分钟) |
119
+ | [`getTodayTimeline`](#gettodaytimelinecode-promisetodaytimelineresponse) | A 股当日分时走势 |
120
+
121
+ ### 技术指标
122
+
123
+ | 方法 | 说明 |
124
+ |------|------|
125
+ | [`getKlineWithIndicators`](#getklinewithindicatorssymbol-options-promiseklinewithindicators) | 获取带技术指标的 K 线数据 |
126
+ | [`calcMA`](#calcmadata-options-maresult) | 计算均线(SMA/EMA/WMA) |
127
+ | [`calcMACD`](#calcmacddata-options-macdresult) | 计算 MACD |
128
+ | [`calcBOLL`](#calcbolldata-options-bollresult) | 计算布林带 |
129
+ | [`calcKDJ`](#calckdjdata-options-kdjresult) | 计算 KDJ |
130
+ | [`calcRSI`](#calcrsidata-options-rsiresult) | 计算 RSI |
131
+ | [`calcWR`](#calcwrdata-options-wrresult) | 计算威廉指标 |
132
+ | [`calcBIAS`](#calcbiasdata-options-biasresult) | 计算乖离率 |
133
+ | [`calcCCI`](#calcccidata-options-cciresult) | 计算商品通道指数 |
134
+ | [`calcATR`](#calcatrdata-options-atrresult) | 计算平均真实波幅 |
117
135
 
118
136
  ### 扩展数据
119
137
 
@@ -127,7 +145,11 @@ console.log(`共获取 ${allQuotes.length} 只股票`);
127
145
  | 方法 | 说明 |
128
146
  |------|------|
129
147
  | [`getAShareCodeList`](#getasharecodellistincludeexchange-promisestring) | 获取全部 A 股代码 |
148
+ | [`getUSCodeList`](#getuscodelistincludemarket-promisestring) | 获取全部美股代码 |
149
+ | [`getHKCodeList`](#gethkcodelist-promisestring) | 获取全部港股代码 |
130
150
  | [`getAllAShareQuotes`](#getallasharequotesoptions-promisefullquote) | 获取全市场 A 股行情 |
151
+ | [`getAllHKShareQuotes`](#getallhksharequotesoptions-promisehkquote) | 获取全市场港股行情 |
152
+ | [`getAllUSShareQuotes`](#getallusssharequotesoptions-promiseusquote) | 获取全市场美股行情 |
131
153
  | [`getAllQuotesByCodes`](#getallquotesbycodescodes-options-promisefullquote) | 批量获取指定股票行情 |
132
154
 
133
155
  ---
@@ -155,20 +177,32 @@ interface FullQuote {
155
177
  high: number; // 最高
156
178
  low: number; // 最低
157
179
  volume: number; // 成交量(手)
158
- amount: number; // 成交额(万)
159
- change: number; // 涨跌额
160
- changePercent: number; // 涨跌幅 %
180
+ outerVolume: number; // 外盘
181
+ innerVolume: number; // 内盘
161
182
  bid: { price: number; volume: number }[]; // 买一~买五
162
183
  ask: { price: number; volume: number }[]; // 卖一~卖五
184
+ time: string; // 时间戳 yyyyMMddHHmmss
185
+ change: number; // 涨跌额
186
+ changePercent: number; // 涨跌幅 %
187
+ volume2: number; // 成交量(手,字段36)
188
+ amount: number; // 成交额(万)
163
189
  turnoverRate: number | null; // 换手率 %
164
190
  pe: number | null; // 市盈率(TTM)
165
- pb: number | null; // 市净率
166
- totalMarketCap: number | null; // 总市值(亿)
191
+ amplitude: number | null; // 振幅 %
167
192
  circulatingMarketCap: number | null; // 流通市值(亿)
168
- volumeRatio: number | null; // 量比
193
+ totalMarketCap: number | null; // 总市值(亿)
194
+ pb: number | null; // 市净率
169
195
  limitUp: number | null; // 涨停价
170
196
  limitDown: number | null; // 跌停价
171
- // ... 更多字段见类型定义
197
+ volumeRatio: number | null; // 量比
198
+ avgPrice: number | null; // 均价
199
+ peStatic: number | null; // 市盈率(静)
200
+ peDynamic: number | null; // 市盈率(动)
201
+ high52w: number | null; // 52周最高价
202
+ low52w: number | null; // 52周最低价
203
+ circulatingShares: number | null; // 流通股本(股)
204
+ totalShares: number | null; // 总股本(股)
205
+ raw: string[]; // 原始字段数组(供扩展使用)
172
206
  }
173
207
  ```
174
208
 
@@ -269,6 +303,105 @@ const weeklyKlines = await sdk.getHistoryKline('sz000858', {
269
303
 
270
304
  ---
271
305
 
306
+ ### `getHKHistoryKline(symbol, options?): Promise<HKUSHistoryKline[]>`
307
+
308
+ 获取港股历史 K 线(日/周/月),数据来源:东方财富。
309
+
310
+ **参数**
311
+
312
+ | 参数 | 类型 | 说明 |
313
+ |------|------|------|
314
+ | `symbol` | `string` | 港股代码,5 位数字(如 `'00700'`、`'09988'`) |
315
+ | `options.period` | `'daily' \| 'weekly' \| 'monthly'` | K 线周期,默认 `'daily'` |
316
+ | `options.adjust` | `'' \| 'qfq' \| 'hfq'` | 复权类型,默认 `'hfq'`(后复权) |
317
+ | `options.startDate` | `string` | 开始日期 `YYYYMMDD` |
318
+ | `options.endDate` | `string` | 结束日期 `YYYYMMDD` |
319
+
320
+ **返回类型**
321
+
322
+ ```typescript
323
+ interface HKUSHistoryKline {
324
+ date: string; // 日期 YYYY-MM-DD
325
+ code: string; // 股票代码
326
+ name: string; // 股票名称
327
+ open: number | null; // 开盘价
328
+ close: number | null; // 收盘价
329
+ high: number | null; // 最高价
330
+ low: number | null; // 最低价
331
+ volume: number | null; // 成交量
332
+ amount: number | null; // 成交额
333
+ changePercent: number | null; // 涨跌幅 %
334
+ change: number | null; // 涨跌额
335
+ amplitude: number | null; // 振幅 %
336
+ turnoverRate: number | null; // 换手率 %
337
+ }
338
+ ```
339
+
340
+ **示例**
341
+
342
+ ```typescript
343
+ // 获取腾讯控股日 K 线
344
+ const klines = await sdk.getHKHistoryKline('00700');
345
+
346
+ // 获取阿里巴巴周 K 线,前复权
347
+ const weeklyKlines = await sdk.getHKHistoryKline('09988', {
348
+ period: 'weekly',
349
+ adjust: 'qfq',
350
+ startDate: '20240101',
351
+ endDate: '20241231',
352
+ });
353
+ console.log(klines[0].name); // 腾讯控股
354
+ console.log(klines[0].close); // 收盘价
355
+ ```
356
+
357
+ ---
358
+
359
+ ### `getUSHistoryKline(symbol, options?): Promise<HKUSHistoryKline[]>`
360
+
361
+ 获取美股历史 K 线(日/周/月),数据来源:东方财富。
362
+
363
+ **参数**
364
+
365
+ | 参数 | 类型 | 说明 |
366
+ |------|------|------|
367
+ | `symbol` | `string` | 美股代码,格式:`{market}.{ticker}`(如 `'105.MSFT'`、`'106.BABA'`) |
368
+ | `options.period` | `'daily' \| 'weekly' \| 'monthly'` | K 线周期,默认 `'daily'` |
369
+ | `options.adjust` | `'' \| 'qfq' \| 'hfq'` | 复权类型,默认 `'hfq'`(后复权) |
370
+ | `options.startDate` | `string` | 开始日期 `YYYYMMDD` |
371
+ | `options.endDate` | `string` | 结束日期 `YYYYMMDD` |
372
+
373
+ **市场代码说明**
374
+
375
+ | 代码 | 说明 | 示例 |
376
+ |------|------|------|
377
+ | `105` | 纳斯达克 | `105.AAPL`(苹果)、`105.MSFT`(微软)、`105.TSLA`(特斯拉) |
378
+ | `106` | 纽交所 | `106.BABA`(阿里巴巴) |
379
+ | `107` | 美国其他 | `107.XXX` |
380
+
381
+ **示例**
382
+
383
+ ```typescript
384
+ // 获取微软日 K 线
385
+ const klines = await sdk.getUSHistoryKline('105.MSFT');
386
+
387
+ // 获取苹果周 K 线,前复权
388
+ const weeklyKlines = await sdk.getUSHistoryKline('105.AAPL', {
389
+ period: 'weekly',
390
+ adjust: 'qfq',
391
+ startDate: '20240101',
392
+ endDate: '20241231',
393
+ });
394
+ console.log(klines[0].name); // 微软
395
+ console.log(klines[0].close); // 收盘价
396
+
397
+ // 获取阿里巴巴月 K 线
398
+ const monthlyKlines = await sdk.getUSHistoryKline('106.BABA', {
399
+ period: 'monthly',
400
+ });
401
+ ```
402
+
403
+ ---
404
+
272
405
  ### `getMinuteKline(symbol, options?): Promise<MinuteTimeline[] | MinuteKline[]>`
273
406
 
274
407
  获取 A 股分钟 K 线或分时数据,数据来源:东方财富。
@@ -361,6 +494,45 @@ const pureCodes = await sdk.getAShareCodeList(false);
361
494
 
362
495
  ---
363
496
 
497
+ ### `getUSCodeList(includeMarket?): Promise<string[]>`
498
+
499
+ 获取全部美股代码列表。
500
+
501
+ **参数**
502
+
503
+ | 参数 | 类型 | 说明 |
504
+ |------|------|------|
505
+ | `includeMarket` | `boolean` | 是否包含市场前缀(如 `105.`),默认 `true` |
506
+
507
+ **示例**
508
+
509
+ ```typescript
510
+ // 包含市场前缀
511
+ const codes = await sdk.getUSCodeList();
512
+ // ['105.MSFT', '105.AAPL', '106.BABA', ...]
513
+
514
+ // 不包含市场前缀
515
+ const pureCodes = await sdk.getUSCodeList(false);
516
+ // ['MSFT', 'AAPL', 'BABA', ...]
517
+ ```
518
+
519
+ > 市场代码说明:`105` = 纳斯达克,`106` = 纽交所,`107` = 其他
520
+
521
+ ---
522
+
523
+ ### `getHKCodeList(): Promise<string[]>`
524
+
525
+ 获取全部港股代码列表。
526
+
527
+ **示例**
528
+
529
+ ```typescript
530
+ const codes = await sdk.getHKCodeList();
531
+ // ['00700', '09988', '03690', ...]
532
+ ```
533
+
534
+ ---
535
+
364
536
  ### `getAllAShareQuotes(options?): Promise<FullQuote[]>`
365
537
 
366
538
  获取全市场 A 股实时行情(5000+ 只股票),返回格式同 `getFullQuotes`。
@@ -371,7 +543,7 @@ const pureCodes = await sdk.getAShareCodeList(false);
371
543
 
372
544
  | 参数 | 类型 | 说明 |
373
545
  |------|------|------|
374
- | `options.batchSize` | `number` | 单次请求股票数量,默认 `500` |
546
+ | `options.batchSize` | `number` | 单次请求股票数量,默认 `500`,最大 `500` |
375
547
  | `options.concurrency` | `number` | 最大并发数,默认 `7` |
376
548
  | `options.onProgress` | `(completed, total) => void` | 进度回调 |
377
549
 
@@ -390,6 +562,54 @@ console.log(`共获取 ${allQuotes.length} 只股票`);
390
562
 
391
563
  ---
392
564
 
565
+ ### `getAllHKShareQuotes(options?): Promise<HKQuote[]>`
566
+
567
+ 获取全市场港股实时行情,返回格式同 `getHKQuotes`。
568
+
569
+ **参数**
570
+
571
+ | 参数 | 类型 | 说明 |
572
+ |------|------|------|
573
+ | `options.batchSize` | `number` | 单次请求股票数量,默认 `500`,最大 `500` |
574
+ | `options.concurrency` | `number` | 最大并发数,默认 `7` |
575
+ | `options.onProgress` | `(completed, total) => void` | 进度回调 |
576
+
577
+ **示例**
578
+
579
+ ```typescript
580
+ const allHKQuotes = await sdk.getAllHKShareQuotes({
581
+ batchSize: 300,
582
+ concurrency: 3,
583
+ });
584
+ console.log(`共获取 ${allHKQuotes.length} 只港股`);
585
+ ```
586
+
587
+ ---
588
+
589
+ ### `getAllUSShareQuotes(options?): Promise<USQuote[]>`
590
+
591
+ 获取全市场美股实时行情,返回格式同 `getUSQuotes`。
592
+
593
+ **参数**
594
+
595
+ | 参数 | 类型 | 说明 |
596
+ |------|------|------|
597
+ | `options.batchSize` | `number` | 单次请求股票数量,默认 `500`,最大 `500` |
598
+ | `options.concurrency` | `number` | 最大并发数,默认 `7` |
599
+ | `options.onProgress` | `(completed, total) => void` | 进度回调 |
600
+
601
+ **示例**
602
+
603
+ ```typescript
604
+ const allUSQuotes = await sdk.getAllUSShareQuotes({
605
+ batchSize: 300,
606
+ concurrency: 3,
607
+ });
608
+ console.log(`共获取 ${allUSQuotes.length} 只美股`);
609
+ ```
610
+
611
+ ---
612
+
393
613
  ### `getAllQuotesByCodes(codes, options?): Promise<FullQuote[]>`
394
614
 
395
615
  批量获取指定股票的全量行情,参数同 `getAllAShareQuotes`。
@@ -486,11 +706,42 @@ console.log(quotes[0].name); // 阿里巴巴-W
486
706
  |------|------|------|
487
707
  | `codes` | `string[]` | 美股代码数组,如 `['BABA', 'AAPL']` |
488
708
 
709
+ **返回类型**
710
+
711
+ ```typescript
712
+ interface USQuote {
713
+ marketId: string; // 市场标识
714
+ name: string; // 名称
715
+ code: string; // 股票代码
716
+ price: number; // 最新价
717
+ prevClose: number; // 昨收
718
+ open: number; // 今开
719
+ volume: number; // 成交量
720
+ time: string; // 时间
721
+ change: number; // 涨跌额
722
+ changePercent: number; // 涨跌幅%
723
+ high: number; // 最高
724
+ low: number; // 最低
725
+ amount: number; // 成交额
726
+ turnoverRate: number | null; // 换手率%
727
+ pe: number | null; // 市盈率
728
+ amplitude: number | null; // 振幅%
729
+ totalMarketCap: number | null; // 总市值(亿)
730
+ pb: number | null; // 市净率
731
+ high52w: number | null; // 52周最高价
732
+ low52w: number | null; // 52周最低价
733
+ raw: string[]; // 原始字段数组
734
+ }
735
+ ```
736
+
489
737
  **示例**
490
738
 
491
739
  ```typescript
492
- const quotes = await sdk.getUSQuotes(['BABA', 'AAPL']);
493
- console.log(quotes[0].code); // BABA.N
740
+ const quotes = await sdk.getUSQuotes(['AAPL', 'MSFT']);
741
+ console.log(quotes[0].code); // AAPL.OQ
742
+ console.log(quotes[0].price); // 270.97
743
+ console.log(quotes[0].high52w); // 288.62
744
+ console.log(quotes[0].low52w); // 168.64
494
745
  ```
495
746
 
496
747
  ---
@@ -540,6 +791,198 @@ console.log(raw[0].fields); // ['51', '五 粮 液', '000858', ...]
540
791
 
541
792
  ---
542
793
 
794
+ ## 技术指标
795
+
796
+ ### `getKlineWithIndicators(symbol, options): Promise<KlineWithIndicators[]>`
797
+
798
+ 获取带技术指标的 K 线数据。支持 A 股、港股、美股,自动识别市场。
799
+
800
+ **参数**
801
+
802
+ | 参数 | 类型 | 说明 |
803
+ |------|------|------|
804
+ | `symbol` | `string` | 股票代码 |
805
+ | `options.market` | `'A' \| 'HK' \| 'US'` | 可选,市场类型(不传则自动识别) |
806
+ | `options.period` | `'daily' \| 'weekly' \| 'monthly'` | 可选,K 线周期,默认 `'daily'` |
807
+ | `options.adjust` | `'' \| 'qfq' \| 'hfq'` | 可选,复权类型,默认 `'hfq'` |
808
+ | `options.startDate` | `string` | 可选,开始日期 `YYYYMMDD` |
809
+ | `options.endDate` | `string` | 可选,结束日期 `YYYYMMDD` |
810
+ | `options.indicators` | `IndicatorOptions` | 技术指标配置 |
811
+
812
+ **indicators 配置**
813
+
814
+ ```typescript
815
+ interface IndicatorOptions {
816
+ ma?: MAOptions | boolean; // 均线
817
+ macd?: MACDOptions | boolean; // MACD
818
+ boll?: BOLLOptions | boolean; // 布林带
819
+ kdj?: KDJOptions | boolean; // KDJ
820
+ rsi?: RSIOptions | boolean; // RSI
821
+ wr?: WROptions | boolean; // WR
822
+ }
823
+
824
+ // 各指标可选参数
825
+ interface MAOptions {
826
+ periods?: number[]; // 周期数组,默认 [5, 10, 20, 30, 60, 120, 250]
827
+ type?: 'sma' | 'ema' | 'wma'; // 均线类型,默认 'sma'
828
+ }
829
+
830
+ interface MACDOptions {
831
+ short?: number; // 短期 EMA 周期,默认 12
832
+ long?: number; // 长期 EMA 周期,默认 26
833
+ signal?: number; // 信号线周期,默认 9
834
+ }
835
+
836
+ interface BOLLOptions {
837
+ period?: number; // 均线周期,默认 20
838
+ stdDev?: number; // 标准差倍数,默认 2
839
+ }
840
+
841
+ interface KDJOptions {
842
+ period?: number; // RSV 周期,默认 9
843
+ kPeriod?: number; // K 平滑周期,默认 3
844
+ dPeriod?: number; // D 平滑周期,默认 3
845
+ }
846
+
847
+ interface RSIOptions {
848
+ periods?: number[]; // 周期数组,默认 [6, 12, 24]
849
+ }
850
+
851
+ interface WROptions {
852
+ periods?: number[]; // 周期数组,默认 [6, 10]
853
+ }
854
+
855
+ interface BIASOptions {
856
+ periods?: number[]; // 周期数组,默认 [6, 12, 24]
857
+ }
858
+
859
+ interface CCIOptions {
860
+ period?: number; // 周期,默认 14
861
+ }
862
+
863
+ interface ATROptions {
864
+ period?: number; // 周期,默认 14
865
+ }
866
+ ```
867
+
868
+ **示例**
869
+
870
+ ```typescript
871
+ // 获取平安银行带技术指标的日 K 线
872
+ const data = await sdk.getKlineWithIndicators('sz000001', {
873
+ startDate: '20240101',
874
+ endDate: '20241231',
875
+ indicators: {
876
+ ma: { periods: [5, 10, 20, 60] },
877
+ macd: true,
878
+ boll: true,
879
+ kdj: true,
880
+ rsi: { periods: [6, 12] },
881
+ wr: true,
882
+ bias: { periods: [6, 12, 24] },
883
+ cci: { period: 14 },
884
+ atr: { period: 14 },
885
+ }
886
+ });
887
+
888
+ // 使用数据
889
+ data.forEach(k => {
890
+ console.log(`${k.date}: ${k.close}`);
891
+ console.log(` MA5=${k.ma?.ma5}, MA10=${k.ma?.ma10}`);
892
+ console.log(` MACD: DIF=${k.macd?.dif}, DEA=${k.macd?.dea}`);
893
+ console.log(` BOLL: 上=${k.boll?.upper}, 中=${k.boll?.mid}, 下=${k.boll?.lower}`);
894
+ console.log(` KDJ: K=${k.kdj?.k}, D=${k.kdj?.d}, J=${k.kdj?.j}`);
895
+ console.log(` RSI6=${k.rsi?.rsi6}, WR6=${k.wr?.wr6}`);
896
+ console.log(` BIAS6=${k.bias?.bias6}, CCI=${k.cci?.cci}, ATR=${k.atr?.atr}`);
897
+ });
898
+
899
+ // 港股(自动识别)
900
+ const hkData = await sdk.getKlineWithIndicators('00700', {
901
+ indicators: { ma: true, macd: true }
902
+ });
903
+
904
+ // 美股(自动识别)
905
+ const usData = await sdk.getKlineWithIndicators('105.MSFT', {
906
+ indicators: { boll: true, rsi: true }
907
+ });
908
+ ```
909
+
910
+ ---
911
+
912
+ ### 独立指标计算函数
913
+
914
+ SDK 还导出了独立的指标计算函数,可自行传入数据计算:
915
+
916
+ ```typescript
917
+ import {
918
+ calcMA,
919
+ calcSMA,
920
+ calcEMA,
921
+ calcMACD,
922
+ calcBOLL,
923
+ calcKDJ,
924
+ calcRSI,
925
+ calcWR,
926
+ calcBIAS,
927
+ calcCCI,
928
+ calcATR,
929
+ addIndicators,
930
+ } from 'stock-sdk';
931
+
932
+ // 获取 K 线数据
933
+ const klines = await sdk.getHistoryKline('sz000001');
934
+ const closes = klines.map(k => k.close);
935
+
936
+ // 计算均线
937
+ const ma = calcMA(closes, { periods: [5, 10, 20], type: 'sma' });
938
+ console.log(ma[10].ma5); // 第 10 天的 5 日均线
939
+
940
+ // 计算 MACD
941
+ const macd = calcMACD(closes);
942
+ console.log(macd[50].dif, macd[50].dea, macd[50].macd);
943
+
944
+ // 计算布林带
945
+ const boll = calcBOLL(closes, { period: 20, stdDev: 2 });
946
+ console.log(boll[30].upper, boll[30].mid, boll[30].lower);
947
+
948
+ // 计算 KDJ(需要 OHLC 数据)
949
+ const ohlcv = klines.map(k => ({
950
+ open: k.open, high: k.high, low: k.low, close: k.close
951
+ }));
952
+ const kdj = calcKDJ(ohlcv, { period: 9 });
953
+ console.log(kdj[20].k, kdj[20].d, kdj[20].j);
954
+
955
+ // 计算乖离率
956
+ const bias = calcBIAS(closes, { periods: [6, 12, 24] });
957
+ console.log(bias[30].bias6, bias[30].bias12, bias[30].bias24);
958
+
959
+ // 计算 CCI(需要 HLC 数据)
960
+ const hlc = klines.map(k => ({ high: k.high, low: k.low, close: k.close }));
961
+ const cci = calcCCI(hlc, { period: 14 });
962
+ console.log(cci[30].cci);
963
+
964
+ // 计算 ATR(需要 HLC 数据)
965
+ const atr = calcATR(hlc, { period: 14 });
966
+ console.log(atr[30].atr, atr[30].tr);
967
+
968
+ // 使用 addIndicators 一次性添加多个指标
969
+ const withIndicators = addIndicators(klines, {
970
+ ma: { periods: [5, 10] },
971
+ macd: true,
972
+ boll: true,
973
+ bias: true,
974
+ cci: true,
975
+ atr: true,
976
+ });
977
+ console.log(withIndicators[50].ma?.ma5);
978
+ console.log(withIndicators[50].macd?.dif);
979
+ console.log(withIndicators[50].bias?.bias6);
980
+ console.log(withIndicators[50].cci?.cci);
981
+ console.log(withIndicators[50].atr?.atr);
982
+ ```
983
+
984
+ ---
985
+
543
986
  ## 浏览器直接使用
544
987
 
545
988
  SDK 使用原生 `TextDecoder` 解码 GBK 编码数据,无需额外 polyfill。
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var N=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var E=Object.getOwnPropertyNames;var _=Object.prototype.hasOwnProperty;var z=(a,e)=>{for(var n in e)N(a,n,{get:e[n],enumerable:!0})},B=(a,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of E(e))!_.call(a,t)&&t!==n&&N(a,t,{get:()=>e[t],enumerable:!(r=H(e,t))||r.enumerable});return a};var W=a=>B(N({},"__esModule",{value:!0}),a);var Y={};z(Y,{StockSDK:()=>A,default:()=>K});module.exports=W(Y);function U(a){return new TextDecoder("gbk").decode(a)}function s(a){if(!a||a==="")return 0;let e=parseFloat(a);return Number.isNaN(e)?0:e}function u(a){if(!a||a==="")return null;let e=parseFloat(a);return Number.isNaN(e)?null:e}function I(a){let e=a.split(";").map(r=>r.trim()).filter(Boolean),n=[];for(let r of e){let t=r.indexOf("=");if(t<0)continue;let o=r.slice(0,t).trim();o.startsWith("v_")&&(o=o.slice(2));let i=r.slice(t+1).trim();i.startsWith('"')&&i.endsWith('"')&&(i=i.slice(1,-1));let m=i.split("~");n.push({key:o,fields:m})}return n}function x(a,e){let n=[];for(let r=0;r<a.length;r+=e)n.push(a.slice(r,r+e));return n}async function L(a,e){let n=[],r=[];for(let t of a){let o=Promise.resolve().then(()=>t()).then(i=>{n.push(i)});if(r.push(o),r.length>=e){await Promise.race(r);for(let i=r.length-1;i>=0;i--)await Promise.race([r[i].then(()=>"fulfilled"),Promise.resolve("pending")])==="fulfilled"&&r.splice(i,1)}}return await Promise.all(r),n}var G="https://qt.gtimg.cn",V="https://web.ifzq.gtimg.cn/appstock/app/minute/query",J="https://assets.linkdiary.cn/shares/ashare-code.json",M="https://push2his.eastmoney.com/api/qt/stock/kline/get",X="https://push2his.eastmoney.com/api/qt/stock/trends2/get";function D(a){return a.startsWith("sh")?"1":a.startsWith("sz")||a.startsWith("bj")?"0":a.startsWith("6")?"1":"0"}function l(a){if(!a||a===""||a==="-")return null;let e=parseFloat(a);return Number.isNaN(e)?null:e}var A=class{constructor(e={}){this.baseUrl=e.baseUrl??G,this.timeout=e.timeout??1e4}async request(e){let n=`${this.baseUrl}/?q=${encodeURIComponent(e)}`,r=new AbortController,t=setTimeout(()=>r.abort(),this.timeout);try{let o=await fetch(n,{signal:r.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let i=await o.arrayBuffer(),m=U(i);return I(m)}finally{clearTimeout(t)}}async getFullQuotes(e){return!e||e.length===0?[]:(await this.request(e.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>this.parseFullQuote(r.fields))}parseFullQuote(e){let n=[];for(let t=0;t<5;t++)n.push({price:s(e[9+t*2]),volume:s(e[10+t*2])});let r=[];for(let t=0;t<5;t++)r.push({price:s(e[19+t*2]),volume:s(e[20+t*2])});return{marketId:e[0]??"",name:e[1]??"",code:e[2]??"",price:s(e[3]),prevClose:s(e[4]),open:s(e[5]),volume:s(e[6]),outerVolume:s(e[7]),innerVolume:s(e[8]),bid:n,ask:r,time:e[30]??"",change:s(e[31]),changePercent:s(e[32]),high:s(e[33]),low:s(e[34]),volume2:s(e[36]),amount:s(e[37]),turnoverRate:u(e[38]),pe:u(e[39]),amplitude:u(e[43]),circulatingMarketCap:u(e[44]),totalMarketCap:u(e[45]),pb:u(e[46]),limitUp:u(e[47]),limitDown:u(e[48]),volumeRatio:u(e[49]),avgPrice:u(e[51]),peStatic:u(e[52]),peDynamic:u(e[53]),high52w:u(e[67]),low52w:u(e[68]),circulatingShares:u(e[72]),totalShares:u(e[73]),raw:e}}async getSimpleQuotes(e){if(!e||e.length===0)return[];let n=e.map(t=>`s_${t}`);return(await this.request(n.join(","))).filter(t=>t.fields&&t.fields.length>0&&t.fields[0]!=="").map(t=>this.parseSimpleQuote(t.fields))}parseSimpleQuote(e){return{marketId:e[0]??"",name:e[1]??"",code:e[2]??"",price:s(e[3]),change:s(e[4]),changePercent:s(e[5]),volume:s(e[6]),amount:s(e[7]),marketCap:u(e[9]),marketType:e[10]??"",raw:e}}async getFundFlow(e){if(!e||e.length===0)return[];let n=e.map(t=>`ff_${t}`);return(await this.request(n.join(","))).filter(t=>t.fields&&t.fields.length>0&&t.fields[0]!=="").map(t=>this.parseFundFlow(t.fields))}parseFundFlow(e){return{code:e[0]??"",mainInflow:s(e[1]),mainOutflow:s(e[2]),mainNet:s(e[3]),mainNetRatio:s(e[4]),retailInflow:s(e[5]),retailOutflow:s(e[6]),retailNet:s(e[7]),retailNetRatio:s(e[8]),totalFlow:s(e[9]),name:e[12]??"",date:e[13]??"",raw:e}}async getPanelLargeOrder(e){if(!e||e.length===0)return[];let n=e.map(t=>`s_pk${t}`);return(await this.request(n.join(","))).filter(t=>t.fields&&t.fields.length>0&&t.fields[0]!=="").map(t=>this.parsePanelLargeOrder(t.fields))}parsePanelLargeOrder(e){return{buyLargeRatio:s(e[0]),buySmallRatio:s(e[1]),sellLargeRatio:s(e[2]),sellSmallRatio:s(e[3]),raw:e}}async getHKQuotes(e){if(!e||e.length===0)return[];let n=e.map(t=>`r_hk${t}`);return(await this.request(n.join(","))).filter(t=>t.fields&&t.fields.length>0&&t.fields[0]!=="").map(t=>this.parseHKQuote(t.fields))}parseHKQuote(e){return{marketId:e[0]??"",name:e[1]??"",code:e[2]??"",price:s(e[3]),prevClose:s(e[4]),open:s(e[5]),volume:s(e[6]),time:e[30]??"",change:s(e[31]),changePercent:s(e[32]),high:s(e[33]),low:s(e[34]),amount:s(e[36]),lotSize:u(e[40]),circulatingMarketCap:u(e[46]),totalMarketCap:u(e[47]),currency:e[e.length-3]??"",raw:e}}async getUSQuotes(e){if(!e||e.length===0)return[];let n=e.map(t=>`s_us${t}`);return(await this.request(n.join(","))).filter(t=>t.fields&&t.fields.length>0&&t.fields[0]!=="").map(t=>this.parseUSQuote(t.fields))}parseUSQuote(e){return{marketId:e[0]??"",name:e[1]??"",code:e[2]??"",price:s(e[3]),change:s(e[4]),changePercent:s(e[5]),volume:s(e[6]),amount:s(e[7]),marketCap:u(e[8]),raw:e}}async getFundQuotes(e){if(!e||e.length===0)return[];let n=e.map(t=>`jj${t}`);return(await this.request(n.join(","))).filter(t=>t.fields&&t.fields.length>0&&t.fields[0]!=="").map(t=>this.parseFundQuote(t.fields))}parseFundQuote(e){return{code:e[0]??"",name:e[1]??"",nav:s(e[5]),accNav:s(e[6]),change:s(e[7]),navDate:e[8]??"",raw:e}}async batchRaw(e){return this.request(e)}async getTodayTimeline(e){let n=new AbortController,r=setTimeout(()=>n.abort(),this.timeout);try{let t=await fetch(`${V}?code=${e}`,{signal:n.signal});if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);let o=await t.json();if(o.code!==0)throw new Error(o.msg||"API error");let i=o.data?.[e];if(!i)return{code:e,date:"",data:[]};let m=i.data?.data||[],d=i.data?.date||"",h=!1;if(m.length>0){let p=m[0].split(" "),c=parseFloat(p[1])||0,g=parseInt(p[2],10)||0,f=parseFloat(p[3])||0;g>0&&c>0&&f/g>c*50&&(h=!0)}let k=m.map(p=>{let c=p.split(" "),g=c[0],f=`${g.slice(0,2)}:${g.slice(2,4)}`,y=parseInt(c[2],10)||0,b=parseFloat(c[3])||0,w=h?y*100:y,P=w>0?b/w:0;return{time:f,price:parseFloat(c[1])||0,volume:w,amount:b,avgPrice:Math.round(P*100)/100}});return{code:e,date:d,data:k}}finally{clearTimeout(r)}}async getAShareCodeList(e=!0){let n=new AbortController,r=setTimeout(()=>n.abort(),this.timeout);try{let t=await fetch(J,{signal:n.signal});if(!t.ok)throw new Error(`HTTP error! status: ${t.status}`);let o=await t.json();return e?o:o.map(i=>i.replace(/^(sh|sz|bj)/,""))}finally{clearTimeout(r)}}async getAllAShareQuotes(e={}){let{batchSize:n=500,concurrency:r=7,onProgress:t}=e,o=await this.getAShareCodeList(),i=x(o,n),m=i.length,d=0,h=i.map(p=>async()=>{let c=await this.getFullQuotes(p);return d++,t&&t(d,m),c});return(await L(h,r)).flat()}async getAllQuotesByCodes(e,n={}){let{batchSize:r=500,concurrency:t=7,onProgress:o}=n,i=x(e,r),m=i.length,d=0,h=i.map(p=>async()=>{let c=await this.getFullQuotes(p);return d++,o&&o(d,m),c});return(await L(h,t)).flat()}async getHistoryKline(e,n={}){let{period:r="daily",adjust:t="hfq",startDate:o="19700101",endDate:i="20500101"}=n,m=e.replace(/^(sh|sz|bj)/,""),d={daily:"101",weekly:"102",monthly:"103"},h={"":"0",qfq:"1",hfq:"2"},k=`${D(m)}.${m}`,p=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f116",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:d[r],fqt:h[t],secid:k,beg:o,end:i}),c=new AbortController,g=setTimeout(()=>c.abort(),this.timeout);try{let f=await fetch(`${M}?${p.toString()}`,{signal:c.signal});if(!f.ok)throw new Error(`HTTP error! status: ${f.status}`);let b=(await f.json())?.data?.klines;return!Array.isArray(b)||b.length===0?[]:b.map(w=>{let[P,T,v,Q,S,F,j,q,C,R,$]=w.split(",");return{date:P,code:m,open:l(T),close:l(v),high:l(Q),low:l(S),volume:l(F),amount:l(j),amplitude:l(q),changePercent:l(C),change:l(R),turnoverRate:l($)}})}finally{clearTimeout(g)}}async getMinuteKline(e,n={}){let{period:r="1",adjust:t="hfq",startDate:o="1979-09-01 09:32:00",endDate:i="2222-01-01 09:32:00"}=n,m=e.replace(/^(sh|sz|bj)/,""),d=`${D(m)}.${m}`,h=new AbortController,k=setTimeout(()=>h.abort(),this.timeout);try{if(r==="1"){let p=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",fields2:"f51,f52,f53,f54,f55,f56,f57,f58",ut:"7eea3edcaed734bea9cbfc24409ed989",ndays:"5",iscr:"0",secid:d}),c=await fetch(`${X}?${p.toString()}`,{signal:h.signal});if(!c.ok)throw new Error(`HTTP error! status: ${c.status}`);let f=(await c.json())?.data?.trends;if(!Array.isArray(f)||f.length===0)return[];let y=o.replace("T"," ").slice(0,16),b=i.replace("T"," ").slice(0,16);return f.map(w=>{let[P,T,v,Q,S,F,j,q]=w.split(",");return{time:P,open:l(T),close:l(v),high:l(Q),low:l(S),volume:l(F),amount:l(j),avgPrice:l(q)}}).filter(w=>w.time>=y&&w.time<=b)}else{let p={"":"0",qfq:"1",hfq:"2"},c=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:r,fqt:p[t],secid:d,beg:"0",end:"20500000"}),g=await fetch(`${M}?${c.toString()}`,{signal:h.signal});if(!g.ok)throw new Error(`HTTP error! status: ${g.status}`);let y=(await g.json())?.data?.klines;if(!Array.isArray(y)||y.length===0)return[];let b=o.replace("T"," ").slice(0,16),w=i.replace("T"," ").slice(0,16);return y.map(P=>{let[T,v,Q,S,F,j,q,C,R,$,O]=P.split(",");return{time:T,open:l(v),close:l(Q),high:l(S),low:l(F),changePercent:l(R),change:l($),volume:l(j),amount:l(q),amplitude:l(C),turnoverRate:l(O)}}).filter(P=>P.time>=b&&P.time<=w)}}finally{clearTimeout(k)}}},K=A;0&&(module.exports={StockSDK});
1
+ "use strict";var ct=Object.defineProperty;var Gt=Object.getOwnPropertyDescriptor;var Jt=Object.getOwnPropertyNames;var Zt=Object.prototype.hasOwnProperty;var mt=(t,e)=>{for(var n in e)ct(t,n,{get:e[n],enumerable:!0})},Yt=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Jt(e))!Zt.call(t,r)&&r!==n&&ct(t,r,{get:()=>e[r],enumerable:!(s=Gt(e,r))||s.enumerable});return t};var Xt=t=>Yt(ct({},"__esModule",{value:!0}),t);var ae={};mt(ae,{StockSDK:()=>nt,addIndicators:()=>et,asyncPool:()=>_,calcATR:()=>tt,calcBIAS:()=>Y,calcBOLL:()=>V,calcCCI:()=>X,calcEMA:()=>I,calcKDJ:()=>G,calcMA:()=>W,calcMACD:()=>z,calcRSI:()=>J,calcSMA:()=>H,calcWMA:()=>at,calcWR:()=>Z,chunkArray:()=>j,decodeGBK:()=>E,default:()=>Vt,parseResponse:()=>D,safeNumber:()=>m,safeNumberOrNull:()=>y});module.exports=Xt(ae);function E(t){return new TextDecoder("gbk").decode(t)}function D(t){let e=t.split(";").map(s=>s.trim()).filter(Boolean),n=[];for(let s of e){let r=s.indexOf("=");if(r<0)continue;let o=s.slice(0,r).trim();o.startsWith("v_")&&(o=o.slice(2));let i=s.slice(r+1).trim();i.startsWith('"')&&i.endsWith('"')&&(i=i.slice(1,-1));let l=i.split("~");n.push({key:o,fields:l})}return n}function m(t){if(!t||t==="")return 0;let e=parseFloat(t);return Number.isNaN(e)?0:e}function y(t){if(!t||t==="")return null;let e=parseFloat(t);return Number.isNaN(e)?null:e}function p(t){if(!t||t===""||t==="-")return null;let e=parseFloat(t);return Number.isNaN(e)?null:e}var pt="https://qt.gtimg.cn",ft="https://web.ifzq.gtimg.cn/appstock/app/minute/query",dt="https://assets.linkdiary.cn/shares/zh_a_list.json",ht="https://assets.linkdiary.cn/shares/us_list.json",gt="https://assets.linkdiary.cn/shares/hk_list.json";var rt="https://push2his.eastmoney.com/api/qt/stock/kline/get",yt="https://push2his.eastmoney.com/api/qt/stock/trends2/get",bt="https://33.push2his.eastmoney.com/api/qt/stock/kline/get",Rt="https://63.push2his.eastmoney.com/api/qt/stock/kline/get",St=3e4,N=500,F=500,v=7;var B=class{constructor(e={}){this.baseUrl=e.baseUrl??pt,this.timeout=e.timeout??St}getTimeout(){return this.timeout}async get(e,n={}){let s=new AbortController,r=setTimeout(()=>s.abort(),this.timeout);try{let o=await fetch(e,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);switch(n.responseType){case"json":return await o.json();case"arraybuffer":return await o.arrayBuffer();default:return await o.text()}}finally{clearTimeout(r)}}async getTencentQuote(e){let n=`${this.baseUrl}/?q=${encodeURIComponent(e)}`,s=await this.get(n,{responseType:"arraybuffer"}),r=E(s);return D(r)}};var te=new Set(["daily","weekly","monthly"]),ee=new Set(["1","5","15","30","60"]),ne=new Set(["","qfq","hfq"]);function C(t,e){if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new RangeError(`${e} must be a positive integer`)}function Q(t){if(!te.has(t))throw new RangeError("period must be one of: daily, weekly, monthly")}function wt(t){if(!ee.has(t))throw new RangeError("period must be one of: 1, 5, 15, 30, 60")}function k(t){if(!ne.has(t))throw new RangeError("adjust must be one of: '', 'qfq', 'hfq'")}function j(t,e){C(e,"chunkSize");let n=[];for(let s=0;s<t.length;s+=e)n.push(t.slice(s,s+e));return n}async function _(t,e){C(e,"concurrency");let n=[],s=[];for(let r of t){let o=Promise.resolve().then(()=>r()).then(i=>{n.push(i)});if(s.push(o),s.length>=e){await Promise.race(s);for(let i=s.length-1;i>=0;i--)await Promise.race([s[i].then(()=>"fulfilled"),Promise.resolve("pending")])==="fulfilled"&&s.splice(i,1)}}return await Promise.all(s),n}function ot(t){return t.startsWith("sh")?"1":t.startsWith("sz")||t.startsWith("bj")?"0":t.startsWith("6")?"1":"0"}var S={};mt(S,{getAShareCodeList:()=>_t,getAllHKQuotesByCodes:()=>Nt,getAllQuotesByCodes:()=>Dt,getAllUSQuotesByCodes:()=>Ft,getFullQuotes:()=>st,getFundFlow:()=>Pt,getFundQuotes:()=>Qt,getHKCodeList:()=>Et,getHKQuotes:()=>it,getPanelLargeOrder:()=>Ot,getSimpleQuotes:()=>Ut,getTodayTimeline:()=>jt,getUSCodeList:()=>qt,getUSQuotes:()=>lt,parseFullQuote:()=>Tt,parseFundFlow:()=>Ct,parseFundQuote:()=>Lt,parseHKQuote:()=>Mt,parsePanelLargeOrder:()=>Kt,parseSimpleQuote:()=>At,parseUSQuote:()=>xt});function Tt(t){let e=[];for(let s=0;s<5;s++)e.push({price:m(t[9+s*2]),volume:m(t[10+s*2])});let n=[];for(let s=0;s<5;s++)n.push({price:m(t[19+s*2]),volume:m(t[20+s*2])});return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),outerVolume:m(t[7]),innerVolume:m(t[8]),bid:e,ask:n,time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),volume2:m(t[36]),amount:m(t[37]),turnoverRate:y(t[38]),pe:y(t[39]),amplitude:y(t[43]),circulatingMarketCap:y(t[44]),totalMarketCap:y(t[45]),pb:y(t[46]),limitUp:y(t[47]),limitDown:y(t[48]),volumeRatio:y(t[49]),avgPrice:y(t[51]),peStatic:y(t[52]),peDynamic:y(t[53]),high52w:y(t[67]),low52w:y(t[68]),circulatingShares:y(t[72]),totalShares:y(t[73]),raw:t}}function At(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),change:m(t[4]),changePercent:m(t[5]),volume:m(t[6]),amount:m(t[7]),marketCap:y(t[9]),marketType:t[10]??"",raw:t}}function Ct(t){return{code:t[0]??"",mainInflow:m(t[1]),mainOutflow:m(t[2]),mainNet:m(t[3]),mainNetRatio:m(t[4]),retailInflow:m(t[5]),retailOutflow:m(t[6]),retailNet:m(t[7]),retailNetRatio:m(t[8]),totalFlow:m(t[9]),name:t[12]??"",date:t[13]??"",raw:t}}function Kt(t){return{buyLargeRatio:m(t[0]),buySmallRatio:m(t[1]),sellLargeRatio:m(t[2]),sellSmallRatio:m(t[3]),raw:t}}function Mt(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),amount:m(t[37]),lotSize:y(t[40]),circulatingMarketCap:y(t[44]),totalMarketCap:y(t[45]),currency:t[t.length-3]??"",raw:t}}function xt(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),amount:m(t[37]),turnoverRate:y(t[38]),pe:y(t[39]),amplitude:y(t[43]),totalMarketCap:y(t[45]),pb:y(t[47]),high52w:y(t[48]),low52w:y(t[49]),raw:t}}function Lt(t){return{code:t[0]??"",name:t[1]??"",nav:m(t[5]),accNav:m(t[6]),change:m(t[7]),navDate:t[8]??"",raw:t}}async function st(t,e){return!e||e.length===0?[]:(await t.getTencentQuote(e.join(","))).filter(s=>s.fields&&s.fields.length>0&&s.fields[0]!=="").map(s=>Tt(s.fields))}async function Ut(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`s_${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>At(r.fields))}async function Pt(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`ff_${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Ct(r.fields))}async function Ot(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`s_pk${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Kt(r.fields))}async function it(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`hk${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Mt(r.fields))}async function lt(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`us${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>xt(r.fields))}async function Qt(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`jj${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Lt(r.fields))}async function jt(t,e){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(`${ft}?code=${e}`,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let i=await o.json();if(i.code!==0)throw new Error(i.msg||"API error");let l=i.data?.[e];if(!l)return{code:e,date:"",data:[]};let a=l.data?.data||[],u=l.data?.date||"",c=!1;if(a.length>0){let f=a[0].split(" "),h=parseFloat(f[1])||0,g=parseInt(f[2],10)||0,b=parseFloat(f[3])||0;g>0&&h>0&&b/g>h*50&&(c=!0)}let d=a.map(f=>{let h=f.split(" "),g=h[0],b=`${g.slice(0,2)}:${g.slice(2,4)}`,R=parseInt(h[2],10)||0,w=parseFloat(h[3])||0,T=c?R*100:R,A=T>0?w/T:0;return{time:b,price:parseFloat(h[1])||0,volume:T,amount:w,avgPrice:Math.round(A*100)/100}});return{code:e,date:u,data:d}}finally{clearTimeout(r)}}async function _t(t,e=!0){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(dt,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let l=(await o.json()).list||[];return e?l:l.map(a=>a.replace(/^(sh|sz|bj)/,""))}finally{clearTimeout(r)}}async function qt(t,e=!0){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(ht,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let l=(await o.json()).list||[];return e?l:l.map(a=>a.replace(/^\d{3}\./,""))}finally{clearTimeout(r)}}async function Et(t){let e=t.getTimeout(),n=new AbortController,s=setTimeout(()=>n.abort(),e);try{let r=await fetch(gt,{signal:n.signal});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);return(await r.json()).list||[]}finally{clearTimeout(s)}}async function Dt(t,e,n={}){let{batchSize:s=N,concurrency:r=v,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,F),l=j(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await st(t,f);return u++,o&&o(u,a),h});return(await _(c,r)).flat()}async function Nt(t,e,n={}){let{batchSize:s=N,concurrency:r=v,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,F),l=j(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await it(t,f);return u++,o&&o(u,a),h});return(await _(c,r)).flat()}async function Ft(t,e,n={}){let{batchSize:s=N,concurrency:r=v,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,F),l=j(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await lt(t,f);return u++,o&&o(u,a),h});return(await _(c,r)).flat()}var q={};mt(q,{getHKHistoryKline:()=>$t,getHistoryKline:()=>vt,getMinuteKline:()=>Bt,getUSHistoryKline:()=>Wt});async function vt(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;Q(s),k(r);let l=e.replace(/^(sh|sz|bj)/,""),a={daily:"101",weekly:"102",monthly:"103"},u={"":"0",qfq:"1",hfq:"2"},c=`${ot(e)}.${l}`,d=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f116",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:a[s],fqt:u[r],secid:c,beg:o,end:i}),f=`${rt}?${d.toString()}`,g=(await t.get(f,{responseType:"json"}))?.data?.klines;return!Array.isArray(g)||g.length===0?[]:g.map(b=>{let[R,w,T,A,K,M,x,L,U,P,O]=b.split(",");return{date:R,code:l,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),amplitude:p(L),changePercent:p(U),change:p(P),turnoverRate:p(O)}})}async function Bt(t,e,n={}){let{period:s="1",adjust:r="hfq",startDate:o="1979-09-01 09:32:00",endDate:i="2222-01-01 09:32:00"}=n;wt(s),k(r);let l=e.replace(/^(sh|sz|bj)/,""),a=`${ot(e)}.${l}`;if(s==="1"){let u=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",fields2:"f51,f52,f53,f54,f55,f56,f57,f58",ut:"7eea3edcaed734bea9cbfc24409ed989",ndays:"5",iscr:"0",secid:a}),c=`${yt}?${u.toString()}`,f=(await t.get(c,{responseType:"json"}))?.data?.trends;if(!Array.isArray(f)||f.length===0)return[];let h=o.replace("T"," ").slice(0,16),g=i.replace("T"," ").slice(0,16);return f.map(b=>{let[R,w,T,A,K,M,x,L]=b.split(",");return{time:R,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),avgPrice:p(L)}}).filter(b=>b.time>=h&&b.time<=g)}else{let u={"":"0",qfq:"1",hfq:"2"},c=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:s,fqt:u[r],secid:a,beg:"0",end:"20500000"}),d=`${rt}?${c.toString()}`,h=(await t.get(d,{responseType:"json"}))?.data?.klines;if(!Array.isArray(h)||h.length===0)return[];let g=o.replace("T"," ").slice(0,16),b=i.replace("T"," ").slice(0,16);return h.map(R=>{let[w,T,A,K,M,x,L,U,P,O,ut]=R.split(",");return{time:w,open:p(T),close:p(A),high:p(K),low:p(M),changePercent:p(P),change:p(O),volume:p(x),amount:p(L),amplitude:p(U),turnoverRate:p(ut)}}).filter(R=>R.time>=g&&R.time<=b)}}async function $t(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;Q(s),k(r);let l=e.replace(/^hk/i,"").padStart(5,"0"),a={daily:"101",weekly:"102",monthly:"103"},u={"":"0",qfq:"1",hfq:"2"},c=`116.${l}`,d=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:a[s],fqt:u[r],secid:c,beg:o,end:i,lmt:"1000000"}),f=`${bt}?${d.toString()}`,h=await t.get(f,{responseType:"json"}),g=h?.data?.klines,b=h?.data?.name||"";return!Array.isArray(g)||g.length===0?[]:g.map(R=>{let[w,T,A,K,M,x,L,U,P,O,ut]=R.split(",");return{date:w,code:l,name:b,open:p(T),close:p(A),high:p(K),low:p(M),volume:p(x),amount:p(L),amplitude:p(U),changePercent:p(P),change:p(O),turnoverRate:p(ut)}})}async function Wt(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;Q(s),k(r);let l={daily:"101",weekly:"102",monthly:"103"},a={"":"0",qfq:"1",hfq:"2"},u=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:l[s],fqt:a[r],secid:e,beg:o,end:i,lmt:"1000000"}),c=`${Rt}?${u.toString()}`,d=await t.get(c,{responseType:"json"}),f=d?.data?.klines,h=d?.data?.code||e.split(".")[1]||e,g=d?.data?.name||"";return!Array.isArray(f)||f.length===0?[]:f.map(b=>{let[R,w,T,A,K,M,x,L,U,P,O]=b.split(",");return{date:R,code:h,name:g,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),amplitude:p(L),changePercent:p(U),change:p(P),turnoverRate:p(O)}})}function $(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function H(t,e){let n=[];for(let s=0;s<t.length;s++){if(s<e-1){n.push(null);continue}let r=0,o=0;for(let i=s-e+1;i<=s;i++)t[i]!==null&&(r+=t[i],o++);n.push(o===e?$(r/e):null)}return n}function I(t,e){let n=[],s=2/(e+1),r=null,o=!1;for(let i=0;i<t.length;i++){if(i<e-1){n.push(null);continue}if(!o){let a=0,u=0;for(let c=i-e+1;c<=i;c++)t[c]!==null&&(a+=t[c],u++);u===e&&(r=a/e,o=!0),n.push(r!==null?$(r):null);continue}let l=t[i];l===null?n.push(r!==null?$(r):null):(r=s*l+(1-s)*r,n.push($(r)))}return n}function at(t,e){let n=[],s=Array.from({length:e},(o,i)=>i+1),r=s.reduce((o,i)=>o+i,0);for(let o=0;o<t.length;o++){if(o<e-1){n.push(null);continue}let i=0,l=!0;for(let a=0;a<e;a++){let u=t[o-e+1+a];if(u===null){l=!1;break}i+=u*s[a]}n.push(l?$(i/r):null)}return n}function W(t,e={}){let{periods:n=[5,10,20,30,60,120,250],type:s="sma"}=e,r=s==="ema"?I:s==="wma"?at:H,o={};for(let i of n)o[`ma${i}`]=r(t,i);return t.map((i,l)=>{let a={};for(let u of n)a[`ma${u}`]=o[`ma${u}`][l];return a})}function zt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function z(t,e={}){let{short:n=12,long:s=26,signal:r=9}=e,o=I(t,n),i=I(t,s),l=t.map((u,c)=>o[c]===null||i[c]===null?null:o[c]-i[c]),a=I(l,r);return t.map((u,c)=>({dif:l[c]!==null?zt(l[c]):null,dea:a[c],macd:l[c]!==null&&a[c]!==null?zt((l[c]-a[c])*2):null}))}function kt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function re(t,e,n){let s=[];for(let r=0;r<t.length;r++){if(r<e-1||n[r]===null){s.push(null);continue}let o=0,i=0;for(let l=r-e+1;l<=r;l++)t[l]!==null&&n[r]!==null&&(o+=Math.pow(t[l]-n[r],2),i++);s.push(i===e?Math.sqrt(o/e):null)}return s}function V(t,e={}){let{period:n=20,stdDev:s=2}=e,r=H(t,n),o=re(t,n,r);return t.map((i,l)=>{if(r[l]===null||o[l]===null)return{mid:null,upper:null,lower:null,bandwidth:null};let a=r[l]+s*o[l],u=r[l]-s*o[l],c=r[l]!==0?kt((a-u)/r[l]*100):null;return{mid:r[l],upper:kt(a),lower:kt(u),bandwidth:c}})}function Ht(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function G(t,e={}){let{period:n=9,kPeriod:s=3,dPeriod:r=3}=e,o=[],i=50,l=50;for(let a=0;a<t.length;a++){if(a<n-1){o.push({k:null,d:null,j:null});continue}let u=-1/0,c=1/0,d=!0;for(let b=a-n+1;b<=a;b++){if(t[b].high===null||t[b].low===null){d=!1;break}u=Math.max(u,t[b].high),c=Math.min(c,t[b].low)}let f=t[a].close;if(!d||f===null||u===c){o.push({k:null,d:null,j:null});continue}let h=(f-c)/(u-c)*100;i=(s-1)/s*i+1/s*h,l=(r-1)/r*l+1/r*i;let g=3*i-2*l;o.push({k:Ht(i),d:Ht(l),j:Ht(g)})}return o}function oe(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function J(t,e={}){let{periods:n=[6,12,24]}=e,s=[null];for(let o=1;o<t.length;o++)t[o]===null||t[o-1]===null?s.push(null):s.push(t[o]-t[o-1]);let r={};for(let o of n){let i=[],l=0,a=0;for(let u=0;u<t.length;u++){if(u<o){i.push(null),s[u]!==null&&(s[u]>0?l+=s[u]:a+=Math.abs(s[u]));continue}if(u===o)l=l/o,a=a/o;else{let c=s[u]??0,d=c>0?c:0,f=c<0?Math.abs(c):0;l=(l*(o-1)+d)/o,a=(a*(o-1)+f)/o}if(a===0)i.push(100);else if(l===0)i.push(0);else{let c=l/a;i.push(oe(100-100/(1+c)))}}r[`rsi${o}`]=i}return t.map((o,i)=>{let l={};for(let a of n)l[`rsi${a}`]=r[`rsi${a}`][i];return l})}function se(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function Z(t,e={}){let{periods:n=[6,10]}=e,s={};for(let r of n){let o=[];for(let i=0;i<t.length;i++){if(i<r-1){o.push(null);continue}let l=-1/0,a=1/0,u=!0;for(let f=i-r+1;f<=i;f++){if(t[f].high===null||t[f].low===null){u=!1;break}l=Math.max(l,t[f].high),a=Math.min(a,t[f].low)}let c=t[i].close;if(!u||c===null||l===a){o.push(null);continue}let d=(l-c)/(l-a)*100;o.push(se(d))}s[`wr${r}`]=o}return t.map((r,o)=>{let i={};for(let l of n)i[`wr${l}`]=s[`wr${l}`][o];return i})}function ie(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function Y(t,e={}){let{periods:n=[6,12,24]}=e,s={};for(let r of n){let o=H(t,r),i=[];for(let l=0;l<t.length;l++)if(t[l]===null||o[l]===null||o[l]===0)i.push(null);else{let a=(t[l]-o[l])/o[l]*100;i.push(ie(a))}s[`bias${r}`]=i}return t.map((r,o)=>{let i={};for(let l of n)i[`bias${l}`]=s[`bias${l}`][o];return i})}function le(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function X(t,e={}){let{period:n=14}=e,s=[],r=t.map(o=>o.high===null||o.low===null||o.close===null?null:(o.high+o.low+o.close)/3);for(let o=0;o<t.length;o++){if(o<n-1){s.push({cci:null});continue}let i=0,l=0;for(let d=o-n+1;d<=o;d++)r[d]!==null&&(i+=r[d],l++);if(l!==n||r[o]===null){s.push({cci:null});continue}let a=i/n,u=0;for(let d=o-n+1;d<=o;d++)u+=Math.abs(r[d]-a);let c=u/n;if(c===0)s.push({cci:0});else{let d=(r[o]-a)/(.015*c);s.push({cci:le(d)})}}return s}function It(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function tt(t,e={}){let{period:n=14}=e,s=[],r=[];for(let i=0;i<t.length;i++){let{high:l,low:a,close:u}=t[i];if(l===null||a===null||u===null){r.push(null);continue}if(i===0)r.push(l-a);else{let c=t[i-1].close;if(c===null)r.push(l-a);else{let d=l-a,f=Math.abs(l-c),h=Math.abs(a-c);r.push(Math.max(d,f,h))}}}let o=null;for(let i=0;i<t.length;i++){if(i<n-1){s.push({tr:r[i]!==null?It(r[i]):null,atr:null});continue}if(i===n-1){let l=0,a=0;for(let u=0;u<n;u++)r[u]!==null&&(l+=r[u],a++);a===n&&(o=l/n)}else o!==null&&r[i]!==null&&(o=(o*(n-1)+r[i])/n);s.push({tr:r[i]!==null?It(r[i]):null,atr:o!==null?It(o):null})}return s}function et(t,e={}){if(t.length===0)return[];let n=t.map(h=>h.close),s=t.map(h=>({open:h.open,high:h.high,low:h.low,close:h.close,volume:h.volume})),r=e.ma?W(n,typeof e.ma=="object"?e.ma:{}):null,o=e.macd?z(n,typeof e.macd=="object"?e.macd:{}):null,i=e.boll?V(n,typeof e.boll=="object"?e.boll:{}):null,l=e.kdj?G(s,typeof e.kdj=="object"?e.kdj:{}):null,a=e.rsi?J(n,typeof e.rsi=="object"?e.rsi:{}):null,u=e.wr?Z(s,typeof e.wr=="object"?e.wr:{}):null,c=e.bias?Y(n,typeof e.bias=="object"?e.bias:{}):null,d=e.cci?X(s,typeof e.cci=="object"?e.cci:{}):null,f=e.atr?tt(s,typeof e.atr=="object"?e.atr:{}):null;return t.map((h,g)=>({...h,...r&&{ma:r[g]},...o&&{macd:o[g]},...i&&{boll:i[g]},...l&&{kdj:l[g]},...a&&{rsi:a[g]},...u&&{wr:u[g]},...c&&{bias:c[g]},...d&&{cci:d[g]},...f&&{atr:f[g]}}))}var nt=class{constructor(e={}){this.client=new B(e)}getFullQuotes(e){return S.getFullQuotes(this.client,e)}getSimpleQuotes(e){return S.getSimpleQuotes(this.client,e)}getHKQuotes(e){return S.getHKQuotes(this.client,e)}getUSQuotes(e){return S.getUSQuotes(this.client,e)}getFundQuotes(e){return S.getFundQuotes(this.client,e)}getFundFlow(e){return S.getFundFlow(this.client,e)}getPanelLargeOrder(e){return S.getPanelLargeOrder(this.client,e)}getTodayTimeline(e){return S.getTodayTimeline(this.client,e)}getHistoryKline(e,n){return q.getHistoryKline(this.client,e,n)}getMinuteKline(e,n){return q.getMinuteKline(this.client,e,n)}getHKHistoryKline(e,n){return q.getHKHistoryKline(this.client,e,n)}getUSHistoryKline(e,n){return q.getUSHistoryKline(this.client,e,n)}getAShareCodeList(e=!0){return S.getAShareCodeList(this.client,e)}getUSCodeList(e=!0){return S.getUSCodeList(this.client,e)}getHKCodeList(){return S.getHKCodeList(this.client)}async getAllAShareQuotes(e={}){let n=await this.getAShareCodeList();return this.getAllQuotesByCodes(n,e)}async getAllHKShareQuotes(e={}){let n=await this.getHKCodeList();return S.getAllHKQuotesByCodes(this.client,n,e)}async getAllUSShareQuotes(e={}){let n=await this.getUSCodeList(!1);return S.getAllUSQuotesByCodes(this.client,n,e)}getAllQuotesByCodes(e,n={}){return S.getAllQuotesByCodes(this.client,e,n)}async batchRaw(e){return this.client.getTencentQuote(e)}detectMarket(e){return/^\d{3}\.[A-Z]+$/i.test(e)?"US":/^\d{5}$/.test(e)?"HK":"A"}safeMax(e,n=0){return!e||e.length===0?n:Math.max(...e)}calcRequiredLookback(e){let n=0,s=!1;if(e.ma){let o=typeof e.ma=="object"?e.ma:{},i=o.periods??[5,10,20,30,60,120,250],l=o.type??"sma";n=Math.max(n,this.safeMax(i,20)),l==="ema"&&(s=!0)}if(e.macd){let o=typeof e.macd=="object"?e.macd:{},i=o.long??26,l=o.signal??9;n=Math.max(n,i*3+l),s=!0}if(e.boll){let o=typeof e.boll=="object"&&e.boll.period?e.boll.period:20;n=Math.max(n,o)}if(e.kdj){let o=typeof e.kdj=="object"&&e.kdj.period?e.kdj.period:9;n=Math.max(n,o)}if(e.rsi){let o=typeof e.rsi=="object"&&e.rsi.periods?e.rsi.periods:[6,12,24];n=Math.max(n,this.safeMax(o,14)+1)}if(e.wr){let o=typeof e.wr=="object"&&e.wr.periods?e.wr.periods:[6,10];n=Math.max(n,this.safeMax(o,10))}if(e.bias){let o=typeof e.bias=="object"&&e.bias.periods?e.bias.periods:[6,12,24];n=Math.max(n,this.safeMax(o,12))}if(e.cci){let o=typeof e.cci=="object"&&e.cci.period?e.cci.period:14;n=Math.max(n,o)}if(e.atr){let o=typeof e.atr=="object"&&e.atr.period?e.atr.period:14;n=Math.max(n,o)}return Math.ceil(n*(s?1.5:1.2))}calcActualStartDate(e,n,s=1.5){let r=Math.ceil(n*s),o=new Date(parseInt(e.slice(0,4)),parseInt(e.slice(4,6))-1,parseInt(e.slice(6,8)));o.setDate(o.getDate()-r);let i=o.getFullYear(),l=String(o.getMonth()+1).padStart(2,"0"),a=String(o.getDate()).padStart(2,"0");return`${i}${l}${a}`}dateToTimestamp(e){let n=e.includes("-")?e:`${e.slice(0,4)}-${e.slice(4,6)}-${e.slice(6,8)}`;return new Date(n).getTime()}async getKlineWithIndicators(e,n={}){let{startDate:s,endDate:r,indicators:o={}}=n,i=n.market??this.detectMarket(e),l=this.calcRequiredLookback(o),u={A:1.5,HK:1.46,US:1.45}[i],c=s?this.calcActualStartDate(s,l,u):void 0,d={period:n.period,adjust:n.adjust,startDate:c,endDate:n.endDate},f;switch(i){case"HK":f=await this.getHKHistoryKline(e,d);break;case"US":f=await this.getUSHistoryKline(e,d);break;default:f=await this.getHistoryKline(e,d)}if(s&&f.length<l)switch(i){case"HK":f=await this.getHKHistoryKline(e,{...d,startDate:void 0});break;case"US":f=await this.getUSHistoryKline(e,{...d,startDate:void 0});break;default:f=await this.getHistoryKline(e,{...d,startDate:void 0})}let h=et(f,o);if(s){let g=this.dateToTimestamp(s),b=r?this.dateToTimestamp(r):1/0;return h.filter(R=>{let w=this.dateToTimestamp(R.date);return w>=g&&w<=b})}return h}},Vt=nt;0&&(module.exports={StockSDK,addIndicators,asyncPool,calcATR,calcBIAS,calcBOLL,calcCCI,calcEMA,calcKDJ,calcMA,calcMACD,calcRSI,calcSMA,calcWMA,calcWR,chunkArray,decodeGBK,parseResponse,safeNumber,safeNumberOrNull});