stock-sdk 1.3.1 → 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/README.md +24 -4
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +275 -1
- package/dist/index.d.ts +275 -1
- package/dist/index.js +1 -1
- package/package.json +6 -7
package/README.md
CHANGED
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
|
|
16
16
|
## Documentation
|
|
17
17
|
|
|
18
|
-
👉🏻 [官方文档](https://
|
|
18
|
+
👉🏻 [官方文档](https://stock-sdk.linkdiary.cn/)
|
|
19
19
|
|
|
20
|
-
📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线演示](https://
|
|
20
|
+
📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线演示](https://stock-sdk.linkdiary.cn/playground/)
|
|
21
21
|
|
|
22
22
|
## Why stock-sdk?
|
|
23
23
|
|
|
@@ -102,7 +102,7 @@ console.log(`共获取 ${allQuotes.length} 只股票`);
|
|
|
102
102
|
|
|
103
103
|
## API 列表
|
|
104
104
|
|
|
105
|
-
💡 API 详细文档请查阅 [https://
|
|
105
|
+
💡 API 详细文档请查阅 [https://stock-sdk.linkdiary.cn/](https://stock-sdk.linkdiary.cn/)
|
|
106
106
|
|
|
107
107
|
### 实时行情
|
|
108
108
|
|
|
@@ -139,6 +139,26 @@ console.log(`共获取 ${allQuotes.length} 只股票`);
|
|
|
139
139
|
| `calcCCI` | 计算商品通道指数 |
|
|
140
140
|
| `calcATR` | 计算平均真实波幅 |
|
|
141
141
|
|
|
142
|
+
### 行业板块
|
|
143
|
+
|
|
144
|
+
| 方法 | 说明 |
|
|
145
|
+
|------|------|
|
|
146
|
+
| `getIndustryList` | 行业板块名称列表 |
|
|
147
|
+
| `getIndustrySpot` | 行业板块实时行情 |
|
|
148
|
+
| `getIndustryConstituents` | 行业板块成分股 |
|
|
149
|
+
| `getIndustryKline` | 行业板块历史 K 线(日/周/月) |
|
|
150
|
+
| `getIndustryMinuteKline` | 行业板块分时行情(1/5/15/30/60 分钟) |
|
|
151
|
+
|
|
152
|
+
### 概念板块
|
|
153
|
+
|
|
154
|
+
| 方法 | 说明 |
|
|
155
|
+
|------|------|
|
|
156
|
+
| `getConceptList` | 概念板块名称列表 |
|
|
157
|
+
| `getConceptSpot` | 概念板块实时行情 |
|
|
158
|
+
| `getConceptConstituents` | 概念板块成分股 |
|
|
159
|
+
| `getConceptKline` | 概念板块历史 K 线(日/周/月) |
|
|
160
|
+
| `getConceptMinuteKline` | 概念板块分时行情(1/5/15/30/60 分钟) |
|
|
161
|
+
|
|
142
162
|
### 扩展数据
|
|
143
163
|
|
|
144
164
|
| 方法 | 说明 |
|
|
@@ -166,7 +186,7 @@ console.log(`共获取 ${allQuotes.length} 只股票`);
|
|
|
166
186
|
|
|
167
187
|
---
|
|
168
188
|
|
|
169
|
-
🌐 [官网](https://
|
|
189
|
+
🌐 [官网](https://stock-sdk.linkdiary.cn) | 📦 [NPM](https://www.npmjs.com/package/stock-sdk) | 📖 [GitHub](https://github.com/chengzuopeng/stock-sdk) | 🎮 [在线演示](https://stock-sdk.linkdiary.cn/playground) | 🐛 [Issues](https://github.com/chengzuopeng/stock-sdk/issues)
|
|
170
190
|
|
|
171
191
|
---
|
|
172
192
|
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var ct=Object.defineProperty;var Gt=Object.getOwnPropertyDescriptor;var Jt=Object.getOwnPropertyNames;var Zt=Object.prototype.hasOwnProperty;var mt=(t,e)=>{for(var n in e)ct(t,n,{get:e[n],enumerable:!0})},Yt=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Jt(e))!Zt.call(t,r)&&r!==n&&ct(t,r,{get:()=>e[r],enumerable:!(s=Gt(e,r))||s.enumerable});return t};var Xt=t=>Yt(ct({},"__esModule",{value:!0}),t);var ae={};mt(ae,{StockSDK:()=>nt,addIndicators:()=>et,asyncPool:()=>_,calcATR:()=>tt,calcBIAS:()=>Y,calcBOLL:()=>V,calcCCI:()=>X,calcEMA:()=>I,calcKDJ:()=>G,calcMA:()=>W,calcMACD:()=>z,calcRSI:()=>J,calcSMA:()=>H,calcWMA:()=>at,calcWR:()=>Z,chunkArray:()=>j,decodeGBK:()=>E,default:()=>Vt,parseResponse:()=>D,safeNumber:()=>m,safeNumberOrNull:()=>y});module.exports=Xt(ae);function E(t){return new TextDecoder("gbk").decode(t)}function D(t){let e=t.split(";").map(s=>s.trim()).filter(Boolean),n=[];for(let s of e){let r=s.indexOf("=");if(r<0)continue;let o=s.slice(0,r).trim();o.startsWith("v_")&&(o=o.slice(2));let i=s.slice(r+1).trim();i.startsWith('"')&&i.endsWith('"')&&(i=i.slice(1,-1));let l=i.split("~");n.push({key:o,fields:l})}return n}function m(t){if(!t||t==="")return 0;let e=parseFloat(t);return Number.isNaN(e)?0:e}function y(t){if(!t||t==="")return null;let e=parseFloat(t);return Number.isNaN(e)?null:e}function p(t){if(!t||t===""||t==="-")return null;let e=parseFloat(t);return Number.isNaN(e)?null:e}var pt="https://qt.gtimg.cn",ft="https://web.ifzq.gtimg.cn/appstock/app/minute/query",dt="https://assets.linkdiary.cn/shares/zh_a_list.json",ht="https://assets.linkdiary.cn/shares/us_list.json",gt="https://assets.linkdiary.cn/shares/hk_list.json";var rt="https://push2his.eastmoney.com/api/qt/stock/kline/get",yt="https://push2his.eastmoney.com/api/qt/stock/trends2/get",bt="https://33.push2his.eastmoney.com/api/qt/stock/kline/get",Rt="https://63.push2his.eastmoney.com/api/qt/stock/kline/get",St=3e4,N=500,F=500,v=7;var B=class{constructor(e={}){this.baseUrl=e.baseUrl??pt,this.timeout=e.timeout??St}getTimeout(){return this.timeout}async get(e,n={}){let s=new AbortController,r=setTimeout(()=>s.abort(),this.timeout);try{let o=await fetch(e,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);switch(n.responseType){case"json":return await o.json();case"arraybuffer":return await o.arrayBuffer();default:return await o.text()}}finally{clearTimeout(r)}}async getTencentQuote(e){let n=`${this.baseUrl}/?q=${encodeURIComponent(e)}`,s=await this.get(n,{responseType:"arraybuffer"}),r=E(s);return D(r)}};var te=new Set(["daily","weekly","monthly"]),ee=new Set(["1","5","15","30","60"]),ne=new Set(["","qfq","hfq"]);function C(t,e){if(!Number.isFinite(t)||!Number.isInteger(t)||t<=0)throw new RangeError(`${e} must be a positive integer`)}function Q(t){if(!te.has(t))throw new RangeError("period must be one of: daily, weekly, monthly")}function wt(t){if(!ee.has(t))throw new RangeError("period must be one of: 1, 5, 15, 30, 60")}function k(t){if(!ne.has(t))throw new RangeError("adjust must be one of: '', 'qfq', 'hfq'")}function j(t,e){C(e,"chunkSize");let n=[];for(let s=0;s<t.length;s+=e)n.push(t.slice(s,s+e));return n}async function _(t,e){C(e,"concurrency");let n=[],s=[];for(let r of t){let o=Promise.resolve().then(()=>r()).then(i=>{n.push(i)});if(s.push(o),s.length>=e){await Promise.race(s);for(let i=s.length-1;i>=0;i--)await Promise.race([s[i].then(()=>"fulfilled"),Promise.resolve("pending")])==="fulfilled"&&s.splice(i,1)}}return await Promise.all(s),n}function ot(t){return t.startsWith("sh")?"1":t.startsWith("sz")||t.startsWith("bj")?"0":t.startsWith("6")?"1":"0"}var S={};mt(S,{getAShareCodeList:()=>_t,getAllHKQuotesByCodes:()=>Nt,getAllQuotesByCodes:()=>Dt,getAllUSQuotesByCodes:()=>Ft,getFullQuotes:()=>st,getFundFlow:()=>Pt,getFundQuotes:()=>Qt,getHKCodeList:()=>Et,getHKQuotes:()=>it,getPanelLargeOrder:()=>Ot,getSimpleQuotes:()=>Ut,getTodayTimeline:()=>jt,getUSCodeList:()=>qt,getUSQuotes:()=>lt,parseFullQuote:()=>Tt,parseFundFlow:()=>Ct,parseFundQuote:()=>Lt,parseHKQuote:()=>Mt,parsePanelLargeOrder:()=>Kt,parseSimpleQuote:()=>At,parseUSQuote:()=>xt});function Tt(t){let e=[];for(let s=0;s<5;s++)e.push({price:m(t[9+s*2]),volume:m(t[10+s*2])});let n=[];for(let s=0;s<5;s++)n.push({price:m(t[19+s*2]),volume:m(t[20+s*2])});return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),outerVolume:m(t[7]),innerVolume:m(t[8]),bid:e,ask:n,time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),volume2:m(t[36]),amount:m(t[37]),turnoverRate:y(t[38]),pe:y(t[39]),amplitude:y(t[43]),circulatingMarketCap:y(t[44]),totalMarketCap:y(t[45]),pb:y(t[46]),limitUp:y(t[47]),limitDown:y(t[48]),volumeRatio:y(t[49]),avgPrice:y(t[51]),peStatic:y(t[52]),peDynamic:y(t[53]),high52w:y(t[67]),low52w:y(t[68]),circulatingShares:y(t[72]),totalShares:y(t[73]),raw:t}}function At(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),change:m(t[4]),changePercent:m(t[5]),volume:m(t[6]),amount:m(t[7]),marketCap:y(t[9]),marketType:t[10]??"",raw:t}}function Ct(t){return{code:t[0]??"",mainInflow:m(t[1]),mainOutflow:m(t[2]),mainNet:m(t[3]),mainNetRatio:m(t[4]),retailInflow:m(t[5]),retailOutflow:m(t[6]),retailNet:m(t[7]),retailNetRatio:m(t[8]),totalFlow:m(t[9]),name:t[12]??"",date:t[13]??"",raw:t}}function Kt(t){return{buyLargeRatio:m(t[0]),buySmallRatio:m(t[1]),sellLargeRatio:m(t[2]),sellSmallRatio:m(t[3]),raw:t}}function Mt(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),amount:m(t[37]),lotSize:y(t[40]),circulatingMarketCap:y(t[44]),totalMarketCap:y(t[45]),currency:t[t.length-3]??"",raw:t}}function xt(t){return{marketId:t[0]??"",name:t[1]??"",code:t[2]??"",price:m(t[3]),prevClose:m(t[4]),open:m(t[5]),volume:m(t[6]),time:t[30]??"",change:m(t[31]),changePercent:m(t[32]),high:m(t[33]),low:m(t[34]),amount:m(t[37]),turnoverRate:y(t[38]),pe:y(t[39]),amplitude:y(t[43]),totalMarketCap:y(t[45]),pb:y(t[47]),high52w:y(t[48]),low52w:y(t[49]),raw:t}}function Lt(t){return{code:t[0]??"",name:t[1]??"",nav:m(t[5]),accNav:m(t[6]),change:m(t[7]),navDate:t[8]??"",raw:t}}async function st(t,e){return!e||e.length===0?[]:(await t.getTencentQuote(e.join(","))).filter(s=>s.fields&&s.fields.length>0&&s.fields[0]!=="").map(s=>Tt(s.fields))}async function Ut(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`s_${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>At(r.fields))}async function Pt(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`ff_${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Ct(r.fields))}async function Ot(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`s_pk${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Kt(r.fields))}async function it(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`hk${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Mt(r.fields))}async function lt(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`us${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>xt(r.fields))}async function Qt(t,e){if(!e||e.length===0)return[];let n=e.map(r=>`jj${r}`);return(await t.getTencentQuote(n.join(","))).filter(r=>r.fields&&r.fields.length>0&&r.fields[0]!=="").map(r=>Lt(r.fields))}async function jt(t,e){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(`${ft}?code=${e}`,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let i=await o.json();if(i.code!==0)throw new Error(i.msg||"API error");let l=i.data?.[e];if(!l)return{code:e,date:"",data:[]};let a=l.data?.data||[],u=l.data?.date||"",c=!1;if(a.length>0){let f=a[0].split(" "),h=parseFloat(f[1])||0,g=parseInt(f[2],10)||0,b=parseFloat(f[3])||0;g>0&&h>0&&b/g>h*50&&(c=!0)}let d=a.map(f=>{let h=f.split(" "),g=h[0],b=`${g.slice(0,2)}:${g.slice(2,4)}`,R=parseInt(h[2],10)||0,w=parseFloat(h[3])||0,T=c?R*100:R,A=T>0?w/T:0;return{time:b,price:parseFloat(h[1])||0,volume:T,amount:w,avgPrice:Math.round(A*100)/100}});return{code:e,date:u,data:d}}finally{clearTimeout(r)}}async function _t(t,e=!0){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(dt,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let l=(await o.json()).list||[];return e?l:l.map(a=>a.replace(/^(sh|sz|bj)/,""))}finally{clearTimeout(r)}}async function qt(t,e=!0){let n=t.getTimeout(),s=new AbortController,r=setTimeout(()=>s.abort(),n);try{let o=await fetch(ht,{signal:s.signal});if(!o.ok)throw new Error(`HTTP error! status: ${o.status}`);let l=(await o.json()).list||[];return e?l:l.map(a=>a.replace(/^\d{3}\./,""))}finally{clearTimeout(r)}}async function Et(t){let e=t.getTimeout(),n=new AbortController,s=setTimeout(()=>n.abort(),e);try{let r=await fetch(gt,{signal:n.signal});if(!r.ok)throw new Error(`HTTP error! status: ${r.status}`);return(await r.json()).list||[]}finally{clearTimeout(s)}}async function Dt(t,e,n={}){let{batchSize:s=N,concurrency:r=v,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,F),l=j(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await st(t,f);return u++,o&&o(u,a),h});return(await _(c,r)).flat()}async function Nt(t,e,n={}){let{batchSize:s=N,concurrency:r=v,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,F),l=j(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await it(t,f);return u++,o&&o(u,a),h});return(await _(c,r)).flat()}async function Ft(t,e,n={}){let{batchSize:s=N,concurrency:r=v,onProgress:o}=n;C(s,"batchSize"),C(r,"concurrency");let i=Math.min(s,F),l=j(e,i),a=l.length,u=0,c=l.map(f=>async()=>{let h=await lt(t,f);return u++,o&&o(u,a),h});return(await _(c,r)).flat()}var q={};mt(q,{getHKHistoryKline:()=>$t,getHistoryKline:()=>vt,getMinuteKline:()=>Bt,getUSHistoryKline:()=>Wt});async function vt(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;Q(s),k(r);let l=e.replace(/^(sh|sz|bj)/,""),a={daily:"101",weekly:"102",monthly:"103"},u={"":"0",qfq:"1",hfq:"2"},c=`${ot(e)}.${l}`,d=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61,f116",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:a[s],fqt:u[r],secid:c,beg:o,end:i}),f=`${rt}?${d.toString()}`,g=(await t.get(f,{responseType:"json"}))?.data?.klines;return!Array.isArray(g)||g.length===0?[]:g.map(b=>{let[R,w,T,A,K,M,x,L,U,P,O]=b.split(",");return{date:R,code:l,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),amplitude:p(L),changePercent:p(U),change:p(P),turnoverRate:p(O)}})}async function Bt(t,e,n={}){let{period:s="1",adjust:r="hfq",startDate:o="1979-09-01 09:32:00",endDate:i="2222-01-01 09:32:00"}=n;wt(s),k(r);let l=e.replace(/^(sh|sz|bj)/,""),a=`${ot(e)}.${l}`;if(s==="1"){let u=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13",fields2:"f51,f52,f53,f54,f55,f56,f57,f58",ut:"7eea3edcaed734bea9cbfc24409ed989",ndays:"5",iscr:"0",secid:a}),c=`${yt}?${u.toString()}`,f=(await t.get(c,{responseType:"json"}))?.data?.trends;if(!Array.isArray(f)||f.length===0)return[];let h=o.replace("T"," ").slice(0,16),g=i.replace("T"," ").slice(0,16);return f.map(b=>{let[R,w,T,A,K,M,x,L]=b.split(",");return{time:R,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),avgPrice:p(L)}}).filter(b=>b.time>=h&&b.time<=g)}else{let u={"":"0",qfq:"1",hfq:"2"},c=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:s,fqt:u[r],secid:a,beg:"0",end:"20500000"}),d=`${rt}?${c.toString()}`,h=(await t.get(d,{responseType:"json"}))?.data?.klines;if(!Array.isArray(h)||h.length===0)return[];let g=o.replace("T"," ").slice(0,16),b=i.replace("T"," ").slice(0,16);return h.map(R=>{let[w,T,A,K,M,x,L,U,P,O,ut]=R.split(",");return{time:w,open:p(T),close:p(A),high:p(K),low:p(M),changePercent:p(P),change:p(O),volume:p(x),amount:p(L),amplitude:p(U),turnoverRate:p(ut)}}).filter(R=>R.time>=g&&R.time<=b)}}async function $t(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;Q(s),k(r);let l=e.replace(/^hk/i,"").padStart(5,"0"),a={daily:"101",weekly:"102",monthly:"103"},u={"":"0",qfq:"1",hfq:"2"},c=`116.${l}`,d=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:a[s],fqt:u[r],secid:c,beg:o,end:i,lmt:"1000000"}),f=`${bt}?${d.toString()}`,h=await t.get(f,{responseType:"json"}),g=h?.data?.klines,b=h?.data?.name||"";return!Array.isArray(g)||g.length===0?[]:g.map(R=>{let[w,T,A,K,M,x,L,U,P,O,ut]=R.split(",");return{date:w,code:l,name:b,open:p(T),close:p(A),high:p(K),low:p(M),volume:p(x),amount:p(L),amplitude:p(U),changePercent:p(P),change:p(O),turnoverRate:p(ut)}})}async function Wt(t,e,n={}){let{period:s="daily",adjust:r="hfq",startDate:o="19700101",endDate:i="20500101"}=n;Q(s),k(r);let l={daily:"101",weekly:"102",monthly:"103"},a={"":"0",qfq:"1",hfq:"2"},u=new URLSearchParams({fields1:"f1,f2,f3,f4,f5,f6",fields2:"f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61",ut:"7eea3edcaed734bea9cbfc24409ed989",klt:l[s],fqt:a[r],secid:e,beg:o,end:i,lmt:"1000000"}),c=`${Rt}?${u.toString()}`,d=await t.get(c,{responseType:"json"}),f=d?.data?.klines,h=d?.data?.code||e.split(".")[1]||e,g=d?.data?.name||"";return!Array.isArray(f)||f.length===0?[]:f.map(b=>{let[R,w,T,A,K,M,x,L,U,P,O]=b.split(",");return{date:R,code:h,name:g,open:p(w),close:p(T),high:p(A),low:p(K),volume:p(M),amount:p(x),amplitude:p(L),changePercent:p(U),change:p(P),turnoverRate:p(O)}})}function $(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function H(t,e){let n=[];for(let s=0;s<t.length;s++){if(s<e-1){n.push(null);continue}let r=0,o=0;for(let i=s-e+1;i<=s;i++)t[i]!==null&&(r+=t[i],o++);n.push(o===e?$(r/e):null)}return n}function I(t,e){let n=[],s=2/(e+1),r=null,o=!1;for(let i=0;i<t.length;i++){if(i<e-1){n.push(null);continue}if(!o){let a=0,u=0;for(let c=i-e+1;c<=i;c++)t[c]!==null&&(a+=t[c],u++);u===e&&(r=a/e,o=!0),n.push(r!==null?$(r):null);continue}let l=t[i];l===null?n.push(r!==null?$(r):null):(r=s*l+(1-s)*r,n.push($(r)))}return n}function at(t,e){let n=[],s=Array.from({length:e},(o,i)=>i+1),r=s.reduce((o,i)=>o+i,0);for(let o=0;o<t.length;o++){if(o<e-1){n.push(null);continue}let i=0,l=!0;for(let a=0;a<e;a++){let u=t[o-e+1+a];if(u===null){l=!1;break}i+=u*s[a]}n.push(l?$(i/r):null)}return n}function W(t,e={}){let{periods:n=[5,10,20,30,60,120,250],type:s="sma"}=e,r=s==="ema"?I:s==="wma"?at:H,o={};for(let i of n)o[`ma${i}`]=r(t,i);return t.map((i,l)=>{let a={};for(let u of n)a[`ma${u}`]=o[`ma${u}`][l];return a})}function zt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function z(t,e={}){let{short:n=12,long:s=26,signal:r=9}=e,o=I(t,n),i=I(t,s),l=t.map((u,c)=>o[c]===null||i[c]===null?null:o[c]-i[c]),a=I(l,r);return t.map((u,c)=>({dif:l[c]!==null?zt(l[c]):null,dea:a[c],macd:l[c]!==null&&a[c]!==null?zt((l[c]-a[c])*2):null}))}function kt(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function re(t,e,n){let s=[];for(let r=0;r<t.length;r++){if(r<e-1||n[r]===null){s.push(null);continue}let o=0,i=0;for(let l=r-e+1;l<=r;l++)t[l]!==null&&n[r]!==null&&(o+=Math.pow(t[l]-n[r],2),i++);s.push(i===e?Math.sqrt(o/e):null)}return s}function V(t,e={}){let{period:n=20,stdDev:s=2}=e,r=H(t,n),o=re(t,n,r);return t.map((i,l)=>{if(r[l]===null||o[l]===null)return{mid:null,upper:null,lower:null,bandwidth:null};let a=r[l]+s*o[l],u=r[l]-s*o[l],c=r[l]!==0?kt((a-u)/r[l]*100):null;return{mid:r[l],upper:kt(a),lower:kt(u),bandwidth:c}})}function Ht(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function G(t,e={}){let{period:n=9,kPeriod:s=3,dPeriod:r=3}=e,o=[],i=50,l=50;for(let a=0;a<t.length;a++){if(a<n-1){o.push({k:null,d:null,j:null});continue}let u=-1/0,c=1/0,d=!0;for(let b=a-n+1;b<=a;b++){if(t[b].high===null||t[b].low===null){d=!1;break}u=Math.max(u,t[b].high),c=Math.min(c,t[b].low)}let f=t[a].close;if(!d||f===null||u===c){o.push({k:null,d:null,j:null});continue}let h=(f-c)/(u-c)*100;i=(s-1)/s*i+1/s*h,l=(r-1)/r*l+1/r*i;let g=3*i-2*l;o.push({k:Ht(i),d:Ht(l),j:Ht(g)})}return o}function oe(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function J(t,e={}){let{periods:n=[6,12,24]}=e,s=[null];for(let o=1;o<t.length;o++)t[o]===null||t[o-1]===null?s.push(null):s.push(t[o]-t[o-1]);let r={};for(let o of n){let i=[],l=0,a=0;for(let u=0;u<t.length;u++){if(u<o){i.push(null),s[u]!==null&&(s[u]>0?l+=s[u]:a+=Math.abs(s[u]));continue}if(u===o)l=l/o,a=a/o;else{let c=s[u]??0,d=c>0?c:0,f=c<0?Math.abs(c):0;l=(l*(o-1)+d)/o,a=(a*(o-1)+f)/o}if(a===0)i.push(100);else if(l===0)i.push(0);else{let c=l/a;i.push(oe(100-100/(1+c)))}}r[`rsi${o}`]=i}return t.map((o,i)=>{let l={};for(let a of n)l[`rsi${a}`]=r[`rsi${a}`][i];return l})}function se(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function Z(t,e={}){let{periods:n=[6,10]}=e,s={};for(let r of n){let o=[];for(let i=0;i<t.length;i++){if(i<r-1){o.push(null);continue}let l=-1/0,a=1/0,u=!0;for(let f=i-r+1;f<=i;f++){if(t[f].high===null||t[f].low===null){u=!1;break}l=Math.max(l,t[f].high),a=Math.min(a,t[f].low)}let c=t[i].close;if(!u||c===null||l===a){o.push(null);continue}let d=(l-c)/(l-a)*100;o.push(se(d))}s[`wr${r}`]=o}return t.map((r,o)=>{let i={};for(let l of n)i[`wr${l}`]=s[`wr${l}`][o];return i})}function ie(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function Y(t,e={}){let{periods:n=[6,12,24]}=e,s={};for(let r of n){let o=H(t,r),i=[];for(let l=0;l<t.length;l++)if(t[l]===null||o[l]===null||o[l]===0)i.push(null);else{let a=(t[l]-o[l])/o[l]*100;i.push(ie(a))}s[`bias${r}`]=i}return t.map((r,o)=>{let i={};for(let l of n)i[`bias${l}`]=s[`bias${l}`][o];return i})}function le(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function X(t,e={}){let{period:n=14}=e,s=[],r=t.map(o=>o.high===null||o.low===null||o.close===null?null:(o.high+o.low+o.close)/3);for(let o=0;o<t.length;o++){if(o<n-1){s.push({cci:null});continue}let i=0,l=0;for(let d=o-n+1;d<=o;d++)r[d]!==null&&(i+=r[d],l++);if(l!==n||r[o]===null){s.push({cci:null});continue}let a=i/n,u=0;for(let d=o-n+1;d<=o;d++)u+=Math.abs(r[d]-a);let c=u/n;if(c===0)s.push({cci:0});else{let d=(r[o]-a)/(.015*c);s.push({cci:le(d)})}}return s}function It(t,e=2){let n=Math.pow(10,e);return Math.round(t*n)/n}function tt(t,e={}){let{period:n=14}=e,s=[],r=[];for(let i=0;i<t.length;i++){let{high:l,low:a,close:u}=t[i];if(l===null||a===null||u===null){r.push(null);continue}if(i===0)r.push(l-a);else{let c=t[i-1].close;if(c===null)r.push(l-a);else{let d=l-a,f=Math.abs(l-c),h=Math.abs(a-c);r.push(Math.max(d,f,h))}}}let o=null;for(let i=0;i<t.length;i++){if(i<n-1){s.push({tr:r[i]!==null?It(r[i]):null,atr:null});continue}if(i===n-1){let l=0,a=0;for(let u=0;u<n;u++)r[u]!==null&&(l+=r[u],a++);a===n&&(o=l/n)}else o!==null&&r[i]!==null&&(o=(o*(n-1)+r[i])/n);s.push({tr:r[i]!==null?It(r[i]):null,atr:o!==null?It(o):null})}return s}function et(t,e={}){if(t.length===0)return[];let n=t.map(h=>h.close),s=t.map(h=>({open:h.open,high:h.high,low:h.low,close:h.close,volume:h.volume})),r=e.ma?W(n,typeof e.ma=="object"?e.ma:{}):null,o=e.macd?z(n,typeof e.macd=="object"?e.macd:{}):null,i=e.boll?V(n,typeof e.boll=="object"?e.boll:{}):null,l=e.kdj?G(s,typeof e.kdj=="object"?e.kdj:{}):null,a=e.rsi?J(n,typeof e.rsi=="object"?e.rsi:{}):null,u=e.wr?Z(s,typeof e.wr=="object"?e.wr:{}):null,c=e.bias?Y(n,typeof e.bias=="object"?e.bias:{}):null,d=e.cci?X(s,typeof e.cci=="object"?e.cci:{}):null,f=e.atr?tt(s,typeof e.atr=="object"?e.atr:{}):null;return t.map((h,g)=>({...h,...r&&{ma:r[g]},...o&&{macd:o[g]},...i&&{boll:i[g]},...l&&{kdj:l[g]},...a&&{rsi:a[g]},...u&&{wr:u[g]},...c&&{bias:c[g]},...d&&{cci:d[g]},...f&&{atr:f[g]}}))}var nt=class{constructor(e={}){this.client=new B(e)}getFullQuotes(e){return S.getFullQuotes(this.client,e)}getSimpleQuotes(e){return S.getSimpleQuotes(this.client,e)}getHKQuotes(e){return S.getHKQuotes(this.client,e)}getUSQuotes(e){return S.getUSQuotes(this.client,e)}getFundQuotes(e){return S.getFundQuotes(this.client,e)}getFundFlow(e){return S.getFundFlow(this.client,e)}getPanelLargeOrder(e){return S.getPanelLargeOrder(this.client,e)}getTodayTimeline(e){return S.getTodayTimeline(this.client,e)}getHistoryKline(e,n){return q.getHistoryKline(this.client,e,n)}getMinuteKline(e,n){return q.getMinuteKline(this.client,e,n)}getHKHistoryKline(e,n){return q.getHKHistoryKline(this.client,e,n)}getUSHistoryKline(e,n){return q.getUSHistoryKline(this.client,e,n)}getAShareCodeList(e=!0){return S.getAShareCodeList(this.client,e)}getUSCodeList(e=!0){return S.getUSCodeList(this.client,e)}getHKCodeList(){return S.getHKCodeList(this.client)}async getAllAShareQuotes(e={}){let n=await this.getAShareCodeList();return this.getAllQuotesByCodes(n,e)}async getAllHKShareQuotes(e={}){let n=await this.getHKCodeList();return S.getAllHKQuotesByCodes(this.client,n,e)}async getAllUSShareQuotes(e={}){let n=await this.getUSCodeList(!1);return S.getAllUSQuotesByCodes(this.client,n,e)}getAllQuotesByCodes(e,n={}){return S.getAllQuotesByCodes(this.client,e,n)}async batchRaw(e){return this.client.getTencentQuote(e)}detectMarket(e){return/^\d{3}\.[A-Z]+$/i.test(e)?"US":/^\d{5}$/.test(e)?"HK":"A"}safeMax(e,n=0){return!e||e.length===0?n:Math.max(...e)}calcRequiredLookback(e){let n=0,s=!1;if(e.ma){let o=typeof e.ma=="object"?e.ma:{},i=o.periods??[5,10,20,30,60,120,250],l=o.type??"sma";n=Math.max(n,this.safeMax(i,20)),l==="ema"&&(s=!0)}if(e.macd){let o=typeof e.macd=="object"?e.macd:{},i=o.long??26,l=o.signal??9;n=Math.max(n,i*3+l),s=!0}if(e.boll){let o=typeof e.boll=="object"&&e.boll.period?e.boll.period:20;n=Math.max(n,o)}if(e.kdj){let o=typeof e.kdj=="object"&&e.kdj.period?e.kdj.period:9;n=Math.max(n,o)}if(e.rsi){let o=typeof e.rsi=="object"&&e.rsi.periods?e.rsi.periods:[6,12,24];n=Math.max(n,this.safeMax(o,14)+1)}if(e.wr){let o=typeof e.wr=="object"&&e.wr.periods?e.wr.periods:[6,10];n=Math.max(n,this.safeMax(o,10))}if(e.bias){let o=typeof e.bias=="object"&&e.bias.periods?e.bias.periods:[6,12,24];n=Math.max(n,this.safeMax(o,12))}if(e.cci){let o=typeof e.cci=="object"&&e.cci.period?e.cci.period:14;n=Math.max(n,o)}if(e.atr){let o=typeof e.atr=="object"&&e.atr.period?e.atr.period:14;n=Math.max(n,o)}return Math.ceil(n*(s?1.5:1.2))}calcActualStartDate(e,n,s=1.5){let r=Math.ceil(n*s),o=new Date(parseInt(e.slice(0,4)),parseInt(e.slice(4,6))-1,parseInt(e.slice(6,8)));o.setDate(o.getDate()-r);let i=o.getFullYear(),l=String(o.getMonth()+1).padStart(2,"0"),a=String(o.getDate()).padStart(2,"0");return`${i}${l}${a}`}dateToTimestamp(e){let n=e.includes("-")?e:`${e.slice(0,4)}-${e.slice(4,6)}-${e.slice(6,8)}`;return new Date(n).getTime()}async getKlineWithIndicators(e,n={}){let{startDate:s,endDate:r,indicators:o={}}=n,i=n.market??this.detectMarket(e),l=this.calcRequiredLookback(o),u={A:1.5,HK:1.46,US:1.45}[i],c=s?this.calcActualStartDate(s,l,u):void 0,d={period:n.period,adjust:n.adjust,startDate:c,endDate:n.endDate},f;switch(i){case"HK":f=await this.getHKHistoryKline(e,d);break;case"US":f=await this.getUSHistoryKline(e,d);break;default:f=await this.getHistoryKline(e,d)}if(s&&f.length<l)switch(i){case"HK":f=await this.getHKHistoryKline(e,{...d,startDate:void 0});break;case"US":f=await this.getUSHistoryKline(e,{...d,startDate:void 0});break;default:f=await this.getHistoryKline(e,{...d,startDate:void 0})}let h=et(f,o);if(s){let g=this.dateToTimestamp(s),b=r?this.dateToTimestamp(r):1/0;return h.filter(R=>{let w=this.dateToTimestamp(R.date);return w>=g&&w<=b})}return h}},Vt=nt;0&&(module.exports={StockSDK,addIndicators,asyncPool,calcATR,calcBIAS,calcBOLL,calcCCI,calcEMA,calcKDJ,calcMA,calcMACD,calcRSI,calcSMA,calcWMA,calcWR,chunkArray,decodeGBK,parseResponse,safeNumber,safeNumberOrNull});
|
|
1
|
+
"use strict";var yt=Object.defineProperty;var Me=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var Ke=Object.prototype.hasOwnProperty;var Ct=(t,e)=>{for(var o in e)yt(t,o,{get:e[o],enumerable:!0})},Ae=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Te(e))!Ke.call(t,n)&&n!==o&&yt(t,n,{get:()=>e[n],enumerable:!(s=Me(e,n))||s.enumerable});return t};var Pe=t=>Ae(yt({},"__esModule",{value:!0}),t);var Ee={};Ct(Ee,{StockSDK:()=>st,addIndicators:()=>ot,asyncPool:()=>N,calcATR:()=>rt,calcBIAS:()=>et,calcBOLL:()=>Z,calcCCI:()=>nt,calcEMA:()=>j,calcKDJ:()=>Y,calcMA:()=>G,calcMACD:()=>J,calcRSI:()=>X,calcSMA:()=>E,calcWMA:()=>gt,calcWR:()=>tt,chunkArray:()=>v,decodeGBK:()=>D,default:()=>we,parseResponse:()=>Q,safeNumber:()=>g,safeNumberOrNull:()=>C});module.exports=Pe(Ee);function D(t){return new TextDecoder("gbk").decode(t)}function Q(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 C(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 Rt="https://qt.gtimg.cn",St="https://web.ifzq.gtimg.cn/appstock/app/minute/query",bt="https://assets.linkdiary.cn/shares/zh_a_list.json",wt="https://assets.linkdiary.cn/shares/us_list.json",Mt="https://assets.linkdiary.cn/shares/hk_list.json";var it="https://push2his.eastmoney.com/api/qt/stock/kline/get",Tt="https://push2his.eastmoney.com/api/qt/stock/trends2/get",Kt="https://33.push2his.eastmoney.com/api/qt/stock/kline/get",At="https://63.push2his.eastmoney.com/api/qt/stock/kline/get",Pt="https://17.push2.eastmoney.com/api/qt/clist/get",kt="https://91.push2.eastmoney.com/api/qt/stock/get",Lt="https://29.push2.eastmoney.com/api/qt/clist/get",at="https://7.push2his.eastmoney.com/api/qt/stock/kline/get",_t="https://push2his.eastmoney.com/api/qt/stock/trends2/get",It="https://79.push2.eastmoney.com/api/qt/clist/get",xt="https://91.push2.eastmoney.com/api/qt/stock/get",Ot="https://29.push2.eastmoney.com/api/qt/clist/get",lt="https://91.push2his.eastmoney.com/api/qt/stock/kline/get",Ut="https://push2his.eastmoney.com/api/qt/stock/trends2/get",Bt=3e4,$=500,F=500,W=7;var z=class{constructor(e={}){this.baseUrl=e.baseUrl??Rt,this.timeout=e.timeout??Bt}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=D(s);return Q(n)}};var ke=new Set(["daily","weekly","monthly"]),Le=new Set(["1","5","15","30","60"]),_e=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(!ke.has(t))throw new RangeError("period must be one of: daily, weekly, monthly")}function H(t){if(!Le.has(t))throw new RangeError("period must be one of: 1, 5, 15, 30, 60")}function I(t){if(!_e.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 ut(t){return t.startsWith("sh")?"1":t.startsWith("sz")||t.startsWith("bj")?"0":t.startsWith("6")?"1":"0"}var A={};Ct(A,{getAShareCodeList:()=>ee,getAllHKQuotesByCodes:()=>se,getAllQuotesByCodes:()=>oe,getAllUSQuotesByCodes:()=>ie,getFullQuotes:()=>ct,getFundFlow:()=>Zt,getFundQuotes:()=>Xt,getHKCodeList:()=>re,getHKQuotes:()=>ft,getPanelLargeOrder:()=>Yt,getSimpleQuotes:()=>Jt,getTodayTimeline:()=>te,getUSCodeList:()=>ne,getUSQuotes:()=>pt,parseFullQuote:()=>Et,parseFundFlow:()=>qt,parseFundQuote:()=>Dt,parseHKQuote:()=>vt,parsePanelLargeOrder:()=>Ht,parseSimpleQuote:()=>jt,parseUSQuote:()=>Nt});function Et(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:C(t[38]),pe:C(t[39]),amplitude:C(t[43]),circulatingMarketCap:C(t[44]),totalMarketCap:C(t[45]),pb:C(t[46]),limitUp:C(t[47]),limitDown:C(t[48]),volumeRatio:C(t[49]),avgPrice:C(t[51]),peStatic:C(t[52]),peDynamic:C(t[53]),high52w:C(t[67]),low52w:C(t[68]),circulatingShares:C(t[72]),totalShares:C(t[73]),raw:t}}function jt(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:C(t[9]),marketType:t[10]??"",raw:t}}function qt(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 Ht(t){return{buyLargeRatio:g(t[0]),buySmallRatio:g(t[1]),sellLargeRatio:g(t[2]),sellSmallRatio:g(t[3]),raw:t}}function vt(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:C(t[40]),circulatingMarketCap:C(t[44]),totalMarketCap:C(t[45]),currency:t[t.length-3]??"",raw:t}}function Nt(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:C(t[38]),pe:C(t[39]),amplitude:C(t[43]),totalMarketCap:C(t[45]),pb:C(t[47]),high52w:C(t[48]),low52w:C(t[49]),raw:t}}function Dt(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 ct(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=>Et(s.fields))}async function Jt(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=>jt(n.fields))}async function Zt(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=>qt(n.fields))}async function Yt(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=>Ht(n.fields))}async function ft(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=>vt(n.fields))}async function pt(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=>Nt(n.fields))}async function Xt(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=>Dt(n.fields))}async function te(t,e){let o=t.getTimeout(),s=new AbortController,n=setTimeout(()=>s.abort(),o);try{let r=await fetch(`${St}?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)}`,R=parseInt(m[2],10)||0,S=parseFloat(m[3])||0,b=f?R*100:R,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 ee(t,e=!0){let o=t.getTimeout(),s=new AbortController,n=setTimeout(()=>s.abort(),o);try{let r=await fetch(bt,{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 ne(t,e=!0){let o=t.getTimeout(),s=new AbortController,n=setTimeout(()=>s.abort(),o);try{let r=await fetch(wt,{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 re(t){let e=t.getTimeout(),o=new AbortController,s=setTimeout(()=>o.abort(),e);try{let n=await fetch(Mt,{signal:o.signal});if(!n.ok)throw new Error(`HTTP error! status: ${n.status}`);return(await n.json()).list||[]}finally{clearTimeout(s)}}async function oe(t,e,o={}){let{batchSize:s=$,concurrency:n=W,onProgress:r}=o;B(s,"batchSize"),B(n,"concurrency");let i=Math.min(s,F),a=v(e,i),l=a.length,c=0,f=a.map(p=>async()=>{let m=await ct(t,p);return c++,r&&r(c,l),m});return(await N(f,n)).flat()}async function se(t,e,o={}){let{batchSize:s=$,concurrency:n=W,onProgress:r}=o;B(s,"batchSize"),B(n,"concurrency");let i=Math.min(s,F),a=v(e,i),l=a.length,c=0,f=a.map(p=>async()=>{let m=await ft(t,p);return c++,r&&r(c,l),m});return(await N(f,n)).flat()}async function ie(t,e,o={}){let{batchSize:s=$,concurrency:n=W,onProgress:r}=o;B(s,"batchSize"),B(n,"concurrency");let i=Math.min(s,F),a=v(e,i),l=a.length,c=0,f=a.map(p=>async()=>{let m=await pt(t,p);return c++,r&&r(c,l),m});return(await N(f,n)).flat()}var P={};Ct(P,{getConceptConstituents:()=>Ce,getConceptKline:()=>Re,getConceptList:()=>Wt,getConceptMinuteKline:()=>Se,getConceptSpot:()=>ye,getHKHistoryKline:()=>ue,getHistoryKline:()=>ae,getIndustryConstituents:()=>de,getIndustryKline:()=>me,getIndustryList:()=>$t,getIndustryMinuteKline:()=>ge,getIndustrySpot:()=>pe,getMinuteKline:()=>le,getUSHistoryKline:()=>ce});async function ae(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=`${ut(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=`${it}?${d.toString()}`,h=(await t.get(p,{responseType:"json"}))?.data?.klines;return!Array.isArray(h)||h.length===0?[]:h.map(y=>{let[R,S,b,T,K,k,L,_,x,O,q]=y.split(",");return{date:R,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(q)}})}async function le(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;H(s),I(n);let a=e.replace(/^(sh|sz|bj)/,""),l=`${ut(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=`${Tt}?${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[R,S,b,T,K,k,L,_]=y.split(",");return{time:R,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=`${it}?${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(R=>{let[S,b,T,K,k,L,_,x,O,q,ht]=R.split(",");return{time:S,open:u(b),close:u(T),high:u(K),low:u(k),changePercent:u(O),change:u(q),volume:u(L),amount:u(_),amplitude:u(x),turnoverRate:u(ht)}}).filter(R=>R.time>=h&&R.time<=y)}}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=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=`${Kt}?${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(R=>{let[S,b,T,K,k,L,_,x,O,q,ht]=R.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(q),turnoverRate:u(ht)}})}async function ce(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=`${At}?${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[R,S,b,T,K,k,L,_,x,O,q]=y.split(",");return{date:R,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(q)}})}var Qt=null;async function dt(t,e){if(e.startsWith("BK"))return e;if(!Qt){let s=await $t(t);Qt=new Map(s.map(n=>[n.name,n.code]))}let o=Qt.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 fe(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 $t(t){let s=await fe(t,Pt,{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 pe(t,e){let o=await dt(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 de(t,e){let s={po:"1",np:"1",ut:"bd1d9ddb04089700cf9c27f6f7426281",fltt:"2",invt:"2",fid:"f3",fs:`b:${await dt(t,e)} f:!50`};return fe(t,Lt,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 me(t,e,o={}){let{period:s="daily",adjust:n="",startDate:r="19700101",endDate:i="20500101"}=o;U(s),I(n);let a=await dt(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=`${at}?${f.toString()}`,m=(await t.get(d,{responseType:"json"}))?.data?.klines;return!Array.isArray(m)||m.length===0?[]:m.map(h=>{let[y,R,S,b,T,K,k,L,_,x,O]=h.split(",");return{date:y,open:u(R),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 ge(t,e,o={}){let{period:s="5"}=o;H(s);let n=await dt(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=`${_t}?${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,R,S]=c.split(",");return{time:f,open:u(d),close:u(p),high:u(m),low:u(h),volume:u(y),amount:u(R),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=`${at}?${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,R,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(R),amplitude:u(S),turnoverRate:u(K)}})}}var Ft=null;function M(t){if(t==null)return null;let e=String(t);return u(e)}async function mt(t,e){if(e.startsWith("BK"))return e;if(!Ft){let s=await Wt(t);Ft=new Map(s.map(n=>[n.name,n.code]))}let o=Ft.get(e);if(!o)throw new Error(`\u672A\u627E\u5230\u6982\u5FF5\u677F\u5757: ${e}`);return o}async function he(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 Wt(t){let s=await he(t,It,{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 ye(t,e){let o=await mt(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=`${xt}?${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 Ce(t,e){let s={po:"1",np:"1",ut:"bd1d9ddb04089700cf9c27f6f7426281",fltt:"2",invt:"2",fid:"f12",fs:`b:${await mt(t,e)} f:!50`};return he(t,Ot,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 Re(t,e,o={}){let{period:s="daily",adjust:n="",startDate:r="19700101",endDate:i="20500101"}=o;U(s),I(n);let a=await mt(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=`${lt}?${f.toString()}`,m=(await t.get(d,{responseType:"json"}))?.data?.klines;return!Array.isArray(m)||m.length===0?[]:m.map(h=>{let[y,R,S,b,T,K,k,L,_,x,O]=h.split(",");return{date:y,open:u(R),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 Se(t,e,o={}){let{period:s="5"}=o;H(s);let n=await mt(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=`${Ut}?${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,R,S]=c.split(",");return{time:f,open:u(d),close:u(p),high:u(m),low:u(h),volume:u(y),amount:u(R),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=`${lt}?${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,R,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(R),amplitude:u(S),turnoverRate:u(K)}})}}function V(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function E(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?V(n/e):null)}return o}function j(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?V(n):null);continue}let a=t[i];a===null?o.push(n!==null?V(n):null):(n=s*a+(1-s)*n,o.push(V(n)))}return o}function gt(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?V(i/n):null)}return o}function G(t,e={}){let{periods:o=[5,10,20,30,60,120,250],type:s="sma"}=e,n=s==="ema"?j:s==="wma"?gt:E,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 be(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function J(t,e={}){let{short:o=12,long:s=26,signal:n=9}=e,r=j(t,o),i=j(t,s),a=t.map((c,f)=>r[f]===null||i[f]===null?null:r[f]-i[f]),l=j(a,n);return t.map((c,f)=>({dif:a[f]!==null?be(a[f]):null,dea:l[f],macd:a[f]!==null&&l[f]!==null?be((a[f]-l[f])*2):null}))}function zt(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function Ie(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 Z(t,e={}){let{period:o=20,stdDev:s=2}=e,n=E(t,o),r=Ie(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?zt((l-c)/n[a]*100):null;return{mid:n[a],upper:zt(l),lower:zt(c),bandwidth:f}})}function Vt(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function Y(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:Vt(i),d:Vt(a),j:Vt(h)})}return r}function xe(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function X(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(xe(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 Oe(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function tt(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(Oe(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 Ue(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function et(t,e={}){let{periods:o=[6,12,24]}=e,s={};for(let n of o){let r=E(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(Ue(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 Be(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function nt(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:Be(d)})}}return s}function Gt(t,e=2){let o=Math.pow(10,e);return Math.round(t*o)/o}function rt(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?Gt(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?Gt(n[i]):null,atr:r!==null?Gt(r):null})}return s}function ot(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?G(o,typeof e.ma=="object"?e.ma:{}):null,r=e.macd?J(o,typeof e.macd=="object"?e.macd:{}):null,i=e.boll?Z(o,typeof e.boll=="object"?e.boll:{}):null,a=e.kdj?Y(s,typeof e.kdj=="object"?e.kdj:{}):null,l=e.rsi?X(o,typeof e.rsi=="object"?e.rsi:{}):null,c=e.wr?tt(s,typeof e.wr=="object"?e.wr:{}):null,f=e.bias?et(o,typeof e.bias=="object"?e.bias:{}):null,d=e.cci?nt(s,typeof e.cci=="object"?e.cci:{}):null,p=e.atr?rt(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 st=class{constructor(e={}){this.client=new z(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=ot(p,r);if(s){let h=this.dateToTimestamp(s),y=n?this.dateToTimestamp(n):1/0;return m.filter(R=>{let S=this.dateToTimestamp(R.date);return S>=h&&S<=y})}return m}},we=st;0&&(module.exports={StockSDK,addIndicators,asyncPool,calcATR,calcBIAS,calcBOLL,calcCCI,calcEMA,calcKDJ,calcMA,calcMACD,calcRSI,calcSMA,calcWMA,calcWR,chunkArray,decodeGBK,parseResponse,safeNumber,safeNumberOrNull});
|
package/dist/index.d.cts
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.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
|
+
"version": "1.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -24,11 +24,10 @@
|
|
|
24
24
|
"scripts": {
|
|
25
25
|
"build": "tsup",
|
|
26
26
|
"test": "vitest run",
|
|
27
|
-
"dev": "
|
|
28
|
-
"
|
|
29
|
-
"build:docs": "vitepress build website",
|
|
30
|
-
"build:
|
|
31
|
-
"preview:docs": "vitepress preview website"
|
|
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"
|
|
32
31
|
},
|
|
33
32
|
"keywords": [
|
|
34
33
|
"stock",
|
|
@@ -44,7 +43,7 @@
|
|
|
44
43
|
"author": "chengzuopeng",
|
|
45
44
|
"license": "ISC",
|
|
46
45
|
"description": "Tencent qt.gtimg.cn stock quote SDK - supports both browser and Node.js",
|
|
47
|
-
"homepage": "https://
|
|
46
|
+
"homepage": "https://stock-sdk.linkdiary.cn",
|
|
48
47
|
"repository": {
|
|
49
48
|
"type": "git",
|
|
50
49
|
"url": "git+https://github.com/chengzuopeng/stock-sdk.git"
|