stock-sdk 1.2.2 → 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 +333 -12
- 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
|
@@ -42,12 +42,13 @@
|
|
|
42
42
|
|
|
43
43
|
## 特性
|
|
44
44
|
|
|
45
|
-
- ✅ **零依赖**,轻量级(压缩后 <
|
|
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) |
|
|
115
|
-
| [`
|
|
116
|
-
| [`
|
|
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
|
|
|
@@ -155,20 +173,32 @@ interface FullQuote {
|
|
|
155
173
|
high: number; // 最高
|
|
156
174
|
low: number; // 最低
|
|
157
175
|
volume: number; // 成交量(手)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
changePercent: number; // 涨跌幅 %
|
|
176
|
+
outerVolume: number; // 外盘
|
|
177
|
+
innerVolume: number; // 内盘
|
|
161
178
|
bid: { price: number; volume: number }[]; // 买一~买五
|
|
162
179
|
ask: { price: number; volume: number }[]; // 卖一~卖五
|
|
180
|
+
time: string; // 时间戳 yyyyMMddHHmmss
|
|
181
|
+
change: number; // 涨跌额
|
|
182
|
+
changePercent: number; // 涨跌幅 %
|
|
183
|
+
volume2: number; // 成交量(手,字段36)
|
|
184
|
+
amount: number; // 成交额(万)
|
|
163
185
|
turnoverRate: number | null; // 换手率 %
|
|
164
186
|
pe: number | null; // 市盈率(TTM)
|
|
165
|
-
|
|
166
|
-
totalMarketCap: number | null; // 总市值(亿)
|
|
187
|
+
amplitude: number | null; // 振幅 %
|
|
167
188
|
circulatingMarketCap: number | null; // 流通市值(亿)
|
|
168
|
-
|
|
189
|
+
totalMarketCap: number | null; // 总市值(亿)
|
|
190
|
+
pb: number | null; // 市净率
|
|
169
191
|
limitUp: number | null; // 涨停价
|
|
170
192
|
limitDown: number | null; // 跌停价
|
|
171
|
-
//
|
|
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[]; // 原始字段数组(供扩展使用)
|
|
172
202
|
}
|
|
173
203
|
```
|
|
174
204
|
|
|
@@ -269,6 +299,105 @@ const weeklyKlines = await sdk.getHistoryKline('sz000858', {
|
|
|
269
299
|
|
|
270
300
|
---
|
|
271
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
|
+
|
|
272
401
|
### `getMinuteKline(symbol, options?): Promise<MinuteTimeline[] | MinuteKline[]>`
|
|
273
402
|
|
|
274
403
|
获取 A 股分钟 K 线或分时数据,数据来源:东方财富。
|
|
@@ -540,6 +669,198 @@ console.log(raw[0].fields); // ['51', '五 粮 液', '000858', ...]
|
|
|
540
669
|
|
|
541
670
|
---
|
|
542
671
|
|
|
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
|
+
|
|
543
864
|
## 浏览器直接使用
|
|
544
865
|
|
|
545
866
|
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 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});
|