stock-sdk 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.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 };