stock-sdk 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -399,6 +399,180 @@ interface HKUSHistoryKline {
399
399
  /** 换手率% */
400
400
  turnoverRate: number | null;
401
401
  }
402
+ /**
403
+ * 行业板块信息
404
+ */
405
+ interface IndustryBoard {
406
+ /** 排名 */
407
+ rank: number;
408
+ /** 板块名称 */
409
+ name: string;
410
+ /** 板块代码 */
411
+ code: string;
412
+ /** 最新价 */
413
+ price: number | null;
414
+ /** 涨跌额 */
415
+ change: number | null;
416
+ /** 涨跌幅% */
417
+ changePercent: number | null;
418
+ /** 总市值 */
419
+ totalMarketCap: number | null;
420
+ /** 换手率% */
421
+ turnoverRate: number | null;
422
+ /** 上涨家数 */
423
+ riseCount: number | null;
424
+ /** 下跌家数 */
425
+ fallCount: number | null;
426
+ /** 领涨股票名称 */
427
+ leadingStock: string | null;
428
+ /** 领涨股票涨跌幅% */
429
+ leadingStockChangePercent: number | null;
430
+ }
431
+ /**
432
+ * 行业板块实时行情
433
+ */
434
+ interface IndustryBoardSpot {
435
+ /** 指标名称 */
436
+ item: string;
437
+ /** 指标值 */
438
+ value: number | null;
439
+ }
440
+ /**
441
+ * 行业板块成分股
442
+ */
443
+ interface IndustryBoardConstituent {
444
+ /** 序号 */
445
+ rank: number;
446
+ /** 股票代码 */
447
+ code: string;
448
+ /** 股票名称 */
449
+ name: string;
450
+ /** 最新价 */
451
+ price: number | null;
452
+ /** 涨跌幅% */
453
+ changePercent: number | null;
454
+ /** 涨跌额 */
455
+ change: number | null;
456
+ /** 成交量 */
457
+ volume: number | null;
458
+ /** 成交额 */
459
+ amount: number | null;
460
+ /** 振幅% */
461
+ amplitude: number | null;
462
+ /** 最高价 */
463
+ high: number | null;
464
+ /** 最低价 */
465
+ low: number | null;
466
+ /** 今开 */
467
+ open: number | null;
468
+ /** 昨收 */
469
+ prevClose: number | null;
470
+ /** 换手率% */
471
+ turnoverRate: number | null;
472
+ /** 市盈率-动态 */
473
+ pe: number | null;
474
+ /** 市净率 */
475
+ pb: number | null;
476
+ }
477
+ /**
478
+ * 行业板块历史 K 线
479
+ */
480
+ interface IndustryBoardKline {
481
+ /** 日期 */
482
+ date: string;
483
+ /** 开盘价 */
484
+ open: number | null;
485
+ /** 收盘价 */
486
+ close: number | null;
487
+ /** 最高价 */
488
+ high: number | null;
489
+ /** 最低价 */
490
+ low: number | null;
491
+ /** 涨跌幅% */
492
+ changePercent: number | null;
493
+ /** 涨跌额 */
494
+ change: number | null;
495
+ /** 成交量 */
496
+ volume: number | null;
497
+ /** 成交额 */
498
+ amount: number | null;
499
+ /** 振幅% */
500
+ amplitude: number | null;
501
+ /** 换手率% */
502
+ turnoverRate: number | null;
503
+ }
504
+ /**
505
+ * 行业板块 1 分钟分时数据
506
+ */
507
+ interface IndustryBoardMinuteTimeline {
508
+ /** 日期时间 */
509
+ time: string;
510
+ /** 开盘价 */
511
+ open: number | null;
512
+ /** 收盘价 */
513
+ close: number | null;
514
+ /** 最高价 */
515
+ high: number | null;
516
+ /** 最低价 */
517
+ low: number | null;
518
+ /** 成交量 */
519
+ volume: number | null;
520
+ /** 成交额 */
521
+ amount: number | null;
522
+ /** 最新价 */
523
+ price: number | null;
524
+ }
525
+ /**
526
+ * 行业板块分钟 K 线
527
+ */
528
+ interface IndustryBoardMinuteKline {
529
+ /** 日期时间 */
530
+ time: string;
531
+ /** 开盘价 */
532
+ open: number | null;
533
+ /** 收盘价 */
534
+ close: number | null;
535
+ /** 最高价 */
536
+ high: number | null;
537
+ /** 最低价 */
538
+ low: number | null;
539
+ /** 涨跌幅% */
540
+ changePercent: number | null;
541
+ /** 涨跌额 */
542
+ change: number | null;
543
+ /** 成交量 */
544
+ volume: number | null;
545
+ /** 成交额 */
546
+ amount: number | null;
547
+ /** 振幅% */
548
+ amplitude: number | null;
549
+ /** 换手率% */
550
+ turnoverRate: number | null;
551
+ }
552
+ /**
553
+ * 概念板块信息(结构同行业板块)
554
+ */
555
+ type ConceptBoard = IndustryBoard;
556
+ /**
557
+ * 概念板块实时行情(结构同行业板块)
558
+ */
559
+ type ConceptBoardSpot = IndustryBoardSpot;
560
+ /**
561
+ * 概念板块成分股(结构同行业板块)
562
+ */
563
+ type ConceptBoardConstituent = IndustryBoardConstituent;
564
+ /**
565
+ * 概念板块历史 K 线(结构同行业板块)
566
+ */
567
+ type ConceptBoardKline = IndustryBoardKline;
568
+ /**
569
+ * 概念板块 1 分钟分时数据(结构同行业板块)
570
+ */
571
+ type ConceptBoardMinuteTimeline = IndustryBoardMinuteTimeline;
572
+ /**
573
+ * 概念板块分钟 K 线(结构同行业板块)
574
+ */
575
+ type ConceptBoardMinuteKline = IndustryBoardMinuteKline;
402
576
 
403
577
  /**
404
578
  * 腾讯财经 - 批量操作
@@ -471,6 +645,44 @@ interface USKlineOptions {
471
645
  endDate?: string;
472
646
  }
473
647
 
648
+ /**
649
+ * 东方财富 - 行业板块
650
+ */
651
+
652
+ interface IndustryBoardKlineOptions {
653
+ /** K 线周期 */
654
+ period?: 'daily' | 'weekly' | 'monthly';
655
+ /** 复权类型 */
656
+ adjust?: '' | 'qfq' | 'hfq';
657
+ /** 开始日期 YYYYMMDD */
658
+ startDate?: string;
659
+ /** 结束日期 YYYYMMDD */
660
+ endDate?: string;
661
+ }
662
+ interface IndustryBoardMinuteKlineOptions {
663
+ /** K 线周期:1/5/15/30/60 分钟 */
664
+ period?: '1' | '5' | '15' | '30' | '60';
665
+ }
666
+
667
+ /**
668
+ * 东方财富 - 概念板块
669
+ */
670
+
671
+ interface ConceptBoardKlineOptions {
672
+ /** K 线周期 */
673
+ period?: 'daily' | 'weekly' | 'monthly';
674
+ /** 复权类型 */
675
+ adjust?: '' | 'qfq' | 'hfq';
676
+ /** 开始日期 YYYYMMDD */
677
+ startDate?: string;
678
+ /** 结束日期 YYYYMMDD */
679
+ endDate?: string;
680
+ }
681
+ interface ConceptBoardMinuteKlineOptions {
682
+ /** K 线周期:1/5/15/30/60 分钟 */
683
+ period?: '1' | '5' | '15' | '30' | '60';
684
+ }
685
+
474
686
  interface OHLCV {
475
687
  open: number | null;
476
688
  high: number | null;
@@ -734,6 +946,68 @@ declare class StockSDK {
734
946
  * @param code 股票代码,如 'sz000001' 或 'sh600000'
735
947
  */
736
948
  getTodayTimeline(code: string): Promise<TodayTimelineResponse>;
949
+ /**
950
+ * 获取行业板块名称列表
951
+ * @returns 行业板块列表
952
+ */
953
+ getIndustryList(): Promise<IndustryBoard[]>;
954
+ /**
955
+ * 获取行业板块实时行情
956
+ * @param symbol 行业板块名称(如"小金属")或代码(如"BK1027")
957
+ * @returns 实时行情指标列表
958
+ */
959
+ getIndustrySpot(symbol: string): Promise<IndustryBoardSpot[]>;
960
+ /**
961
+ * 获取行业板块成分股
962
+ * @param symbol 行业板块名称(如"小金属")或代码(如"BK1027")
963
+ * @returns 成分股列表
964
+ */
965
+ getIndustryConstituents(symbol: string): Promise<IndustryBoardConstituent[]>;
966
+ /**
967
+ * 获取行业板块历史 K 线(日/周/月)
968
+ * @param symbol 行业板块名称(如"小金属")或代码(如"BK1027")
969
+ * @param options 配置选项
970
+ * @returns 历史 K 线数据
971
+ */
972
+ getIndustryKline(symbol: string, options?: IndustryBoardKlineOptions): Promise<IndustryBoardKline[]>;
973
+ /**
974
+ * 获取行业板块分时行情(1/5/15/30/60 分钟)
975
+ * @param symbol 行业板块名称(如"小金属")或代码(如"BK1027")
976
+ * @param options 配置选项
977
+ * @returns 分时行情数据
978
+ */
979
+ getIndustryMinuteKline(symbol: string, options?: IndustryBoardMinuteKlineOptions): Promise<IndustryBoardMinuteTimeline[] | IndustryBoardMinuteKline[]>;
980
+ /**
981
+ * 获取概念板块名称列表
982
+ * @returns 概念板块列表
983
+ */
984
+ getConceptList(): Promise<ConceptBoard[]>;
985
+ /**
986
+ * 获取概念板块实时行情
987
+ * @param symbol 概念板块名称(如"人工智能")或代码(如"BK0800")
988
+ * @returns 实时行情指标列表
989
+ */
990
+ getConceptSpot(symbol: string): Promise<ConceptBoardSpot[]>;
991
+ /**
992
+ * 获取概念板块成分股
993
+ * @param symbol 概念板块名称(如"人工智能")或代码(如"BK0800")
994
+ * @returns 成分股列表
995
+ */
996
+ getConceptConstituents(symbol: string): Promise<ConceptBoardConstituent[]>;
997
+ /**
998
+ * 获取概念板块历史 K 线(日/周/月)
999
+ * @param symbol 概念板块名称(如"人工智能")或代码(如"BK0800")
1000
+ * @param options 配置选项
1001
+ * @returns 历史 K 线数据
1002
+ */
1003
+ getConceptKline(symbol: string, options?: ConceptBoardKlineOptions): Promise<ConceptBoardKline[]>;
1004
+ /**
1005
+ * 获取概念板块分时行情(1/5/15/30/60 分钟)
1006
+ * @param symbol 概念板块名称(如"人工智能")或代码(如"BK0800")
1007
+ * @param options 配置选项
1008
+ * @returns 分时行情数据
1009
+ */
1010
+ getConceptMinuteKline(symbol: string, options?: ConceptBoardMinuteKlineOptions): Promise<ConceptBoardMinuteTimeline[] | ConceptBoardMinuteKline[]>;
737
1011
  /**
738
1012
  * 获取 A 股历史 K 线(日/周/月)
739
1013
  */
@@ -827,4 +1101,4 @@ declare class StockSDK {
827
1101
  }): Promise<KlineWithIndicators<HistoryKline | HKUSHistoryKline>[]>;
828
1102
  }
