kline-charts-react 0.0.2 → 0.0.4

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.
@@ -0,0 +1 @@
1
+ "use strict";var qe=Object.defineProperty;var Ue=(e,t,n)=>t in e?qe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var le=(e,t,n)=>Ue(e,typeof t!="symbol"?t+"":t,n);const j=require("react"),Ye=require("stock-sdk"),We=require("echarts/core"),X=require("echarts/charts"),O=require("echarts/components"),Je=require("echarts/renderers"),x=require("react/jsx-runtime");function Ze(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const ye=Ze(We);function z(e,t){const n=[];let i=0,u=0;for(let r=0;r<e.length;r++){const c=e[r];if(c!=null&&(i+=c,u++),r>=t){const o=e[r-t];o!=null&&(i-=o,u--)}r>=t-1&&u===t?n.push(i/t):n.push(null)}return n}function T(e,t){const n=[],i=2/(t+1);let u=null;for(let r=0;r<e.length;r++){const c=e[r];if(c==null){n.push(u);continue}u===null?u=c:u=c*i+u*(1-i),n.push(u)}return n}function we(e,t){const n=[],i=Array.from({length:t},(r,c)=>c+1),u=i.reduce((r,c)=>r+c,0);for(let r=0;r<e.length;r++){if(r<t-1){n.push(null);continue}let c=0,o=0;for(let l=0;l<t;l++){const s=e[r-t+1+l],a=i[l];s!=null&&a!==void 0&&(c+=s*a,o++)}o===t?n.push(c/u):n.push(null)}return n}function Ie(e,t={}){const{periods:n=[5,10,20,30,60],type:i="sma"}=t,u={};for(const c of n){const o=`ma${c}`;switch(i){case"ema":u[o]=T(e,c);break;case"wma":u[o]=we(e,c);break;default:u[o]=z(e,c)}}const r=[];for(let c=0;c<e.length;c++){const o={};for(const l of Object.keys(u)){const s=u[l];o[l]=s!==void 0?s[c]??null:null}r.push(o)}return r}function Ce(e,t={}){const{short:n=12,long:i=26,signal:u=9}=t,r=T(e,n),c=T(e,i),o=[];for(let a=0;a<e.length;a++){const d=r[a],f=c[a];d!=null&&f!==null&&f!==void 0?o.push(d-f):o.push(null)}const l=T(o,u),s=[];for(let a=0;a<e.length;a++){const d=o[a]??null,f=l[a]??null;s.push({dif:d,dea:f,macd:d!==null&&f!==null?(d-f)*2:null})}return s}function Ae(e,t={}){const{period:n=20,stdDev:i=2}=t,u=z(e,n),r=[];for(let c=0;c<e.length;c++){const o=u[c];if(o==null||c<n-1){r.push({mid:null,upper:null,lower:null,bandwidth:null});continue}let l=0,s=0;for(let a=c-n+1;a<=c;a++){const d=e[a];d!=null&&(l+=Math.pow(d-o,2),s++)}if(s===n){const a=Math.sqrt(l/n),d=o+i*a,f=o-i*a;r.push({mid:o,upper:d,lower:f,bandwidth:o!==0?(d-f)/o*100:null})}else r.push({mid:o,upper:null,lower:null,bandwidth:null})}return r}function Se(e,t={}){const{period:n=9,kPeriod:i=3,dPeriod:u=3}=t,r=[];let c=50,o=50;for(let l=0;l<e.length;l++){if(l<n-1){r.push({k:null,d:null,j:null});continue}let s=-1/0,a=1/0;for(let I=l-n+1;I<=l;I++){const v=e[I];v!==void 0&&v.high!==null&&v.high!==void 0&&(s=Math.max(s,v.high)),v!==void 0&&v.low!==null&&v.low!==void 0&&(a=Math.min(a,v.low))}const d=e[l],f=d!==void 0?d.close:null;if(f==null||s===-1/0||a===1/0){r.push({k:null,d:null,j:null});continue}const g=s===a?50:(f-a)/(s-a)*100,w=(c*(i-1)+g)/i,y=(o*(u-1)+w)/u,h=3*w-2*y;r.push({k:w,d:y,j:h}),c=w,o=y}return r}function je(e,t={}){const{periods:n=[6,12,24]}=t,i={};for(const r of n){const c=`rsi${r}`,o=[];let l=0,s=0;for(let a=0;a<e.length;a++){const d=e[a],f=e[a-1];if(a===0||d===null||d===void 0||f===null||f===void 0){o.push(null);continue}const g=d-f,w=g>0?g:0,y=g<0?-g:0;if(a<r)l+=w,s+=y,o.push(null);else if(a===r){l=(l+w)/r,s=(s+y)/r;const h=s===0?100:l/s;o.push(100-100/(1+h))}else{l=(l*(r-1)+w)/r,s=(s*(r-1)+y)/r;const h=s===0?100:l/s;o.push(100-100/(1+h))}}i[c]=o}const u=[];for(let r=0;r<e.length;r++){const c={};for(const o of Object.keys(i)){const l=i[o];c[o]=l!==void 0?l[r]??null:null}u.push(c)}return u}function ke(e,t={}){const{periods:n=[6,10]}=t,i={};for(const r of n){const c=`wr${r}`,o=[];for(let l=0;l<e.length;l++){if(l<r-1){o.push(null);continue}let s=-1/0,a=1/0;for(let g=l-r+1;g<=l;g++){const w=e[g];w!==void 0&&w.high!==null&&w.high!==void 0&&(s=Math.max(s,w.high)),w!==void 0&&w.low!==null&&w.low!==void 0&&(a=Math.min(a,w.low))}const d=e[l],f=d!==void 0?d.close:null;f==null||s===a?o.push(null):o.push((s-f)/(s-a)*-100)}i[c]=o}const u=[];for(let r=0;r<e.length;r++){const c={};for(const o of Object.keys(i)){const l=i[o];c[o]=l!==void 0?l[r]??null:null}u.push(c)}return u}function Me(e,t={}){const{periods:n=[6,12,24]}=t,i={};for(const r of n){const c=`bias${r}`,o=z(e,r),l=[];for(let s=0;s<e.length;s++){const a=e[s],d=o[s];a==null||d===null||d===void 0||d===0?l.push(null):l.push((a-d)/d*100)}i[c]=l}const u=[];for(let r=0;r<e.length;r++){const c={};for(const o of Object.keys(i)){const l=i[o];c[o]=l!==void 0?l[r]??null:null}u.push(c)}return u}function $e(e,t={}){const{period:n=14}=t,i=e.map(c=>c.high===null||c.low===null||c.close===null?null:(c.high+c.low+c.close)/3),u=z(i,n),r=[];for(let c=0;c<e.length;c++){const o=i[c],l=u[c];if(c<n-1||o===null||o===void 0||l===null||l===void 0){r.push({cci:null});continue}let s=0,a=0;for(let f=c-n+1;f<=c;f++){const g=i[f];g!=null&&(s+=Math.abs(g-l),a++)}const d=a>0?s/a:0;d===0?r.push({cci:0}):r.push({cci:(o-l)/(.015*d)})}return r}function me(e,t={}){const{period:n=14}=t,i=[],u=[];for(let r=0;r<e.length;r++){const c=e[r];if(c===void 0||c.high===null||c.low===null||c.close===null){u.push(null),i.push({tr:null,atr:null});continue}let o;if(r===0)o=c.high-c.low;else{const l=e[r-1],s=l!==void 0?l.close:null;s==null?o=c.high-c.low:o=Math.max(c.high-c.low,Math.abs(c.high-s),Math.abs(c.low-s))}if(u.push(o),r<n-1)i.push({tr:o,atr:null});else if(r===n-1){let l=0;for(let s=0;s<n;s++)l+=u[s]??0;i.push({tr:o,atr:l/n})}else{const l=i[r-1],s=l!==void 0?l.atr:null;s==null?i.push({tr:o,atr:null}):i.push({tr:o,atr:(s*(n-1)+o)/n})}}return i}function De(e,t={}){const{maPeriod:n=30}=t,i=[];let u=0;for(let o=0;o<e.length;o++){const l=e[o];if(l===void 0||l.close===null||l.volume===null||l.volume===void 0){i.push({obv:null,obvMa:null});continue}if(o===0)u=l.volume;else{const s=e[o-1],a=s!==void 0?s.close:null;a==null?u=l.volume:l.close>a?u+=l.volume:l.close<a&&(u-=l.volume)}i.push({obv:u,obvMa:null})}const r=i.map(o=>o.obv),c=z(r,n);for(let o=0;o<i.length;o++){const l=i[o];l!==void 0&&(l.obvMa=c[o]??null)}return i}function _e(e,t={}){const{period:n=12,signalPeriod:i=6}=t,u=[];for(let o=0;o<e.length;o++){const l=e[o],s=e[o-n];o<n||l===null||l===void 0||s===null||s===void 0||s===0?u.push(null):u.push((l-s)/s*100)}const r=T(u,i),c=[];for(let o=0;o<e.length;o++)c.push({roc:u[o]??null,signal:r[o]??null});return c}function Ne(e,t={}){const{period:n=14,adxPeriod:i=14}=t,u=[],r=[],c=[],o=[];for(let l=0;l<e.length;l++){const s=e[l];if(s===void 0||s.high===null||s.low===null||s.close===null){u.push({pdi:null,mdi:null,adx:null,adxr:null});continue}let a;if(l===0)a=s.high-s.low;else{const m=e[l-1],C=m!==void 0?m.close:null;C==null?a=s.high-s.low:a=Math.max(s.high-s.low,Math.abs(s.high-C),Math.abs(s.low-C))}if(r.push(a),l===0)c.push(0),o.push(0);else{const m=e[l-1];if(m===void 0||m.high===null||m.low===null)c.push(0),o.push(0);else{const C=s.high-m.high,A=m.low-s.low,S=C>A&&C>0?C:0,_=A>C&&A>0?A:0;c.push(S),o.push(_)}}if(l<n-1){u.push({pdi:null,mdi:null,adx:null,adxr:null});continue}let d=0,f=0,g=0;for(let m=l-n+1;m<=l;m++)d+=r[m]??0,f+=c[m]??0,g+=o[m]??0;const w=d>0?f/d*100:0,y=d>0?g/d*100:0,h=w+y,I=h>0?Math.abs(w-y)/h*100:0;let v=null;if(l>=n-1+i-1){let m=0;for(let C=l-i+1;C<=l;C++){if(u[C]===void 0)continue;let S=0,_=0,J=0;for(let D=C-n+1;D<=C;D++)S+=r[D]??0,_+=c[D]??0,J+=o[D]??0;const Z=S>0?_/S*100:0,G=S>0?J/S*100:0,$=Z+G,ne=$>0?Math.abs(Z-G)/$*100:0;m+=ne}m+=I,v=m/i}let p=null;if(v!==null&&l>=n-1+i-1+i){const m=u[l-i];m!==void 0&&m.adx!==null&&(p=(v+m.adx)/2)}u.push({pdi:w,mdi:y,adx:v,adxr:p})}return u}function Re(e,t={}){var a,d;const{afStart:n=.02,afIncrement:i=.02,afMax:u=.2}=t,r=[];if(e.length===0)return r;let c=1,o=((a=e[0])==null?void 0:a.low)??0,l=((d=e[0])==null?void 0:d.high)??0,s=n;for(let f=0;f<e.length;f++){const g=e[f];if(g===void 0||g.high===null||g.low===null){r.push({sar:null,trend:null,ep:null,af:null});continue}if(f===0){r.push({sar:g.low,trend:1,ep:g.high,af:n}),o=g.low,l=g.high,c=1,s=n;continue}const w=o;if(o=w+s*(l-w),c===1){const y=e[f-1],h=e[f-2];y!==void 0&&y.low!==null&&(o=Math.min(o,y.low)),h!==void 0&&h.low!==null&&(o=Math.min(o,h.low)),g.low<o?(c=-1,o=l,l=g.low,s=n):g.high>l&&(l=g.high,s=Math.min(s+i,u))}else{const y=e[f-1],h=e[f-2];y!==void 0&&y.high!==null&&(o=Math.max(o,y.high)),h!==void 0&&h.high!==null&&(o=Math.max(o,h.high)),g.high>o?(c=1,o=l,l=g.high,s=n):g.low<l&&(l=g.low,s=Math.min(s+i,u))}r.push({sar:o,trend:c,ep:l,af:s})}return r}function Le(e,t={}){var s;const{emaPeriod:n=20,atrPeriod:i=10,multiplier:u=2}=t,r=e.map(a=>a.close),c=T(r,n),o=me(e,{period:i}),l=[];for(let a=0;a<e.length;a++){const d=c[a],f=(s=o[a])==null?void 0:s.atr;if(d==null||f===null||f===void 0){l.push({mid:null,upper:null,lower:null,width:null});continue}const g=d+u*f,w=d-u*f,y=d!==0?(g-w)/d*100:null;l.push({mid:d,upper:g,lower:w,width:y})}return l}const Ge={enabled:!0,ttl:300*1e3,maxSize:100};function Xe(e){switch(e){case"timeline":case"timeline5":return 30*1e3;case"1":case"5":case"15":case"30":case"60":return 120*1e3;case"daily":case"weekly":case"monthly":default:return 600*1e3}}class W{constructor(t={}){le(this,"cache",new Map);le(this,"config");this.config={...Ge,...t}}static buildKey(t){return Object.entries(t).filter(([,n])=>n!==void 0).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>`${n}:${String(i)}`).join("|")}get(t){if(!this.config.enabled)return;const n=this.cache.get(t);if(!n)return;const i=n.ttl??this.config.ttl;if(Date.now()-n.timestamp>i){this.cache.delete(t);return}return n.data}set(t,n,i){if(this.config.enabled){if(this.cache.size>=this.config.maxSize&&(this.cleanup(),this.cache.size>=this.config.maxSize)){const u=this.cache.keys().next().value;u&&this.cache.delete(u)}this.cache.set(t,{data:n,timestamp:Date.now(),ttl:i})}}cleanup(){const t=Date.now();for(const[n,i]of this.cache.entries()){const u=i.ttl??this.config.ttl;t-i.timestamp>u&&this.cache.delete(n)}}delete(t){return this.cache.delete(t)}clear(){this.cache.clear()}size(){return this.cache.size}}new W;const oe=new W,ie=new W,se=new Map,re=new Map,Qe=150;function et(e){const t=new Ye.StockSDK(e);return{getKline:async n=>{const{symbol:i,market:u,period:r,adjust:c}=n;if(r==="timeline"){const s=await t.getTodayTimeline(i);return s.data.map(a=>({date:`${s.date.slice(0,4)}-${s.date.slice(4,6)}-${s.date.slice(6,8)} ${a.time}`,open:a.price,close:a.price,high:a.price,low:a.price,volume:a.volume,amount:a.amount}))}if(r==="timeline5"){const s=new Date,a=new Date;a.setDate(a.getDate()-7);const d=g=>{const w=g.getFullYear(),y=String(g.getMonth()+1).padStart(2,"0"),h=String(g.getDate()).padStart(2,"0");return`${w}-${y}-${h}`};return(await t.getMinuteKline(i,{period:"1",startDate:d(a),endDate:d(s)})).map(g=>({date:"time"in g?g.time:"",open:g.open,close:g.close,high:g.high,low:g.low,volume:g.volume,amount:g.amount}))}if(["1","5","15","30","60"].includes(r)){let a=(await t.getMinuteKline(i,{period:r,adjust:c||"qfq"})).map(d=>({date:"time"in d?d.time:"",open:d.open,close:d.close,high:d.high,low:d.low,volume:d.volume,amount:d.amount,changePercent:"changePercent"in d?d.changePercent:void 0,change:"change"in d?d.change:void 0,amplitude:"amplitude"in d?d.amplitude:void 0,turnoverRate:"turnoverRate"in d?d.turnoverRate:void 0}));if(r==="1"&&a.length>0){const d=a[a.length-1].date.split(" ")[0];a=a.filter(f=>f.date.startsWith(d))}return a}const l={daily:"daily",weekly:"weekly",monthly:"monthly"}[r]??"daily";switch(u){case"HK":return await t.getHKHistoryKline(i,{period:l,adjust:c||"qfq"});case"US":return await t.getUSHistoryKline(i,{period:l,adjust:c||"qfq"});default:return await t.getHistoryKline(i,{period:l,adjust:c||"qfq"})}},getTimeline:async n=>(await t.getTodayTimeline(n.symbol)).data}}function xe(e){return W.buildKey(e)}function ce(e){return W.buildKey({...e,type:"timeline"})}function tt(e,t,n={}){if(e.length===0)return[];const i=e.map(p=>p.close),u=e.map(p=>({open:p.open,high:p.high,low:p.low,close:p.close,volume:p.volume})),r=t.includes("ma")?Ie(i,typeof n.ma=="object"?n.ma:{}):null,c=t.includes("macd")?Ce(i,typeof n.macd=="object"?n.macd:{}):null,o=t.includes("boll")?Ae(i,typeof n.boll=="object"?n.boll:{}):null,l=t.includes("kdj")?Se(u,typeof n.kdj=="object"?n.kdj:{}):null,s=t.includes("rsi")?je(i,typeof n.rsi=="object"?n.rsi:{}):null,a=t.includes("wr")?ke(u,typeof n.wr=="object"?n.wr:{}):null,d=t.includes("bias")?Me(i,typeof n.bias=="object"?n.bias:{}):null,f=t.includes("cci")?$e(u,typeof n.cci=="object"?n.cci:{}):null,g=t.includes("atr")?me(u,typeof n.atr=="object"?n.atr:{}):null,w=t.includes("obv")?De(u,typeof n.obv=="object"?n.obv:{}):null,y=t.includes("roc")?_e(i,typeof n.roc=="object"?n.roc:{}):null,h=t.includes("dmi")?Ne(u,typeof n.dmi=="object"?n.dmi:{}):null,I=t.includes("sar")?Re(u,typeof n.sar=="object"?n.sar:{}):null,v=t.includes("kc")?Le(u,typeof n.kc=="object"?n.kc:{}):null;return e.map((p,m)=>({...p,ma:r==null?void 0:r[m],macd:c==null?void 0:c[m],boll:o==null?void 0:o[m],kdj:l==null?void 0:l[m],rsi:s==null?void 0:s[m],wr:a==null?void 0:a[m],bias:d==null?void 0:d[m],cci:f==null?void 0:f[m],atr:g==null?void 0:g[m],obv:w==null?void 0:w[m],roc:y==null?void 0:y[m],dmi:h==null?void 0:h[m],sar:I==null?void 0:I[m],kc:v==null?void 0:v[m]}))}function nt(e){const{symbol:t,market:n,period:i,adjust:u,dataProvider:r,sdkOptions:c,requestOptions:o,indicatorOptions:l,indicators:s=["ma","volume","macd"]}=e,[a,d]=j.useState([]),[f,g]=j.useState({key:"",data:[]}),[w,y]=j.useState(!1),[h,I]=j.useState(null),v=j.useRef(null),p=j.useRef(null),m=j.useRef(null),C=j.useRef(0);j.useEffect(()=>{r||(m.current=null)},[r,c]);const A=j.useCallback(()=>r||(m.current||(m.current=et(c)),m.current),[r,c]),S=j.useCallback(async()=>{(o==null?void 0:o.abortOnChange)!==!1&&v.current&&v.current.abort();const $=new AbortController,ne=++C.current;v.current=$;const D=(o==null?void 0:o.dedupe)!==!1,fe=()=>ne===C.current&&!$.signal.aborted;y(!0),I(null);try{const P=A(),V=xe({symbol:t,market:n,period:i,adjust:u}),L=ce({symbol:t,market:n}),pe=Xe(i);let B=D?oe.get(V):void 0;if(!B){const N=D?se.get(V):void 0;if(N)try{B=await N}catch{}else{const F=P.getKline({symbol:t,market:n,period:i,adjust:u},$.signal);se.set(V,F);try{B=await F}finally{se.delete(V)}}}if(!fe()||!B)return;if(oe.set(V,B,pe),d(B),i==="timeline"&&P.getTimeline){let N=D?ie.get(L):void 0;if(!N){g({key:L,data:[]});const F=D?re.get(L):void 0;if(F)try{N=await F}catch{}else{const ge=P.getTimeline({symbol:t,market:n},$.signal);re.set(L,ge);try{N=await ge}finally{re.delete(L)}}}fe()&&N&&(ie.set(L,N,pe),g({key:L,data:N}))}}catch(P){if(P.name==="AbortError")return;I(P)}finally{$.signal.aborted||y(!1)}},[t,n,i,u,A,o]),_=j.useCallback(async()=>{const $=xe({symbol:t,market:n,period:i,adjust:u});oe.delete($),i==="timeline"&&(ie.delete(ce({symbol:t,market:n})),g({key:"",data:[]})),await S()},[t,n,i,u,S]);j.useEffect(()=>{p.current&&clearTimeout(p.current);const $=(o==null?void 0:o.debounceMs)??Qe;return p.current=setTimeout(S,$),()=>{p.current&&clearTimeout(p.current),v.current&&v.current.abort()}},[t,n,i,u,S,o==null?void 0:o.debounceMs]);const J=j.useMemo(()=>tt(a,s,l),[a,s,l]),Z=i==="timeline"?ce({symbol:t,market:n}):"",G=f.key===Z?f.data:[];return{data:J,timelineData:G,loading:w,error:h,refresh:_}}ye.use([X.CandlestickChart,X.LineChart,X.BarChart,X.ScatterChart,O.TitleComponent,O.TooltipComponent,O.GridComponent,O.DataZoomComponent,O.LegendComponent,O.AxisPointerComponent,Je.CanvasRenderer]);function lt(){const e=j.useRef(null),t=j.useRef(null);j.useEffect(()=>{if(!e.current)return;t.current=ye.init(e.current);const l=new ResizeObserver(()=>{var s;(s=t.current)==null||s.resize()});return l.observe(e.current),()=>{var s;l.disconnect(),(s=t.current)==null||s.dispose(),t.current=null}},[]);const n=j.useCallback((l,s,a=!1)=>{var f;let d;typeof s=="boolean"?d={notMerge:s,lazyUpdate:a}:d=s??{},(f=t.current)==null||f.setOption(l,d)},[]),i=j.useCallback(()=>{var l;(l=t.current)==null||l.resize()},[]),u=j.useCallback(()=>{var l;(l=t.current)==null||l.dispose(),t.current=null},[]),r=j.useCallback(l=>t.current?t.current.getDataURL({type:(l==null?void 0:l.type)??"png",pixelRatio:(l==null?void 0:l.pixelRatio)??2,backgroundColor:(l==null?void 0:l.backgroundColor)??"#fff"}):"",[]),c=j.useCallback(()=>t.current,[]),o=j.useCallback((l,s)=>{const a=t.current;return a?(a.on(l,s),()=>{a.off(l,s)}):()=>{}},[]);return{chartRef:e,setOption:n,resize:i,dispose:u,getInstance:c,getDataURL:r,bindEvent:o}}const ot={start:70,end:100},be=50;function it(e,t){return e.start===t.start&&e.end===t.end}function st(e=ot){const[t,n]=j.useState({history:[e],index:0}),i=t.history[t.index]??e,u=j.useCallback(l=>{n(s=>{const a=s.history[s.index];if(a&&it(a,l))return s;let d=s.history.slice(0,s.index+1);return d=[...d,l],d.length>be&&(d=d.slice(d.length-be)),{history:d,index:d.length-1}})},[]),r=j.useCallback(()=>{let l=null;return n(s=>{if(s.index===0)return s;const a=s.index-1;return l=s.history[a]??null,{...s,index:a}}),l},[]),c=j.useCallback(()=>{let l=null;return n(s=>{if(s.index>=s.history.length-1)return s;const a=s.index+1;return l=s.history[a]??null,{...s,index:a}}),l},[]),o=j.useCallback((l=e)=>{n({history:[l],index:0})},[e]);return{canUndo:t.index>0,canRedo:t.index<t.history.length-1,currentState:i,pushState:u,undo:r,redo:c,reset:o}}function te(e,t){const n=(e??[]).filter(i=>Number.isFinite(i)&&i>0).map(i=>Math.floor(i));return n.length===0?t:Array.from(new Set(n)).sort((i,u)=>i-u)}function rt(e){return te(typeof e=="object"?e.periods:void 0,[5,10,20,30,60])}function ct(e){return te(typeof e=="object"?e.periods:void 0,[6,12,24])}function ut(e){return te(typeof e=="object"?e.periods:void 0,[6,10])}function at(e){return te(typeof e=="object"?e.periods:void 0,[6,12,24])}function ve(e){const t=e.match(/(\d+)$/);return t?Number(t[1]):Number.POSITIVE_INFINITY}function q(e,t){return e?Object.keys(e).filter(n=>n.startsWith(t)).sort((n,i)=>ve(n)-ve(i)).map(n=>[n,e[n]]):[]}function U(e){return e.replace(/^[a-z]+/,t=>t.toUpperCase())}function Te(e,t=2){return e==null||isNaN(e)?"--":e.toLocaleString("zh-CN",{minimumFractionDigits:t,maximumFractionDigits:t})}function b(e){return Te(e,2)}function Pe(e){return e==null||isNaN(e)?"--":`${e>0?"+":""}${e.toFixed(2)}%`}function Be(e){return e==null||isNaN(e)?"--":`${e>0?"+":""}${e.toFixed(2)}`}function Y(e,t){return Number.isInteger(e)?e.toString():e.toFixed(t).replace(/\.?0+$/,"")}function R(e){return e==null||isNaN(e)?"--":e>=1e8?`${Y(e/1e8,2)}亿`:e>=1e4?`${Y(e/1e4,2)}万`:e.toFixed(0)}function Oe(e){return e==null||isNaN(e)?"--":e>=1e8?`${Y(e/1e8,2)}亿`:e>=1e4?`${Y(e/1e4,2)}万`:Y(e,2)}function dt(e,t="YYYY-MM-DD"){const n=typeof e=="string"?new Date(e):e;if(isNaN(n.getTime()))return e;const i=n.getFullYear(),u=String(n.getMonth()+1).padStart(2,"0"),r=String(n.getDate()).padStart(2,"0"),c=String(n.getHours()).padStart(2,"0"),o=String(n.getMinutes()).padStart(2,"0");return t.replace("YYYY",String(i)).replace("MM",u).replace("DD",r).replace("HH",c).replace("mm",o)}function Q(e,t,n){const i=q(t,n);return i.length===0?null:`${e}: ${i.map(([u,r])=>`${U(u)} ${b(r)}`).join(" / ")}`}function Ke(e){const t=[`<div style="font-weight:bold;margin-bottom:4px">${e.date}</div>`,`<div>开盘: <span style="font-weight:500">${b(e.open)}</span></div>`,`<div>最高: <span style="font-weight:500">${b(e.high)}</span></div>`,`<div>最低: <span style="font-weight:500">${b(e.low)}</span></div>`,`<div>收盘: <span style="font-weight:500">${b(e.close)}</span></div>`];if(e.change!==void 0&&e.changePercent!==void 0){const u=e.change!==null&&e.change>0?"#f5222d":e.change!==null&&e.change<0?"#52c41a":"inherit";t.push(`<div>涨跌: <span style="color:${u};font-weight:500">${Be(e.change)} (${Pe(e.changePercent)})</span></div>`)}e.volume!==void 0&&t.push(`<div>成交量: ${R(e.volume)}</div>`),e.amount!==void 0&&t.push(`<div>成交额: ${Oe(e.amount)}</div>`),e.turnoverRate!==void 0&&e.turnoverRate!==null&&t.push(`<div>换手率: ${e.turnoverRate.toFixed(2)}%</div>`),e.amplitude!==void 0&&e.amplitude!==null&&t.push(`<div>振幅: ${e.amplitude.toFixed(2)}%</div>`);const n=e.indicators??[];let i=!1;if(n.includes("ma")&&e.ma){const u=Q("MA",e.ma,"ma");u&&(i?t.push(`<div>${u}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">${u}</div>`),i=!0))}if(n.includes("boll")&&e.boll&&(i?t.push(`<div>BOLL: 上 ${b(e.boll.upper)} 中 ${b(e.boll.mid)} 下 ${b(e.boll.lower)}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">BOLL: 上 ${b(e.boll.upper)} 中 ${b(e.boll.mid)} 下 ${b(e.boll.lower)}</div>`),i=!0)),n.includes("sar")&&e.sar){const u=e.sar.trend===1?"↑":"↓";i?t.push(`<div>SAR: ${b(e.sar.sar)} ${u}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">SAR: ${b(e.sar.sar)} ${u}</div>`),i=!0)}if(n.includes("kc")&&e.kc&&(i?t.push(`<div>KC: 上 ${b(e.kc.upper)} 中 ${b(e.kc.mid)} 下 ${b(e.kc.lower)}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">KC: 上 ${b(e.kc.upper)} 中 ${b(e.kc.mid)} 下 ${b(e.kc.lower)}</div>`),i=!0)),n.includes("macd")&&e.macd&&(i?t.push(`<div>MACD: DIF ${b(e.macd.dif)} DEA ${b(e.macd.dea)} MACD ${b(e.macd.macd)}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">MACD: DIF ${b(e.macd.dif)} DEA ${b(e.macd.dea)} MACD ${b(e.macd.macd)}</div>`),i=!0)),n.includes("kdj")&&e.kdj&&t.push(`<div>KDJ: K ${b(e.kdj.k)} D ${b(e.kdj.d)} J ${b(e.kdj.j)}</div>`),n.includes("rsi")&&e.rsi){const u=Q("RSI",e.rsi,"rsi");u&&t.push(`<div>${u}</div>`)}if(n.includes("wr")&&e.wr){const u=Q("WR",e.wr,"wr");u&&t.push(`<div>${u}</div>`)}if(n.includes("bias")&&e.bias){const u=Q("BIAS",e.bias,"bias");u&&t.push(`<div>${u}</div>`)}return n.includes("cci")&&e.cci&&t.push(`<div>CCI: ${b(e.cci.cci)}</div>`),n.includes("atr")&&e.atr&&t.push(`<div>ATR: ${b(e.atr.atr)}</div>`),n.includes("obv")&&e.obv&&t.push(`<div>OBV: ${R(e.obv.obv)} MA ${R(e.obv.obvMa)}</div>`),n.includes("roc")&&e.roc&&t.push(`<div>ROC: ${b(e.roc.roc)} SIGNAL ${b(e.roc.signal)}</div>`),n.includes("dmi")&&e.dmi&&t.push(`<div>DMI: +DI ${b(e.dmi.pdi)} -DI ${b(e.dmi.mdi)} ADX ${b(e.dmi.adx)}</div>`),t.join("")}const ue=["ma","boll","sar","kc"],Ee="kline-zoom-inside",ze="kline-zoom-slider";function H(e,t){return Number.isInteger(e)?e.toString():e.toFixed(t).replace(/\.?0+$/,"")}function ht(e,t){return t.includes("volume")?R(e):Math.abs(e)>=100||Math.abs(e)>=10||Math.abs(e)>=1||Math.abs(e)>=.01?H(e,2):H(e,4)}function Ve(e,t={}){const n=Math.min(Math.max(t.maxSubPanes??3,0),3),i=e.filter(s=>!ue.includes(s));if(n===0)return[{id:"main",height:"95%",indicators:ue.filter(s=>e.includes(s))}];const u=i.length,r=Math.min(u,n),o=r===0?{main:"95%",sub:"0%"}:r===1?{main:"78%",sub:"18%"}:r===2?{main:"65%",sub:"15%"}:{main:"55%",sub:"13%"},l=[{id:"main",height:o.main,indicators:ue.filter(s=>e.includes(s))}];return i.slice(0,n).forEach((s,a)=>{l.push({id:`sub_${s}_${a}`,height:o.sub,indicators:[s]})}),l}const ae={gap:25,topMargin:50,bottomMargin:55,leftMargin:60,rightMargin:60};function Fe(e,t){const n=[],{gap:i,topMargin:u,bottomMargin:r}=ae,c=t-u-r-(e.length-1)*i;let o=0;const l=[];for(const f of e)if(typeof f.height=="string"&&f.height.endsWith("%")){const g=parseFloat(f.height)/100;l.push(g),o+=g}else typeof f.height=="number"?(l.push(f.height/c),o+=f.height/c):l.push(0);const s=l.filter(f=>f===0).length;if(s>0&&o<1){const f=(1-o)/s;for(let g=0;g<l.length;g++)l[g]===0&&(l[g]=f)}const a=l.reduce((f,g)=>f+g,0);for(let f=0;f<l.length;f++)l[f]=l[f]/a*c;let d=u;for(let f=0;f<e.length;f++)n.push({id:e[f].id,left:ae.leftMargin,right:ae.rightMargin,top:d,height:l[f]}),d+=l[f]+i;return n}function mt(e){const{data:t,theme:n,indicators:i,panes:u=Ve(i),containerHeight:r=500,indicatorOptions:c}=e,o=rt(c==null?void 0:c.ma),l=ct(c==null?void 0:c.rsi),s=ut(c==null?void 0:c.wr),a=at(c==null?void 0:c.bias);if(t.length===0)return{title:{text:"暂无数据",left:"center",top:"center",textStyle:{color:n.textColorSecondary}}};const d=Fe(u,r),f=t.map(h=>h.date),g=t.map(h=>h.close),w={animation:!1,backgroundColor:n.backgroundColor,title:{text:"",show:!1},tooltip:{trigger:"axis",axisPointer:{type:"cross",crossStyle:{color:n.crosshairColor},lineStyle:{color:n.crosshairColor,type:"dashed"}},backgroundColor:n.tooltipBgColor,borderColor:n.tooltipBorderColor,textStyle:{color:n.textColor,fontSize:12},formatter:h=>{if(!Array.isArray(h)||h.length===0)return"";const I=h[0].dataIndex,v=t[I];return v?Ke({date:v.date,open:v.open,high:v.high,low:v.low,close:v.close,volume:v.volume,amount:v.amount,change:v.change,changePercent:v.changePercent,turnoverRate:v.turnoverRate,amplitude:v.amplitude,indicators:i,ma:v.ma,boll:v.boll,sar:v.sar,kc:v.kc,macd:v.macd,kdj:v.kdj,rsi:v.rsi,wr:v.wr,bias:v.bias,cci:v.cci,atr:v.atr,obv:v.obv,roc:v.roc,dmi:v.dmi}):""}},axisPointer:{link:[{xAxisIndex:"all"}]},grid:d.map(h=>({left:h.left,right:h.right,top:h.top,height:h.height})),xAxis:d.map((h,I)=>({type:"category",data:f,gridIndex:I,axisLine:{lineStyle:{color:n.gridLineColor}},axisTick:{show:!1},axisLabel:{show:I===d.length-1,color:n.textColorSecondary,fontSize:11},splitLine:{show:!1},boundaryGap:!0,min:"dataMin",max:"dataMax"})),yAxis:d.map((h,I)=>({type:"value",gridIndex:I,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:n.textColorSecondary,fontSize:11,formatter:v=>ht(v,h.id)},splitLine:{lineStyle:{color:n.splitLineColor,type:"dashed"}},splitNumber:h.id==="main"?3:2,scale:h.id!=="volume"&&!h.id.includes("volume")})),dataZoom:[{id:Ee,type:"inside",xAxisIndex:d.map((h,I)=>I),minValueSpan:10},{id:ze,type:"slider",xAxisIndex:d.map((h,I)=>I),bottom:8,height:20,borderColor:n.gridLineColor,fillerColor:"rgba(24,144,255,0.1)",handleStyle:{color:n.activeColor},textStyle:{color:n.textColorSecondary}}],series:[]},y=[];for(let h=0;h<u.length;h++){const I=u[h];if(d[h].id==="main"&&y.push({type:"candlestick",name:"K线",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>[p.open,p.close,p.low,p.high]),itemStyle:{color:n.upColor,color0:n.downColor,borderColor:n.upColor,borderColor0:n.downColor}}),I.indicators.includes("ma")&&o.forEach((p,m)=>{const C=`ma${p}`,A=t.map(S=>{var _;return((_=S.ma)==null?void 0:_[C])??null});y.push({type:"line",name:`MA${p}`,xAxisIndex:h,yAxisIndex:h,data:A,smooth:!0,symbol:"none",lineStyle:{width:1,color:n.maColors[m]??n.maColors[0]}})}),I.indicators.includes("boll")){const[p,m,C]=n.bollColors;y.push({type:"line",name:"BOLL上轨",xAxisIndex:h,yAxisIndex:h,data:t.map(A=>{var S;return((S=A.boll)==null?void 0:S.upper)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:p}},{type:"line",name:"BOLL中轨",xAxisIndex:h,yAxisIndex:h,data:t.map(A=>{var S;return((S=A.boll)==null?void 0:S.mid)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:m}},{type:"line",name:"BOLL下轨",xAxisIndex:h,yAxisIndex:h,data:t.map(A=>{var S;return((S=A.boll)==null?void 0:S.lower)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:C}})}if(I.indicators.includes("volume")&&y.push({type:"bar",name:"成交量",xAxisIndex:h,yAxisIndex:h,data:t.map((p,m)=>{const C=m>0?g[m-1]:p.open,A=(p.close??0)>=(C??0);return{value:p.volume,itemStyle:{color:A?n.volumeUpColor:n.volumeDownColor}}})}),I.indicators.includes("macd")&&y.push({type:"bar",name:"MACD",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m,C;return{value:((m=p.macd)==null?void 0:m.macd)??null,itemStyle:{color:(((C=p.macd)==null?void 0:C.macd)??0)>=0?n.upColor:n.downColor}}})},{type:"line",name:"DIF",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.macd)==null?void 0:m.dif)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"DEA",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.macd)==null?void 0:m.dea)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),I.indicators.includes("kdj")&&y.push({type:"line",name:"K",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.kdj)==null?void 0:m.k)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"D",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.kdj)==null?void 0:m.d)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}},{type:"line",name:"J",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.kdj)==null?void 0:m.j)??null}),symbol:"none",lineStyle:{width:1,color:"#722ed1"}}),I.indicators.includes("rsi")&&l.forEach((p,m)=>{y.push({type:"line",name:`RSI${p}`,xAxisIndex:h,yAxisIndex:h,data:t.map(C=>{var A;return((A=C.rsi)==null?void 0:A[`rsi${p}`])??null}),symbol:"none",lineStyle:{width:1,color:n.maColors[m]??"#1890ff"}})}),I.indicators.includes("wr")&&s.forEach((p,m)=>{y.push({type:"line",name:`WR${p}`,xAxisIndex:h,yAxisIndex:h,data:t.map(C=>{var A;return((A=C.wr)==null?void 0:A[`wr${p}`])??null}),symbol:"none",lineStyle:{width:1,color:n.maColors[m]??"#1890ff"}})}),I.indicators.includes("bias")&&a.forEach((p,m)=>{y.push({type:"line",name:`BIAS${p}`,xAxisIndex:h,yAxisIndex:h,data:t.map(C=>{var A;return((A=C.bias)==null?void 0:A[`bias${p}`])??null}),symbol:"none",lineStyle:{width:1,color:n.maColors[m]??"#1890ff"}})}),I.indicators.includes("cci")&&y.push({type:"line",name:"CCI",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.cci)==null?void 0:m.cci)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}}),I.indicators.includes("atr")&&y.push({type:"line",name:"ATR",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.atr)==null?void 0:m.atr)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}}),I.indicators.includes("obv")&&y.push({type:"line",name:"OBV",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.obv)==null?void 0:m.obv)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"OBV_MA",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.obv)==null?void 0:m.obvMa)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),I.indicators.includes("roc")&&y.push({type:"line",name:"ROC",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.roc)==null?void 0:m.roc)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"ROC_MA",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.roc)==null?void 0:m.signal)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),I.indicators.includes("dmi")&&y.push({type:"line",name:"+DI",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.dmi)==null?void 0:m.pdi)??null}),symbol:"none",lineStyle:{width:1,color:n.upColor}},{type:"line",name:"-DI",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.dmi)==null?void 0:m.mdi)??null}),symbol:"none",lineStyle:{width:1,color:n.downColor}},{type:"line",name:"ADX",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.dmi)==null?void 0:m.adx)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"ADXR",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m;return((m=p.dmi)==null?void 0:m.adxr)??null}),symbol:"none",lineStyle:{width:1,color:"#722ed1",type:"dashed"}}),I.indicators.includes("sar")&&y.push({type:"scatter",name:"SAR",xAxisIndex:h,yAxisIndex:h,data:t.map(p=>{var m,C;return{value:((m=p.sar)==null?void 0:m.sar)??null,itemStyle:{color:((C=p.sar)==null?void 0:C.trend)===1?n.upColor:n.downColor}}}),symbol:"circle",symbolSize:4}),I.indicators.includes("kc")){const[p,m,C]=n.kcColors;y.push({type:"line",name:"KC上轨",xAxisIndex:h,yAxisIndex:h,data:t.map(A=>{var S;return((S=A.kc)==null?void 0:S.upper)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:p}},{type:"line",name:"KC中轨",xAxisIndex:h,yAxisIndex:h,data:t.map(A=>{var S;return((S=A.kc)==null?void 0:S.mid)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:m}},{type:"line",name:"KC下轨",xAxisIndex:h,yAxisIndex:h,data:t.map(A=>{var S;return((S=A.kc)==null?void 0:S.lower)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:C}})}}return w.series=y,w}function ft(e,t,n="safeMerge"){if(!t)return e;if(n==="replace")return t;const i={...e};for(const u of Object.keys(t)){const r=t[u];r!==void 0&&(Array.isArray(r)?i[u]=r:typeof r=="object"&&r!==null?i[u]={...i[u],...r}:i[u]=r)}return i}const pt="_container_119o2_1",gt="_spinner_119o2_11",xt="_dot_119o2_16",bt="_text_119o2_43",K={container:pt,spinner:gt,dot:xt,text:bt};function vt({text:e="加载中..."}){return x.jsxs("div",{className:K.container,children:[x.jsxs("div",{className:K.spinner,children:[x.jsx("div",{className:K.dot}),x.jsx("div",{className:K.dot}),x.jsx("div",{className:K.dot})]}),x.jsx("span",{className:K.text,children:e})]})}const yt="_container_1xu4v_1",wt="_group_1xu4v_10",It="_button_1xu4v_15",Ct="_active_1xu4v_30",ee={container:yt,group:wt,button:It,active:Ct},At=[{label:"分时",periods:[{value:"timeline",label:"分时"},{value:"timeline5",label:"五日"}]},{label:"周期",periods:[{value:"daily",label:"日K"},{value:"weekly",label:"周K"},{value:"monthly",label:"月K"}]},{label:"分钟",periods:[{value:"1",label:"1分"},{value:"5",label:"5分"},{value:"15",label:"15分"},{value:"30",label:"30分"},{value:"60",label:"60分"}]}];function St({value:e,onChange:t}){return x.jsx("div",{className:ee.container,children:At.map(n=>x.jsx("div",{className:ee.group,children:n.periods.map(i=>x.jsx("button",{type:"button",className:`${ee.button} ${e===i.value?ee.active:""}`,onClick:()=>t(i.value),children:i.label},i.value))},n.label))})}const jt="_container_1fbmi_1",kt="_button_1fbmi_11",Mt="_active_1fbmi_27",$t="_divider_1fbmi_33",E={container:jt,button:kt,active:Mt,divider:$t},He=[{value:"ma",label:"MA",group:"main"},{value:"boll",label:"BOLL",group:"main"},{value:"sar",label:"SAR",group:"main"},{value:"kc",label:"KC",group:"main"}],Dt=[{value:"volume",label:"成交量",group:"sub"},{value:"macd",label:"MACD",group:"sub"},{value:"kdj",label:"KDJ",group:"sub"},{value:"rsi",label:"RSI",group:"sub"},{value:"wr",label:"WR",group:"sub"},{value:"bias",label:"BIAS",group:"sub"},{value:"cci",label:"CCI",group:"sub"},{value:"atr",label:"ATR",group:"sub"},{value:"obv",label:"OBV",group:"sub"},{value:"roc",label:"ROC",group:"sub"},{value:"dmi",label:"DMI",group:"sub"}];function de(e){return He.find(n=>n.value===e)?"main":"sub"}function _t({value:e,onChange:t,maxSubPanes:n=3,maxMainIndicators:i=2}){const u=r=>{const c=de(r);if(e.includes(r))t(e.filter(o=>o!==r));else if(c==="main"){const o=e.filter(l=>de(l)==="main");if(o.length>=i){const l=o[o.length-1],s=e.filter(a=>a!==l);t([...s,r])}else t([...e,r])}else{const o=e.filter(l=>de(l)==="sub");if(o.length>=n){const l=o[o.length-1],s=e.filter(a=>a!==l);t([...s,r])}else t([...e,r])}};return x.jsxs("div",{className:E.container,children:[He.map(r=>x.jsx("button",{type:"button",className:`${E.button} ${e.includes(r.value)?E.active:""}`,onClick:()=>u(r.value),children:r.label},r.value)),x.jsx("div",{className:E.divider}),Dt.map(r=>x.jsx("button",{type:"button",className:`${E.button} ${e.includes(r.value)?E.active:""}`,onClick:()=>u(r.value),children:r.label},r.value))]})}const Nt="_container_2tswg_1",Rt="_group_2tswg_10",Lt="_divider_2tswg_16",Tt="_spacer_2tswg_23",Pt="_iconButton_2tswg_27",Bt="_textButton_2tswg_51",Ot="_active_2tswg_67",k={container:Nt,group:Rt,divider:Lt,spacer:Tt,iconButton:Pt,textButton:Bt,active:Ot},Kt=[{value:"",label:"不复权"},{value:"qfq",label:"前复权"},{value:"hfq",label:"后复权"}];function Et({adjust:e,onAdjustChange:t,canUndo:n,canRedo:i,onUndo:u,onRedo:r,onZoomIn:c,onZoomOut:o,onPanLeft:l,onPanRight:s,onReset:a,onFullscreen:d}){return x.jsxs("div",{className:k.container,children:[x.jsxs("div",{className:k.group,children:[x.jsx("button",{type:"button",className:k.iconButton,onClick:u,disabled:!n,title:"撤销",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"})})}),x.jsx("button",{type:"button",className:k.iconButton,onClick:r,disabled:!i,title:"重做",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z"})})})]}),x.jsx("div",{className:k.divider}),x.jsxs("div",{className:k.group,children:[x.jsx("button",{type:"button",className:k.iconButton,onClick:c,title:"放大",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})})}),x.jsx("button",{type:"button",className:k.iconButton,onClick:o,title:"缩小",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M19 13H5v-2h14v2z"})})})]}),x.jsx("div",{className:k.divider}),x.jsxs("div",{className:k.group,children:[x.jsx("button",{type:"button",className:k.iconButton,onClick:l,title:"向左",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})})}),x.jsx("button",{type:"button",className:k.iconButton,onClick:s,title:"向右",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})})})]}),x.jsx("div",{className:k.divider}),x.jsx("div",{className:k.group,children:x.jsx("button",{type:"button",className:k.textButton,onClick:a,title:"重置",children:"重置"})}),x.jsx("div",{className:k.spacer}),x.jsx("div",{className:k.group,children:Kt.map(f=>x.jsx("button",{type:"button",className:`${k.textButton} ${e===f.value?k.active:""}`,onClick:()=>t(f.value),children:f.label},f.value))}),d&&x.jsxs(x.Fragment,{children:[x.jsx("div",{className:k.divider}),x.jsx("button",{type:"button",className:k.iconButton,onClick:d,title:"全屏",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})})]})]})}const zt="_container_1vdme_1",Vt="_group_1vdme_11",Ft="_item_1vdme_18",M={container:zt,group:Vt,item:Ft};function Ht({data:e,indicators:t,hoverIndex:n,theme:i}){const u=i.maColors,r=i.bollColors,c=i.kcColors,o=j.useMemo(()=>{const f=n??e.length-1,g=e[f];return g||null},[e,n]);if(!o)return null;const l=t.includes("ma"),s=t.includes("boll"),a=t.includes("sar"),d=t.includes("kc");return!l&&!s&&!a&&!d?null:x.jsxs("div",{className:M.container,children:[l&&o.ma&&x.jsx("div",{className:M.group,children:q(o.ma,"ma").map(([f,g],w)=>{const y=u[w]??"#999";return x.jsxs("span",{className:M.item,style:{color:y},children:[U(f),": ",b(g)]},f)})}),s&&o.boll&&x.jsxs("div",{className:M.group,children:[x.jsxs("span",{className:M.item,style:{color:r[0]},children:["UPPER: ",b(o.boll.upper)]}),x.jsxs("span",{className:M.item,style:{color:r[1]},children:["MID: ",b(o.boll.mid)]}),x.jsxs("span",{className:M.item,style:{color:r[2]},children:["LOWER: ",b(o.boll.lower)]})]}),a&&o.sar&&x.jsx("div",{className:M.group,children:x.jsxs("span",{className:M.item,style:{color:o.sar.trend===1?i.upColor:i.downColor},children:["SAR: ",b(o.sar.sar)," ",o.sar.trend===1?"↑":"↓"]})}),d&&o.kc&&x.jsxs("div",{className:M.group,children:[x.jsxs("span",{className:M.item,style:{color:c[0]},children:["KC上: ",b(o.kc.upper)]}),x.jsxs("span",{className:M.item,style:{color:c[1]},children:["KC中: ",b(o.kc.mid)]}),x.jsxs("span",{className:M.item,style:{color:c[2]},children:["KC下: ",b(o.kc.lower)]})]})]})}const qt="_title_p093j_1",Ut="_label_p093j_16",Yt="_value_p093j_21",he={title:qt,label:Ut,value:Yt},Wt={ma:"MA",boll:"BOLL",sar:"SAR",kc:"KC",volume:"成交量",macd:"MACD",kdj:"KDJ",rsi:"RSI",wr:"WR",bias:"BIAS",cci:"CCI",atr:"ATR",obv:"OBV",roc:"ROC",dmi:"DMI"};function Jt(e,t){if(!t)return"";switch(e){case"volume":return`VOL: ${R(t.volume)}`;case"macd":return t.macd?`DIF: ${b(t.macd.dif)} DEA: ${b(t.macd.dea)} MACD: ${b(t.macd.macd)}`:"";case"kdj":return t.kdj?`K: ${b(t.kdj.k)} D: ${b(t.kdj.d)} J: ${b(t.kdj.j)}`:"";case"rsi":return t.rsi?q(t.rsi,"rsi").map(([n,i])=>`${U(n)}: ${b(i)}`).join(" "):"";case"wr":return t.wr?q(t.wr,"wr").map(([n,i])=>`${U(n)}: ${b(i)}`).join(" "):"";case"bias":return t.bias?q(t.bias,"bias").map(([n,i])=>`${U(n)}: ${b(i)}`).join(" "):"";case"cci":return t.cci?`CCI: ${b(t.cci.cci)}`:"";case"atr":return t.atr?`ATR: ${b(t.atr.atr)}`:"";case"obv":return t.obv?`OBV: ${R(t.obv.obv)} MA: ${R(t.obv.obvMa)}`:"";case"roc":return t.roc?`ROC: ${b(t.roc.roc)} SIGNAL: ${b(t.roc.signal)}`:"";case"dmi":return t.dmi?`+DI: ${b(t.dmi.pdi)} -DI: ${b(t.dmi.mdi)} ADX: ${b(t.dmi.adx)}`:"";case"sar":return t.sar?`SAR: ${b(t.sar.sar)} ${t.sar.trend===1?"↑":"↓"}`:"";case"kc":return t.kc?`上: ${b(t.kc.upper)} 中: ${b(t.kc.mid)} 下: ${b(t.kc.lower)}`:"";default:return""}}function Zt(e,t){return Fe(e,t).map(i=>({top:i.top,height:i.height}))}function Gt({panes:e,data:t,hoverIndex:n,containerHeight:i}){const u=n??t.length-1,r=t[u],c=j.useMemo(()=>Zt(e,i),[e,i]),o=e.slice(1),l=c.slice(1);return o.length===0?null:x.jsx(x.Fragment,{children:o.map((s,a)=>{if(s.indicators.length===0)return null;const d=s.indicators.map(w=>Wt[w]||w.toUpperCase()).join(" / "),f=s.indicators.map(w=>Jt(w,r)).filter(Boolean).join(" | "),g=l[a];return x.jsxs("div",{className:he.title,style:{top:(g==null?void 0:g.top)??0},children:[x.jsx("span",{className:he.label,children:d}),f&&x.jsx("span",{className:he.value,children:f})]},s.id)})})}exports.DATA_ZOOM_INSIDE_ID=Ee;exports.DATA_ZOOM_SLIDER_ID=ze;exports.IndicatorDisplay=Ht;exports.IndicatorSelector=_t;exports.Loading=vt;exports.PeriodSelector=St;exports.SubPaneTitle=Gt;exports.Toolbar=Et;exports.buildOption=mt;exports.calcATR=me;exports.calcBIAS=Me;exports.calcBOLL=Ae;exports.calcCCI=$e;exports.calcDMI=Ne;exports.calcEMA=T;exports.calcKC=Le;exports.calcKDJ=Se;exports.calcMA=Ie;exports.calcMACD=Ce;exports.calcOBV=De;exports.calcROC=_e;exports.calcRSI=je;exports.calcSAR=Re;exports.calcSMA=z;exports.calcWMA=we;exports.calcWR=ke;exports.formatAmount=Oe;exports.formatChange=Be;exports.formatDate=dt;exports.formatKlineTooltip=Ke;exports.formatNumber=Te;exports.formatPercent=Pe;exports.formatPrice=b;exports.formatVolume=R;exports.getDefaultPanes=Ve;exports.mergeOption=ft;exports.useEcharts=lt;exports.useKlineData=nt;exports.useZoomHistory=st;
@@ -8,10 +8,10 @@ interface SetOptionOpts {
8
8
  }
9
9
  interface UseEchartsResult {
10
10
  chartRef: React.RefObject<HTMLDivElement | null>;
11
- chartInstance: EChartsInstance | null;
12
11
  setOption: (option: EChartsOption, opts?: boolean | SetOptionOpts, lazyUpdate?: boolean) => void;
13
12
  resize: () => void;
14
13
  dispose: () => void;
14
+ getInstance: () => EChartsInstance | null;
15
15
  getDataURL: (opts?: {
16
16
  type?: 'png' | 'jpeg';
17
17
  pixelRatio?: number;
@@ -1,4 +1,4 @@
1
- import { KlineWithIndicators, TimelineData, PeriodType, MarketType, AdjustType, KLineDataProvider, SDKOptions, RequestOptions, IndicatorOptions } from '../types';
1
+ import { KlineWithIndicators, TimelineData, PeriodType, MarketType, AdjustType, IndicatorType, KLineDataProvider, SDKOptions, RequestOptions, IndicatorOptions } from '../types';
2
2
  interface UseKlineDataParams {
3
3
  symbol: string;
4
4
  market: MarketType;
@@ -8,7 +8,7 @@ interface UseKlineDataParams {
8
8
  sdkOptions?: SDKOptions;
9
9
  requestOptions?: RequestOptions;
10
10
  indicatorOptions?: IndicatorOptions;
11
- indicators?: string[];
11
+ indicators?: IndicatorType[];
12
12
  }
13
13
  interface UseKlineDataResult {
14
14
  data: KlineWithIndicators[];
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";var Kt=Object.defineProperty;var Et=(e,t,n)=>t in e?Kt(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var _e=(e,t,n)=>Et(e,typeof t!="symbol"?t+"":t,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("react/jsx-runtime"),C=require("react"),zt=require("stock-sdk"),Ht=require("echarts/core"),xe=require("echarts/charts"),ne=require("echarts/components"),Vt=require("echarts/renderers");function Ft(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const l=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,l.get?l:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const qe=Ft(Ht),Pe={backgroundColor:"#ffffff",textColor:"#333333",textColorSecondary:"#999999",gridLineColor:"#e0e0e0",upColor:"#f5222d",downColor:"#52c41a",maColors:["#f5a623","#1890ff","#722ed1","#13c2c2","#eb2f96","#faad14","#a0d911"],volumeUpColor:"#f5222d",volumeDownColor:"#52c41a",crosshairColor:"#999999",tooltipBgColor:"rgba(255,255,255,0.96)",tooltipBorderColor:"#e0e0e0",splitLineColor:"#f0f0f0",areaColor:"rgba(24,144,255,0.1)",activeColor:"#1890ff",bollColors:["#faad14","#1890ff","#722ed1"],kcColors:["#52c41a","#13c2c2","#eb2f96"]},Ze={backgroundColor:"#1a1a1a",textColor:"#d1d1d1",textColorSecondary:"#666666",gridLineColor:"#333333",upColor:"#f5222d",downColor:"#52c41a",maColors:["#f5a623","#1890ff","#722ed1","#13c2c2","#eb2f96","#faad14","#a0d911"],volumeUpColor:"#f5222d",volumeDownColor:"#52c41a",crosshairColor:"#666666",tooltipBgColor:"rgba(30,30,30,0.96)",tooltipBorderColor:"#333333",splitLineColor:"#2a2a2a",areaColor:"rgba(24,144,255,0.15)",activeColor:"#1890ff",bollColors:["#faad14","#1890ff","#722ed1"],kcColors:["#52c41a","#13c2c2","#eb2f96"]};function Ye(e){return typeof e=="string"?e==="dark"?Ze:Pe:{...Pe,...e}}function se(e,t){const n=[];let l=0,a=0;for(let s=0;s<e.length;s++){const c=e[s];if(c!=null&&(l+=c,a++),s>=t){const o=e[s-t];o!=null&&(l-=o,a--)}s>=t-1&&a===t?n.push(l/t):n.push(null)}return n}function X(e,t){const n=[],l=2/(t+1);let a=null;for(let s=0;s<e.length;s++){const c=e[s];if(c==null){n.push(a);continue}a===null?a=c:a=c*l+a*(1-l),n.push(a)}return n}function Ge(e,t){const n=[],l=Array.from({length:t},(s,c)=>c+1),a=l.reduce((s,c)=>s+c,0);for(let s=0;s<e.length;s++){if(s<t-1){n.push(null);continue}let c=0,o=0;for(let r=0;r<t;r++){const i=e[s-t+1+r],d=l[r];i!=null&&d!==void 0&&(c+=i*d,o++)}o===t?n.push(c/a):n.push(null)}return n}function Je(e,t={}){const{periods:n=[5,10,20,30,60],type:l="sma"}=t,a={};for(const c of n){const o=`ma${c}`;switch(l){case"ema":a[o]=X(e,c);break;case"wma":a[o]=Ge(e,c);break;default:a[o]=se(e,c)}}const s=[];for(let c=0;c<e.length;c++){const o={};for(const r of Object.keys(a)){const i=a[r];o[r]=i!==void 0?i[c]??null:null}s.push(o)}return s}function Xe(e,t={}){const{short:n=12,long:l=26,signal:a=9}=t,s=X(e,n),c=X(e,l),o=[];for(let d=0;d<e.length;d++){const h=s[d],m=c[d];h!=null&&m!==null&&m!==void 0?o.push(h-m):o.push(null)}const r=X(o,a),i=[];for(let d=0;d<e.length;d++){const h=o[d]??null,m=r[d]??null;i.push({dif:h,dea:m,macd:h!==null&&m!==null?(h-m)*2:null})}return i}function Qe(e,t={}){const{period:n=20,stdDev:l=2}=t,a=se(e,n),s=[];for(let c=0;c<e.length;c++){const o=a[c];if(o==null||c<n-1){s.push({mid:null,upper:null,lower:null,bandwidth:null});continue}let r=0,i=0;for(let d=c-n+1;d<=c;d++){const h=e[d];h!=null&&(r+=Math.pow(h-o,2),i++)}if(i===n){const d=Math.sqrt(r/n),h=o+l*d,m=o-l*d;s.push({mid:o,upper:h,lower:m,bandwidth:o!==0?(h-m)/o*100:null})}else s.push({mid:o,upper:null,lower:null,bandwidth:null})}return s}function et(e,t={}){const{period:n=9,kPeriod:l=3,dPeriod:a=3}=t,s=[];let c=50,o=50;for(let r=0;r<e.length;r++){if(r<n-1){s.push({k:null,d:null,j:null});continue}let i=-1/0,d=1/0;for(let b=r-n+1;b<=r;b++){const p=e[b];p!==void 0&&p.high!==null&&p.high!==void 0&&(i=Math.max(i,p.high)),p!==void 0&&p.low!==null&&p.low!==void 0&&(d=Math.min(d,p.low))}const h=e[r],m=h!==void 0?h.close:null;if(m==null||i===-1/0||d===1/0){s.push({k:null,d:null,j:null});continue}const f=i===d?50:(m-d)/(i-d)*100,u=(c*(l-1)+f)/l,y=(o*(a-1)+u)/a,w=3*u-2*y;s.push({k:u,d:y,j:w}),c=u,o=y}return s}function tt(e,t={}){const{periods:n=[6,12,24]}=t,l={};for(const s of n){const c=`rsi${s}`,o=[];let r=0,i=0;for(let d=0;d<e.length;d++){const h=e[d],m=e[d-1];if(d===0||h===null||h===void 0||m===null||m===void 0){o.push(null);continue}const f=h-m,u=f>0?f:0,y=f<0?-f:0;if(d<s)r+=u,i+=y,o.push(null);else if(d===s){r=(r+u)/s,i=(i+y)/s;const w=i===0?100:r/i;o.push(100-100/(1+w))}else{r=(r*(s-1)+u)/s,i=(i*(s-1)+y)/s;const w=i===0?100:r/i;o.push(100-100/(1+w))}}l[c]=o}const a=[];for(let s=0;s<e.length;s++){const c={};for(const o of Object.keys(l)){const r=l[o];c[o]=r!==void 0?r[s]??null:null}a.push(c)}return a}function nt(e,t={}){const{periods:n=[6,10]}=t,l={};for(const s of n){const c=`wr${s}`,o=[];for(let r=0;r<e.length;r++){if(r<s-1){o.push(null);continue}let i=-1/0,d=1/0;for(let f=r-s+1;f<=r;f++){const u=e[f];u!==void 0&&u.high!==null&&u.high!==void 0&&(i=Math.max(i,u.high)),u!==void 0&&u.low!==null&&u.low!==void 0&&(d=Math.min(d,u.low))}const h=e[r],m=h!==void 0?h.close:null;m==null||i===d?o.push(null):o.push((i-m)/(i-d)*-100)}l[c]=o}const a=[];for(let s=0;s<e.length;s++){const c={};for(const o of Object.keys(l)){const r=l[o];c[o]=r!==void 0?r[s]??null:null}a.push(c)}return a}function ot(e,t={}){const{periods:n=[6,12,24]}=t,l={};for(const s of n){const c=`bias${s}`,o=se(e,s),r=[];for(let i=0;i<e.length;i++){const d=e[i],h=o[i];d==null||h===null||h===void 0||h===0?r.push(null):r.push((d-h)/h*100)}l[c]=r}const a=[];for(let s=0;s<e.length;s++){const c={};for(const o of Object.keys(l)){const r=l[o];c[o]=r!==void 0?r[s]??null:null}a.push(c)}return a}function lt(e,t={}){const{period:n=14}=t,l=e.map(c=>c.high===null||c.low===null||c.close===null?null:(c.high+c.low+c.close)/3),a=se(l,n),s=[];for(let c=0;c<e.length;c++){const o=l[c],r=a[c];if(c<n-1||o===null||o===void 0||r===null||r===void 0){s.push({cci:null});continue}let i=0,d=0;for(let m=c-n+1;m<=c;m++){const f=l[m];f!=null&&(i+=Math.abs(f-r),d++)}const h=d>0?i/d:0;h===0?s.push({cci:0}):s.push({cci:(o-r)/(.015*h)})}return s}function Be(e,t={}){const{period:n=14}=t,l=[],a=[];for(let s=0;s<e.length;s++){const c=e[s];if(c===void 0||c.high===null||c.low===null||c.close===null){a.push(null),l.push({tr:null,atr:null});continue}let o;if(s===0)o=c.high-c.low;else{const r=e[s-1],i=r!==void 0?r.close:null;i==null?o=c.high-c.low:o=Math.max(c.high-c.low,Math.abs(c.high-i),Math.abs(c.low-i))}if(a.push(o),s<n-1)l.push({tr:o,atr:null});else if(s===n-1){let r=0;for(let i=0;i<n;i++)r+=a[i]??0;l.push({tr:o,atr:r/n})}else{const r=l[s-1],i=r!==void 0?r.atr:null;i==null?l.push({tr:o,atr:null}):l.push({tr:o,atr:(i*(n-1)+o)/n})}}return l}function rt(e,t={}){const{maPeriod:n=30}=t,l=[];let a=0;for(let o=0;o<e.length;o++){const r=e[o];if(r===void 0||r.close===null||r.volume===null||r.volume===void 0){l.push({obv:null,obvMa:null});continue}if(o===0)a=r.volume;else{const i=e[o-1],d=i!==void 0?i.close:null;d==null?a=r.volume:r.close>d?a+=r.volume:r.close<d&&(a-=r.volume)}l.push({obv:a,obvMa:null})}const s=l.map(o=>o.obv),c=se(s,n);for(let o=0;o<l.length;o++){const r=l[o];r!==void 0&&(r.obvMa=c[o]??null)}return l}function st(e,t={}){const{period:n=12,signalPeriod:l=6}=t,a=[];for(let o=0;o<e.length;o++){const r=e[o],i=e[o-n];o<n||r===null||r===void 0||i===null||i===void 0||i===0?a.push(null):a.push((r-i)/i*100)}const s=X(a,l),c=[];for(let o=0;o<e.length;o++)c.push({roc:a[o]??null,signal:s[o]??null});return c}function it(e,t={}){const{period:n=14,adxPeriod:l=14}=t,a=[],s=[],c=[],o=[];for(let r=0;r<e.length;r++){const i=e[r];if(i===void 0||i.high===null||i.low===null||i.close===null){a.push({pdi:null,mdi:null,adx:null,adxr:null});continue}let d;if(r===0)d=i.high-i.low;else{const v=e[r-1],S=v!==void 0?v.close:null;S==null?d=i.high-i.low:d=Math.max(i.high-i.low,Math.abs(i.high-S),Math.abs(i.low-S))}if(s.push(d),r===0)c.push(0),o.push(0);else{const v=e[r-1];if(v===void 0||v.high===null||v.low===null)c.push(0),o.push(0);else{const S=i.high-v.high,j=v.low-i.low,T=S>j&&S>0?S:0,W=j>S&&j>0?j:0;c.push(T),o.push(W)}}if(r<n-1){a.push({pdi:null,mdi:null,adx:null,adxr:null});continue}let h=0,m=0,f=0;for(let v=r-n+1;v<=r;v++)h+=s[v]??0,m+=c[v]??0,f+=o[v]??0;const u=h>0?m/h*100:0,y=h>0?f/h*100:0,w=u+y,b=w>0?Math.abs(u-y)/w*100:0;let p=null;if(r>=n-1+l-1){let v=0;for(let S=r-l+1;S<=r;S++){if(a[S]===void 0)continue;let T=0,W=0,R=0;for(let H=S-n+1;H<=S;H++)T+=s[H]??0,W+=c[H]??0,R+=o[H]??0;const B=T>0?W/T*100:0,z=T>0?R/T*100:0,Y=B+z,L=Y>0?Math.abs(B-z)/Y*100:0;v+=L}v+=b,p=v/l}let I=null;if(p!==null&&r>=n-1+l-1+l){const v=a[r-l];v!==void 0&&v.adx!==null&&(I=(p+v.adx)/2)}a.push({pdi:u,mdi:y,adx:p,adxr:I})}return a}function ct(e,t={}){var d,h;const{afStart:n=.02,afIncrement:l=.02,afMax:a=.2}=t,s=[];if(e.length===0)return s;let c=1,o=((d=e[0])==null?void 0:d.low)??0,r=((h=e[0])==null?void 0:h.high)??0,i=n;for(let m=0;m<e.length;m++){const f=e[m];if(f===void 0||f.high===null||f.low===null){s.push({sar:null,trend:null,ep:null,af:null});continue}if(m===0){s.push({sar:f.low,trend:1,ep:f.high,af:n}),o=f.low,r=f.high,c=1,i=n;continue}const u=o;if(o=u+i*(r-u),c===1){const y=e[m-1],w=e[m-2];y!==void 0&&y.low!==null&&(o=Math.min(o,y.low)),w!==void 0&&w.low!==null&&(o=Math.min(o,w.low)),f.low<o?(c=-1,o=r,r=f.low,i=n):f.high>r&&(r=f.high,i=Math.min(i+l,a))}else{const y=e[m-1],w=e[m-2];y!==void 0&&y.high!==null&&(o=Math.max(o,y.high)),w!==void 0&&w.high!==null&&(o=Math.max(o,w.high)),f.high>o?(c=1,o=r,r=f.high,i=n):f.low<r&&(r=f.low,i=Math.min(i+l,a))}s.push({sar:o,trend:c,ep:r,af:i})}return s}function at(e,t={}){var i;const{emaPeriod:n=20,atrPeriod:l=10,multiplier:a=2}=t,s=e.map(d=>d.close),c=X(s,n),o=Be(e,{period:l}),r=[];for(let d=0;d<e.length;d++){const h=c[d],m=(i=o[d])==null?void 0:i.atr;if(h==null||m===null||m===void 0){r.push({mid:null,upper:null,lower:null,width:null});continue}const f=h+a*m,u=h-a*m,y=h!==0?(f-u)/h*100:null;r.push({mid:h,upper:f,lower:u,width:y})}return r}const Ut={enabled:!0,ttl:300*1e3,maxSize:100};function Wt(e){switch(e){case"timeline":case"timeline5":return 30*1e3;case"1":case"5":case"15":case"30":case"60":return 120*1e3;case"daily":case"weekly":case"monthly":default:return 600*1e3}}class re{constructor(t={}){_e(this,"cache",new Map);_e(this,"config");this.config={...Ut,...t}}static buildKey(t){return Object.entries(t).filter(([,n])=>n!==void 0).sort(([n],[l])=>n.localeCompare(l)).map(([n,l])=>`${n}:${String(l)}`).join("|")}get(t){if(!this.config.enabled)return;const n=this.cache.get(t);if(!n)return;const l=n.ttl??this.config.ttl;if(Date.now()-n.timestamp>l){this.cache.delete(t);return}return n.data}set(t,n,l){if(this.config.enabled){if(this.cache.size>=this.config.maxSize&&(this.cleanup(),this.cache.size>=this.config.maxSize)){const a=this.cache.keys().next().value;a&&this.cache.delete(a)}this.cache.set(t,{data:n,timestamp:Date.now(),ttl:l})}}cleanup(){const t=Date.now();for(const[n,l]of this.cache.entries()){const a=l.ttl??this.config.ttl;t-l.timestamp>a&&this.cache.delete(n)}}delete(t){return this.cache.delete(t)}clear(){this.cache.clear()}size(){return this.cache.size}}new re;const ce=new re,De=new Map,qt=150;function Zt(e){const t=new zt.StockSDK(e);return{getKline:async n=>{const{symbol:l,market:a,period:s,adjust:c}=n;if(s==="timeline"){const i=await t.getTodayTimeline(l);return i.data.map(d=>({date:`${i.date.slice(0,4)}-${i.date.slice(4,6)}-${i.date.slice(6,8)} ${d.time}`,open:d.price,close:d.price,high:d.price,low:d.price,volume:d.volume,amount:d.amount}))}if(s==="timeline5"){const i=new Date,d=new Date;d.setDate(d.getDate()-7);const h=f=>{const u=f.getFullYear(),y=String(f.getMonth()+1).padStart(2,"0"),w=String(f.getDate()).padStart(2,"0");return`${u}-${y}-${w}`};return(await t.getMinuteKline(l,{period:"1",startDate:h(d),endDate:h(i)})).map(f=>({date:"time"in f?f.time:"",open:f.open,close:f.close,high:f.high,low:f.low,volume:f.volume,amount:f.amount}))}if(["1","5","15","30","60"].includes(s)){let d=(await t.getMinuteKline(l,{period:s,adjust:c||"qfq"})).map(h=>({date:"time"in h?h.time:"",open:h.open,close:h.close,high:h.high,low:h.low,volume:h.volume,amount:h.amount,changePercent:"changePercent"in h?h.changePercent:void 0,change:"change"in h?h.change:void 0,amplitude:"amplitude"in h?h.amplitude:void 0,turnoverRate:"turnoverRate"in h?h.turnoverRate:void 0}));if(s==="1"&&d.length>0){const h=d[d.length-1].date.split(" ")[0];d=d.filter(m=>m.date.startsWith(h))}return d}const r={daily:"daily",weekly:"weekly",monthly:"monthly"}[s]??"daily";switch(a){case"HK":return await t.getHKHistoryKline(l,{period:r,adjust:c||"qfq"});case"US":return await t.getUSHistoryKline(l,{period:r,adjust:c||"qfq"});default:return await t.getHistoryKline(l,{period:r,adjust:c||"qfq"})}},getTimeline:async n=>(await t.getTodayTimeline(n.symbol)).data}}function Yt(e,t,n={}){if(e.length===0)return[];const l=e.map(I=>I.close),a=e.map(I=>({open:I.open,high:I.high,low:I.low,close:I.close,volume:I.volume})),s=t.includes("ma")?Je(l,typeof n.ma=="object"?n.ma:{}):null,c=t.includes("macd")?Xe(l,typeof n.macd=="object"?n.macd:{}):null,o=t.includes("boll")?Qe(l,typeof n.boll=="object"?n.boll:{}):null,r=t.includes("kdj")?et(a,typeof n.kdj=="object"?n.kdj:{}):null,i=t.includes("rsi")?tt(l,typeof n.rsi=="object"?n.rsi:{}):null,d=t.includes("wr")?nt(a,typeof n.wr=="object"?n.wr:{}):null,h=t.includes("bias")?ot(l,typeof n.bias=="object"?n.bias:{}):null,m=t.includes("cci")?lt(a,typeof n.cci=="object"?n.cci:{}):null,f=t.includes("atr")?Be(a,typeof n.atr=="object"?n.atr:{}):null,u=t.includes("obv")?rt(a,typeof n.obv=="object"?n.obv:{}):null,y=t.includes("roc")?st(l,typeof n.roc=="object"?n.roc:{}):null,w=t.includes("dmi")?it(a,typeof n.dmi=="object"?n.dmi:{}):null,b=t.includes("sar")?ct(a,typeof n.sar=="object"?n.sar:{}):null,p=t.includes("kc")?at(a,typeof n.kc=="object"?n.kc:{}):null;return e.map((I,v)=>({...I,ma:s==null?void 0:s[v],macd:c==null?void 0:c[v],boll:o==null?void 0:o[v],kdj:r==null?void 0:r[v],rsi:i==null?void 0:i[v],wr:d==null?void 0:d[v],bias:h==null?void 0:h[v],cci:m==null?void 0:m[v],atr:f==null?void 0:f[v],obv:u==null?void 0:u[v],roc:y==null?void 0:y[v],dmi:w==null?void 0:w[v],sar:b==null?void 0:b[v],kc:p==null?void 0:p[v]}))}function ut(e){const{symbol:t,market:n,period:l,adjust:a,dataProvider:s,sdkOptions:c,requestOptions:o,indicatorOptions:r,indicators:i=["ma","volume","macd"]}=e,[d,h]=C.useState([]),[m,f]=C.useState([]),[u,y]=C.useState(!1),[w,b]=C.useState(null),p=C.useRef(null),I=C.useRef(null),v=C.useRef(null),S=C.useCallback(()=>s||(v.current||(v.current=Zt(c)),v.current),[s,c]),j=C.useCallback(async()=>{(o==null?void 0:o.abortOnChange)!==!1&&p.current&&p.current.abort();const R=new AbortController;p.current=R,y(!0),b(null);try{const B=S(),z=re.buildKey({symbol:t,market:n,period:l,adjust:a}),Y=ce.get(z);if(Y&&(o==null?void 0:o.dedupe)!==!1){if(h(Y),y(!1),l==="timeline"){const E=re.buildKey({symbol:t,market:n,type:"timeline"}),G=ce.get(E);G&&f(G)}return}const L=De.get(z);if(L){try{const E=await L;R.signal.aborted||h(E)}catch{}finally{R.signal.aborted||y(!1)}return}const H=B.getKline({symbol:t,market:n,period:l,adjust:a},R.signal);De.set(z,H);try{const E=await H;if(R.signal.aborted)return;const G=Wt(l);if(ce.set(z,E,G),h(E),l==="timeline"&&B.getTimeline){const K=await B.getTimeline({symbol:t,market:n},R.signal);if(!R.signal.aborted){const ve=re.buildKey({symbol:t,market:n,type:"timeline"});ce.set(ve,K,G),f(K)}}}finally{De.delete(z)}}catch(B){if(B.name==="AbortError")return;b(B)}finally{R.signal.aborted||y(!1)}},[t,n,l,a,S,o]),T=C.useCallback(async()=>{const R=re.buildKey({symbol:t,market:n,period:l,adjust:a});ce.delete(R),await j()},[t,n,l,a,j]);return C.useEffect(()=>{I.current&&clearTimeout(I.current);const R=(o==null?void 0:o.debounceMs)??qt;return I.current=setTimeout(j,R),()=>{I.current&&clearTimeout(I.current),p.current&&p.current.abort()}},[t,n,l,a,j,o==null?void 0:o.debounceMs]),{data:C.useMemo(()=>Yt(d,i,r),[d,i,r]),timelineData:m,loading:u,error:w,refresh:T}}qe.use([xe.CandlestickChart,xe.LineChart,xe.BarChart,xe.ScatterChart,ne.TitleComponent,ne.TooltipComponent,ne.GridComponent,ne.DataZoomComponent,ne.LegendComponent,ne.AxisPointerComponent,Vt.CanvasRenderer]);function dt(){const e=C.useRef(null),t=C.useRef(null);C.useEffect(()=>{if(!e.current)return;t.current=qe.init(e.current);const o=new ResizeObserver(()=>{var r;(r=t.current)==null||r.resize()});return o.observe(e.current),()=>{var r;o.disconnect(),(r=t.current)==null||r.dispose(),t.current=null}},[]);const n=C.useCallback((o,r,i=!1)=>{var h;let d;typeof r=="boolean"?d={notMerge:r,lazyUpdate:i}:d=r??{},(h=t.current)==null||h.setOption(o,d)},[]),l=C.useCallback(()=>{var o;(o=t.current)==null||o.resize()},[]),a=C.useCallback(()=>{var o;(o=t.current)==null||o.dispose(),t.current=null},[]),s=C.useCallback(o=>t.current?t.current.getDataURL({type:(o==null?void 0:o.type)??"png",pixelRatio:(o==null?void 0:o.pixelRatio)??2,backgroundColor:(o==null?void 0:o.backgroundColor)??"#fff"}):"",[]),c=C.useCallback((o,r)=>{const i=t.current;return i?(i.on(o,r),()=>{i.off(o,r)}):()=>{}},[]);return{chartRef:e,chartInstance:t.current,setOption:n,resize:l,dispose:a,getDataURL:s,bindEvent:c}}const Gt={start:70,end:100},Jt=50;function ht(e=Gt){const t=C.useRef([e]),n=C.useRef(0),[,l]=C.useState({}),a=t.current[n.current]??e,s=C.useCallback(i=>{n.current<t.current.length-1&&(t.current=t.current.slice(0,n.current+1)),t.current.length>=Jt&&(t.current=t.current.slice(1)),t.current.push(i),n.current=t.current.length-1,l({})},[]),c=C.useCallback(()=>n.current>0?(n.current--,l({}),t.current[n.current]??null):null,[]),o=C.useCallback(()=>n.current<t.current.length-1?(n.current++,l({}),t.current[n.current]??null):null,[]),r=C.useCallback((i=e)=>{t.current=[i],n.current=0,l({})},[e]);return{canUndo:n.current>0,canRedo:n.current<t.current.length-1,currentState:a,pushState:s,undo:c,redo:o,reset:r}}function mt(e,t=2){return e==null||isNaN(e)?"--":e.toLocaleString("zh-CN",{minimumFractionDigits:t,maximumFractionDigits:t})}function g(e){return mt(e,2)}function ft(e){return e==null||isNaN(e)?"--":`${e>0?"+":""}${e.toFixed(2)}%`}function pt(e){return e==null||isNaN(e)?"--":`${e>0?"+":""}${e.toFixed(2)}`}function ue(e,t){return Number.isInteger(e)?e.toString():e.toFixed(t).replace(/\.?0+$/,"")}function F(e){return e==null||isNaN(e)?"--":e>=1e8?`${ue(e/1e8,2)}亿`:e>=1e4?`${ue(e/1e4,2)}万`:e.toFixed(0)}function gt(e){return e==null||isNaN(e)?"--":e>=1e8?`${ue(e/1e8,2)}亿`:e>=1e4?`${ue(e/1e4,2)}万`:ue(e,2)}function Xt(e,t="YYYY-MM-DD"){const n=typeof e=="string"?new Date(e):e;if(isNaN(n.getTime()))return e;const l=n.getFullYear(),a=String(n.getMonth()+1).padStart(2,"0"),s=String(n.getDate()).padStart(2,"0"),c=String(n.getHours()).padStart(2,"0"),o=String(n.getMinutes()).padStart(2,"0");return t.replace("YYYY",String(l)).replace("MM",a).replace("DD",s).replace("HH",c).replace("mm",o)}function xt(e){const t=[`<div style="font-weight:bold;margin-bottom:4px">${e.date}</div>`,`<div>开盘: <span style="font-weight:500">${g(e.open)}</span></div>`,`<div>最高: <span style="font-weight:500">${g(e.high)}</span></div>`,`<div>最低: <span style="font-weight:500">${g(e.low)}</span></div>`,`<div>收盘: <span style="font-weight:500">${g(e.close)}</span></div>`];if(e.change!==void 0&&e.changePercent!==void 0){const a=e.change!==null&&e.change>0?"#f5222d":e.change!==null&&e.change<0?"#52c41a":"inherit";t.push(`<div>涨跌: <span style="color:${a};font-weight:500">${pt(e.change)} (${ft(e.changePercent)})</span></div>`)}e.volume!==void 0&&t.push(`<div>成交量: ${F(e.volume)}</div>`),e.amount!==void 0&&t.push(`<div>成交额: ${gt(e.amount)}</div>`),e.turnoverRate!==void 0&&e.turnoverRate!==null&&t.push(`<div>换手率: ${e.turnoverRate.toFixed(2)}%</div>`),e.amplitude!==void 0&&e.amplitude!==null&&t.push(`<div>振幅: ${e.amplitude.toFixed(2)}%</div>`);const n=e.indicators??[];let l=!1;if(n.includes("ma")&&e.ma&&(l?t.push(`<div>MA: ${g(e.ma.ma5)} / ${g(e.ma.ma10)} / ${g(e.ma.ma20)}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">MA: ${g(e.ma.ma5)} / ${g(e.ma.ma10)} / ${g(e.ma.ma20)}</div>`),l=!0)),n.includes("boll")&&e.boll&&(l?t.push(`<div>BOLL: 上 ${g(e.boll.upper)} 中 ${g(e.boll.mid)} 下 ${g(e.boll.lower)}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">BOLL: 上 ${g(e.boll.upper)} 中 ${g(e.boll.mid)} 下 ${g(e.boll.lower)}</div>`),l=!0)),n.includes("sar")&&e.sar){const a=e.sar.trend===1?"↑":"↓";l?t.push(`<div>SAR: ${g(e.sar.sar)} ${a}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">SAR: ${g(e.sar.sar)} ${a}</div>`),l=!0)}return n.includes("kc")&&e.kc&&(l?t.push(`<div>KC: 上 ${g(e.kc.upper)} 中 ${g(e.kc.mid)} 下 ${g(e.kc.lower)}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">KC: 上 ${g(e.kc.upper)} 中 ${g(e.kc.mid)} 下 ${g(e.kc.lower)}</div>`),l=!0)),n.includes("macd")&&e.macd&&(l?t.push(`<div>MACD: DIF ${g(e.macd.dif)} DEA ${g(e.macd.dea)} MACD ${g(e.macd.macd)}</div>`):(t.push(`<div style="margin-top:4px;border-top:1px solid #eee;padding-top:4px">MACD: DIF ${g(e.macd.dif)} DEA ${g(e.macd.dea)} MACD ${g(e.macd.macd)}</div>`),l=!0)),n.includes("kdj")&&e.kdj&&t.push(`<div>KDJ: K ${g(e.kdj.k)} D ${g(e.kdj.d)} J ${g(e.kdj.j)}</div>`),n.includes("rsi")&&e.rsi&&t.push(`<div>RSI: ${g(e.rsi.rsi6)} / ${g(e.rsi.rsi12)} / ${g(e.rsi.rsi24)}</div>`),n.includes("wr")&&e.wr&&t.push(`<div>WR: ${g(e.wr.wr6)} / ${g(e.wr.wr10)}</div>`),n.includes("bias")&&e.bias&&t.push(`<div>BIAS: ${g(e.bias.bias6)} / ${g(e.bias.bias12)} / ${g(e.bias.bias24)}</div>`),n.includes("cci")&&e.cci&&t.push(`<div>CCI: ${g(e.cci.cci)}</div>`),n.includes("atr")&&e.atr&&t.push(`<div>ATR: ${g(e.atr.atr)}</div>`),n.includes("obv")&&e.obv&&t.push(`<div>OBV: ${F(e.obv.obv)} MA ${F(e.obv.obvMa)}</div>`),n.includes("roc")&&e.roc&&t.push(`<div>ROC: ${g(e.roc.roc)} SIGNAL ${g(e.roc.signal)}</div>`),n.includes("dmi")&&e.dmi&&t.push(`<div>DMI: +DI ${g(e.dmi.pdi)} -DI ${g(e.dmi.mdi)} ADX ${g(e.dmi.adx)}</div>`),t.join("")}const Le=["ma","boll","sar","kc"],bt="kline-zoom-inside",vt="kline-zoom-slider";function ae(e,t){return Number.isInteger(e)?e.toString():e.toFixed(t).replace(/\.?0+$/,"")}function Qt(e,t){return t.includes("volume")?F(e):Math.abs(e)>=100||Math.abs(e)>=10||Math.abs(e)>=1||Math.abs(e)>=.01?ae(e,2):ae(e,4)}function yt(e,t={}){const n=Math.min(Math.max(t.maxSubPanes??3,0),3),l=e.filter(i=>!Le.includes(i));if(n===0)return[{id:"main",height:"95%",indicators:Le.filter(i=>e.includes(i))}];const a=l.length,s=Math.min(a,n),o=s===0?{main:"95%",sub:"0%"}:s===1?{main:"78%",sub:"18%"}:s===2?{main:"65%",sub:"15%"}:{main:"55%",sub:"13%"},r=[{id:"main",height:o.main,indicators:Le.filter(i=>e.includes(i))}];return l.slice(0,n).forEach((i,d)=>{r.push({id:`sub_${i}_${d}`,height:o.sub,indicators:[i]})}),r}const Re={gap:25,topMargin:50,bottomMargin:55,leftMargin:60,rightMargin:60};function Ct(e,t){const n=[],{gap:l,topMargin:a,bottomMargin:s}=Re,c=t-a-s-(e.length-1)*l;let o=0;const r=[];for(const m of e)if(typeof m.height=="string"&&m.height.endsWith("%")){const f=parseFloat(m.height)/100;r.push(f),o+=f}else typeof m.height=="number"?(r.push(m.height/c),o+=m.height/c):r.push(0);const i=r.filter(m=>m===0).length;if(i>0&&o<1){const m=(1-o)/i;for(let f=0;f<r.length;f++)r[f]===0&&(r[f]=m)}const d=r.reduce((m,f)=>m+f,0);for(let m=0;m<r.length;m++)r[m]=r[m]/d*c;let h=a;for(let m=0;m<e.length;m++)n.push({id:e[m].id,left:Re.leftMargin,right:Re.rightMargin,top:h,height:r[m]}),h+=r[m]+l;return n}function en(e){const{data:t,theme:n,indicators:l,panes:a=yt(l),containerHeight:s=500,indicatorOptions:c}=e,o=typeof(c==null?void 0:c.ma)=="object"?c.ma:void 0,r=(o==null?void 0:o.periods)??[5,10,20,30,60];if(t.length===0)return{title:{text:"暂无数据",left:"center",top:"center",textStyle:{color:n.textColorSecondary}}};const i=Ct(a,s),d=t.map(u=>u.date),h=t.map(u=>u.close),m={animation:!1,backgroundColor:n.backgroundColor,title:{text:"",show:!1},tooltip:{trigger:"axis",axisPointer:{type:"cross",crossStyle:{color:n.crosshairColor},lineStyle:{color:n.crosshairColor,type:"dashed"}},backgroundColor:n.tooltipBgColor,borderColor:n.tooltipBorderColor,textStyle:{color:n.textColor,fontSize:12},formatter:u=>{if(!Array.isArray(u)||u.length===0)return"";const y=u[0].dataIndex,w=t[y];return w?xt({date:w.date,open:w.open,high:w.high,low:w.low,close:w.close,volume:w.volume,amount:w.amount,change:w.change,changePercent:w.changePercent,turnoverRate:w.turnoverRate,amplitude:w.amplitude,indicators:l,ma:w.ma,boll:w.boll,sar:w.sar,kc:w.kc,macd:w.macd,kdj:w.kdj,rsi:w.rsi,wr:w.wr,bias:w.bias,cci:w.cci,atr:w.atr,obv:w.obv,roc:w.roc,dmi:w.dmi}):""}},axisPointer:{link:[{xAxisIndex:"all"}]},grid:i.map(u=>({left:u.left,right:u.right,top:u.top,height:u.height})),xAxis:i.map((u,y)=>({type:"category",data:d,gridIndex:y,axisLine:{lineStyle:{color:n.gridLineColor}},axisTick:{show:!1},axisLabel:{show:y===i.length-1,color:n.textColorSecondary,fontSize:11},splitLine:{show:!1},boundaryGap:!0,min:"dataMin",max:"dataMax"})),yAxis:i.map((u,y)=>({type:"value",gridIndex:y,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:n.textColorSecondary,fontSize:11,formatter:w=>Qt(w,u.id)},splitLine:{lineStyle:{color:n.splitLineColor,type:"dashed"}},splitNumber:u.id==="main"?3:2,scale:u.id!=="volume"&&!u.id.includes("volume")})),dataZoom:[{id:bt,type:"inside",xAxisIndex:i.map((u,y)=>y),minValueSpan:10},{id:vt,type:"slider",xAxisIndex:i.map((u,y)=>y),bottom:8,height:20,borderColor:n.gridLineColor,fillerColor:"rgba(24,144,255,0.1)",handleStyle:{color:n.activeColor},textStyle:{color:n.textColorSecondary}}],series:[]},f=[];for(let u=0;u<a.length;u++){const y=a[u];if(i[u].id==="main"&&f.push({type:"candlestick",name:"K线",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>[b.open,b.close,b.low,b.high]),itemStyle:{color:n.upColor,color0:n.downColor,borderColor:n.upColor,borderColor0:n.downColor}}),y.indicators.includes("ma")&&r.forEach((b,p)=>{const I=`ma${b}`,v=t.map(S=>{var j;return((j=S.ma)==null?void 0:j[I])??null});f.push({type:"line",name:`MA${b}`,xAxisIndex:u,yAxisIndex:u,data:v,smooth:!0,symbol:"none",lineStyle:{width:1,color:n.maColors[p]??n.maColors[0]}})}),y.indicators.includes("boll")){const[b,p,I]=n.bollColors;f.push({type:"line",name:"BOLL上轨",xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.boll)==null?void 0:S.upper)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:b}},{type:"line",name:"BOLL中轨",xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.boll)==null?void 0:S.mid)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:p}},{type:"line",name:"BOLL下轨",xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.boll)==null?void 0:S.lower)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:I}})}if(y.indicators.includes("volume")&&f.push({type:"bar",name:"成交量",xAxisIndex:u,yAxisIndex:u,data:t.map((b,p)=>{const I=p>0?h[p-1]:b.open,v=(b.close??0)>=(I??0);return{value:b.volume,itemStyle:{color:v?n.volumeUpColor:n.volumeDownColor}}})}),y.indicators.includes("macd")&&f.push({type:"bar",name:"MACD",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p,I;return{value:((p=b.macd)==null?void 0:p.macd)??null,itemStyle:{color:(((I=b.macd)==null?void 0:I.macd)??0)>=0?n.upColor:n.downColor}}})},{type:"line",name:"DIF",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.macd)==null?void 0:p.dif)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"DEA",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.macd)==null?void 0:p.dea)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),y.indicators.includes("kdj")&&f.push({type:"line",name:"K",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.kdj)==null?void 0:p.k)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"D",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.kdj)==null?void 0:p.d)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}},{type:"line",name:"J",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.kdj)==null?void 0:p.j)??null}),symbol:"none",lineStyle:{width:1,color:"#722ed1"}}),y.indicators.includes("rsi")&&[6,12,24].forEach((p,I)=>{f.push({type:"line",name:`RSI${p}`,xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.rsi)==null?void 0:S[`rsi${p}`])??null}),symbol:"none",lineStyle:{width:1,color:n.maColors[I]??"#1890ff"}})}),y.indicators.includes("wr")&&[6,10].forEach((p,I)=>{f.push({type:"line",name:`WR${p}`,xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.wr)==null?void 0:S[`wr${p}`])??null}),symbol:"none",lineStyle:{width:1,color:n.maColors[I]??"#1890ff"}})}),y.indicators.includes("bias")&&[6,12,24].forEach((p,I)=>{f.push({type:"line",name:`BIAS${p}`,xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.bias)==null?void 0:S[`bias${p}`])??null}),symbol:"none",lineStyle:{width:1,color:n.maColors[I]??"#1890ff"}})}),y.indicators.includes("cci")&&f.push({type:"line",name:"CCI",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.cci)==null?void 0:p.cci)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}}),y.indicators.includes("atr")&&f.push({type:"line",name:"ATR",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.atr)==null?void 0:p.atr)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}}),y.indicators.includes("obv")&&f.push({type:"line",name:"OBV",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.obv)==null?void 0:p.obv)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"OBV_MA",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.obv)==null?void 0:p.obvMa)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),y.indicators.includes("roc")&&f.push({type:"line",name:"ROC",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.roc)==null?void 0:p.roc)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"ROC_MA",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.roc)==null?void 0:p.signal)??null}),symbol:"none",lineStyle:{width:1,color:"#faad14"}}),y.indicators.includes("dmi")&&f.push({type:"line",name:"+DI",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.dmi)==null?void 0:p.pdi)??null}),symbol:"none",lineStyle:{width:1,color:n.upColor}},{type:"line",name:"-DI",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.dmi)==null?void 0:p.mdi)??null}),symbol:"none",lineStyle:{width:1,color:n.downColor}},{type:"line",name:"ADX",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.dmi)==null?void 0:p.adx)??null}),symbol:"none",lineStyle:{width:1,color:"#1890ff"}},{type:"line",name:"ADXR",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p;return((p=b.dmi)==null?void 0:p.adxr)??null}),symbol:"none",lineStyle:{width:1,color:"#722ed1",type:"dashed"}}),y.indicators.includes("sar")&&f.push({type:"scatter",name:"SAR",xAxisIndex:u,yAxisIndex:u,data:t.map(b=>{var p,I;return{value:((p=b.sar)==null?void 0:p.sar)??null,itemStyle:{color:((I=b.sar)==null?void 0:I.trend)===1?n.upColor:n.downColor}}}),symbol:"circle",symbolSize:4}),y.indicators.includes("kc")){const[b,p,I]=n.kcColors;f.push({type:"line",name:"KC上轨",xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.kc)==null?void 0:S.upper)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:b}},{type:"line",name:"KC中轨",xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.kc)==null?void 0:S.mid)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:p}},{type:"line",name:"KC下轨",xAxisIndex:u,yAxisIndex:u,data:t.map(v=>{var S;return((S=v.kc)==null?void 0:S.lower)??null}),smooth:!0,symbol:"none",lineStyle:{width:1,color:I}})}}return m.series=f,m}function tn(e,t,n="safeMerge"){if(!t)return e;if(n==="replace")return t;const l={...e};for(const a of Object.keys(t)){const s=t[a];s!==void 0&&(Array.isArray(s)?l[a]=s:typeof s=="object"&&s!==null?l[a]={...l[a],...s}:l[a]=s)}return l}function We(e,t){if(e.startsWith("rgba"))return e.replace(/,\s*[\d.]+\)$/,`, ${t})`);if(e.startsWith("rgb("))return e.replace("rgb(","rgba(").replace(")",`, ${t})`);let n=e.replace("#","");n.length===3&&(n=n[0]+n[0]+n[1]+n[1]+n[2]+n[2]);const l=parseInt(n.slice(0,2),16),a=parseInt(n.slice(2,4),16),s=parseInt(n.slice(4,6),16);return`rgba(${l}, ${a}, ${s}, ${t})`}function nn(e){const{data:t,theme:n,prevClose:l,containerHeight:a=500}=e;if(t.length===0)return{title:{text:"暂无分时数据",left:"center",top:"center",textStyle:{color:n.textColorSecondary}}};const s=t.map(I=>I.time),c=t.map(I=>I.price),o=t.map(I=>I.avgPrice),r=t.map((I,v)=>{var j;const S=v>0?((j=t[v-1])==null?void 0:j.volume)??0:0;return I.volume-S}),i=c.filter(I=>I>0),d=i.length>0?Math.min(...i):0,h=i.length>0?Math.max(...i):0,f=(h-d)*.1||1,u=c[c.length-1]??0,y=l?u>=l?n.upColor:n.downColor:n.activeColor,w=Math.max(60,a*.15),b=a-w-100;return{animation:!1,backgroundColor:n.backgroundColor,tooltip:{trigger:"axis",axisPointer:{type:"cross",crossStyle:{color:n.crosshairColor},lineStyle:{color:n.crosshairColor,type:"dashed"}},backgroundColor:n.tooltipBgColor,borderColor:n.tooltipBorderColor,textStyle:{color:n.textColor,fontSize:12},formatter:I=>{if(!Array.isArray(I)||I.length===0)return"";const v=I[0].dataIndex,S=t[v];if(!S)return"";const j=l?((S.price-l)/l*100).toFixed(2):"--",T=l&&S.price>=l?n.upColor:n.downColor;return`
2
- <div style="font-weight:bold;margin-bottom:4px">${S.time}</div>
3
- <div>价格: <span style="color:${T};font-weight:500">${g(S.price)}</span></div>
4
- <div>均价: ${g(S.avgPrice)}</div>
5
- <div>涨跌: <span style="color:${T}">${j}%</span></div>
6
- <div>成交量: ${F(S.volume)}</div>
7
- `}},axisPointer:{link:[{xAxisIndex:"all"}]},grid:[{left:60,right:60,top:40,height:b},{left:60,right:60,top:b+70,height:w}],xAxis:[{type:"category",data:s,gridIndex:0,axisLine:{lineStyle:{color:n.gridLineColor}},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1},boundaryGap:!1},{type:"category",data:s,gridIndex:1,axisLine:{lineStyle:{color:n.gridLineColor}},axisTick:{show:!1},axisLabel:{color:n.textColorSecondary,fontSize:11,formatter:I=>I},splitLine:{show:!1},boundaryGap:!1}],yAxis:[{type:"value",gridIndex:0,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:n.textColorSecondary,fontSize:11,formatter:I=>g(I)},splitLine:{lineStyle:{color:n.splitLineColor,type:"dashed"}},min:d-f,max:h+f},{type:"value",gridIndex:1,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:n.textColorSecondary,fontSize:11,formatter:I=>F(I)},splitLine:{lineStyle:{color:n.splitLineColor,type:"dashed"}}}],series:[{type:"line",name:"价格",xAxisIndex:0,yAxisIndex:0,data:c,symbol:"none",lineStyle:{width:1.5,color:y},areaStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:We(y,.3)},{offset:1,color:We(y,.05)}]}}},{type:"line",name:"均价",xAxisIndex:0,yAxisIndex:0,data:o,symbol:"none",lineStyle:{width:1,color:"#faad14",type:"dashed"}},...l?[{type:"line",name:"昨收",xAxisIndex:0,yAxisIndex:0,data:s.map(()=>l),symbol:"none",lineStyle:{width:1,color:n.textColorSecondary,type:"dotted"}}]:[],{type:"bar",name:"成交量",xAxisIndex:1,yAxisIndex:1,data:r.map((I,v)=>{const S=c[v]??0,j=v>0?c[v-1]??S:l??S;return{value:I,itemStyle:{color:S>=j?n.volumeUpColor:n.volumeDownColor}}})}]}}const on="_container_119o2_1",ln="_spinner_119o2_11",rn="_dot_119o2_16",sn="_text_119o2_43",oe={container:on,spinner:ln,dot:rn,text:sn};function wt({text:e="加载中..."}){return x.jsxs("div",{className:oe.container,children:[x.jsxs("div",{className:oe.spinner,children:[x.jsx("div",{className:oe.dot}),x.jsx("div",{className:oe.dot}),x.jsx("div",{className:oe.dot})]}),x.jsx("span",{className:oe.text,children:e})]})}const cn="_container_1xu4v_1",an="_group_1xu4v_10",un="_button_1xu4v_15",dn="_active_1xu4v_30",be={container:cn,group:an,button:un,active:dn},hn=[{label:"分时",periods:[{value:"timeline",label:"分时"},{value:"timeline5",label:"五日"}]},{label:"周期",periods:[{value:"daily",label:"日K"},{value:"weekly",label:"周K"},{value:"monthly",label:"月K"}]},{label:"分钟",periods:[{value:"1",label:"1分"},{value:"5",label:"5分"},{value:"15",label:"15分"},{value:"30",label:"30分"},{value:"60",label:"60分"}]}];function It({value:e,onChange:t}){return x.jsx("div",{className:be.container,children:hn.map(n=>x.jsx("div",{className:be.group,children:n.periods.map(l=>x.jsx("button",{type:"button",className:`${be.button} ${e===l.value?be.active:""}`,onClick:()=>t(l.value),children:l.label},l.value))},n.label))})}const mn="_container_1fbmi_1",fn="_button_1fbmi_11",pn="_active_1fbmi_27",gn="_divider_1fbmi_33",le={container:mn,button:fn,active:pn,divider:gn},St=[{value:"ma",label:"MA",group:"main"},{value:"boll",label:"BOLL",group:"main"},{value:"sar",label:"SAR",group:"main"},{value:"kc",label:"KC",group:"main"}],xn=[{value:"volume",label:"成交量",group:"sub"},{value:"macd",label:"MACD",group:"sub"},{value:"kdj",label:"KDJ",group:"sub"},{value:"rsi",label:"RSI",group:"sub"},{value:"wr",label:"WR",group:"sub"},{value:"bias",label:"BIAS",group:"sub"},{value:"cci",label:"CCI",group:"sub"},{value:"atr",label:"ATR",group:"sub"},{value:"obv",label:"OBV",group:"sub"},{value:"roc",label:"ROC",group:"sub"},{value:"dmi",label:"DMI",group:"sub"}];function Ne(e){return St.find(n=>n.value===e)?"main":"sub"}function At({value:e,onChange:t,maxSubPanes:n=3,maxMainIndicators:l=2}){const a=s=>{const c=Ne(s);if(e.includes(s))t(e.filter(o=>o!==s));else if(c==="main"){const o=e.filter(r=>Ne(r)==="main");if(o.length>=l){const r=o[o.length-1],i=e.filter(d=>d!==r);t([...i,s])}else t([...e,s])}else{const o=e.filter(r=>Ne(r)==="sub");if(o.length>=n){const r=o[o.length-1],i=e.filter(d=>d!==r);t([...i,s])}else t([...e,s])}};return x.jsxs("div",{className:le.container,children:[St.map(s=>x.jsx("button",{type:"button",className:`${le.button} ${e.includes(s.value)?le.active:""}`,onClick:()=>a(s.value),children:s.label},s.value)),x.jsx("div",{className:le.divider}),xn.map(s=>x.jsx("button",{type:"button",className:`${le.button} ${e.includes(s.value)?le.active:""}`,onClick:()=>a(s.value),children:s.label},s.value))]})}const bn="_container_2tswg_1",vn="_group_2tswg_10",yn="_divider_2tswg_16",Cn="_spacer_2tswg_23",wn="_iconButton_2tswg_27",In="_textButton_2tswg_51",Sn="_active_2tswg_67",D={container:bn,group:vn,divider:yn,spacer:Cn,iconButton:wn,textButton:In,active:Sn},An=[{value:"",label:"不复权"},{value:"qfq",label:"前复权"},{value:"hfq",label:"后复权"}];function kt({adjust:e,onAdjustChange:t,canUndo:n,canRedo:l,onUndo:a,onRedo:s,onZoomIn:c,onZoomOut:o,onPanLeft:r,onPanRight:i,onReset:d,onFullscreen:h}){return x.jsxs("div",{className:D.container,children:[x.jsxs("div",{className:D.group,children:[x.jsx("button",{type:"button",className:D.iconButton,onClick:a,disabled:!n,title:"撤销",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M12.5 8c-2.65 0-5.05.99-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"})})}),x.jsx("button",{type:"button",className:D.iconButton,onClick:s,disabled:!l,title:"重做",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M18.4 10.6C16.55 8.99 14.15 8 11.5 8c-4.65 0-8.58 3.03-9.96 7.22L3.9 16c1.05-3.19 4.05-5.5 7.6-5.5 1.95 0 3.73.72 5.12 1.88L13 16h9V7l-3.6 3.6z"})})})]}),x.jsx("div",{className:D.divider}),x.jsxs("div",{className:D.group,children:[x.jsx("button",{type:"button",className:D.iconButton,onClick:c,title:"放大",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"})})}),x.jsx("button",{type:"button",className:D.iconButton,onClick:o,title:"缩小",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M19 13H5v-2h14v2z"})})})]}),x.jsx("div",{className:D.divider}),x.jsxs("div",{className:D.group,children:[x.jsx("button",{type:"button",className:D.iconButton,onClick:r,title:"向左",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})})}),x.jsx("button",{type:"button",className:D.iconButton,onClick:i,title:"向右",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})})})]}),x.jsx("div",{className:D.divider}),x.jsx("div",{className:D.group,children:x.jsx("button",{type:"button",className:D.textButton,onClick:d,title:"重置",children:"重置"})}),x.jsx("div",{className:D.spacer}),x.jsx("div",{className:D.group,children:An.map(m=>x.jsx("button",{type:"button",className:`${D.textButton} ${e===m.value?D.active:""}`,onClick:()=>t(m.value),children:m.label},m.value))}),h&&x.jsxs(x.Fragment,{children:[x.jsx("div",{className:D.divider}),x.jsx("button",{type:"button",className:D.iconButton,onClick:h,title:"全屏",children:x.jsx("svg",{viewBox:"0 0 24 24",width:"16",height:"16",fill:"currentColor",children:x.jsx("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})})})]})]})}const kn="_container_1vdme_1",$n="_group_1vdme_11",jn="_item_1vdme_18",O={container:kn,group:$n,item:jn};function Mn({data:e,indicators:t,hoverIndex:n,theme:l}){const a=l.maColors,s=l.bollColors,c=l.kcColors,o=C.useMemo(()=>{const m=n??e.length-1,f=e[m];return f||null},[e,n]);if(!o)return null;const r=t.includes("ma"),i=t.includes("boll"),d=t.includes("sar"),h=t.includes("kc");return!r&&!i&&!d&&!h?null:x.jsxs("div",{className:O.container,children:[r&&o.ma&&x.jsx("div",{className:O.group,children:Object.keys(o.ma).filter(m=>{var f,u;return m.startsWith("ma")&&((f=o.ma)==null?void 0:f[m])!==null&&((u=o.ma)==null?void 0:u[m])!==void 0}).map((m,f)=>{var w;const u=(w=o.ma)==null?void 0:w[m],y=a[f]??"#999";return x.jsxs("span",{className:O.item,style:{color:y},children:[m.toUpperCase(),": ",g(u)]},m)})}),i&&o.boll&&x.jsxs("div",{className:O.group,children:[x.jsxs("span",{className:O.item,style:{color:s[0]},children:["UPPER: ",g(o.boll.upper)]}),x.jsxs("span",{className:O.item,style:{color:s[1]},children:["MID: ",g(o.boll.mid)]}),x.jsxs("span",{className:O.item,style:{color:s[2]},children:["LOWER: ",g(o.boll.lower)]})]}),d&&o.sar&&x.jsx("div",{className:O.group,children:x.jsxs("span",{className:O.item,style:{color:o.sar.trend===1?l.upColor:l.downColor},children:["SAR: ",g(o.sar.sar)," ",o.sar.trend===1?"↑":"↓"]})}),h&&o.kc&&x.jsxs("div",{className:O.group,children:[x.jsxs("span",{className:O.item,style:{color:c[0]},children:["KC上: ",g(o.kc.upper)]}),x.jsxs("span",{className:O.item,style:{color:c[1]},children:["KC中: ",g(o.kc.mid)]}),x.jsxs("span",{className:O.item,style:{color:c[2]},children:["KC下: ",g(o.kc.lower)]})]})]})}const _n="_title_p093j_1",Dn="_label_p093j_16",Ln="_value_p093j_21",Te={title:_n,label:Dn,value:Ln},Rn={ma:"MA",boll:"BOLL",sar:"SAR",kc:"KC",volume:"成交量",macd:"MACD",kdj:"KDJ",rsi:"RSI",wr:"WR",bias:"BIAS",cci:"CCI",atr:"ATR",obv:"OBV",roc:"ROC",dmi:"DMI"};function Nn(e,t){if(!t)return"";switch(e){case"volume":return`VOL: ${F(t.volume)}`;case"macd":return t.macd?`DIF: ${g(t.macd.dif)} DEA: ${g(t.macd.dea)} MACD: ${g(t.macd.macd)}`:"";case"kdj":return t.kdj?`K: ${g(t.kdj.k)} D: ${g(t.kdj.d)} J: ${g(t.kdj.j)}`:"";case"rsi":return t.rsi?`RSI6: ${g(t.rsi.rsi6)} RSI12: ${g(t.rsi.rsi12)} RSI24: ${g(t.rsi.rsi24)}`:"";case"wr":return t.wr?`WR6: ${g(t.wr.wr6)} WR10: ${g(t.wr.wr10)}`:"";case"bias":return t.bias?`BIAS6: ${g(t.bias.bias6)} BIAS12: ${g(t.bias.bias12)} BIAS24: ${g(t.bias.bias24)}`:"";case"cci":return t.cci?`CCI: ${g(t.cci.cci)}`:"";case"atr":return t.atr?`ATR: ${g(t.atr.atr)}`:"";case"obv":return t.obv?`OBV: ${F(t.obv.obv)} MA: ${F(t.obv.obvMa)}`:"";case"roc":return t.roc?`ROC: ${g(t.roc.roc)} SIGNAL: ${g(t.roc.signal)}`:"";case"dmi":return t.dmi?`+DI: ${g(t.dmi.pdi)} -DI: ${g(t.dmi.mdi)} ADX: ${g(t.dmi.adx)}`:"";case"sar":return t.sar?`SAR: ${g(t.sar.sar)} ${t.sar.trend===1?"↑":"↓"}`:"";case"kc":return t.kc?`上: ${g(t.kc.upper)} 中: ${g(t.kc.mid)} 下: ${g(t.kc.lower)}`:"";default:return""}}function Tn(e,t){return Ct(e,t).map(l=>({top:l.top,height:l.height}))}function Pn({panes:e,data:t,hoverIndex:n,containerHeight:l}){const a=n??t.length-1,s=t[a],c=C.useMemo(()=>Tn(e,l),[e,l]),o=e.slice(1),r=c.slice(1);return o.length===0?null:x.jsx(x.Fragment,{children:o.map((i,d)=>{const h=i.indicators[0];if(!h)return null;const m=Rn[h]||h.toUpperCase(),f=Nn(h,s),u=r[d];return x.jsxs("div",{className:Te.title,style:{top:(u==null?void 0:u.top)??0},children:[x.jsx("span",{className:Te.label,children:m}),f&&x.jsx("span",{className:Te.value,children:f})]},i.id)})})}const Bn="_container_o8wlo_1",On="_fullscreen_o8wlo_12",Kn="_chartWrapper_o8wlo_23",En="_chart_o8wlo_23",zn="_error_o8wlo_34",Hn="_timelineToolbar_o8wlo_63",Vn="_timelineLabel_o8wlo_71",Fn="_refreshButton_o8wlo_77",Un="_fullscreenButton_o8wlo_78",U={container:Bn,fullscreen:On,chartWrapper:Kn,chart:En,error:zn,timelineToolbar:Hn,timelineLabel:Vn,refreshButton:Fn,fullscreenButton:Un};function Z(e){return e==="timeline"||e==="timeline5"}function Wn(){const e=new Date,t=e.getDay();if(t===0||t===6)return!1;const n=e.getHours(),l=e.getMinutes(),a=n*60+l;return a>=570&&a<=690||a>=780&&a<=900}const qn=C.forwardRef(function(t,n){const{symbol:l,market:a="A",period:s="daily",adjust:c="qfq",height:o=500,width:r="100%",theme:i="light",indicators:d=["ma","volume","macd"],indicatorOptions:h,showToolbar:m=!0,showPeriodSelector:f=!0,showIndicatorSelector:u=!0,maxSubPanes:y=3,visibleCount:w=60,onDataLoad:b,onPeriodChange:p,onError:I,dataProvider:v,sdkOptions:S,requestOptions:j,autoRefresh:T,panes:W,echartsOption:R,echartsOptionMerge:B,className:z,style:Y}=t,[L,H]=C.useState(s),[E,G]=C.useState(c),[K,ve]=C.useState(d),[ye,Ce]=C.useState(!1),[Oe,Ke]=C.useState(null),we=C.useRef(null),Q=C.useRef(null),V=C.useMemo(()=>Ye(i),[i]),Ie=C.useMemo(()=>W??yt(K,{maxSubPanes:y}),[W,K,y]),{data:M,timelineData:de,loading:he,error:ie,refresh:ee}=ut({symbol:l,market:a,period:L,adjust:E,dataProvider:v,sdkOptions:S,requestOptions:j,indicatorOptions:h,indicators:K}),{chartRef:me,setOption:fe,getDataURL:Ee,bindEvent:Se}=dt(),{canUndo:$t,canRedo:jt,currentState:q,pushState:ze,undo:He,redo:Ve,reset:te}=ht(),[pe,Mt]=C.useState(500);C.useEffect(()=>{const A=me.current;if(!A)return;const k=()=>{const $=A.offsetHeight;$>0&&Mt($)};k();const _=new ResizeObserver(k);return _.observe(A),()=>_.disconnect()},[]);const Ae=C.useMemo(()=>T?T===!0?{intervalMs:5e3,onlyTradingTime:!0}:T:null,[T]);C.useEffect(()=>{if(Q.current&&(clearInterval(Q.current),Q.current=null),!Ae||!Z(L))return;const{intervalMs:A=5e3,onlyTradingTime:k=!0}=Ae;return Q.current=setInterval(()=>{k&&!Wn()||ee()},A),()=>{Q.current&&clearInterval(Q.current)}},[Ae,L,ee]),C.useEffect(()=>{const A=Se("mousemove",_=>{const $=_;($==null?void 0:$.dataIndex)!==void 0&&Ke($.dataIndex)}),k=Se("mouseout",()=>{Ke(null)});return()=>{A(),k()}},[Se]),C.useEffect(()=>{var _;if(M.length===0&&!he)return;let A;if(Z(L)&&de.length>0){const $=M.length>0?((_=M[0])==null?void 0:_.close)??void 0:void 0;A=nn({data:de,theme:V,prevClose:$??void 0,containerHeight:pe})}else A=en({data:M,theme:V,indicators:K,panes:Ie,containerHeight:pe,indicatorOptions:h});const k=tn(A,R,B==null?void 0:B.mode);fe(k,{replaceMerge:["series","xAxis","yAxis","grid","title"]})},[M,de,V,K,Ie,w,pe,R,B,fe,he,L]),C.useEffect(()=>{M.length>0&&b&&b(M)},[M,b]),C.useEffect(()=>{ie&&I&&I(ie)},[ie,I]);const ke=C.useCallback(A=>{H(A),te(),p==null||p(A)},[p,te]),_t=C.useCallback(A=>{G(A)},[]),$e=C.useCallback(A=>{ve(A)},[]),N=C.useCallback((A,k,_=!0)=>{const $=Math.max(0,Math.min(100,A)),P=Math.max($,Math.min(100,k));fe({dataZoom:[{id:bt,start:$,end:P},{id:vt,start:$,end:P}]}),_&&ze({start:$,end:P})},[fe,ze]),ge=C.useCallback(A=>A<=0?{start:0,end:100}:{start:Math.max(0,(A-w)/A*100),end:100},[w]),Dt=C.useCallback(()=>{const{start:A,end:k}=q,_=k-A,$=Math.max(_*.6,5),P=(A+k)/2,J=Math.max(0,P-$/2),Me=Math.min(100,P+$/2);N(J,Me)},[N,q]),Lt=C.useCallback(()=>{const{start:A,end:k}=q,_=k-A,$=Math.min(_*1.5,100),P=(A+k)/2,J=Math.max(0,P-$/2),Me=Math.min(100,P+$/2);N(J,Me)},[N,q]),Rt=C.useCallback(()=>{const{start:A,end:k}=q,_=k-A,$=_*.2,P=Math.max(0,A-$),J=P+_;N(P,J)},[N,q]),Nt=C.useCallback(()=>{const{start:A,end:k}=q,_=k-A,$=_*.2,P=Math.min(100,k+$),J=P-_;N(J,P)},[N,q]),Tt=C.useCallback(()=>{const A=He();A&&N(A.start,A.end,!1)},[He,N]),Pt=C.useCallback(()=>{const A=Ve();A&&N(A.start,A.end,!1)},[Ve,N]),je=C.useCallback(()=>{const{start:A,end:k}=ge(M.length);N(A,k,!1),te({start:A,end:k})},[M.length,ge,N,te]),Fe=C.useCallback(()=>{we.current&&(document.fullscreenElement?document.exitFullscreen().then(()=>{Ce(!1)}).catch(()=>{}):we.current.requestFullscreen().then(()=>{Ce(!0)}).catch(()=>{}))},[]);C.useEffect(()=>{const A=()=>{Ce(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",A),()=>{document.removeEventListener("fullscreenchange",A)}},[]),C.useImperativeHandle(n,()=>({refresh:ee,setPeriod:ke,setIndicators:$e,zoomTo:(A,k)=>{N(A,k)},resetZoom:je,getEchartsInstance:()=>me.current,exportImage:A=>Ee({type:A}),getData:()=>M}),[ee,ke,$e,je,N,me,Ee,M]);const Ue=C.useRef("");C.useEffect(()=>{if(Z(L)||M.length===0)return;const A=`${l}_${L}_${E}`;if(A===Ue.current)return;Ue.current=A;const{start:k,end:_}=ge(M.length);N(k,_,!1),te({start:k,end:_})},[l,L,E,M.length,ge,N,te]);const Bt=C.useMemo(()=>({"--kline-bg-color":V.backgroundColor,"--kline-text-color":V.textColor,"--kline-text-secondary":V.textColorSecondary,"--kline-border-color":V.gridLineColor,"--kline-active-color":V.activeColor,"--kline-hover-bg":i==="dark"?"#2a2a2a":"#f5f5f5","--kline-tag-bg":i==="dark"?"#2a2a2a":"#f0f0f0","--kline-text-disabled":i==="dark"?"#444":"#ccc"}),[V,i]),Ot=(K.includes("ma")||K.includes("boll"))&&!Z(L)&&M.length>0;return x.jsxs("div",{ref:we,className:`${U.container} ${ye?U.fullscreen:""} ${z??""}`,style:{...Bt,width:r,height:ye?"100vh":o,...Y},children:[f&&x.jsx(It,{value:L,onChange:ke}),m&&!Z(L)&&x.jsx(kt,{adjust:E,onAdjustChange:_t,canUndo:$t,canRedo:jt,onUndo:Tt,onRedo:Pt,onZoomIn:Dt,onZoomOut:Lt,onPanLeft:Rt,onPanRight:Nt,onReset:je,onFullscreen:Fe}),m&&Z(L)&&x.jsxs("div",{className:U.timelineToolbar,children:[x.jsx("span",{className:U.timelineLabel,children:"分时走势"}),x.jsx("button",{type:"button",className:U.refreshButton,onClick:ee,disabled:he,children:"刷新"}),x.jsx("button",{type:"button",className:U.fullscreenButton,onClick:Fe,children:ye?"退出全屏":"全屏"})]}),Ot&&x.jsx(Mn,{data:M,indicators:K,hoverIndex:Oe,theme:V}),x.jsxs("div",{className:U.chartWrapper,children:[he&&M.length===0&&x.jsx(wt,{}),ie&&M.length===0&&x.jsxs("div",{className:U.error,children:[x.jsxs("span",{children:["加载失败:",ie.message]}),x.jsx("button",{type:"button",onClick:ee,children:"重试"})]}),x.jsx("div",{ref:me,className:U.chart,style:{visibility:M.length>0||de.length>0?"visible":"hidden"}}),!Z(L)&&M.length>0&&x.jsx(Pn,{panes:Ie,data:M,hoverIndex:Oe,containerHeight:pe})]}),u&&!Z(L)&&x.jsx(At,{value:K,onChange:$e})]})});exports.IndicatorSelector=At;exports.KLineChart=qn;exports.Loading=wt;exports.PeriodSelector=It;exports.Toolbar=kt;exports.calcATR=Be;exports.calcBIAS=ot;exports.calcBOLL=Qe;exports.calcCCI=lt;exports.calcDMI=it;exports.calcEMA=X;exports.calcKC=at;exports.calcKDJ=et;exports.calcMA=Je;exports.calcMACD=Xe;exports.calcOBV=rt;exports.calcROC=st;exports.calcRSI=tt;exports.calcSAR=ct;exports.calcSMA=se;exports.calcWMA=Ge;exports.calcWR=nt;exports.darkTheme=Ze;exports.formatAmount=gt;exports.formatChange=pt;exports.formatDate=Xt;exports.formatKlineTooltip=xt;exports.formatNumber=mt;exports.formatPercent=ft;exports.formatPrice=g;exports.formatVolume=F;exports.getTheme=Ye;exports.lightTheme=Pe;exports.useEcharts=dt;exports.useKlineData=ut;exports.useZoomHistory=ht;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("react/jsx-runtime"),r=require("react"),n=require("./SubPaneTitle-BAu9MdQQ.cjs"),Ce={backgroundColor:"#ffffff",textColor:"#333333",textColorSecondary:"#999999",gridLineColor:"#e0e0e0",upColor:"#f5222d",downColor:"#52c41a",maColors:["#f5a623","#1890ff","#722ed1","#13c2c2","#eb2f96","#faad14","#a0d911"],volumeUpColor:"#f5222d",volumeDownColor:"#52c41a",crosshairColor:"#999999",tooltipBgColor:"rgba(255,255,255,0.96)",tooltipBorderColor:"#e0e0e0",splitLineColor:"#f0f0f0",areaColor:"rgba(24,144,255,0.1)",activeColor:"#1890ff",bollColors:["#faad14","#1890ff","#722ed1"],kcColors:["#52c41a","#13c2c2","#eb2f96"]},je={backgroundColor:"#1a1a1a",textColor:"#d1d1d1",textColorSecondary:"#666666",gridLineColor:"#333333",upColor:"#f5222d",downColor:"#52c41a",maColors:["#f5a623","#1890ff","#722ed1","#13c2c2","#eb2f96","#faad14","#a0d911"],volumeUpColor:"#f5222d",volumeDownColor:"#52c41a",crosshairColor:"#666666",tooltipBgColor:"rgba(30,30,30,0.96)",tooltipBorderColor:"#333333",splitLineColor:"#2a2a2a",areaColor:"rgba(24,144,255,0.15)",activeColor:"#1890ff",bollColors:["#faad14","#1890ff","#722ed1"],kcColors:["#52c41a","#13c2c2","#eb2f96"]};function Oe(l){return typeof l=="string"?l==="dark"?je:Ce:{...Ce,...l}}function De(l,d){if(l.startsWith("rgba"))return l.replace(/,\s*[\d.]+\)$/,`, ${d})`);if(l.startsWith("rgb("))return l.replace("rgb(","rgba(").replace(")",`, ${d})`);let t=l.replace("#","");t.length===3&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]);const i=parseInt(t.slice(0,2),16),C=parseInt(t.slice(2,4),16),b=parseInt(t.slice(4,6),16);return`rgba(${i}, ${C}, ${b}, ${d})`}function Xe(l){const{data:d,theme:t,prevClose:i,containerHeight:C=500}=l;if(d.length===0)return{title:{text:"暂无分时数据",left:"center",top:"center",textStyle:{color:t.textColorSecondary}}};const b=d.map(c=>c.time),x=d.map(c=>c.price),R=d.map(c=>c.avgPrice),k=d.map((c,S)=>{var _;const y=S>0?((_=d[S-1])==null?void 0:_.volume)??0:0;return c.volume-y}),v=x.filter(c=>c>0),N=v.length>0?Math.min(...v):0,A=v.length>0?Math.max(...v):0,Z=(A-N)*.1||1,B=x[x.length-1]??0,D=i?B>=i?t.upColor:t.downColor:t.activeColor,H=Math.max(60,C*.15),K=C-H-100;return{animation:!1,backgroundColor:t.backgroundColor,tooltip:{trigger:"axis",axisPointer:{type:"cross",crossStyle:{color:t.crosshairColor},lineStyle:{color:t.crosshairColor,type:"dashed"}},backgroundColor:t.tooltipBgColor,borderColor:t.tooltipBorderColor,textStyle:{color:t.textColor,fontSize:12},formatter:c=>{if(!Array.isArray(c)||c.length===0)return"";const S=c[0].dataIndex,y=d[S];if(!y)return"";const _=i?((y.price-i)/i*100).toFixed(2):"--",F=i&&y.price>=i?t.upColor:t.downColor;return`
2
+ <div style="font-weight:bold;margin-bottom:4px">${y.time}</div>
3
+ <div>价格: <span style="color:${F};font-weight:500">${n.formatPrice(y.price)}</span></div>
4
+ <div>均价: ${n.formatPrice(y.avgPrice)}</div>
5
+ <div>涨跌: <span style="color:${F}">${_}%</span></div>
6
+ <div>成交量: ${n.formatVolume(y.volume)}</div>
7
+ `}},axisPointer:{link:[{xAxisIndex:"all"}]},grid:[{left:60,right:60,top:40,height:K},{left:60,right:60,top:K+70,height:H}],xAxis:[{type:"category",data:b,gridIndex:0,axisLine:{lineStyle:{color:t.gridLineColor}},axisTick:{show:!1},axisLabel:{show:!1},splitLine:{show:!1},boundaryGap:!1},{type:"category",data:b,gridIndex:1,axisLine:{lineStyle:{color:t.gridLineColor}},axisTick:{show:!1},axisLabel:{color:t.textColorSecondary,fontSize:11,formatter:c=>c},splitLine:{show:!1},boundaryGap:!1}],yAxis:[{type:"value",gridIndex:0,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:t.textColorSecondary,fontSize:11,formatter:c=>n.formatPrice(c)},splitLine:{lineStyle:{color:t.splitLineColor,type:"dashed"}},min:N-Z,max:A+Z},{type:"value",gridIndex:1,position:"right",axisLine:{show:!1},axisTick:{show:!1},axisLabel:{color:t.textColorSecondary,fontSize:11,formatter:c=>n.formatVolume(c)},splitLine:{lineStyle:{color:t.splitLineColor,type:"dashed"}}}],series:[{type:"line",name:"价格",xAxisIndex:0,yAxisIndex:0,data:x,symbol:"none",lineStyle:{width:1.5,color:D},areaStyle:{color:{type:"linear",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:De(D,.3)},{offset:1,color:De(D,.05)}]}}},{type:"line",name:"均价",xAxisIndex:0,yAxisIndex:0,data:R,symbol:"none",lineStyle:{width:1,color:"#faad14",type:"dashed"}},...i?[{type:"line",name:"昨收",xAxisIndex:0,yAxisIndex:0,data:b.map(()=>i),symbol:"none",lineStyle:{width:1,color:t.textColorSecondary,type:"dotted"}}]:[],{type:"bar",name:"成交量",xAxisIndex:1,yAxisIndex:1,data:k.map((c,S)=>{const y=x[S]??0,_=S>0?x[S-1]??y:i??y;return{value:c,itemStyle:{color:y>=_?t.volumeUpColor:t.volumeDownColor}}})}]}}function pe({value:l,defaultValue:d,onChange:t}){const[i,C]=r.useState(d),b=l!==void 0,x=b?l:i,R=r.useCallback(k=>{b||C(k),t==null||t(k)},[b,t]);return[x,R]}const et={A:{timeZone:"Asia/Shanghai",sessions:[[570,690],[780,900]]},HK:{timeZone:"Asia/Hong_Kong",sessions:[[570,720],[780,960]]},US:{timeZone:"America/New_York",sessions:[[570,960]]}},Ee=new Map;function tt(l){const d=Ee.get(l);if(d)return d;const t=new Intl.DateTimeFormat("en-US",{timeZone:l,weekday:"short",hour:"2-digit",minute:"2-digit",hour12:!1});return Ee.set(l,t),t}function ot(l,d){var x,R,k;const t=tt(d).formatToParts(l),i=((x=t.find(v=>v.type==="weekday"))==null?void 0:x.value)??"Sun",C=Number(((R=t.find(v=>v.type==="hour"))==null?void 0:R.value)??"0"),b=Number(((k=t.find(v=>v.type==="minute"))==null?void 0:k.value)??"0");return{weekday:i,minutes:C*60+b}}function nt(l,d=new Date){const t=et[l],{weekday:i,minutes:C}=ot(d,t.timeZone);return i==="Sat"||i==="Sun"?!1:t.sessions.some(([b,x])=>C>=b&&C<=x)}const rt="_container_o8wlo_1",at="_fullscreen_o8wlo_12",st="_chartWrapper_o8wlo_23",lt="_chart_o8wlo_23",ct="_error_o8wlo_34",it="_timelineToolbar_o8wlo_63",dt="_timelineLabel_o8wlo_71",ut="_refreshButton_o8wlo_77",ft="_fullscreenButton_o8wlo_78",w={container:rt,fullscreen:at,chartWrapper:st,chart:lt,error:ct,timelineToolbar:it,timelineLabel:dt,refreshButton:ut,fullscreenButton:ft};function M(l){return l==="timeline"||l==="timeline5"}const ht=r.forwardRef(function(d,t){const{symbol:i,market:C="A",period:b,defaultPeriod:x="daily",adjust:R,defaultAdjust:k="qfq",height:v=500,width:N="100%",theme:A="light",indicators:be,defaultIndicators:Z=["ma","volume","macd"],indicatorOptions:B,showToolbar:D=!0,showPeriodSelector:H=!0,showIndicatorSelector:K=!0,maxSubPanes:W=3,visibleCount:c=60,onDataLoad:S,onPeriodChange:y,onAdjustChange:_,onIndicatorsChange:F,onVisibleRangeChange:ne,onError:re,dataProvider:Be,sdkOptions:Ve,requestOptions:$e,autoRefresh:U,panes:xe,echartsOption:ye,echartsOptionMerge:T,className:Ne,style:Ze}=d,[g,ve]=pe({value:b,defaultValue:x,onChange:y}),[E,Se]=pe({value:R,defaultValue:k,onChange:_}),[L,Ie]=pe({value:be,defaultValue:Z,onChange:F}),[ae,se]=r.useState(!1),[ke,Ae]=r.useState(null),le=r.useRef(null),j=r.useRef(null),q=r.useRef(null),we=r.useRef(!1),z=r.useRef(null),I=r.useMemo(()=>Oe(A),[A]),ce=r.useMemo(()=>xe??n.getDefaultPanes(L,{maxSubPanes:W}),[xe,L,W]),{data:u,timelineData:G,loading:J,error:V,refresh:O}=n.useKlineData({symbol:i,market:C,period:g,adjust:E,dataProvider:Be,sdkOptions:Ve,requestOptions:$e,indicatorOptions:B,indicators:L}),{chartRef:ie,setOption:Y,getInstance:Q,getDataURL:Re,bindEvent:$}=n.useEcharts(),{canUndo:He,canRedo:Ke,currentState:h,pushState:X,undo:_e,redo:Le,reset:ee}=n.useZoomHistory(),[te,We]=r.useState(500);r.useEffect(()=>{const e=ie.current;if(!e)return;const o=()=>{const s=e.offsetHeight;s>0&&We(s)};o();const a=new ResizeObserver(o);return a.observe(e),()=>a.disconnect()},[ie]);const de=r.useMemo(()=>U?U===!0?{intervalMs:5e3,onlyTradingTime:!0}:U:null,[U]);r.useEffect(()=>{if(j.current&&(clearInterval(j.current),j.current=null),!de||!M(g))return;const{intervalMs:e=5e3,onlyTradingTime:o=!0}=de;return j.current=setInterval(()=>{o&&!nt(C)||O()},e),()=>{j.current&&clearInterval(j.current)}},[de,C,g,O]),r.useEffect(()=>{const e=$("mousemove",a=>{const s=a;(s==null?void 0:s.dataIndex)!==void 0&&Ae(s.dataIndex)}),o=$("mouseout",()=>{Ae(null)});return()=>{e(),o()}},[$]);const Me=r.useCallback(()=>{var s;const e=(s=Q())==null?void 0:s.getOption(),o=e==null?void 0:e.dataZoom,a=(o==null?void 0:o.find(f=>f.id===n.DATA_ZOOM_INSIDE_ID))??(o==null?void 0:o.find(f=>f.id===n.DATA_ZOOM_SLIDER_ID))??(o==null?void 0:o[0]);return{start:Number((a==null?void 0:a.start)??h.start),end:Number((a==null?void 0:a.end)??h.end)}},[h.end,h.start,Q]);r.useEffect(()=>$("datazoom",()=>{const o=Me(),a=q.current;if(a&&a.start===o.start&&a.end===o.end){q.current=null;return}q.current=null,X(o)}),[$,Me,X]),r.useEffect(()=>{var e,o;if(ne){if(!we.current){we.current=!0,z.current=h;return}((e=z.current)==null?void 0:e.start)===h.start&&((o=z.current)==null?void 0:o.end)===h.end||(z.current=h,ne(h))}},[h,ne]),r.useEffect(()=>{var s;if(u.length===0&&!J)return;let e;if(M(g)&&G.length>0){const f=u.length>0?((s=u[0])==null?void 0:s.close)??void 0:void 0;e=Xe({data:G,theme:I,prevClose:f??void 0,containerHeight:te})}else e=n.buildOption({data:u,theme:I,indicators:L,panes:ce,containerHeight:te,indicatorOptions:B});const o=n.mergeOption(e,ye,T==null?void 0:T.mode),a=Array.from(new Set(["series","xAxis","yAxis","grid","title",...(T==null?void 0:T.replaceMerge)??[]]));Y(o,{replaceMerge:a})},[u,G,I,L,ce,c,te,ye,T,B,Y,J,g]),r.useEffect(()=>{u.length>0&&S&&S(u)},[u,S]),r.useEffect(()=>{V&&re&&re(V)},[V,re]);const ue=r.useCallback(e=>{e!==g&&ve(e)},[g,ve]),fe=r.useCallback(e=>{e!==E&&Se(e)},[E,Se]),he=r.useCallback(e=>{Ie(e)},[Ie]),m=r.useCallback((e,o,a=!0)=>{const s=Math.max(0,Math.min(100,e)),f=Math.max(s,Math.min(100,o));a||(q.current={start:s,end:f}),Y({dataZoom:[{id:n.DATA_ZOOM_INSIDE_ID,start:s,end:f},{id:n.DATA_ZOOM_SLIDER_ID,start:s,end:f}]}),a&&X({start:s,end:f})},[Y,X]),oe=r.useCallback(e=>e<=0?{start:0,end:100}:{start:Math.max(0,(e-c)/e*100),end:100},[c]),Fe=r.useCallback(()=>{const{start:e,end:o}=h,a=o-e,s=Math.max(a*.6,5),f=(e+o)/2,P=Math.max(0,f-s/2),ge=Math.min(100,f+s/2);m(P,ge)},[m,h]),Ue=r.useCallback(()=>{const{start:e,end:o}=h,a=o-e,s=Math.min(a*1.5,100),f=(e+o)/2,P=Math.max(0,f-s/2),ge=Math.min(100,f+s/2);m(P,ge)},[m,h]),qe=r.useCallback(()=>{const{start:e,end:o}=h,a=o-e,s=a*.2,f=Math.max(0,e-s),P=f+a;m(f,P)},[m,h]),ze=r.useCallback(()=>{const{start:e,end:o}=h,a=o-e,s=a*.2,f=Math.min(100,o+s),P=f-a;m(P,f)},[m,h]),Ge=r.useCallback(()=>{const e=_e();e&&m(e.start,e.end,!1)},[_e,m]),Je=r.useCallback(()=>{const e=Le();e&&m(e.start,e.end,!1)},[Le,m]),me=r.useCallback(()=>{const{start:e,end:o}=oe(u.length);m(e,o,!1),ee({start:e,end:o})},[u.length,oe,m,ee]),Te=r.useCallback(()=>{le.current&&(document.fullscreenElement?document.exitFullscreen().then(()=>{se(!1)}).catch(()=>{}):le.current.requestFullscreen().then(()=>{se(!0)}).catch(()=>{}))},[]);r.useEffect(()=>{const e=()=>{se(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]),r.useImperativeHandle(t,()=>({refresh:O,setPeriod:ue,setAdjust:fe,setIndicators:he,zoomTo:(e,o)=>{m(e,o)},resetZoom:me,getVisibleRange:()=>h,getEchartsInstance:()=>Q(),exportImage:e=>Re({type:e,backgroundColor:I.backgroundColor}),getData:()=>u}),[O,ue,fe,he,me,m,h,Q,Re,u,I.backgroundColor]);const Pe=r.useRef("");r.useEffect(()=>{if(M(g)||u.length===0)return;const e=`${i}_${g}_${E}`;if(e===Pe.current)return;Pe.current=e;const{start:o,end:a}=oe(u.length);m(o,a,!1),ee({start:o,end:a})},[i,g,E,u.length,oe,m,ee]);const Ye=r.useMemo(()=>({"--kline-bg-color":I.backgroundColor,"--kline-text-color":I.textColor,"--kline-text-secondary":I.textColorSecondary,"--kline-border-color":I.gridLineColor,"--kline-active-color":I.activeColor,"--kline-hover-bg":A==="dark"?"#2a2a2a":"#f5f5f5","--kline-tag-bg":A==="dark"?"#2a2a2a":"#f0f0f0","--kline-text-disabled":A==="dark"?"#444":"#ccc"}),[I,A]),Qe=L.some(e=>["ma","boll","sar","kc"].includes(e))&&!M(g)&&u.length>0;return p.jsxs("div",{ref:le,className:`${w.container} ${ae?w.fullscreen:""} ${Ne??""}`,style:{...Ye,width:N,height:ae?"100vh":v,...Ze},children:[H&&p.jsx(n.PeriodSelector,{value:g,onChange:ue}),D&&!M(g)&&p.jsx(n.Toolbar,{adjust:E,onAdjustChange:fe,canUndo:He,canRedo:Ke,onUndo:Ge,onRedo:Je,onZoomIn:Fe,onZoomOut:Ue,onPanLeft:qe,onPanRight:ze,onReset:me,onFullscreen:Te}),D&&M(g)&&p.jsxs("div",{className:w.timelineToolbar,children:[p.jsx("span",{className:w.timelineLabel,children:"分时走势"}),p.jsx("button",{type:"button",className:w.refreshButton,onClick:O,disabled:J,children:"刷新"}),p.jsx("button",{type:"button",className:w.fullscreenButton,onClick:Te,children:ae?"退出全屏":"全屏"})]}),Qe&&p.jsx(n.IndicatorDisplay,{data:u,indicators:L,hoverIndex:ke,theme:I}),p.jsxs("div",{className:w.chartWrapper,children:[J&&u.length===0&&p.jsx(n.Loading,{}),V&&u.length===0&&p.jsxs("div",{className:w.error,children:[p.jsxs("span",{children:["加载失败:",V.message]}),p.jsx("button",{type:"button",onClick:O,children:"重试"})]}),p.jsx("div",{ref:ie,className:w.chart,style:{visibility:u.length>0||G.length>0?"visible":"hidden"}}),!M(g)&&u.length>0&&p.jsx(n.SubPaneTitle,{panes:ce,data:u,hoverIndex:ke,containerHeight:te})]}),K&&!M(g)&&p.jsx(n.IndicatorSelector,{value:L,onChange:he,maxSubPanes:W})]})});exports.calcATR=n.calcATR;exports.calcBIAS=n.calcBIAS;exports.calcBOLL=n.calcBOLL;exports.calcCCI=n.calcCCI;exports.calcDMI=n.calcDMI;exports.calcEMA=n.calcEMA;exports.calcKC=n.calcKC;exports.calcKDJ=n.calcKDJ;exports.calcMA=n.calcMA;exports.calcMACD=n.calcMACD;exports.calcOBV=n.calcOBV;exports.calcROC=n.calcROC;exports.calcRSI=n.calcRSI;exports.calcSAR=n.calcSAR;exports.calcSMA=n.calcSMA;exports.calcWMA=n.calcWMA;exports.calcWR=n.calcWR;exports.formatAmount=n.formatAmount;exports.formatChange=n.formatChange;exports.formatDate=n.formatDate;exports.formatKlineTooltip=n.formatKlineTooltip;exports.formatNumber=n.formatNumber;exports.formatPercent=n.formatPercent;exports.formatPrice=n.formatPrice;exports.formatVolume=n.formatVolume;exports.KLineChart=ht;exports.darkTheme=je;exports.getTheme=Oe;exports.lightTheme=Ce;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  export { KLineChart } from './KLineChart';
2
- export type { KLineChartProps, KLineChartRef, PeriodType, MarketType, AdjustType, IndicatorType, IndicatorOptions, KLineDataProvider, GetKlineParams, GetTimelineParams, RequestOptions, AutoRefreshOptions, TimeAxisOptions, EChartsOptionMergeOptions, PaneConfig, SDKOptions, KlineData, KlineWithIndicators, TimelineData, MAResult, MACDResult, BOLLResult, KDJResult, RSIResult, WRResult, BIASResult, CCIResult, ATRResult, OBVResult, ROCResult, DMIResult, SARResult, KCResult, OHLCV, ThemeConfig, } from './types';
2
+ export type { KLineChartProps, KLineChartRef, PeriodType, MarketType, AdjustType, IndicatorType, IndicatorOptions, KLineDataProvider, GetKlineParams, GetTimelineParams, RequestOptions, AutoRefreshOptions, EChartsOptionMergeOptions, PaneConfig, VisibleRange, SDKOptions, KlineData, KlineWithIndicators, TimelineData, MAResult, MACDResult, BOLLResult, KDJResult, RSIResult, WRResult, BIASResult, CCIResult, ATRResult, OBVResult, ROCResult, DMIResult, SARResult, KCResult, OHLCV, ThemeConfig, } from './types';
3
3
  export { lightTheme, darkTheme, getTheme } from './types/theme';
4
4
  export { formatNumber, formatPrice, formatPercent, formatChange, formatVolume, formatAmount, formatDate, formatKlineTooltip, } from './utils/formatters';
5
5
  export { calcMA, calcSMA, calcEMA, calcWMA, calcMACD, calcBOLL, calcKDJ, calcRSI, calcWR, calcBIAS, calcCCI, calcATR, calcOBV, calcROC, calcDMI, calcSAR, calcKC, } from './utils/indicators';
6
- export { useKlineData, useEcharts, useZoomHistory } from './hooks';
7
- export { Loading, PeriodSelector, IndicatorSelector, Toolbar } from './components';