stock-sdk 1.2.1 → 1.3.0-beta.1
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 +394 -24
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +427 -72
- package/dist/index.d.ts +427 -72
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,20 +5,50 @@
|
|
|
5
5
|
[](https://github.com/chengzuopeng/stock-sdk/blob/master/LICENSE)
|
|
6
6
|
[](https://github.com/chengzuopeng/stock-sdk)
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**[English](./README_EN.md)** | 中文
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
为 **前端和 Node.js 设计的股票行情 SDK**。
|
|
11
|
+
|
|
12
|
+
无需 Python、无需后端服务,直接在 **浏览器或 Node.js** 中获取 **A 股 / 港股 / 美股 / 公募基金** 的实时行情与 K 线数据。
|
|
13
|
+
|
|
14
|
+
**✨ 零依赖 | 🌐 Browser + Node.js | 📦 <10KB | 🧠 完整 TypeScript 类型**
|
|
11
15
|
|
|
12
16
|
📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线演示](https://chengzuopeng.github.io/stock-sdk/)
|
|
13
17
|
|
|
18
|
+
## Why stock-sdk?
|
|
19
|
+
|
|
20
|
+
如果你是前端工程师,可能遇到过这些问题:
|
|
21
|
+
|
|
22
|
+
* 股票行情工具大多是 **Python 生态**,前端难以直接使用
|
|
23
|
+
* 想做行情看板 / Demo,不想额外维护后端服务
|
|
24
|
+
* 财经接口返回格式混乱、编码复杂(GBK / 并发 / 批量)
|
|
25
|
+
* AkShare 很强,但并不适合浏览器或 Node.js 项目
|
|
26
|
+
|
|
27
|
+
**stock-sdk 的目标很简单:**
|
|
28
|
+
|
|
29
|
+
> 让前端工程师,用最熟悉的 JavaScript / TypeScript,优雅地获取股票行情数据。
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 使用场景
|
|
34
|
+
|
|
35
|
+
* 📊 股票行情看板(Web / Admin)
|
|
36
|
+
* 📈 数据可视化(ECharts / TradingView)
|
|
37
|
+
* 🎓 股票 / 金融课程 Demo
|
|
38
|
+
* 🧪 量化策略原型验证(JS / Node)
|
|
39
|
+
* 🕒 Node.js 定时抓取行情数据
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
14
43
|
## 特性
|
|
15
44
|
|
|
16
|
-
- ✅ **零依赖**,轻量级(压缩后 <
|
|
45
|
+
- ✅ **零依赖**,轻量级(压缩后 < 20KB)
|
|
17
46
|
- ✅ 支持 **浏览器** 和 **Node.js 18+** 双端运行
|
|
18
47
|
- ✅ 同时提供 **ESM** 和 **CommonJS** 两种模块格式
|
|
19
|
-
- ✅ 完整的 **TypeScript**
|
|
48
|
+
- ✅ 完整的 **TypeScript** 类型定义和单元测试覆盖
|
|
20
49
|
- ✅ **A 股、港股、美股、公募基金**实时行情
|
|
21
50
|
- ✅ **历史 K 线**(日/周/月)、**分钟 K 线**(1/5/15/30/60 分钟)和**当日分时走势**数据
|
|
51
|
+
- ✅ **技术指标**:内置 MA、MACD、BOLL、KDJ、RSI、WR 等常用指标计算
|
|
22
52
|
- ✅ **资金流向**、**盘口大单**等扩展数据
|
|
23
53
|
- ✅ 获取全部 **A 股代码列表**(5000+ 只股票)和批量获取**全市场行情**(内置并发控制)
|
|
24
54
|
|
|
@@ -32,22 +62,38 @@ yarn add stock-sdk
|
|
|
32
62
|
pnpm add stock-sdk
|
|
33
63
|
```
|
|
34
64
|
|
|
35
|
-
##
|
|
65
|
+
## 快速开始(10 行 Demo)
|
|
36
66
|
|
|
37
|
-
```
|
|
67
|
+
```ts
|
|
38
68
|
import { StockSDK } from 'stock-sdk';
|
|
39
69
|
|
|
40
70
|
const sdk = new StockSDK();
|
|
41
71
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
72
|
+
const quotes = await sdk.getSimpleQuotes([
|
|
73
|
+
'sh000001',
|
|
74
|
+
'sz000858',
|
|
75
|
+
'sh600519',
|
|
76
|
+
]);
|
|
45
77
|
|
|
46
|
-
|
|
47
|
-
|
|
78
|
+
quotes.forEach(q => {
|
|
79
|
+
console.log(`${q.name}: ${q.price} (${q.changePercent}%)`);
|
|
80
|
+
});
|
|
81
|
+
```
|
|
48
82
|
|
|
49
|
-
|
|
50
|
-
|
|
83
|
+
## 示例:全市场 A 股行情
|
|
84
|
+
|
|
85
|
+
前端直接一次性获取全市场 A 股行情(5000+股票),无需 Python 或后端服务。
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
const allQuotes = await sdk.getAllAShareQuotes({
|
|
89
|
+
batchSize: 300,
|
|
90
|
+
concurrency: 5,
|
|
91
|
+
onProgress: (completed, total) => {
|
|
92
|
+
console.log(`进度: ${completed}/${total}`);
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
console.log(`共获取 ${allQuotes.length} 只股票`);
|
|
51
97
|
```
|
|
52
98
|
|
|
53
99
|
## API 文档
|
|
@@ -66,9 +112,26 @@ const timeline = await sdk.getTodayTimeline('sz000001');
|
|
|
66
112
|
|
|
67
113
|
| 方法 | 说明 |
|
|
68
114
|
|------|------|
|
|
69
|
-
| [`getHistoryKline`](#gethistoryklinesymbol-options-promisehistorykline) |
|
|
70
|
-
| [`
|
|
71
|
-
| [`
|
|
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) | 计算平均真实波幅 |
|
|
72
135
|
|
|
73
136
|
### 扩展数据
|
|
74
137
|
|
|
@@ -110,20 +173,32 @@ interface FullQuote {
|
|
|
110
173
|
high: number; // 最高
|
|
111
174
|
low: number; // 最低
|
|
112
175
|
volume: number; // 成交量(手)
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
changePercent: number; // 涨跌幅 %
|
|
176
|
+
outerVolume: number; // 外盘
|
|
177
|
+
innerVolume: number; // 内盘
|
|
116
178
|
bid: { price: number; volume: number }[]; // 买一~买五
|
|
117
179
|
ask: { price: number; volume: number }[]; // 卖一~卖五
|
|
180
|
+
time: string; // 时间戳 yyyyMMddHHmmss
|
|
181
|
+
change: number; // 涨跌额
|
|
182
|
+
changePercent: number; // 涨跌幅 %
|
|
183
|
+
volume2: number; // 成交量(手,字段36)
|
|
184
|
+
amount: number; // 成交额(万)
|
|
118
185
|
turnoverRate: number | null; // 换手率 %
|
|
119
186
|
pe: number | null; // 市盈率(TTM)
|
|
120
|
-
|
|
121
|
-
totalMarketCap: number | null; // 总市值(亿)
|
|
187
|
+
amplitude: number | null; // 振幅 %
|
|
122
188
|
circulatingMarketCap: number | null; // 流通市值(亿)
|
|
123
|
-
|
|
189
|
+
totalMarketCap: number | null; // 总市值(亿)
|
|
190
|
+
pb: number | null; // 市净率
|
|
124
191
|
limitUp: number | null; // 涨停价
|
|
125
192
|
limitDown: number | null; // 跌停价
|
|
126
|
-
//
|
|
193
|
+
volumeRatio: number | null; // 量比
|
|
194
|
+
avgPrice: number | null; // 均价
|
|
195
|
+
peStatic: number | null; // 市盈率(静)
|
|
196
|
+
peDynamic: number | null; // 市盈率(动)
|
|
197
|
+
high52w: number | null; // 52周最高价
|
|
198
|
+
low52w: number | null; // 52周最低价
|
|
199
|
+
circulatingShares: number | null; // 流通股本(股)
|
|
200
|
+
totalShares: number | null; // 总股本(股)
|
|
201
|
+
raw: string[]; // 原始字段数组(供扩展使用)
|
|
127
202
|
}
|
|
128
203
|
```
|
|
129
204
|
|
|
@@ -224,6 +299,105 @@ const weeklyKlines = await sdk.getHistoryKline('sz000858', {
|
|
|
224
299
|
|
|
225
300
|
---
|
|
226
301
|
|
|
302
|
+
### `getHKHistoryKline(symbol, options?): Promise<HKUSHistoryKline[]>`
|
|
303
|
+
|
|
304
|
+
获取港股历史 K 线(日/周/月),数据来源:东方财富。
|
|
305
|
+
|
|
306
|
+
**参数**
|
|
307
|
+
|
|
308
|
+
| 参数 | 类型 | 说明 |
|
|
309
|
+
|------|------|------|
|
|
310
|
+
| `symbol` | `string` | 港股代码,5 位数字(如 `'00700'`、`'09988'`) |
|
|
311
|
+
| `options.period` | `'daily' \| 'weekly' \| 'monthly'` | K 线周期,默认 `'daily'` |
|
|
312
|
+
| `options.adjust` | `'' \| 'qfq' \| 'hfq'` | 复权类型,默认 `'hfq'`(后复权) |
|
|
313
|
+
| `options.startDate` | `string` | 开始日期 `YYYYMMDD` |
|
|
314
|
+
| `options.endDate` | `string` | 结束日期 `YYYYMMDD` |
|
|
315
|
+
|
|
316
|
+
**返回类型**
|
|
317
|
+
|
|
318
|
+
```typescript
|
|
319
|
+
interface HKUSHistoryKline {
|
|
320
|
+
date: string; // 日期 YYYY-MM-DD
|
|
321
|
+
code: string; // 股票代码
|
|
322
|
+
name: string; // 股票名称
|
|
323
|
+
open: number | null; // 开盘价
|
|
324
|
+
close: number | null; // 收盘价
|
|
325
|
+
high: number | null; // 最高价
|
|
326
|
+
low: number | null; // 最低价
|
|
327
|
+
volume: number | null; // 成交量
|
|
328
|
+
amount: number | null; // 成交额
|
|
329
|
+
changePercent: number | null; // 涨跌幅 %
|
|
330
|
+
change: number | null; // 涨跌额
|
|
331
|
+
amplitude: number | null; // 振幅 %
|
|
332
|
+
turnoverRate: number | null; // 换手率 %
|
|
333
|
+
}
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**示例**
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// 获取腾讯控股日 K 线
|
|
340
|
+
const klines = await sdk.getHKHistoryKline('00700');
|
|
341
|
+
|
|
342
|
+
// 获取阿里巴巴周 K 线,前复权
|
|
343
|
+
const weeklyKlines = await sdk.getHKHistoryKline('09988', {
|
|
344
|
+
period: 'weekly',
|
|
345
|
+
adjust: 'qfq',
|
|
346
|
+
startDate: '20240101',
|
|
347
|
+
endDate: '20241231',
|
|
348
|
+
});
|
|
349
|
+
console.log(klines[0].name); // 腾讯控股
|
|
350
|
+
console.log(klines[0].close); // 收盘价
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
### `getUSHistoryKline(symbol, options?): Promise<HKUSHistoryKline[]>`
|
|
356
|
+
|
|
357
|
+
获取美股历史 K 线(日/周/月),数据来源:东方财富。
|
|
358
|
+
|
|
359
|
+
**参数**
|
|
360
|
+
|
|
361
|
+
| 参数 | 类型 | 说明 |
|
|
362
|
+
|------|------|------|
|
|
363
|
+
| `symbol` | `string` | 美股代码,格式:`{market}.{ticker}`(如 `'105.MSFT'`、`'106.BABA'`) |
|
|
364
|
+
| `options.period` | `'daily' \| 'weekly' \| 'monthly'` | K 线周期,默认 `'daily'` |
|
|
365
|
+
| `options.adjust` | `'' \| 'qfq' \| 'hfq'` | 复权类型,默认 `'hfq'`(后复权) |
|
|
366
|
+
| `options.startDate` | `string` | 开始日期 `YYYYMMDD` |
|
|
367
|
+
| `options.endDate` | `string` | 结束日期 `YYYYMMDD` |
|
|
368
|
+
|
|
369
|
+
**市场代码说明**
|
|
370
|
+
|
|
371
|
+
| 代码 | 说明 | 示例 |
|
|
372
|
+
|------|------|------|
|
|
373
|
+
| `105` | 纳斯达克 | `105.AAPL`(苹果)、`105.MSFT`(微软)、`105.TSLA`(特斯拉) |
|
|
374
|
+
| `106` | 纽交所 | `106.BABA`(阿里巴巴) |
|
|
375
|
+
| `107` | 美国其他 | `107.XXX` |
|
|
376
|
+
|
|
377
|
+
**示例**
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
// 获取微软日 K 线
|
|
381
|
+
const klines = await sdk.getUSHistoryKline('105.MSFT');
|
|
382
|
+
|
|
383
|
+
// 获取苹果周 K 线,前复权
|
|
384
|
+
const weeklyKlines = await sdk.getUSHistoryKline('105.AAPL', {
|
|
385
|
+
period: 'weekly',
|
|
386
|
+
adjust: 'qfq',
|
|
387
|
+
startDate: '20240101',
|
|
388
|
+
endDate: '20241231',
|
|
389
|
+
});
|
|
390
|
+
console.log(klines[0].name); // 微软
|
|
391
|
+
console.log(klines[0].close); // 收盘价
|
|
392
|
+
|
|
393
|
+
// 获取阿里巴巴月 K 线
|
|
394
|
+
const monthlyKlines = await sdk.getUSHistoryKline('106.BABA', {
|
|
395
|
+
period: 'monthly',
|
|
396
|
+
});
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
---
|
|
400
|
+
|
|
227
401
|
### `getMinuteKline(symbol, options?): Promise<MinuteTimeline[] | MinuteKline[]>`
|
|
228
402
|
|
|
229
403
|
获取 A 股分钟 K 线或分时数据,数据来源:东方财富。
|
|
@@ -495,7 +669,199 @@ console.log(raw[0].fields); // ['51', '五 粮 液', '000858', ...]
|
|
|
495
669
|
|
|
496
670
|
---
|
|
497
671
|
|
|
498
|
-
##
|
|
672
|
+
## 技术指标
|
|
673
|
+
|
|
674
|
+
### `getKlineWithIndicators(symbol, options): Promise<KlineWithIndicators[]>`
|
|
675
|
+
|
|
676
|
+
获取带技术指标的 K 线数据。支持 A 股、港股、美股,自动识别市场。
|
|
677
|
+
|
|
678
|
+
**参数**
|
|
679
|
+
|
|
680
|
+
| 参数 | 类型 | 说明 |
|
|
681
|
+
|------|------|------|
|
|
682
|
+
| `symbol` | `string` | 股票代码 |
|
|
683
|
+
| `options.market` | `'A' \| 'HK' \| 'US'` | 可选,市场类型(不传则自动识别) |
|
|
684
|
+
| `options.period` | `'daily' \| 'weekly' \| 'monthly'` | 可选,K 线周期,默认 `'daily'` |
|
|
685
|
+
| `options.adjust` | `'' \| 'qfq' \| 'hfq'` | 可选,复权类型,默认 `'hfq'` |
|
|
686
|
+
| `options.startDate` | `string` | 可选,开始日期 `YYYYMMDD` |
|
|
687
|
+
| `options.endDate` | `string` | 可选,结束日期 `YYYYMMDD` |
|
|
688
|
+
| `options.indicators` | `IndicatorOptions` | 技术指标配置 |
|
|
689
|
+
|
|
690
|
+
**indicators 配置**
|
|
691
|
+
|
|
692
|
+
```typescript
|
|
693
|
+
interface IndicatorOptions {
|
|
694
|
+
ma?: MAOptions | boolean; // 均线
|
|
695
|
+
macd?: MACDOptions | boolean; // MACD
|
|
696
|
+
boll?: BOLLOptions | boolean; // 布林带
|
|
697
|
+
kdj?: KDJOptions | boolean; // KDJ
|
|
698
|
+
rsi?: RSIOptions | boolean; // RSI
|
|
699
|
+
wr?: WROptions | boolean; // WR
|
|
700
|
+
}
|
|
701
|
+
|
|
702
|
+
// 各指标可选参数
|
|
703
|
+
interface MAOptions {
|
|
704
|
+
periods?: number[]; // 周期数组,默认 [5, 10, 20, 30, 60, 120, 250]
|
|
705
|
+
type?: 'sma' | 'ema' | 'wma'; // 均线类型,默认 'sma'
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
interface MACDOptions {
|
|
709
|
+
short?: number; // 短期 EMA 周期,默认 12
|
|
710
|
+
long?: number; // 长期 EMA 周期,默认 26
|
|
711
|
+
signal?: number; // 信号线周期,默认 9
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
interface BOLLOptions {
|
|
715
|
+
period?: number; // 均线周期,默认 20
|
|
716
|
+
stdDev?: number; // 标准差倍数,默认 2
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
interface KDJOptions {
|
|
720
|
+
period?: number; // RSV 周期,默认 9
|
|
721
|
+
kPeriod?: number; // K 平滑周期,默认 3
|
|
722
|
+
dPeriod?: number; // D 平滑周期,默认 3
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
interface RSIOptions {
|
|
726
|
+
periods?: number[]; // 周期数组,默认 [6, 12, 24]
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
interface WROptions {
|
|
730
|
+
periods?: number[]; // 周期数组,默认 [6, 10]
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
interface BIASOptions {
|
|
734
|
+
periods?: number[]; // 周期数组,默认 [6, 12, 24]
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
interface CCIOptions {
|
|
738
|
+
period?: number; // 周期,默认 14
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
interface ATROptions {
|
|
742
|
+
period?: number; // 周期,默认 14
|
|
743
|
+
}
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
**示例**
|
|
747
|
+
|
|
748
|
+
```typescript
|
|
749
|
+
// 获取平安银行带技术指标的日 K 线
|
|
750
|
+
const data = await sdk.getKlineWithIndicators('sz000001', {
|
|
751
|
+
startDate: '20240101',
|
|
752
|
+
endDate: '20241231',
|
|
753
|
+
indicators: {
|
|
754
|
+
ma: { periods: [5, 10, 20, 60] },
|
|
755
|
+
macd: true,
|
|
756
|
+
boll: true,
|
|
757
|
+
kdj: true,
|
|
758
|
+
rsi: { periods: [6, 12] },
|
|
759
|
+
wr: true,
|
|
760
|
+
bias: { periods: [6, 12, 24] },
|
|
761
|
+
cci: { period: 14 },
|
|
762
|
+
atr: { period: 14 },
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
|
|
766
|
+
// 使用数据
|
|
767
|
+
data.forEach(k => {
|
|
768
|
+
console.log(`${k.date}: ${k.close}`);
|
|
769
|
+
console.log(` MA5=${k.ma?.ma5}, MA10=${k.ma?.ma10}`);
|
|
770
|
+
console.log(` MACD: DIF=${k.macd?.dif}, DEA=${k.macd?.dea}`);
|
|
771
|
+
console.log(` BOLL: 上=${k.boll?.upper}, 中=${k.boll?.mid}, 下=${k.boll?.lower}`);
|
|
772
|
+
console.log(` KDJ: K=${k.kdj?.k}, D=${k.kdj?.d}, J=${k.kdj?.j}`);
|
|
773
|
+
console.log(` RSI6=${k.rsi?.rsi6}, WR6=${k.wr?.wr6}`);
|
|
774
|
+
console.log(` BIAS6=${k.bias?.bias6}, CCI=${k.cci?.cci}, ATR=${k.atr?.atr}`);
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
// 港股(自动识别)
|
|
778
|
+
const hkData = await sdk.getKlineWithIndicators('00700', {
|
|
779
|
+
indicators: { ma: true, macd: true }
|
|
780
|
+
});
|
|
781
|
+
|
|
782
|
+
// 美股(自动识别)
|
|
783
|
+
const usData = await sdk.getKlineWithIndicators('105.MSFT', {
|
|
784
|
+
indicators: { boll: true, rsi: true }
|
|
785
|
+
});
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
---
|
|
789
|
+
|
|
790
|
+
### 独立指标计算函数
|
|
791
|
+
|
|
792
|
+
SDK 还导出了独立的指标计算函数,可自行传入数据计算:
|
|
793
|
+
|
|
794
|
+
```typescript
|
|
795
|
+
import {
|
|
796
|
+
calcMA,
|
|
797
|
+
calcSMA,
|
|
798
|
+
calcEMA,
|
|
799
|
+
calcMACD,
|
|
800
|
+
calcBOLL,
|
|
801
|
+
calcKDJ,
|
|
802
|
+
calcRSI,
|
|
803
|
+
calcWR,
|
|
804
|
+
calcBIAS,
|
|
805
|
+
calcCCI,
|
|
806
|
+
calcATR,
|
|
807
|
+
addIndicators,
|
|
808
|
+
} from 'stock-sdk';
|
|
809
|
+
|
|
810
|
+
// 获取 K 线数据
|
|
811
|
+
const klines = await sdk.getHistoryKline('sz000001');
|
|
812
|
+
const closes = klines.map(k => k.close);
|
|
813
|
+
|
|
814
|
+
// 计算均线
|
|
815
|
+
const ma = calcMA(closes, { periods: [5, 10, 20], type: 'sma' });
|
|
816
|
+
console.log(ma[10].ma5); // 第 10 天的 5 日均线
|
|
817
|
+
|
|
818
|
+
// 计算 MACD
|
|
819
|
+
const macd = calcMACD(closes);
|
|
820
|
+
console.log(macd[50].dif, macd[50].dea, macd[50].macd);
|
|
821
|
+
|
|
822
|
+
// 计算布林带
|
|
823
|
+
const boll = calcBOLL(closes, { period: 20, stdDev: 2 });
|
|
824
|
+
console.log(boll[30].upper, boll[30].mid, boll[30].lower);
|
|
825
|
+
|
|
826
|
+
// 计算 KDJ(需要 OHLC 数据)
|
|
827
|
+
const ohlcv = klines.map(k => ({
|
|
828
|
+
open: k.open, high: k.high, low: k.low, close: k.close
|
|
829
|
+
}));
|
|
830
|
+
const kdj = calcKDJ(ohlcv, { period: 9 });
|
|
831
|
+
console.log(kdj[20].k, kdj[20].d, kdj[20].j);
|
|
832
|
+
|
|
833
|
+
// 计算乖离率
|
|
834
|
+
const bias = calcBIAS(closes, { periods: [6, 12, 24] });
|
|
835
|
+
console.log(bias[30].bias6, bias[30].bias12, bias[30].bias24);
|
|
836
|
+
|
|
837
|
+
// 计算 CCI(需要 HLC 数据)
|
|
838
|
+
const hlc = klines.map(k => ({ high: k.high, low: k.low, close: k.close }));
|
|
839
|
+
const cci = calcCCI(hlc, { period: 14 });
|
|
840
|
+
console.log(cci[30].cci);
|
|
841
|
+
|
|
842
|
+
// 计算 ATR(需要 HLC 数据)
|
|
843
|
+
const atr = calcATR(hlc, { period: 14 });
|
|
844
|
+
console.log(atr[30].atr, atr[30].tr);
|
|
845
|
+
|
|
846
|
+
// 使用 addIndicators 一次性添加多个指标
|
|
847
|
+
const withIndicators = addIndicators(klines, {
|
|
848
|
+
ma: { periods: [5, 10] },
|
|
849
|
+
macd: true,
|
|
850
|
+
boll: true,
|
|
851
|
+
bias: true,
|
|
852
|
+
cci: true,
|
|
853
|
+
atr: true,
|
|
854
|
+
});
|
|
855
|
+
console.log(withIndicators[50].ma?.ma5);
|
|
856
|
+
console.log(withIndicators[50].macd?.dif);
|
|
857
|
+
console.log(withIndicators[50].bias?.bias6);
|
|
858
|
+
console.log(withIndicators[50].cci?.cci);
|
|
859
|
+
console.log(withIndicators[50].atr?.atr);
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
---
|
|
863
|
+
|
|
864
|
+
## 浏览器直接使用
|
|
499
865
|
|
|
500
866
|
SDK 使用原生 `TextDecoder` 解码 GBK 编码数据,无需额外 polyfill。
|
|
501
867
|
|
|
@@ -537,3 +903,7 @@ yarn dev
|
|
|
537
903
|
---
|
|
538
904
|
|
|
539
905
|
📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线演示](https://chengzuopeng.github.io/stock-sdk/) | 🐛 [Issues](https://github.com/chengzuopeng/stock-sdk/issues)
|
|
906
|
+
|
|
907
|
+
---
|
|
908
|
+
|
|
909
|
+
如果这个项目对你有帮助,欢迎 Star ⭐ 或提出 Issue 反馈。
|
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 te=Object.defineProperty;var Qe=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var Ue=Object.prototype.hasOwnProperty;var ne=(t,e)=>{for(var n in e)te(t,n,{get:e[n],enumerable:!0})},De=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of qe(e))!Ue.call(t,r)&&r!==n&&te(t,r,{get:()=>e[r],enumerable:!(s=Qe(e,r))||s.enumerable});return t};var Fe=t=>De(te({},"__esModule",{value:!0}),t);var Ge={};ne(Ge,{StockSDK:()=>z,addIndicators:()=>J,asyncPool:()=>D,calcATR:()=>G,calcBIAS:()=>W,calcBOLL:()=>_,calcCCI:()=>V,calcEMA:()=>O,calcKDJ:()=>E,calcMA:()=>v,calcMACD:()=>N,calcRSI:()=>$,calcSMA:()=>k,calcWMA:()=>X,calcWR:()=>B,chunkArray:()=>U,decodeGBK:()=>L,default:()=>Le,parseResponse:()=>Q,safeNumber:()=>m,safeNumberOrNull:()=>b});module.exports=Fe(Ge);function L(t){return new TextDecoder("gbk").decode(t)}function Q(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 b(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 de="https://qt.gtimg.cn",he="https://web.ifzq.gtimg.cn/appstock/app/minute/query",ge="https://assets.linkdiary.cn/shares/ashare-code.json",re="https://push2his.eastmoney.com/api/qt/stock/kline/get",ye="https://push2his.eastmoney.com/api/qt/stock/trends2/get",be="https://33.push2his.eastmoney.com/api/qt/stock/kline/get",Re="https://63.push2his.eastmoney.com/api/qt/stock/kline/get";var q=class{constructor(e={}){this.baseUrl=e.baseUrl??de,this.timeout=e.timeout??3e4}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=L(s);return Q(r)}};function U(t,e){let n=[];for(let s=0;s<t.length;s+=e)n.push(t.slice(s,s+e));return n}async function D(t,e){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 Y(t){return t.startsWith("sh")?"1":t.startsWith("sz")||t.startsWith("bj")?"0":t.startsWith("6")?"1":"0"}var K={};ne(K,{getAShareCodeList:()=>Ce,getAllQuotesByCodes:()=>ke,getFullQuotes:()=>Z,getFundFlow:()=>Me,getFundQuotes:()=>Se,getHKQuotes:()=>xe,getPanelLargeOrder:()=>Ke,getSimpleQuotes:()=>we,getTodayTimeline:()=>Ae,getUSQuotes:()=>Te,parseFullQuote:()=>oe,parseFundFlow:()=>ie,parseFundQuote:()=>ce,parseHKQuote:()=>ae,parsePanelLargeOrder:()=>le,parseSimpleQuote:()=>se,parseUSQuote:()=>ue});function oe(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:b(t[38]),pe:b(t[39]),amplitude:b(t[43]),circulatingMarketCap:b(t[44]),totalMarketCap:b(t[45]),pb:b(t[46]),limitUp:b(t[47]),limitDown:b(t[48]),volumeRatio:b(t[49]),avgPrice:b(t[51]),peStatic:b(t[52]),peDynamic:b(t[53]),high52w:b(t[67]),low52w:b(t[68]),circulatingShares:b(t[72]),totalShares:b(t[73]),raw:t}}function se(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:b(t[9]),marketType:t[10]??"",raw:t}}function ie(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 le(t){return{buyLargeRatio:m(t[0]),buySmallRatio:m(t[1]),sellLargeRatio:m(t[2]),sellSmallRatio:m(t[3]),raw:t}}function ae(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[36]),lotSize:b(t[40]),circulatingMarketCap:b(t[46]),totalMarketCap:b(t[47]),currency:t[t.length-3]??"",raw:t}}function ue(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:b(t[8]),raw:t}}function ce(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 Z(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=>oe(s.fields))}async function we(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=>se(r.fields))}async function Me(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=>ie(r.fields))}async function Ke(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=>le(r.fields))}async function xe(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`r_hk${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>ae(r.fields))}async function Te(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`s_us${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>ue(r.fields))}async function Se(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=>ce(r.fields))}async function Ae(t,e){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(`${he}?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||[],c=l.data?.date||"",u=!1;if(a.length>0){let f=a[0].split(" "),h=parseFloat(f[1])||0,g=parseInt(f[2],10)||0,y=parseFloat(f[3])||0;g>0&&h>0&&y/g>h*50&&(u=!0)}let d=a.map(f=>{let h=f.split(" "),g=h[0],y=`${g.slice(0,2)}:${g.slice(2,4)}`,R=parseInt(h[2],10)||0,w=parseFloat(h[3])||0,M=u?R*100:R,x=M>0?w/M:0;return{time:y,price:parseFloat(h[1])||0,volume:M,amount:w,avgPrice:Math.round(x*100)/100}});return{code:e,date:c,data:d}}finally{clearTimeout(r)}}async function Ce(t,e=!0){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(ge,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let i=await o.json();return e?i:i.map(l=>l.replace(/^(sh|sz|bj)/,""))}finally{clearTimeout(r)}}async function ke(t,e,n={}){let{batchSize:s=500,concurrency:r=7,onProgress:o}=n,i=U(e,s),l=i.length,a=0,c=i.map(d=>async()=>{let f=await Z(t,d);return a++,o&&o(a,l),f});return(await D(c,r)).flat()}var P={};ne(P,{getHKHistoryKline:()=>je,getHistoryKline:()=>Oe,getMinuteKline:()=>He,getUSHistoryKline:()=>Ie});async function Oe(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n,l=e.replace(/^(sh|sz|bj)/,""),a={daily:"101",weekly:"102",monthly:"103"},c={"":"0",qfq:"1",hfq:"2"},u=`${Y(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:c[r],secid:u,beg:o,end:i}),f=`${re}?${d.toString()}`,g=(await t.get(f,{responseType:"json"}))?.data?.klines;return!Array.isArray(g)||g.length===0?[]:g.map(y=>{let[R,w,M,x,T,S,A,C,H,j,I]=y.split(",");return{date:R,code:l,open:p(w),close:p(M),high:p(x),low:p(T),volume:p(S),amount:p(A),amplitude:p(C),changePercent:p(H),change:p(j),turnoverRate:p(I)}})}async function He(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,l=e.replace(/^(sh|sz|bj)/,""),a=`${Y(e)}.${l}`;if(s==="1"){let c=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}),u=`${ye}?${c.toString()}`,f=(await t.get(u,{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(y=>{let[R,w,M,x,T,S,A,C]=y.split(",");return{time:R,open:p(w),close:p(M),high:p(x),low:p(T),volume:p(S),amount:p(A),avgPrice:p(C)}}).filter(y=>y.time>=h&&y.time<=g)}else{let c={"":"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:s,fqt:c[r],secid:a,beg:"0",end:"20500000"}),d=`${re}?${u.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),y=i.replace("T"," ").slice(0,16);return h.map(R=>{let[w,M,x,T,S,A,C,H,j,I,ee]=R.split(",");return{time:w,open:p(M),close:p(x),high:p(T),low:p(S),changePercent:p(j),change:p(I),volume:p(A),amount:p(C),amplitude:p(H),turnoverRate:p(ee)}}).filter(R=>R.time>=g&&R.time<=y)}}async function je(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n,l=e.replace(/^hk/i,"").padStart(5,"0"),a={daily:"101",weekly:"102",monthly:"103"},c={"":"0",qfq:"1",hfq:"2"},u=`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:c[r],secid:u,beg:o,end:i,lmt:"1000000"}),f=`${be}?${d.toString()}`,h=await t.get(f,{responseType:"json"}),g=h?.data?.klines,y=h?.data?.name||"";return!Array.isArray(g)||g.length===0?[]:g.map(R=>{let[w,M,x,T,S,A,C,H,j,I,ee]=R.split(",");return{date:w,code:l,name:y,open:p(M),close:p(x),high:p(T),low:p(S),volume:p(A),amount:p(C),amplitude:p(H),changePercent:p(j),change:p(I),turnoverRate:p(ee)}})}async function Ie(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n,l={daily:"101",weekly:"102",monthly:"103"},a={"":"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:l[s],fqt:a[r],secid:e,beg:o,end:i,lmt:"1000000"}),u=`${Re}?${c.toString()}`,d=await t.get(u,{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(y=>{let[R,w,M,x,T,S,A,C,H,j,I]=y.split(",");return{date:R,code:h,name:g,open:p(w),close:p(M),high:p(x),low:p(T),volume:p(S),amount:p(A),amplitude:p(C),changePercent:p(H),change:p(j),turnoverRate:p(I)}})}function F(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function k(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?F(r/e):null)}return n}function O(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,c=0;for(let u=i-e+1;u<=i;u++)t[u]!==null&&(a+=t[u],c++);c===e&&(r=a/e,o=!0),n.push(r!==null?F(r):null);continue}let l=t[i];l===null?n.push(r!==null?F(r):null):(r=s*l+(1-s)*r,n.push(F(r)))}return n}function X(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 c=t[o-e+1+a];if(c===null){l=!1;break}i+=c*s[a]}n.push(l?F(i/r):null)}return n}function v(t,e={}){let{periods:n=[5,10,20,30,60,120,250],type:s="sma"}=e,r=s==="ema"?O:s==="wma"?X:k,o={};for(let i of n)o[`ma${i}`]=r(t,i);return t.map((i,l)=>{let a={};for(let c of n)a[`ma${c}`]=o[`ma${c}`][l];return a})}function Pe(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function N(t,e={}){let{short:n=12,long:s=26,signal:r=9}=e,o=O(t,n),i=O(t,s),l=t.map((c,u)=>o[u]===null||i[u]===null?null:o[u]-i[u]),a=O(l,r);return t.map((c,u)=>({dif:l[u]!==null?Pe(l[u]):null,dea:a[u],macd:l[u]!==null&&a[u]!==null?Pe((l[u]-a[u])*2):null}))}function me(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function Ee(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 _(t,e={}){let{period:n=20,stdDev:s=2}=e,r=k(t,n),o=Ee(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],c=r[l]-s*o[l],u=r[l]!==0?me((a-c)/r[l]*100):null;return{mid:r[l],upper:me(a),lower:me(c),bandwidth:u}})}function pe(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function E(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 c=-1/0,u=1/0,d=!0;for(let y=a-n+1;y<=a;y++){if(t[y].high===null||t[y].low===null){d=!1;break}c=Math.max(c,t[y].high),u=Math.min(u,t[y].low)}let f=t[a].close;if(!d||f===null||c===u){o.push({k:null,d:null,j:null});continue}let h=(f-u)/(c-u)*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:pe(i),d:pe(l),j:pe(g)})}return o}function $e(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function $(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 c=0;c<t.length;c++){if(c<o){i.push(null),s[c]!==null&&(s[c]>0?l+=s[c]:a+=Math.abs(s[c]));continue}if(c===o)l=l/o,a=a/o;else{let u=s[c]??0,d=u>0?u:0,f=u<0?Math.abs(u):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 u=l/a;i.push($e(100-100/(1+u)))}}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 Be(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function B(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,c=!0;for(let f=i-r+1;f<=i;f++){if(t[f].high===null||t[f].low===null){c=!1;break}l=Math.max(l,t[f].high),a=Math.min(a,t[f].low)}let u=t[i].close;if(!c||u===null||l===a){o.push(null);continue}let d=(l-u)/(l-a)*100;o.push(Be(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 We(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function W(t,e={}){let{periods:n=[6,12,24]}=e,s={};for(let r of n){let o=k(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(We(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 Ve(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function V(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,c=0;for(let d=o-n+1;d<=o;d++)c+=Math.abs(r[d]-a);let u=c/n;if(u===0)s.push({cci:0});else{let d=(r[o]-a)/(.015*u);s.push({cci:Ve(d)})}}return s}function fe(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function G(t,e={}){let{period:n=14}=e,s=[],r=[];for(let i=0;i<t.length;i++){let{high:l,low:a,close:c}=t[i];if(l===null||a===null||c===null){r.push(null);continue}if(i===0)r.push(l-a);else{let u=t[i-1].close;if(u===null)r.push(l-a);else{let d=l-a,f=Math.abs(l-u),h=Math.abs(a-u);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?fe(r[i]):null,atr:null});continue}if(i===n-1){let l=0,a=0;for(let c=0;c<n;c++)r[c]!==null&&(l+=r[c],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?fe(r[i]):null,atr:o!==null?fe(o):null})}return s}function J(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?v(n,typeof e.ma=="object"?e.ma:{}):null,o=e.macd?N(n,typeof e.macd=="object"?e.macd:{}):null,i=e.boll?_(n,typeof e.boll=="object"?e.boll:{}):null,l=e.kdj?E(s,typeof e.kdj=="object"?e.kdj:{}):null,a=e.rsi?$(n,typeof e.rsi=="object"?e.rsi:{}):null,c=e.wr?B(s,typeof e.wr=="object"?e.wr:{}):null,u=e.bias?W(n,typeof e.bias=="object"?e.bias:{}):null,d=e.cci?V(s,typeof e.cci=="object"?e.cci:{}):null,f=e.atr?G(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]},...c&&{wr:c[g]},...u&&{bias:u[g]},...d&&{cci:d[g]},...f&&{atr:f[g]}}))}var z=class{constructor(e={}){this.client=new q(e)}getFullQuotes(e){return K.getFullQuotes(this.client,e)}getSimpleQuotes(e){return K.getSimpleQuotes(this.client,e)}getHKQuotes(e){return K.getHKQuotes(this.client,e)}getUSQuotes(e){return K.getUSQuotes(this.client,e)}getFundQuotes(e){return K.getFundQuotes(this.client,e)}getFundFlow(e){return K.getFundFlow(this.client,e)}getPanelLargeOrder(e){return K.getPanelLargeOrder(this.client,e)}getTodayTimeline(e){return K.getTodayTimeline(this.client,e)}getHistoryKline(e,n){return P.getHistoryKline(this.client,e,n)}getMinuteKline(e,n){return P.getMinuteKline(this.client,e,n)}getHKHistoryKline(e,n){return P.getHKHistoryKline(this.client,e,n)}getUSHistoryKline(e,n){return P.getUSHistoryKline(this.client,e,n)}getAShareCodeList(e=!0){return K.getAShareCodeList(this.client,e)}async getAllAShareQuotes(e={}){let n=await this.getAShareCodeList();return this.getAllQuotesByCodes(n,e)}getAllQuotesByCodes(e,n={}){return K.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),c={A:1.5,HK:1.46,US:1.45}[i],u=s?this.calcActualStartDate(s,l,c):void 0,d={period:n.period,adjust:n.adjust,startDate:u,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=J(f,o);if(s){let g=this.dateToTimestamp(s),y=r?this.dateToTimestamp(r):1/0;return h.filter(R=>{let w=this.dateToTimestamp(R.date);return w>=g&&w<=y})}return h}},Le=z;0&&(module.exports={StockSDK,addIndicators,asyncPool,calcATR,calcBIAS,calcBOLL,calcCCI,calcEMA,calcKDJ,calcMA,calcMACD,calcRSI,calcSMA,calcWMA,calcWR,chunkArray,decodeGBK,parseResponse,safeNumber,safeNumberOrNull});
|