829
1103
 
830
- export { type ATROptions, type BIASOptions, type BOLLOptions, type CCIOptions, type FullQuote, type FundFlow, type FundQuote, type GetAllAShareQuotesOptions, type HKQuote, type HKUSHistoryKline, type HistoryKline, type IndicatorOptions, type KDJOptions, type KlineWithIndicators, type MACDOptions, type MAOptions, type MarketType, type MinuteKline, type MinuteTimeline, type PanelLargeOrder, type RSIOptions, type SimpleQuote, StockSDK, type TodayTimeline, type TodayTimelineResponse, type USQuote, type WROptions, addIndicators, asyncPool, calcATR, calcBIAS, calcBOLL, calcCCI, calcEMA, calcKDJ, calcMA, calcMACD, calcRSI, calcSMA, calcWMA, calcWR, chunkArray, decodeGBK, StockSDK as default, parseResponse, safeNumber, safeNumberOrNull };
1104
+ export { type ATROptions, type BIASOptions, type BOLLOptions, type CCIOptions, type ConceptBoard, type ConceptBoardConstituent, type ConceptBoardKline, type ConceptBoardKlineOptions, type ConceptBoardMinuteKline, type ConceptBoardMinuteKlineOptions, type ConceptBoardMinuteTimeline, type ConceptBoardSpot, type FullQuote, type FundFlow, type FundQuote, type GetAllAShareQuotesOptions, type HKQuote, type HKUSHistoryKline, type HistoryKline, type IndicatorOptions, type IndustryBoard, type IndustryBoardConstituent, type IndustryBoardKline, type IndustryBoardKlineOptions, type IndustryBoardMinuteKline, type IndustryBoardMinuteKlineOptions, type IndustryBoardMinuteTimeline, type IndustryBoardSpot, type KDJOptions, type KlineWithIndicators, type MACDOptions, type MAOptions, type MarketType, type MinuteKline, type MinuteTimeline, type PanelLargeOrder, type RSIOptions, type SimpleQuote, StockSDK, type TodayTimeline, type TodayTimelineResponse, type USQuote, type WROptions, addIndicators, asyncPool, calcATR, calcBIAS, calcBOLL, calcCCI, calcEMA, calcKDJ, calcMA, calcMACD, calcRSI, calcSMA, calcWMA, calcWR, chunkArray, decodeGBK, StockSDK as default, parseResponse, safeNumber, safeNumberOrNull };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- var zt=Object.defineProperty;var Ht=(t,e)=>{for(var n in e)zt(t,n,{get:e[n],enumerable:!0})};function B(t){return new TextDecoder("gbk").decode(t)}function $(t){let e=t.split(";").map(s=>s.trim()).filter(Boolean),n=[];for(let s of e){let r=s.indexOf("=");if(r<0)continue;let o=s.slice(0,r).trim();o.startsWith("v_")&&(o=o.slice(2));let i=s.slice(r+1).trim();i.startsWith('"')&&i.endsWith('"')&&(i=i.slice(1,-1));let l=i.split("~");n.push({key:o,fields:l})}return n}function m(t){if(!t||t==="")return 0;let e=parseFloat(t);return Number.isNaN(e)?0:e}function y(t){if(!t||t==="")return null;let e=parseFloat(t);return Number.isNaN(e)?null:e}function p(t){if(!t||t===""||t==="-")return null;let e=parseFloat(t);return Number.isNaN(e)?null:e}var ut="https://qt.gtimg.cn",ct="https://web.ifzq.gtimg.cn/appstock/app/minute/query",mt="https://assets.linkdiary.cn/shares/zh_a_list.json",pt="https://assets.linkdiary.cn/shares/us_list.json",ft="https://assets.linkdiary.cn/shares/hk_list.json";var W="https://push2his.eastmoney.com/api/qt/stock/kline/get",dt="https://push2his.eastmoney.com/api/qt/stock/trends2/get",ht="https://33.push2his.eastmoney.com/api/qt/stock/kline/get",gt="https://63.push2his.eastmoney.com/api/qt/stock/kline/get",yt=3e4,E=500,D=500,N=7;var F=class{constructor(e={}){this.baseUrl=e.baseUrl??ut,this.timeout=e.timeout??yt}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=B(s);return $(r)}};var Vt=new Set(["daily","weekly","monthly"]),Gt=new Set(["1","5","15","30","60"]),Jt=new Set(["","qfq","hfq"]);function C(t,e){if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new RangeError(`${e} must be a positive integer`)}function P(t){if(!Vt.has(t))throw new RangeError("period must be one of: daily, weekly, monthly")}function bt(t){if(!Gt.has(t))throw new RangeError("period must be one of: 1, 5, 15, 30, 60")}function k(t){if(!Jt.has(t))throw new RangeError("adjust must be one of: '', 'qfq', 'hfq'")}function _(t,e){C(e,"chunkSize");let n=[];for(let s=0;s<t.length;s+=e)n.push(t.slice(s,s+e));return n}async function q(t,e){C(e,"concurrency");let n=[],s=[];for(let r of t){let o=Promise.resolve().then(()=>r()).then(i=>{n.push(i)});if(s.push(o),s.length>=e){await Promise.race(s);for(let i=s.length-1;i>=0;i--)await Promise.race([s[i].then(()=>"fulfilled"),Promise.resolve("pending")])==="fulfilled"&&s.splice(i,1)}}return await Promise.all(s),n}function z(t){return t.startsWith("sh")?"1":t.startsWith("sz")||t.startsWith("bj")?"0":t.startsWith("6")?"1":"0"}var S={};Ht(S,{getAShareCodeList:()=>jt,getAllHKQuotesByCodes:()=>Dt,getAllQuotesByCodes:()=>Et,getAllUSQuotesByCodes:()=>Nt,getFullQuotes:()=>V,getFundFlow:()=>Ut,getFundQuotes:()=>Ot,getHKCodeList:()=>qt,getHKQuotes:()=>G,getPanelLargeOrder:()=>Pt,getSimpleQuotes:()=>It,getTodayTimeline:()=>Qt,getUSCodeList:()=>_t,getUSQuotes:()=>J,parseFullQuote:()=>Rt,parseFundFlow:()=>wt,parseFundQuote:()=>Kt,parseHKQuote:()=>At,parsePanelLargeOrder:()=>Tt,parseSimpleQuote:()=>St,parseUSQuote:()=>Ct});function Rt(t){let e=[];for(let s=0;s<5;s++)e.push({price:m(t[9+s*2]),volume:m(t[10+s*2])});let n=[];for(let s=0;s<5;s++)n.push({price:m(t[19+s*2]),volume:m(t[20+s*2])});return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),outerVolume:m(t[7]),innerVolume:m(t[8]),bid:e,ask:n,time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),volume2:m(t[36]),amount:m(t[37]),turnoverRate:y(t[38]),pe:y(t[39]),amplitude:y(t[43]),circulatingMarketCap:y(t[44]),totalMarketCap:y(t[45]),pb:y(t[46]),limitUp:y(t[47]),limitDown:y(t[48]),volumeRatio:y(t[49]),avgPrice:y(t[51]),peStatic:y(t[52]),peDynamic:y(t[53]),high52w:y(t[67]),low52w:y(t[68]),circulatingShares:y(t[72]),totalShares:y(t[73]),raw:t}}function St(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),change:m(t[4]),changePercent:m(t[5]),volume:m(t[6]),amount:m(t[7]),marketCap:y(t[9]),marketType:t[10]??"",raw:t}}function wt(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 Tt(t){return{buyLargeRatio:m(t[0]),buySmallRatio:m(t[1]),sellLargeRatio:m(t[2]),sellSmallRatio:m(t[3]),raw:t}}function At(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),amount:m(t[37]),lotSize:y(t[40]),circulatingMarketCap:y(t[44]),totalMarketCap:y(t[45]),currency:t[t.length-3]??"",raw:t}}function Ct(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),amount:m(t[37]),turnoverRate:y(t[38]),pe:y(t[39]),amplitude:y(t[43]),totalMarketCap:y(t[45]),pb:y(t[47]),high52w:y(t[48]),low52w:y(t[49]),raw:t}}function Kt(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 V(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=>Rt(s.fields))}async function It(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=>St(r.fields))}async function Ut(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=>wt(r.fields))}async function Pt(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=>Tt(r.fields))}async function G(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`hk${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>At(r.fields))}async function J(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`us${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Ct(r.fields))}async function Ot(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=>Kt(r.fields))}async function Qt(t,e){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(`${ct}?code=${e}`,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let i=await o.json();if(i.code!==0)throw new Error(i.msg||"API error");let l=i.data?.[e];if(!l)return{code:e,date:"",data:[]};let a=l.data?.data||[],u=l.data?.date||"",c=!1;if(a.length>0){let f=a[0].split(" "),h=parseFloat(f[1])||0,g=parseInt(f[2],10)||0,b=parseFloat(f[3])||0;g>0&&h>0&&b/g>h*50&&(c=!0)}let d=a.map(f=>{let h=f.split(" "),g=h[0],b=`${g.slice(0,2)}:${g.slice(2,4)}`,R=parseInt(h[2],10)||0,w=parseFloat(h[3])||0,T=c?R*100:R,A=T>0?w/T:0;return{time:b,price:parseFloat(h[1])||0,volume:T,amount:w,avgPrice:Math.round(A*100)/100}});return{code:e,date:u,data:d}}finally{clearTimeout(r)}}async function jt(t,e=!0){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(mt,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let l=(await o.json()).list||[];return e?l:l.map(a=>a.replace(/^(sh|sz|bj)/,""))}finally{clearTimeout(r)}}async function _t(t,e=!0){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(pt,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let l=(await o.json()).list||[];return e?l:l.map(a=>a.replace(/^\d{3}\./,""))}finally{clearTimeout(r)}}async function qt(t){let e=t.getTimeout(),n=new AbortController,s=setTimeout(()=>n.abort(),e);try{let r=await fetch(ft,{signal:n.signal});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);return(await r.json()).list||[]}finally{clearTimeout(s)}}async function Et(t,e,n={}){let{batchSize:s=E,concurrency:r=N,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,D),l=_(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await V(t,f);return u++,o&&o(u,a),h});return(await q(c,r)).flat()}async function Dt(t,e,n={}){let{batchSize:s=E,concurrency:r=N,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,D),l=_(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await G(t,f);return u++,o&&o(u,a),h});return(await q(c,r)).flat()}async function Nt(t,e,n={}){let{batchSize:s=E,concurrency:r=N,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,D),l=_(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await J(t,f);return u++,o&&o(u,a),h});return(await q(c,r)).flat()}var O={};Ht(O,{getHKHistoryKline:()=>Bt,getHistoryKline:()=>Ft,getMinuteKline:()=>vt,getUSHistoryKline:()=>$t});async function Ft(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;P(s),k(r);let l=e.replace(/^(sh|sz|bj)/,""),a={daily:"101",weekly:"102",monthly:"103"},u={"":"0",qfq:"1",hfq:"2"},c=`${z(e)}.${l}`,d=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f116",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:a[s],fqt:u[r],secid:c,beg:o,end:i}),f=`${W}?${d.toString()}`,g=(await t.get(f,{responseType:"json"}))?.data?.klines;return!Array.isArray(g)||g.length===0?[]:g.map(b=>{let[R,w,T,A,K,M,x,L,H,I,U]=b.split(",");return{date:R,code:l,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),amplitude:p(L),changePercent:p(H),change:p(I),turnoverRate:p(U)}})}async function vt(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;bt(s),k(r);let l=e.replace(/^(sh|sz|bj)/,""),a=`${z(e)}.${l}`;if(s==="1"){let u=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",fields2:"f51,f52,f53,f54,f55,f56,f57,f58",ut:"7eea3edcaed734bea9cbfc24409ed989",ndays:"5",iscr:"0",secid:a}),c=`${dt}?${u.toString()}`,f=(await t.get(c,{responseType:"json"}))?.data?.trends;if(!Array.isArray(f)||f.length===0)return[];let h=o.replace("T"," ").slice(0,16),g=i.replace("T"," ").slice(0,16);return f.map(b=>{let[R,w,T,A,K,M,x,L]=b.split(",");return{time:R,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),avgPrice:p(L)}}).filter(b=>b.time>=h&&b.time<=g)}else{let u={"":"0",qfq:"1",hfq:"2"},c=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:s,fqt:u[r],secid:a,beg:"0",end:"20500000"}),d=`${W}?${c.toString()}`,h=(await t.get(d,{responseType:"json"}))?.data?.klines;if(!Array.isArray(h)||h.length===0)return[];let g=o.replace("T"," ").slice(0,16),b=i.replace("T"," ").slice(0,16);return h.map(R=>{let[w,T,A,K,M,x,L,H,I,U,at]=R.split(",");return{time:w,open:p(T),close:p(A),high:p(K),low:p(M),changePercent:p(I),change:p(U),volume:p(x),amount:p(L),amplitude:p(H),turnoverRate:p(at)}}).filter(R=>R.time>=g&&R.time<=b)}}async function Bt(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;P(s),k(r);let l=e.replace(/^hk/i,"").padStart(5,"0"),a={daily:"101",weekly:"102",monthly:"103"},u={"":"0",qfq:"1",hfq:"2"},c=`116.${l}`,d=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:a[s],fqt:u[r],secid:c,beg:o,end:i,lmt:"1000000"}),f=`${ht}?${d.toString()}`,h=await t.get(f,{responseType:"json"}),g=h?.data?.klines,b=h?.data?.name||"";return!Array.isArray(g)||g.length===0?[]:g.map(R=>{let[w,T,A,K,M,x,L,H,I,U,at]=R.split(",");return{date:w,code:l,name:b,open:p(T),close:p(A),high:p(K),low:p(M),volume:p(x),amount:p(L),amplitude:p(H),changePercent:p(I),change:p(U),turnoverRate:p(at)}})}async function $t(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;P(s),k(r);let l={daily:"101",weekly:"102",monthly:"103"},a={"":"0",qfq:"1",hfq:"2"},u=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:l[s],fqt:a[r],secid:e,beg:o,end:i,lmt:"1000000"}),c=`${gt}?${u.toString()}`,d=await t.get(c,{responseType:"json"}),f=d?.data?.klines,h=d?.data?.code||e.split(".")[1]||e,g=d?.data?.name||"";return!Array.isArray(f)||f.length===0?[]:f.map(b=>{let[R,w,T,A,K,M,x,L,H,I,U]=b.split(",");return{date:R,code:h,name:g,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),amplitude:p(L),changePercent:p(H),change:p(I),turnoverRate:p(U)}})}function v(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function Q(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?v(r/e):null)}return n}function j(t,e){let n=[],s=2/(e+1),r=null,o=!1;for(let i=0;i<t.length;i++){if(i<e-1){n.push(null);continue}if(!o){let a=0,u=0;for(let c=i-e+1;c<=i;c++)t[c]!==null&&(a+=t[c],u++);u===e&&(r=a/e,o=!0),n.push(r!==null?v(r):null);continue}let l=t[i];l===null?n.push(r!==null?v(r):null):(r=s*l+(1-s)*r,n.push(v(r)))}return n}function Mt(t,e){let n=[],s=Array.from({length:e},(o,i)=>i+1),r=s.reduce((o,i)=>o+i,0);for(let o=0;o<t.length;o++){if(o<e-1){n.push(null);continue}let i=0,l=!0;for(let a=0;a<e;a++){let u=t[o-e+1+a];if(u===null){l=!1;break}i+=u*s[a]}n.push(l?v(i/r):null)}return n}function Z(t,e={}){let{periods:n=[5,10,20,30,60,120,250],type:s="sma"}=e,r=s==="ema"?j:s==="wma"?Mt:Q,o={};for(let i of n)o[`ma${i}`]=r(t,i);return t.map((i,l)=>{let a={};for(let u of n)a[`ma${u}`]=o[`ma${u}`][l];return a})}function Wt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function Y(t,e={}){let{short:n=12,long:s=26,signal:r=9}=e,o=j(t,n),i=j(t,s),l=t.map((u,c)=>o[c]===null||i[c]===null?null:o[c]-i[c]),a=j(l,r);return t.map((u,c)=>({dif:l[c]!==null?Wt(l[c]):null,dea:a[c],macd:l[c]!==null&&a[c]!==null?Wt((l[c]-a[c])*2):null}))}function xt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function Zt(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 X(t,e={}){let{period:n=20,stdDev:s=2}=e,r=Q(t,n),o=Zt(t,n,r);return t.map((i,l)=>{if(r[l]===null||o[l]===null)return{mid:null,upper:null,lower:null,bandwidth:null};let a=r[l]+s*o[l],u=r[l]-s*o[l],c=r[l]!==0?xt((a-u)/r[l]*100):null;return{mid:r[l],upper:xt(a),lower:xt(u),bandwidth:c}})}function Lt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function tt(t,e={}){let{period:n=9,kPeriod:s=3,dPeriod:r=3}=e,o=[],i=50,l=50;for(let a=0;a<t.length;a++){if(a<n-1){o.push({k:null,d:null,j:null});continue}let u=-1/0,c=1/0,d=!0;for(let b=a-n+1;b<=a;b++){if(t[b].high===null||t[b].low===null){d=!1;break}u=Math.max(u,t[b].high),c=Math.min(c,t[b].low)}let f=t[a].close;if(!d||f===null||u===c){o.push({k:null,d:null,j:null});continue}let h=(f-c)/(u-c)*100;i=(s-1)/s*i+1/s*h,l=(r-1)/r*l+1/r*i;let g=3*i-2*l;o.push({k:Lt(i),d:Lt(l),j:Lt(g)})}return o}function Yt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function et(t,e={}){let{periods:n=[6,12,24]}=e,s=[null];for(let o=1;o<t.length;o++)t[o]===null||t[o-1]===null?s.push(null):s.push(t[o]-t[o-1]);let r={};for(let o of n){let i=[],l=0,a=0;for(let u=0;u<t.length;u++){if(u<o){i.push(null),s[u]!==null&&(s[u]>0?l+=s[u]:a+=Math.abs(s[u]));continue}if(u===o)l=l/o,a=a/o;else{let c=s[u]??0,d=c>0?c:0,f=c<0?Math.abs(c):0;l=(l*(o-1)+d)/o,a=(a*(o-1)+f)/o}if(a===0)i.push(100);else if(l===0)i.push(0);else{let c=l/a;i.push(Yt(100-100/(1+c)))}}r[`rsi${o}`]=i}return t.map((o,i)=>{let l={};for(let a of n)l[`rsi${a}`]=r[`rsi${a}`][i];return l})}function Xt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function nt(t,e={}){let{periods:n=[6,10]}=e,s={};for(let r of n){let o=[];for(let i=0;i<t.length;i++){if(i<r-1){o.push(null);continue}let l=-1/0,a=1/0,u=!0;for(let f=i-r+1;f<=i;f++){if(t[f].high===null||t[f].low===null){u=!1;break}l=Math.max(l,t[f].high),a=Math.min(a,t[f].low)}let c=t[i].close;if(!u||c===null||l===a){o.push(null);continue}let d=(l-c)/(l-a)*100;o.push(Xt(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 te(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function rt(t,e={}){let{periods:n=[6,12,24]}=e,s={};for(let r of n){let o=Q(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(te(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 ee(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function ot(t,e={}){let{period:n=14}=e,s=[],r=t.map(o=>o.high===null||o.low===null||o.close===null?null:(o.high+o.low+o.close)/3);for(let o=0;o<t.length;o++){if(o<n-1){s.push({cci:null});continue}let i=0,l=0;for(let d=o-n+1;d<=o;d++)r[d]!==null&&(i+=r[d],l++);if(l!==n||r[o]===null){s.push({cci:null});continue}let a=i/n,u=0;for(let d=o-n+1;d<=o;d++)u+=Math.abs(r[d]-a);let c=u/n;if(c===0)s.push({cci:0});else{let d=(r[o]-a)/(.015*c);s.push({cci:ee(d)})}}return s}function kt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function st(t,e={}){let{period:n=14}=e,s=[],r=[];for(let i=0;i<t.length;i++){let{high:l,low:a,close:u}=t[i];if(l===null||a===null||u===null){r.push(null);continue}if(i===0)r.push(l-a);else{let c=t[i-1].close;if(c===null)r.push(l-a);else{let d=l-a,f=Math.abs(l-c),h=Math.abs(a-c);r.push(Math.max(d,f,h))}}}let o=null;for(let i=0;i<t.length;i++){if(i<n-1){s.push({tr:r[i]!==null?kt(r[i]):null,atr:null});continue}if(i===n-1){let l=0,a=0;for(let u=0;u<n;u++)r[u]!==null&&(l+=r[u],a++);a===n&&(o=l/n)}else o!==null&&r[i]!==null&&(o=(o*(n-1)+r[i])/n);s.push({tr:r[i]!==null?kt(r[i]):null,atr:o!==null?kt(o):null})}return s}function it(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?Z(n,typeof e.ma=="object"?e.ma:{}):null,o=e.macd?Y(n,typeof e.macd=="object"?e.macd:{}):null,i=e.boll?X(n,typeof e.boll=="object"?e.boll:{}):null,l=e.kdj?tt(s,typeof e.kdj=="object"?e.kdj:{}):null,a=e.rsi?et(n,typeof e.rsi=="object"?e.rsi:{}):null,u=e.wr?nt(s,typeof e.wr=="object"?e.wr:{}):null,c=e.bias?rt(n,typeof e.bias=="object"?e.bias:{}):null,d=e.cci?ot(s,typeof e.cci=="object"?e.cci:{}):null,f=e.atr?st(s,typeof e.atr=="object"?e.atr:{}):null;return t.map((h,g)=>({...h,...r&&{ma:r[g]},...o&&{macd:o[g]},...i&&{boll:i[g]},...l&&{kdj:l[g]},...a&&{rsi:a[g]},...u&&{wr:u[g]},...c&&{bias:c[g]},...d&&{cci:d[g]},...f&&{atr:f[g]}}))}var lt=class{constructor(e={}){this.client=new F(e)}getFullQuotes(e){return S.getFullQuotes(this.client,e)}getSimpleQuotes(e){return S.getSimpleQuotes(this.client,e)}getHKQuotes(e){return S.getHKQuotes(this.client,e)}getUSQuotes(e){return S.getUSQuotes(this.client,e)}getFundQuotes(e){return S.getFundQuotes(this.client,e)}getFundFlow(e){return S.getFundFlow(this.client,e)}getPanelLargeOrder(e){return S.getPanelLargeOrder(this.client,e)}getTodayTimeline(e){return S.getTodayTimeline(this.client,e)}getHistoryKline(e,n){return O.getHistoryKline(this.client,e,n)}getMinuteKline(e,n){return O.getMinuteKline(this.client,e,n)}getHKHistoryKline(e,n){return O.getHKHistoryKline(this.client,e,n)}getUSHistoryKline(e,n){return O.getUSHistoryKline(this.client,e,n)}getAShareCodeList(e=!0){return S.getAShareCodeList(this.client,e)}getUSCodeList(e=!0){return S.getUSCodeList(this.client,e)}getHKCodeList(){return S.getHKCodeList(this.client)}async getAllAShareQuotes(e={}){let n=await this.getAShareCodeList();return this.getAllQuotesByCodes(n,e)}async getAllHKShareQuotes(e={}){let n=await this.getHKCodeList();return S.getAllHKQuotesByCodes(this.client,n,e)}async getAllUSShareQuotes(e={}){let n=await this.getUSCodeList(!1);return S.getAllUSQuotesByCodes(this.client,n,e)}getAllQuotesByCodes(e,n={}){return S.getAllQuotesByCodes(this.client,e,n)}async batchRaw(e){return this.client.getTencentQuote(e)}detectMarket(e){return/^\d{3}\.[A-Z]+$/i.test(e)?"US":/^\d{5}$/.test(e)?"HK":"A"}safeMax(e,n=0){return!e||e.length===0?n:Math.max(...e)}calcRequiredLookback(e){let n=0,s=!1;if(e.ma){let o=typeof e.ma=="object"?e.ma:{},i=o.periods??[5,10,20,30,60,120,250],l=o.type??"sma";n=Math.max(n,this.safeMax(i,20)),l==="ema"&&(s=!0)}if(e.macd){let o=typeof e.macd=="object"?e.macd:{},i=o.long??26,l=o.signal??9;n=Math.max(n,i*3+l),s=!0}if(e.boll){let o=typeof e.boll=="object"&&e.boll.period?e.boll.period:20;n=Math.max(n,o)}if(e.kdj){let o=typeof e.kdj=="object"&&e.kdj.period?e.kdj.period:9;n=Math.max(n,o)}if(e.rsi){let o=typeof e.rsi=="object"&&e.rsi.periods?e.rsi.periods:[6,12,24];n=Math.max(n,this.safeMax(o,14)+1)}if(e.wr){let o=typeof e.wr=="object"&&e.wr.periods?e.wr.periods:[6,10];n=Math.max(n,this.safeMax(o,10))}if(e.bias){let o=typeof e.bias=="object"&&e.bias.periods?e.bias.periods:[6,12,24];n=Math.max(n,this.safeMax(o,12))}if(e.cci){let o=typeof e.cci=="object"&&e.cci.period?e.cci.period:14;n=Math.max(n,o)}if(e.atr){let o=typeof e.atr=="object"&&e.atr.period?e.atr.period:14;n=Math.max(n,o)}return Math.ceil(n*(s?1.5:1.2))}calcActualStartDate(e,n,s=1.5){let r=Math.ceil(n*s),o=new Date(parseInt(e.slice(0,4)),parseInt(e.slice(4,6))-1,parseInt(e.slice(6,8)));o.setDate(o.getDate()-r);let i=o.getFullYear(),l=String(o.getMonth()+1).padStart(2,"0"),a=String(o.getDate()).padStart(2,"0");return`${i}${l}${a}`}dateToTimestamp(e){let n=e.includes("-")?e:`${e.slice(0,4)}-${e.slice(4,6)}-${e.slice(6,8)}`;return new Date(n).getTime()}async getKlineWithIndicators(e,n={}){let{startDate:s,endDate:r,indicators:o={}}=n,i=n.market??this.detectMarket(e),l=this.calcRequiredLookback(o),u={A:1.5,HK:1.46,US:1.45}[i],c=s?this.calcActualStartDate(s,l,u):void 0,d={period:n.period,adjust:n.adjust,startDate:c,endDate:n.endDate},f;switch(i){case"HK":f=await this.getHKHistoryKline(e,d);break;case"US":f=await this.getUSHistoryKline(e,d);break;default:f=await this.getHistoryKline(e,d)}if(s&&f.length<l)switch(i){case"HK":f=await this.getHKHistoryKline(e,{...d,startDate:void 0});break;case"US":f=await this.getUSHistoryKline(e,{...d,startDate:void 0});break;default:f=await this.getHistoryKline(e,{...d,startDate:void 0})}let h=it(f,o);if(s){let g=this.dateToTimestamp(s),b=r?this.dateToTimestamp(r):1/0;return h.filter(R=>{let w=this.dateToTimestamp(R.date);return w>=g&&w<=b})}return h}},ne=lt;export{lt as StockSDK,it as addIndicators,q as asyncPool,st as calcATR,rt as calcBIAS,X as calcBOLL,ot as calcCCI,j as calcEMA,tt as calcKDJ,Z as calcMA,Y as calcMACD,et as calcRSI,Q as calcSMA,Mt as calcWMA,nt as calcWR,_ as chunkArray,B as decodeGBK,ne as default,$ as parseResponse,m as safeNumber,y as safeNumberOrNull};
1
+ var be=Object.defineProperty;var Vt=(t,e)=>{for(var o in e)be(t,o,{get:e[o],enumerable:!0})};function z(t){return new TextDecoder("gbk").decode(t)}function V(t){let e=t.split(";").map(s=>s.trim()).filter(Boolean),o=[];for(let s of e){let n=s.indexOf("=");if(n<0)continue;let r=s.slice(0,n).trim();r.startsWith("v_")&&(r=r.slice(2));let i=s.slice(n+1).trim();i.startsWith('"')&&i.endsWith('"')&&(i=i.slice(1,-1));let a=i.split("~");o.push({key:r,fields:a})}return o}function g(t){if(!t||t==="")return 0;let e=parseFloat(t);return Number.isNaN(e)?0:e}function R(t){if(!t||t==="")return null;let e=parseFloat(t);return Number.isNaN(e)?null:e}function u(t){if(!t||t===""||t==="-")return null;let e=parseFloat(t);return Number.isNaN(e)?null:e}var ht="https://qt.gtimg.cn",yt="https://web.ifzq.gtimg.cn/appstock/app/minute/query",Ct="https://assets.linkdiary.cn/shares/zh_a_list.json",Rt="https://assets.linkdiary.cn/shares/us_list.json",St="https://assets.linkdiary.cn/shares/hk_list.json";var G="https://push2his.eastmoney.com/api/qt/stock/kline/get",bt="https://push2his.eastmoney.com/api/qt/stock/trends2/get",wt="https://33.push2his.eastmoney.com/api/qt/stock/kline/get",Mt="https://63.push2his.eastmoney.com/api/qt/stock/kline/get",Tt="https://17.push2.eastmoney.com/api/qt/clist/get",Kt="https://91.push2.eastmoney.com/api/qt/stock/get",At="https://29.push2.eastmoney.com/api/qt/clist/get",J="https://7.push2his.eastmoney.com/api/qt/stock/kline/get",Pt="https://push2his.eastmoney.com/api/qt/stock/trends2/get",kt="https://79.push2.eastmoney.com/api/qt/clist/get",Lt="https://91.push2.eastmoney.com/api/qt/stock/get",_t="https://29.push2.eastmoney.com/api/qt/clist/get",Z="https://91.push2his.eastmoney.com/api/qt/stock/kline/get",It="https://push2his.eastmoney.com/api/qt/stock/trends2/get",xt=3e4,D=500,Q=500,$=7;var F=class{constructor(e={}){this.baseUrl=e.baseUrl??ht,this.timeout=e.timeout??xt}getTimeout(){return this.timeout}async get(e,o={}){let s=new AbortController,n=setTimeout(()=>s.abort(),this.timeout);try{let r=await fetch(e,{signal:s.signal});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);switch(o.responseType){case"json":return await r.json();case"arraybuffer":return await r.arrayBuffer();default:return await r.text()}}finally{clearTimeout(n)}}async getTencentQuote(e){let o=`${this.baseUrl}/?q=${encodeURIComponent(e)}`,s=await this.get(o,{responseType:"arraybuffer"}),n=z(s);return V(n)}};var we=new Set(["daily","weekly","monthly"]),Me=new Set(["1","5","15","30","60"]),Te=new Set(["","qfq","hfq"]);function B(t,e){if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new RangeError(`${e} must be a positive integer`)}function U(t){if(!we.has(t))throw new RangeError("period must be one of: daily, weekly, monthly")}function j(t){if(!Me.has(t))throw new RangeError("period must be one of: 1, 5, 15, 30, 60")}function I(t){if(!Te.has(t))throw new RangeError("adjust must be one of: '', 'qfq', 'hfq'")}function v(t,e){B(e,"chunkSize");let o=[];for(let s=0;s<t.length;s+=e)o.push(t.slice(s,s+e));return o}async function N(t,e){B(e,"concurrency");let o=[],s=[];for(let n of t){let r=Promise.resolve().then(()=>n()).then(i=>{o.push(i)});if(s.push(r),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),o}function Y(t){return t.startsWith("sh")?"1":t.startsWith("sz")||t.startsWith("bj")?"0":t.startsWith("6")?"1":"0"}var A={};Vt(A,{getAShareCodeList:()=>te,getAllHKQuotesByCodes:()=>oe,getAllQuotesByCodes:()=>re,getAllUSQuotesByCodes:()=>se,getFullQuotes:()=>X,getFundFlow:()=>Jt,getFundQuotes:()=>Yt,getHKCodeList:()=>ne,getHKQuotes:()=>tt,getPanelLargeOrder:()=>Zt,getSimpleQuotes:()=>Gt,getTodayTimeline:()=>Xt,getUSCodeList:()=>ee,getUSQuotes:()=>et,parseFullQuote:()=>Ot,parseFundFlow:()=>Bt,parseFundQuote:()=>Ht,parseHKQuote:()=>jt,parsePanelLargeOrder:()=>Et,parseSimpleQuote:()=>Ut,parseUSQuote:()=>qt});function Ot(t){let e=[];for(let s=0;s<5;s++)e.push({price:g(t[9+s*2]),volume:g(t[10+s*2])});let o=[];for(let s=0;s<5;s++)o.push({price:g(t[19+s*2]),volume:g(t[20+s*2])});return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:g(t[3]),prevClose:g(t[4]),open:g(t[5]),volume:g(t[6]),outerVolume:g(t[7]),innerVolume:g(t[8]),bid:e,ask:o,time:t[30]??"",change:g(t[31]),changePercent:g(t[32]),high:g(t[33]),low:g(t[34]),volume2:g(t[36]),amount:g(t[37]),turnoverRate:R(t[38]),pe:R(t[39]),amplitude:R(t[43]),circulatingMarketCap:R(t[44]),totalMarketCap:R(t[45]),pb:R(t[46]),limitUp:R(t[47]),limitDown:R(t[48]),volumeRatio:R(t[49]),avgPrice:R(t[51]),peStatic:R(t[52]),peDynamic:R(t[53]),high52w:R(t[67]),low52w:R(t[68]),circulatingShares:R(t[72]),totalShares:R(t[73]),raw:t}}function Ut(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:g(t[3]),change:g(t[4]),changePercent:g(t[5]),volume:g(t[6]),amount:g(t[7]),marketCap:R(t[9]),marketType:t[10]??"",raw:t}}function Bt(t){return{code:t[0]??"",mainInflow:g(t[1]),mainOutflow:g(t[2]),mainNet:g(t[3]),mainNetRatio:g(t[4]),retailInflow:g(t[5]),retailOutflow:g(t[6]),retailNet:g(t[7]),retailNetRatio:g(t[8]),totalFlow:g(t[9]),name:t[12]??"",date:t[13]??"",raw:t}}function Et(t){return{buyLargeRatio:g(t[0]),buySmallRatio:g(t[1]),sellLargeRatio:g(t[2]),sellSmallRatio:g(t[3]),raw:t}}function jt(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:g(t[3]),prevClose:g(t[4]),open:g(t[5]),volume:g(t[6]),time:t[30]??"",change:g(t[31]),changePercent:g(t[32]),high:g(t[33]),low:g(t[34]),amount:g(t[37]),lotSize:R(t[40]),circulatingMarketCap:R(t[44]),totalMarketCap:R(t[45]),currency:t[t.length-3]??"",raw:t}}function qt(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:g(t[3]),prevClose:g(t[4]),open:g(t[5]),volume:g(t[6]),time:t[30]??"",change:g(t[31]),changePercent:g(t[32]),high:g(t[33]),low:g(t[34]),amount:g(t[37]),turnoverRate:R(t[38]),pe:R(t[39]),amplitude:R(t[43]),totalMarketCap:R(t[45]),pb:R(t[47]),high52w:R(t[48]),low52w:R(t[49]),raw:t}}function Ht(t){return{code:t[0]??"",name:t[1]??"",nav:g(t[5]),accNav:g(t[6]),change:g(t[7]),navDate:t[8]??"",raw:t}}async function X(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=>Ot(s.fields))}async function Gt(t,e){if(!e||e.length===0)return[];let o=e.map(n=>`s_${n}`);return(await t.getTencentQuote(o.join(","))).filter(n=>n.fields&&n.fields.length>0&&n.fields[0]!=="").map(n=>Ut(n.fields))}async function Jt(t,e){if(!e||e.length===0)return[];let o=e.map(n=>`ff_${n}`);return(await t.getTencentQuote(o.join(","))).filter(n=>n.fields&&n.fields.length>0&&n.fields[0]!=="").map(n=>Bt(n.fields))}async function Zt(t,e){if(!e||e.length===0)return[];let o=e.map(n=>`s_pk${n}`);return(await t.getTencentQuote(o.join(","))).filter(n=>n.fields&&n.fields.length>0&&n.fields[0]!=="").map(n=>Et(n.fields))}async function tt(t,e){if(!e||e.length===0)return[];let o=e.map(n=>`hk${n}`);return(await t.getTencentQuote(o.join(","))).filter(n=>n.fields&&n.fields.length>0&&n.fields[0]!=="").map(n=>jt(n.fields))}async function et(t,e){if(!e||e.length===0)return[];let o=e.map(n=>`us${n}`);return(await t.getTencentQuote(o.join(","))).filter(n=>n.fields&&n.fields.length>0&&n.fields[0]!=="").map(n=>qt(n.fields))}async function Yt(t,e){if(!e||e.length===0)return[];let o=e.map(n=>`jj${n}`);return(await t.getTencentQuote(o.join(","))).filter(n=>n.fields&&n.fields.length>0&&n.fields[0]!=="").map(n=>Ht(n.fields))}async function Xt(t,e){let o=t.getTimeout(),s=new AbortController,n=setTimeout(()=>s.abort(),o);try{let r=await fetch(`${yt}?code=${e}`,{signal:s.signal});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);let i=await r.json();if(i.code!==0)throw new Error(i.msg||"API error");let a=i.data?.[e];if(!a)return{code:e,date:"",data:[]};let l=a.data?.data||[],c=a.data?.date||"",f=!1;if(l.length>0){let p=l[0].split(" "),m=parseFloat(p[1])||0,h=parseInt(p[2],10)||0,y=parseFloat(p[3])||0;h>0&&m>0&&y/h>m*50&&(f=!0)}let d=l.map(p=>{let m=p.split(" "),h=m[0],y=`${h.slice(0,2)}:${h.slice(2,4)}`,C=parseInt(m[2],10)||0,S=parseFloat(m[3])||0,b=f?C*100:C,T=b>0?S/b:0;return{time:y,price:parseFloat(m[1])||0,volume:b,amount:S,avgPrice:Math.round(T*100)/100}});return{code:e,date:c,data:d}}finally{clearTimeout(n)}}async function te(t,e=!0){let o=t.getTimeout(),s=new AbortController,n=setTimeout(()=>s.abort(),o);try{let r=await fetch(Ct,{signal:s.signal});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);let a=(await r.json()).list||[];return e?a:a.map(l=>l.replace(/^(sh|sz|bj)/,""))}finally{clearTimeout(n)}}async function ee(t,e=!0){let o=t.getTimeout(),s=new AbortController,n=setTimeout(()=>s.abort(),o);try{let r=await fetch(Rt,{signal:s.signal});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);let a=(await r.json()).list||[];return e?a:a.map(l=>l.replace(/^\d{3}\./,""))}finally{clearTimeout(n)}}async function ne(t){let e=t.getTimeout(),o=new AbortController,s=setTimeout(()=>o.abort(),e);try{let n=await fetch(St,{signal:o.signal});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return(await n.json()).list||[]}finally{clearTimeout(s)}}async function re(t,e,o={}){let{batchSize:s=D,concurrency:n=$,onProgress:r}=o;B(s,"batchSize"),B(n,"concurrency");let i=Math.min(s,Q),a=v(e,i),l=a.length,c=0,f=a.map(p=>async()=>{let m=await X(t,p);return c++,r&&r(c,l),m});return(await N(f,n)).flat()}async function oe(t,e,o={}){let{batchSize:s=D,concurrency:n=$,onProgress:r}=o;B(s,"batchSize"),B(n,"concurrency");let i=Math.min(s,Q),a=v(e,i),l=a.length,c=0,f=a.map(p=>async()=>{let m=await tt(t,p);return c++,r&&r(c,l),m});return(await N(f,n)).flat()}async function se(t,e,o={}){let{batchSize:s=D,concurrency:n=$,onProgress:r}=o;B(s,"batchSize"),B(n,"concurrency");let i=Math.min(s,Q),a=v(e,i),l=a.length,c=0,f=a.map(p=>async()=>{let m=await et(t,p);return c++,r&&r(c,l),m});return(await N(f,n)).flat()}var P={};Vt(P,{getConceptConstituents:()=>ye,getConceptKline:()=>Ce,getConceptList:()=>Qt,getConceptMinuteKline:()=>Re,getConceptSpot:()=>he,getHKHistoryKline:()=>le,getHistoryKline:()=>ie,getIndustryConstituents:()=>pe,getIndustryKline:()=>de,getIndustryList:()=>Nt,getIndustryMinuteKline:()=>me,getIndustrySpot:()=>fe,getMinuteKline:()=>ae,getUSHistoryKline:()=>ue});async function ie(t,e,o={}){let{period:s="daily",adjust:n="hfq",startDate:r="19700101",endDate:i="20500101"}=o;U(s),I(n);let a=e.replace(/^(sh|sz|bj)/,""),l={daily:"101",weekly:"102",monthly:"103"},c={"":"0",qfq:"1",hfq:"2"},f=`${Y(e)}.${a}`,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:l[s],fqt:c[n],secid:f,beg:r,end:i}),p=`${G}?${d.toString()}`,h=(await t.get(p,{responseType:"json"}))?.data?.klines;return!Array.isArray(h)||h.length===0?[]:h.map(y=>{let[C,S,b,T,K,k,L,_,x,O,E]=y.split(",");return{date:C,code:a,open:u(S),close:u(b),high:u(T),low:u(K),volume:u(k),amount:u(L),amplitude:u(_),changePercent:u(x),change:u(O),turnoverRate:u(E)}})}async function ae(t,e,o={}){let{period:s="1",adjust:n="hfq",startDate:r="1979-09-01 09:32:00",endDate:i="2222-01-01 09:32:00"}=o;j(s),I(n);let a=e.replace(/^(sh|sz|bj)/,""),l=`${Y(e)}.${a}`;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:l}),f=`${bt}?${c.toString()}`,p=(await t.get(f,{responseType:"json"}))?.data?.trends;if(!Array.isArray(p)||p.length===0)return[];let m=r.replace("T"," ").slice(0,16),h=i.replace("T"," ").slice(0,16);return p.map(y=>{let[C,S,b,T,K,k,L,_]=y.split(",");return{time:C,open:u(S),close:u(b),high:u(T),low:u(K),volume:u(k),amount:u(L),avgPrice:u(_)}}).filter(y=>y.time>=m&&y.time<=h)}else{let c={"":"0",qfq:"1",hfq:"2"},f=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[n],secid:l,beg:"0",end:"20500000"}),d=`${G}?${f.toString()}`,m=(await t.get(d,{responseType:"json"}))?.data?.klines;if(!Array.isArray(m)||m.length===0)return[];let h=r.replace("T"," ").slice(0,16),y=i.replace("T"," ").slice(0,16);return m.map(C=>{let[S,b,T,K,k,L,_,x,O,E,gt]=C.split(",");return{time:S,open:u(b),close:u(T),high:u(K),low:u(k),changePercent:u(O),change:u(E),volume:u(L),amount:u(_),amplitude:u(x),turnoverRate:u(gt)}}).filter(C=>C.time>=h&&C.time<=y)}}async function le(t,e,o={}){let{period:s="daily",adjust:n="hfq",startDate:r="19700101",endDate:i="20500101"}=o;U(s),I(n);let a=e.replace(/^hk/i,"").padStart(5,"0"),l={daily:"101",weekly:"102",monthly:"103"},c={"":"0",qfq:"1",hfq:"2"},f=`116.${a}`,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:l[s],fqt:c[n],secid:f,beg:r,end:i,lmt:"1000000"}),p=`${wt}?${d.toString()}`,m=await t.get(p,{responseType:"json"}),h=m?.data?.klines,y=m?.data?.name||"";return!Array.isArray(h)||h.length===0?[]:h.map(C=>{let[S,b,T,K,k,L,_,x,O,E,gt]=C.split(",");return{date:S,code:a,name:y,open:u(b),close:u(T),high:u(K),low:u(k),volume:u(L),amount:u(_),amplitude:u(x),changePercent:u(O),change:u(E),turnoverRate:u(gt)}})}async function ue(t,e,o={}){let{period:s="daily",adjust:n="hfq",startDate:r="19700101",endDate:i="20500101"}=o;U(s),I(n);let a={daily:"101",weekly:"102",monthly:"103"},l={"":"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:a[s],fqt:l[n],secid:e,beg:r,end:i,lmt:"1000000"}),f=`${Mt}?${c.toString()}`,d=await t.get(f,{responseType:"json"}),p=d?.data?.klines,m=d?.data?.code||e.split(".")[1]||e,h=d?.data?.name||"";return!Array.isArray(p)||p.length===0?[]:p.map(y=>{let[C,S,b,T,K,k,L,_,x,O,E]=y.split(",");return{date:C,code:m,name:h,open:u(S),close:u(b),high:u(T),low:u(K),volume:u(k),amount:u(L),amplitude:u(_),changePercent:u(x),change:u(O),turnoverRate:u(E)}})}var vt=null;async function nt(t,e){if(e.startsWith("BK"))return e;if(!vt){let s=await Nt(t);vt=new Map(s.map(n=>[n.name,n.code]))}let o=vt.get(e);if(!o)throw new Error(`\u672A\u627E\u5230\u884C\u4E1A\u677F\u5757: ${e}`);return o}function w(t){if(t==null)return null;let e=String(t);return u(e)}async function ce(t,e,o,s,n=100,r){let i=[],a=1,l=0;do{let c=new URLSearchParams({...o,pn:String(a),pz:String(n),fields:s}),f=`${e}?${c.toString()}`,p=(await t.get(f,{responseType:"json"}))?.data;if(!p||!Array.isArray(p.diff))break;a===1&&(l=p.total??0);let m=p.diff.map((h,y)=>r(h,i.length+y+1));i.push(...m),a++}while(i.length<l);return i}async function Nt(t){let s=await ce(t,Tt,{po:"1",np:"1",ut:"bd1d9ddb04089700cf9c27f6f7426281",fltt:"2",invt:"2",fid:"f3",fs:"m:90 t:2 f:!50"},"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f26,f22,f33,f11,f62,f128,f136,f115,f152,f124,f107,f104,f105,f140,f141,f207,f208,f209,f222",100,(n,r)=>({rank:r,name:String(n.f14??""),code:String(n.f12??""),price:w(n.f2),change:w(n.f4),changePercent:w(n.f3),totalMarketCap:w(n.f20),turnoverRate:w(n.f8),riseCount:w(n.f104),fallCount:w(n.f105),leadingStock:n.f128?String(n.f128):null,leadingStockChangePercent:w(n.f136)}));return s.sort((n,r)=>(r.changePercent??0)-(n.changePercent??0)),s.forEach((n,r)=>{n.rank=r+1}),s}async function fe(t,e){let o=await nt(t,e),s=new URLSearchParams({fields:"f43,f44,f45,f46,f47,f48,f170,f171,f168,f169",mpi:"1000",invt:"2",fltt:"1",secid:`90.${o}`}),n=`${Kt}?${s.toString()}`,i=(await t.get(n,{responseType:"json"}))?.data;return i?[{key:"f43",name:"\u6700\u65B0",divide:!0},{key:"f44",name:"\u6700\u9AD8",divide:!0},{key:"f45",name:"\u6700\u4F4E",divide:!0},{key:"f46",name:"\u5F00\u76D8",divide:!0},{key:"f47",name:"\u6210\u4EA4\u91CF",divide:!1},{key:"f48",name:"\u6210\u4EA4\u989D",divide:!1},{key:"f170",name:"\u6DA8\u8DCC\u5E45",divide:!0},{key:"f171",name:"\u632F\u5E45",divide:!0},{key:"f168",name:"\u6362\u624B\u7387",divide:!0},{key:"f169",name:"\u6DA8\u8DCC\u989D",divide:!0}].map(({key:l,name:c,divide:f})=>{let d=i[l],p=null;return typeof d=="number"&&!isNaN(d)&&(p=f?d/100:d),{item:c,value:p}}):[]}async function pe(t,e){let s={po:"1",np:"1",ut:"bd1d9ddb04089700cf9c27f6f7426281",fltt:"2",invt:"2",fid:"f3",fs:`b:${await nt(t,e)} f:!50`};return ce(t,At,s,"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152,f45",100,(r,i)=>({rank:i,code:String(r.f12??""),name:String(r.f14??""),price:w(r.f2),changePercent:w(r.f3),change:w(r.f4),volume:w(r.f5),amount:w(r.f6),amplitude:w(r.f7),high:w(r.f15),low:w(r.f16),open:w(r.f17),prevClose:w(r.f18),turnoverRate:w(r.f8),pe:w(r.f9),pb:w(r.f23)}))}async function de(t,e,o={}){let{period:s="daily",adjust:n="",startDate:r="19700101",endDate:i="20500101"}=o;U(s),I(n);let a=await nt(t,e),l={daily:"101",weekly:"102",monthly:"103"},c={"":"0",qfq:"1",hfq:"2"},f=new URLSearchParams({secid:`90.${a}`,fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",klt:l[s],fqt:c[n],beg:r,end:i,smplmt:"10000",lmt:"1000000"}),d=`${J}?${f.toString()}`,m=(await t.get(d,{responseType:"json"}))?.data?.klines;return!Array.isArray(m)||m.length===0?[]:m.map(h=>{let[y,C,S,b,T,K,k,L,_,x,O]=h.split(",");return{date:y,open:u(C),close:u(S),high:u(b),low:u(T),changePercent:u(_),change:u(x),volume:u(K),amount:u(k),amplitude:u(L),turnoverRate:u(O)}})}async function me(t,e,o={}){let{period:s="5"}=o;j(s);let n=await nt(t,e);if(s==="1"){let r=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",iscr:"0",ndays:"1",secid:`90.${n}`}),i=`${Pt}?${r.toString()}`,l=(await t.get(i,{responseType:"json"}))?.data?.trends;return!Array.isArray(l)||l.length===0?[]:l.map(c=>{let[f,d,p,m,h,y,C,S]=c.split(",");return{time:f,open:u(d),close:u(p),high:u(m),low:u(h),volume:u(y),amount:u(C),price:u(S)}})}else{let r=new URLSearchParams({secid:`90.${n}`,fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",klt:s,fqt:"1",beg:"0",end:"20500101",smplmt:"10000",lmt:"1000000"}),i=`${J}?${r.toString()}`,l=(await t.get(i,{responseType:"json"}))?.data?.klines;return!Array.isArray(l)||l.length===0?[]:l.map(c=>{let[f,d,p,m,h,y,C,S,b,T,K]=c.split(",");return{time:f,open:u(d),close:u(p),high:u(m),low:u(h),changePercent:u(b),change:u(T),volume:u(y),amount:u(C),amplitude:u(S),turnoverRate:u(K)}})}}var Dt=null;function M(t){if(t==null)return null;let e=String(t);return u(e)}async function rt(t,e){if(e.startsWith("BK"))return e;if(!Dt){let s=await Qt(t);Dt=new Map(s.map(n=>[n.name,n.code]))}let o=Dt.get(e);if(!o)throw new Error(`\u672A\u627E\u5230\u6982\u5FF5\u677F\u5757: ${e}`);return o}async function ge(t,e,o,s,n=100,r){let i=[],a=1,l=0;do{let c=new URLSearchParams({...o,pn:String(a),pz:String(n),fields:s}),f=`${e}?${c.toString()}`,p=(await t.get(f,{responseType:"json"}))?.data;if(!p||!Array.isArray(p.diff))break;a===1&&(l=p.total??0);let m=p.diff.map((h,y)=>r(h,i.length+y+1));i.push(...m),a++}while(i.length<l);return i}async function Qt(t){let s=await ge(t,kt,{po:"1",np:"1",ut:"bd1d9ddb04089700cf9c27f6f7426281",fltt:"2",invt:"2",fid:"f12",fs:"m:90 t:3 f:!50"},"f2,f3,f4,f8,f12,f14,f15,f16,f17,f18,f20,f21,f24,f25,f22,f33,f11,f62,f128,f124,f107,f104,f105,f136",100,(n,r)=>({rank:r,name:String(n.f14??""),code:String(n.f12??""),price:M(n.f2),change:M(n.f4),changePercent:M(n.f3),totalMarketCap:M(n.f20),turnoverRate:M(n.f8),riseCount:M(n.f104),fallCount:M(n.f105),leadingStock:n.f128?String(n.f128):null,leadingStockChangePercent:M(n.f136)}));return s.sort((n,r)=>(r.changePercent??0)-(n.changePercent??0)),s.forEach((n,r)=>{n.rank=r+1}),s}async function he(t,e){let o=await rt(t,e),s=new URLSearchParams({fields:"f43,f44,f45,f46,f47,f48,f170,f171,f168,f169",mpi:"1000",invt:"2",fltt:"1",secid:`90.${o}`}),n=`${Lt}?${s.toString()}`,i=(await t.get(n,{responseType:"json"}))?.data;return i?[{key:"f43",name:"\u6700\u65B0",divide:!0},{key:"f44",name:"\u6700\u9AD8",divide:!0},{key:"f45",name:"\u6700\u4F4E",divide:!0},{key:"f46",name:"\u5F00\u76D8",divide:!0},{key:"f47",name:"\u6210\u4EA4\u91CF",divide:!1},{key:"f48",name:"\u6210\u4EA4\u989D",divide:!1},{key:"f170",name:"\u6DA8\u8DCC\u5E45",divide:!0},{key:"f171",name:"\u632F\u5E45",divide:!0},{key:"f168",name:"\u6362\u624B\u7387",divide:!0},{key:"f169",name:"\u6DA8\u8DCC\u989D",divide:!0}].map(({key:l,name:c,divide:f})=>{let d=i[l],p=null;return typeof d=="number"&&!isNaN(d)&&(p=f?d/100:d),{item:c,value:p}}):[]}async function ye(t,e){let s={po:"1",np:"1",ut:"bd1d9ddb04089700cf9c27f6f7426281",fltt:"2",invt:"2",fid:"f12",fs:`b:${await rt(t,e)} f:!50`};return ge(t,_t,s,"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152,f45",100,(r,i)=>({rank:i,code:String(r.f12??""),name:String(r.f14??""),price:M(r.f2),changePercent:M(r.f3),change:M(r.f4),volume:M(r.f5),amount:M(r.f6),amplitude:M(r.f7),high:M(r.f15),low:M(r.f16),open:M(r.f17),prevClose:M(r.f18),turnoverRate:M(r.f8),pe:M(r.f9),pb:M(r.f23)}))}async function Ce(t,e,o={}){let{period:s="daily",adjust:n="",startDate:r="19700101",endDate:i="20500101"}=o;U(s),I(n);let a=await rt(t,e),l={daily:"101",weekly:"102",monthly:"103"},c={"":"0",qfq:"1",hfq:"2"},f=new URLSearchParams({secid:`90.${a}`,fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",klt:l[s],fqt:c[n],beg:r,end:i,smplmt:"10000",lmt:"1000000"}),d=`${Z}?${f.toString()}`,m=(await t.get(d,{responseType:"json"}))?.data?.klines;return!Array.isArray(m)||m.length===0?[]:m.map(h=>{let[y,C,S,b,T,K,k,L,_,x,O]=h.split(",");return{date:y,open:u(C),close:u(S),high:u(b),low:u(T),changePercent:u(_),change:u(x),volume:u(K),amount:u(k),amplitude:u(L),turnoverRate:u(O)}})}async function Re(t,e,o={}){let{period:s="5"}=o;j(s);let n=await rt(t,e);if(s==="1"){let r=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",iscr:"0",ndays:"1",secid:`90.${n}`}),i=`${It}?${r.toString()}`,l=(await t.get(i,{responseType:"json"}))?.data?.trends;return!Array.isArray(l)||l.length===0?[]:l.map(c=>{let[f,d,p,m,h,y,C,S]=c.split(",");return{time:f,open:u(d),close:u(p),high:u(m),low:u(h),volume:u(y),amount:u(C),price:u(S)}})}else{let r=new URLSearchParams({secid:`90.${n}`,fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",klt:s,fqt:"1",beg:"0",end:"20500101",smplmt:"10000",lmt:"1000000"}),i=`${Z}?${r.toString()}`,l=(await t.get(i,{responseType:"json"}))?.data?.klines;return!Array.isArray(l)||l.length===0?[]:l.map(c=>{let[f,d,p,m,h,y,C,S,b,T,K]=c.split(",");return{time:f,open:u(d),close:u(p),high:u(m),low:u(h),changePercent:u(b),change:u(T),volume:u(y),amount:u(C),amplitude:u(S),turnoverRate:u(K)}})}}function W(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function q(t,e){let o=[];for(let s=0;s<t.length;s++){if(s<e-1){o.push(null);continue}let n=0,r=0;for(let i=s-e+1;i<=s;i++)t[i]!==null&&(n+=t[i],r++);o.push(r===e?W(n/e):null)}return o}function H(t,e){let o=[],s=2/(e+1),n=null,r=!1;for(let i=0;i<t.length;i++){if(i<e-1){o.push(null);continue}if(!r){let l=0,c=0;for(let f=i-e+1;f<=i;f++)t[f]!==null&&(l+=t[f],c++);c===e&&(n=l/e,r=!0),o.push(n!==null?W(n):null);continue}let a=t[i];a===null?o.push(n!==null?W(n):null):(n=s*a+(1-s)*n,o.push(W(n)))}return o}function $t(t,e){let o=[],s=Array.from({length:e},(r,i)=>i+1),n=s.reduce((r,i)=>r+i,0);for(let r=0;r<t.length;r++){if(r<e-1){o.push(null);continue}let i=0,a=!0;for(let l=0;l<e;l++){let c=t[r-e+1+l];if(c===null){a=!1;break}i+=c*s[l]}o.push(a?W(i/n):null)}return o}function ot(t,e={}){let{periods:o=[5,10,20,30,60,120,250],type:s="sma"}=e,n=s==="ema"?H:s==="wma"?$t:q,r={};for(let i of o)r[`ma${i}`]=n(t,i);return t.map((i,a)=>{let l={};for(let c of o)l[`ma${c}`]=r[`ma${c}`][a];return l})}function Se(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function st(t,e={}){let{short:o=12,long:s=26,signal:n=9}=e,r=H(t,o),i=H(t,s),a=t.map((c,f)=>r[f]===null||i[f]===null?null:r[f]-i[f]),l=H(a,n);return t.map((c,f)=>({dif:a[f]!==null?Se(a[f]):null,dea:l[f],macd:a[f]!==null&&l[f]!==null?Se((a[f]-l[f])*2):null}))}function Ft(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function Ke(t,e,o){let s=[];for(let n=0;n<t.length;n++){if(n<e-1||o[n]===null){s.push(null);continue}let r=0,i=0;for(let a=n-e+1;a<=n;a++)t[a]!==null&&o[n]!==null&&(r+=Math.pow(t[a]-o[n],2),i++);s.push(i===e?Math.sqrt(r/e):null)}return s}function it(t,e={}){let{period:o=20,stdDev:s=2}=e,n=q(t,o),r=Ke(t,o,n);return t.map((i,a)=>{if(n[a]===null||r[a]===null)return{mid:null,upper:null,lower:null,bandwidth:null};let l=n[a]+s*r[a],c=n[a]-s*r[a],f=n[a]!==0?Ft((l-c)/n[a]*100):null;return{mid:n[a],upper:Ft(l),lower:Ft(c),bandwidth:f}})}function Wt(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function at(t,e={}){let{period:o=9,kPeriod:s=3,dPeriod:n=3}=e,r=[],i=50,a=50;for(let l=0;l<t.length;l++){if(l<o-1){r.push({k:null,d:null,j:null});continue}let c=-1/0,f=1/0,d=!0;for(let y=l-o+1;y<=l;y++){if(t[y].high===null||t[y].low===null){d=!1;break}c=Math.max(c,t[y].high),f=Math.min(f,t[y].low)}let p=t[l].close;if(!d||p===null||c===f){r.push({k:null,d:null,j:null});continue}let m=(p-f)/(c-f)*100;i=(s-1)/s*i+1/s*m,a=(n-1)/n*a+1/n*i;let h=3*i-2*a;r.push({k:Wt(i),d:Wt(a),j:Wt(h)})}return r}function Ae(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function lt(t,e={}){let{periods:o=[6,12,24]}=e,s=[null];for(let r=1;r<t.length;r++)t[r]===null||t[r-1]===null?s.push(null):s.push(t[r]-t[r-1]);let n={};for(let r of o){let i=[],a=0,l=0;for(let c=0;c<t.length;c++){if(c<r){i.push(null),s[c]!==null&&(s[c]>0?a+=s[c]:l+=Math.abs(s[c]));continue}if(c===r)a=a/r,l=l/r;else{let f=s[c]??0,d=f>0?f:0,p=f<0?Math.abs(f):0;a=(a*(r-1)+d)/r,l=(l*(r-1)+p)/r}if(l===0)i.push(100);else if(a===0)i.push(0);else{let f=a/l;i.push(Ae(100-100/(1+f)))}}n[`rsi${r}`]=i}return t.map((r,i)=>{let a={};for(let l of o)a[`rsi${l}`]=n[`rsi${l}`][i];return a})}function Pe(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function ut(t,e={}){let{periods:o=[6,10]}=e,s={};for(let n of o){let r=[];for(let i=0;i<t.length;i++){if(i<n-1){r.push(null);continue}let a=-1/0,l=1/0,c=!0;for(let p=i-n+1;p<=i;p++){if(t[p].high===null||t[p].low===null){c=!1;break}a=Math.max(a,t[p].high),l=Math.min(l,t[p].low)}let f=t[i].close;if(!c||f===null||a===l){r.push(null);continue}let d=(a-f)/(a-l)*100;r.push(Pe(d))}s[`wr${n}`]=r}return t.map((n,r)=>{let i={};for(let a of o)i[`wr${a}`]=s[`wr${a}`][r];return i})}function ke(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function ct(t,e={}){let{periods:o=[6,12,24]}=e,s={};for(let n of o){let r=q(t,n),i=[];for(let a=0;a<t.length;a++)if(t[a]===null||r[a]===null||r[a]===0)i.push(null);else{let l=(t[a]-r[a])/r[a]*100;i.push(ke(l))}s[`bias${n}`]=i}return t.map((n,r)=>{let i={};for(let a of o)i[`bias${a}`]=s[`bias${a}`][r];return i})}function Le(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function ft(t,e={}){let{period:o=14}=e,s=[],n=t.map(r=>r.high===null||r.low===null||r.close===null?null:(r.high+r.low+r.close)/3);for(let r=0;r<t.length;r++){if(r<o-1){s.push({cci:null});continue}let i=0,a=0;for(let d=r-o+1;d<=r;d++)n[d]!==null&&(i+=n[d],a++);if(a!==o||n[r]===null){s.push({cci:null});continue}let l=i/o,c=0;for(let d=r-o+1;d<=r;d++)c+=Math.abs(n[d]-l);let f=c/o;if(f===0)s.push({cci:0});else{let d=(n[r]-l)/(.015*f);s.push({cci:Le(d)})}}return s}function zt(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function pt(t,e={}){let{period:o=14}=e,s=[],n=[];for(let i=0;i<t.length;i++){let{high:a,low:l,close:c}=t[i];if(a===null||l===null||c===null){n.push(null);continue}if(i===0)n.push(a-l);else{let f=t[i-1].close;if(f===null)n.push(a-l);else{let d=a-l,p=Math.abs(a-f),m=Math.abs(l-f);n.push(Math.max(d,p,m))}}}let r=null;for(let i=0;i<t.length;i++){if(i<o-1){s.push({tr:n[i]!==null?zt(n[i]):null,atr:null});continue}if(i===o-1){let a=0,l=0;for(let c=0;c<o;c++)n[c]!==null&&(a+=n[c],l++);l===o&&(r=a/o)}else r!==null&&n[i]!==null&&(r=(r*(o-1)+n[i])/o);s.push({tr:n[i]!==null?zt(n[i]):null,atr:r!==null?zt(r):null})}return s}function dt(t,e={}){if(t.length===0)return[];let o=t.map(m=>m.close),s=t.map(m=>({open:m.open,high:m.high,low:m.low,close:m.close,volume:m.volume})),n=e.ma?ot(o,typeof e.ma=="object"?e.ma:{}):null,r=e.macd?st(o,typeof e.macd=="object"?e.macd:{}):null,i=e.boll?it(o,typeof e.boll=="object"?e.boll:{}):null,a=e.kdj?at(s,typeof e.kdj=="object"?e.kdj:{}):null,l=e.rsi?lt(o,typeof e.rsi=="object"?e.rsi:{}):null,c=e.wr?ut(s,typeof e.wr=="object"?e.wr:{}):null,f=e.bias?ct(o,typeof e.bias=="object"?e.bias:{}):null,d=e.cci?ft(s,typeof e.cci=="object"?e.cci:{}):null,p=e.atr?pt(s,typeof e.atr=="object"?e.atr:{}):null;return t.map((m,h)=>({...m,...n&&{ma:n[h]},...r&&{macd:r[h]},...i&&{boll:i[h]},...a&&{kdj:a[h]},...l&&{rsi:l[h]},...c&&{wr:c[h]},...f&&{bias:f[h]},...d&&{cci:d[h]},...p&&{atr:p[h]}}))}var mt=class{constructor(e={}){this.client=new F(e)}getFullQuotes(e){return A.getFullQuotes(this.client,e)}getSimpleQuotes(e){return A.getSimpleQuotes(this.client,e)}getHKQuotes(e){return A.getHKQuotes(this.client,e)}getUSQuotes(e){return A.getUSQuotes(this.client,e)}getFundQuotes(e){return A.getFundQuotes(this.client,e)}getFundFlow(e){return A.getFundFlow(this.client,e)}getPanelLargeOrder(e){return A.getPanelLargeOrder(this.client,e)}getTodayTimeline(e){return A.getTodayTimeline(this.client,e)}getIndustryList(){return P.getIndustryList(this.client)}getIndustrySpot(e){return P.getIndustrySpot(this.client,e)}getIndustryConstituents(e){return P.getIndustryConstituents(this.client,e)}getIndustryKline(e,o){return P.getIndustryKline(this.client,e,o)}getIndustryMinuteKline(e,o){return P.getIndustryMinuteKline(this.client,e,o)}getConceptList(){return P.getConceptList(this.client)}getConceptSpot(e){return P.getConceptSpot(this.client,e)}getConceptConstituents(e){return P.getConceptConstituents(this.client,e)}getConceptKline(e,o){return P.getConceptKline(this.client,e,o)}getConceptMinuteKline(e,o){return P.getConceptMinuteKline(this.client,e,o)}getHistoryKline(e,o){return P.getHistoryKline(this.client,e,o)}getMinuteKline(e,o){return P.getMinuteKline(this.client,e,o)}getHKHistoryKline(e,o){return P.getHKHistoryKline(this.client,e,o)}getUSHistoryKline(e,o){return P.getUSHistoryKline(this.client,e,o)}getAShareCodeList(e=!0){return A.getAShareCodeList(this.client,e)}getUSCodeList(e=!0){return A.getUSCodeList(this.client,e)}getHKCodeList(){return A.getHKCodeList(this.client)}async getAllAShareQuotes(e={}){let o=await this.getAShareCodeList();return this.getAllQuotesByCodes(o,e)}async getAllHKShareQuotes(e={}){let o=await this.getHKCodeList();return A.getAllHKQuotesByCodes(this.client,o,e)}async getAllUSShareQuotes(e={}){let o=await this.getUSCodeList(!1);return A.getAllUSQuotesByCodes(this.client,o,e)}getAllQuotesByCodes(e,o={}){return A.getAllQuotesByCodes(this.client,e,o)}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,o=0){return!e||e.length===0?o:Math.max(...e)}calcRequiredLookback(e){let o=0,s=!1;if(e.ma){let r=typeof e.ma=="object"?e.ma:{},i=r.periods??[5,10,20,30,60,120,250],a=r.type??"sma";o=Math.max(o,this.safeMax(i,20)),a==="ema"&&(s=!0)}if(e.macd){let r=typeof e.macd=="object"?e.macd:{},i=r.long??26,a=r.signal??9;o=Math.max(o,i*3+a),s=!0}if(e.boll){let r=typeof e.boll=="object"&&e.boll.period?e.boll.period:20;o=Math.max(o,r)}if(e.kdj){let r=typeof e.kdj=="object"&&e.kdj.period?e.kdj.period:9;o=Math.max(o,r)}if(e.rsi){let r=typeof e.rsi=="object"&&e.rsi.periods?e.rsi.periods:[6,12,24];o=Math.max(o,this.safeMax(r,14)+1)}if(e.wr){let r=typeof e.wr=="object"&&e.wr.periods?e.wr.periods:[6,10];o=Math.max(o,this.safeMax(r,10))}if(e.bias){let r=typeof e.bias=="object"&&e.bias.periods?e.bias.periods:[6,12,24];o=Math.max(o,this.safeMax(r,12))}if(e.cci){let r=typeof e.cci=="object"&&e.cci.period?e.cci.period:14;o=Math.max(o,r)}if(e.atr){let r=typeof e.atr=="object"&&e.atr.period?e.atr.period:14;o=Math.max(o,r)}return Math.ceil(o*(s?1.5:1.2))}calcActualStartDate(e,o,s=1.5){let n=Math.ceil(o*s),r=new Date(parseInt(e.slice(0,4)),parseInt(e.slice(4,6))-1,parseInt(e.slice(6,8)));r.setDate(r.getDate()-n);let i=r.getFullYear(),a=String(r.getMonth()+1).padStart(2,"0"),l=String(r.getDate()).padStart(2,"0");return`${i}${a}${l}`}dateToTimestamp(e){let o=e.includes("-")?e:`${e.slice(0,4)}-${e.slice(4,6)}-${e.slice(6,8)}`;return new Date(o).getTime()}async getKlineWithIndicators(e,o={}){let{startDate:s,endDate:n,indicators:r={}}=o,i=o.market??this.detectMarket(e),a=this.calcRequiredLookback(r),c={A:1.5,HK:1.46,US:1.45}[i],f=s?this.calcActualStartDate(s,a,c):void 0,d={period:o.period,adjust:o.adjust,startDate:f,endDate:o.endDate},p;switch(i){case"HK":p=await this.getHKHistoryKline(e,d);break;case"US":p=await this.getUSHistoryKline(e,d);break;default:p=await this.getHistoryKline(e,d)}if(s&&p.length<a)switch(i){case"HK":p=await this.getHKHistoryKline(e,{...d,startDate:void 0});break;case"US":p=await this.getUSHistoryKline(e,{...d,startDate:void 0});break;default:p=await this.getHistoryKline(e,{...d,startDate:void 0})}let m=dt(p,r);if(s){let h=this.dateToTimestamp(s),y=n?this.dateToTimestamp(n):1/0;return m.filter(C=>{let S=this.dateToTimestamp(C.date);return S>=h&&S<=y})}return m}},_e=mt;export{mt as StockSDK,dt as addIndicators,N as asyncPool,pt as calcATR,ct as calcBIAS,it as calcBOLL,ft as calcCCI,H as calcEMA,at as calcKDJ,ot as calcMA,st as calcMACD,lt as calcRSI,q as calcSMA,$t as calcWMA,ut as calcWR,v as chunkArray,z as decodeGBK,_e as default,V as parseResponse,g as safeNumber,R as safeNumberOrNull};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stock-sdk",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -24,15 +24,17 @@
24
24
  "scripts": {
25
25
  "build": "tsup",
26
26
  "test": "vitest run",
27
- "dev": "yarn build && (sleep 1 && open http://localhost:4000/playground/ &) && npx serve -l 4000 ."
27
+ "dev": "vitepress dev website",
28
+ "preview": "vitepress preview website",
29
+ "build:docs": "DOCS_BASE=/ vitepress build website",
30
+ "build:pages": "DOCS_BASE=/stock-sdk/ vitepress build website"
28
31
  },
29
32
  "keywords": [
30
33
  "stock",
31
- "tencent",
32
- "qt.gtimg.cn",
33
34
  "sdk",
34
35
  "browser",
35
36
  "node",
37
+ "akshare",
36
38
  "A股",
37
39
  "港股",
38
40
  "美股",
@@ -41,7 +43,7 @@
41
43
  "author": "chengzuopeng",
42
44
  "license": "ISC",
43
45
  "description": "Tencent qt.gtimg.cn stock quote SDK - supports both browser and Node.js",
44
- "homepage": "https://github.com/chengzuopeng/stock-sdk#readme",
46
+ "homepage": "https://stock-sdk.linkdiary.cn",
45
47
  "repository": {
46
48
  "type": "git",
47
49
  "url": "git+https://github.com/chengzuopeng/stock-sdk.git"
@@ -53,14 +55,17 @@
53
55
  "node": ">=18.0.0"
54
56
  },
55
57
  "devDependencies": {
58
+ "@iconify/vue": "^5.0.0",
56
59
  "@types/node": "^24.10.2",
57
60
  "@vitest/coverage-v8": "^4.0.16",
58
61
  "tsup": "^8.3.5",
59
62
  "typescript": "^5.9.3",
60
- "vitest": "^4.0.15"
63
+ "vitepress": "^1.6.4",
64
+ "vitest": "^4.0.15",
65
+ "vue": "^3.5.26"
61
66
  },
62
67
  "publishConfig": {
63
68
  "registry": "https://registry.npmjs.org/"
64
69
  },
65
- "packageManager": "yarn@4.6.0+sha512.5383cc12567a95f1d668fbe762dfe0075c595b4bfff433be478dbbe24e05251a8e8c3eb992a986667c1d53b6c3a9c85b8398c35a960587fbd9fa3a0915406728"
70
+ "packageManager": "yarn@1.22.22"
66
71
  }