candleview 2.3.5 → 2.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ React keys must be passed directly to JSX without using spread:
18
18
  .indicators-scrollbar::-webkit-scrollbar-thumb:hover {
19
19
  background: ${r?.layout?.textColor||"#000000"}80;
20
20
  }
21
- `,ht={position:"absolute",left:`${l.x}px`,top:`${l.y}px`,background:r?.toolbar?.background||"#fafafa",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"8px",padding:"0",width:"400px",maxWidth:"90vw",height:"400px",maxHeight:"80vh",zIndex:1e4,boxShadow:"0 8px 24px rgba(0,0,0,0.3)",cursor:c?"grabbing":"default",userSelect:c?"none":"auto",display:"flex",flexDirection:"column"},ut={padding:"16px 16px 12px 16px",borderBottom:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,cursor:"grab",userSelect:"none",flexShrink:0},y={fontSize:"14px",fontWeight:"bold",color:r?.layout?.textColor||"#000000",margin:0},W={padding:"16px",flex:1,display:"flex",flexDirection:"column",overflow:"hidden"},nt={marginBottom:"16px",flex:1,overflowY:"auto",overflowX:"hidden",...j},ct={display:"flex",alignItems:"center",gap:"8px",marginBottom:"8px",padding:"8px",background:r?.toolbar?.background||"#fafafa",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px"},it={fontSize:"12px",color:r?.layout?.textColor||"#000000",minWidth:"80px",fontWeight:"bold"},B={width:"60px",padding:"4px 8px",background:r?.toolbar?.background||"#fafafa",color:r?.layout?.textColor||"#000000",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",fontSize:"12px"},G={width:"60px",padding:"4px 8px",background:r?.toolbar?.background||"#fafafa",color:r?.layout?.textColor||"#000000",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",fontSize:"12px"},rt={display:"flex",alignItems:"center",gap:"4px",position:"relative"},ot={width:"24px",height:"24px",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",cursor:"pointer"},dt={position:"absolute",top:0,left:0,width:"24px",height:"24px",border:"none",background:"transparent",cursor:"pointer",opacity:0},pt={background:"transparent",border:"none",fontSize:"16px",cursor:"pointer",padding:"0",width:"20px",height:"20px",display:"flex",alignItems:"center",justifyContent:"center",color:r?.chart?.downColor||"#ff4d4f"},bt={...pt,color:`${r?.toolbar?.border||"#d9d9d9"}`,cursor:"not-allowed"},mt={width:"100%",background:"transparent",color:r?.chart?.lineColor||"#2962FF",border:`2px dashed ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",padding:"8px 16px",fontSize:"12px",cursor:"pointer",marginBottom:"16px",flexShrink:0};({...mt,color:`${r?.toolbar?.border||"#d9d9d9"}`,borderColor:`${r?.toolbar?.border||"#d9d9d9"}`});const At={display:"flex",justifyContent:"flex-end",gap:"8px",flexShrink:0},Et={background:"transparent",color:r?.layout?.textColor||"#000000",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",padding:"6px 12px",fontSize:"12px",cursor:"pointer"},Rt={background:r?.toolbar?.button?.active||"#2962FF",color:r?.toolbar?.button?.activeTextColor||"#ffffff",border:"none",borderRadius:"4px",padding:"6px 12px",fontSize:"12px",cursor:"pointer"},yt={fontSize:"10px",color:`${r?.layout?.textColor||"#000000"}80`,marginTop:"8px",textAlign:"center",flexShrink:0},Ot={position:"fixed",top:0,left:0,right:0,bottom:0,zIndex:9999,background:"transparent"};return!f||!o?null:ue.createPortal(m.jsxs(E.Fragment,{children:[m.jsx("style",{children:st}),m.jsx("div",{style:Ot,onClick:$,children:m.jsxs("div",{ref:M,style:ht,onClick:V=>V.stopPropagation(),onMouseDown:at,onKeyDown:tt,children:[m.jsx("div",{ref:k,style:ut,onMouseDown:V=>{V.target===k.current&&V.preventDefault()},children:m.jsx("div",{style:y,children:K()})}),m.jsxs("div",{style:W,children:[m.jsx("div",{style:nt,className:"indicators-scrollbar",children:o.params?.map((V,I)=>m.jsxs("div",{style:ct,children:[m.jsx("div",{style:it,children:Z(I)}),m.jsx("input",{type:"number",style:B,value:V.paramValue,onChange:q=>A(I,Number(q.target.value)),onClick:q=>q.stopPropagation()}),m.jsxs("select",{style:G,value:V.lineWidth,onChange:q=>R(I,Number(q.target.value)),onClick:q=>q.stopPropagation(),children:[m.jsx("option",{value:1,children:"1px"}),m.jsx("option",{value:2,children:"2px"}),m.jsx("option",{value:3,children:"3px"}),m.jsx("option",{value:4,children:"4px"}),m.jsx("option",{value:5,children:"5px"})]}),m.jsxs("div",{style:rt,children:[m.jsx("div",{style:{...ot,backgroundColor:V.lineColor},onClick:q=>{q.currentTarget.nextSibling?.click()}}),m.jsx("input",{type:"color",style:dt,value:V.lineColor,onChange:q=>x(I,q.target.value),onClick:q=>q.stopPropagation()})]}),S()&&o.params&&m.jsx("button",{onClick:()=>C(I),style:o.params.length<=1?bt:pt,disabled:!o.params||o.params.length<=1,type:"button",title:o.params.length<=1?n.modal?.keepAtLeastOne||"至少保留一个参数":n.modal?.deleteParameter||"删除此参数",children:"×"})]},`${o.id}-${I}`))}),S()&&m.jsxs("button",{onClick:_,style:mt,type:"button",children:["+ ",n.modal?.addParameter||"添加参数"]}),m.jsxs("div",{style:At,children:[m.jsx("button",{onClick:X,style:Et,type:"button",children:n.systemSettings?.cancel||"取消"}),m.jsx("button",{onClick:L,style:Rt,type:"button",children:n.systemSettings?.confirm||"确定"})]}),m.jsxs("div",{style:yt,children:[n.tooltips?.ctrlEnterToConfirm||"Ctrl+Enter: 确认",", ",n.tooltips?.escToCancel||"Esc: 取消",", ",n.modal?.dragToMove||"拖动标题栏移动"]})]})]})})]}),document.body)};class Hn{constructor(t,e=[]){this._defaultIsCircular=!0,this._defaultFontSize=11,this._defaultPadding=2,this._defaultTextColor="white",this._defaultBackgroundColor="green",this._time=t,this._textItems=e}attached(t){this._chart=t.chart,this._series=t.series,t.requestUpdate()}updateAllViews(){}paneViews(){return this._renderer||(this._renderer={draw:t=>{const e=t.context??t._context;if(!e||!this._chart||!this._series)return;const i=this._chart.timeScale().timeToCoordinate(this._time);if(i==null)return;const r=this._series.data().find(n=>n.time===this._time);if(!r)return;const a=r.low;let s=this._series.priceToCoordinate(a);if(s!=null){s+=20,e.save();for(let n=0;n<this._textItems.length;n++){const o=this._textItems[n],h=s+n*40,l=o.fontSize??this._defaultFontSize,g="Arial";e.font=`${l}px ${g}`;const d=e.measureText(o.text).width,u=l,p=o.padding??this._defaultPadding,M=d+p*2,k=u+p*2,P=i-M/2,S=h-k/2;if(e.fillStyle=o.backgroundColor??this._defaultBackgroundColor,o.isCircular??this._defaultIsCircular){const _=Math.max(M,k)/2;e.beginPath(),e.arc(i,h,_,0,Math.PI*2),e.fill()}else e.fillRect(P,S,M,k);e.fillStyle=o.textColor??this._defaultTextColor,e.textAlign="center",e.textBaseline="middle",e.fillText(o.text,i,h)}e.restore()}}}),[{renderer:()=>this._renderer}]}addTextItem(t,e="white",i="blue",r=!1,a=this._defaultFontSize,s=this._defaultPadding){this._textItems.push({text:t,textColor:e,backgroundColor:i,isCircular:r,fontSize:a,padding:s}),this._chart&&this._chart.requestUpdate()}setTextItems(t){this._textItems=t,this._chart&&this._chart.requestUpdate()}updateText(t,e){this._textItems[t]&&(this._textItems[t].text=e,this._chart&&this._chart.requestUpdate())}updateColors(t,e,i){this._textItems[t]&&(this._textItems[t].textColor=e,this._textItems[t].backgroundColor=i,this._chart&&this._chart.requestUpdate())}updateCircular(t,e){this._textItems[t]&&(this._textItems[t].isCircular=e,this._chart&&this._chart.requestUpdate())}removeTextItem(t){this._textItems[t]&&(this._textItems.splice(t,1),this._chart&&this._chart.requestUpdate())}clearTextItems(){this._textItems=[],this._chart&&this._chart.requestUpdate()}getTextItemCount(){return this._textItems.length}}class On{constructor(t,e=[]){this._defaultIsCircular=!0,this._defaultFontSize=11,this._defaultPadding=2,this._defaultTextColor="white",this._defaultBackgroundColor="red",this._time=t,this._textItems=e}attached(t){this._chart=t.chart,this._series=t.series,t.requestUpdate()}updateAllViews(){}paneViews(){return this._renderer||(this._renderer={draw:t=>{const e=t.context??t._context;if(!e||!this._chart||!this._series)return;const i=this._chart.timeScale().timeToCoordinate(this._time);if(i==null)return;const r=this._series.data().find(n=>n.time===this._time);if(!r)return;const a=r.high;let s=this._series.priceToCoordinate(a);if(s!=null){s-=20,e.save();for(let n=0;n<this._textItems.length;n++){const o=this._textItems[n],h=s-n*40,l=o.fontSize??this._defaultFontSize,g="Arial";e.font=`${l}px ${g}`;const d=e.measureText(o.text).width,u=l,p=o.padding??this._defaultPadding,M=d+p*2,k=u+p*2,P=i-M/2,S=h-k/2;if(e.fillStyle=o.backgroundColor??this._defaultBackgroundColor,o.isCircular??this._defaultIsCircular){const _=Math.max(M,k)/2;e.beginPath(),e.arc(i,h,_,0,Math.PI*2),e.fill()}else e.fillRect(P,S,M,k);e.fillStyle=o.textColor??this._defaultTextColor,e.textAlign="center",e.textBaseline="middle",e.fillText(o.text,i,h)}e.restore()}}}),[{renderer:()=>this._renderer}]}addTextItem(t,e="white",i="blue",r=!1,a=this._defaultFontSize,s=this._defaultPadding){this._textItems.push({text:t,textColor:e,backgroundColor:i,isCircular:r,fontSize:a,padding:s}),this._chart&&this._chart.requestUpdate()}setTextItems(t){this._textItems=t,this._chart&&this._chart.requestUpdate()}updateText(t,e){this._textItems[t]&&(this._textItems[t].text=e,this._chart&&this._chart.requestUpdate())}updateColors(t,e,i){this._textItems[t]&&(this._textItems[t].textColor=e,this._textItems[t].backgroundColor=i,this._chart&&this._chart.requestUpdate())}updateCircular(t,e){this._textItems[t]&&(this._textItems[t].isCircular=e,this._chart&&this._chart.requestUpdate())}removeTextItem(t){this._textItems[t]&&(this._textItems.splice(t,1),this._chart&&this._chart.requestUpdate())}clearTextItems(){this._textItems=[],this._chart&&this._chart.requestUpdate()}getTextItemCount(){return this._textItems.length}}var _e=(f=>(f.Top="Top",f.Bottom="Bottom",f))(_e||{}),Yi=(f=>(f.Text="Text",f.Arrow="Arrow",f))(Yi||{});class jn{constructor(){this._marks=[],this._tolerance=1440*60*1e3,this._timeframe="1d",this._chartSeries=null}autoDetectTimeframe(t){if(!t||t.length<2)return"1d";const e=[];for(let r=1;r<Math.min(t.length,10);r++){const a=t[r].time-t[r-1].time;e.push(a)}const i=this.median(e);return i<=60*1e3?"1m":i<=300*1e3?"5m":i<=900*1e3?"15m":i<=3600*1e3?"1h":i<=14400*1e3?"4h":i<=1440*60*1e3?"1d":i<=10080*60*1e3?"1w":"1M"}median(t){if(t.length===0)return 0;t.sort((i,r)=>i-r);const e=Math.floor(t.length/2);return t.length%2?t[e]:(t[e-1]+t[e])/2}calculateTolerance(t){const e=t.slice(-1).toLowerCase(),i=parseInt(t.slice(0,-1))||1;switch(e){case"m":return Math.max(i*60*1e3,300*1e3);case"h":return i*60*60*1e3;case"d":return i*24*60*60*1e3;case"w":return i*7*24*60*60*1e3;case"M":return i*30*24*60*60*1e3;default:return 1440*60*1e3}}findClosestBarTime(t,e){const i=this.autoDetectTimeframe(t);i!==this._timeframe&&(this._timeframe=i,this._tolerance=this.calculateTolerance(i));let r=null,a=1/0;for(const s of t){const n=Math.abs(s.time-e);this._timeframe.endsWith("w")||this._timeframe.endsWith("M")?this.isInSameTimeUnit(s.time,e,this._timeframe)&&n<a&&(a=n,r=s.time):n<=this._tolerance&&n<a&&(a=n,r=s.time)}return r}isInSameTimeUnit(t,e,i){const r=new Date(t),a=new Date(e);if(i.endsWith("w")){const s=this.getWeekNumber(r),n=this.getWeekNumber(a);return s.year===n.year&&s.week===n.week}else if(i.endsWith("M"))return r.getFullYear()===a.getFullYear()&&r.getMonth()===a.getMonth();return!1}getWeekNumber(t){const e=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate())),i=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-i);const r=new Date(Date.UTC(e.getUTCFullYear(),0,1));return{year:e.getUTCFullYear(),week:Math.ceil(((e.getTime()-r.getTime())/864e5+1)/7)}}addMark(t,e){this._chartSeries=e;const i=e.series.data();if(!i||i.length===0)return;const r=new Map;t.forEach(s=>{r.has(s.time)||r.set(s.time,[]),r.get(s.time).push(s)});const a=new Map;r.forEach((s,n)=>{const o=this.findClosestBarTime(i,n);o!==null&&(a.has(o)||a.set(o,[]),s.forEach(h=>{a.get(o).push({...h,time:o})}))}),a.forEach((s,n)=>{const o=new Map;s.forEach(h=>{const l=Object.values(Yi).find(g=>g===h.type);l&&(o.has(l)||o.set(l,[]),o.get(l).push(h))}),o.forEach((h,l)=>{const g=h.flatMap(u=>u.data),c=g.filter(u=>Object.values(_e).find(p=>p===u.direction)==="Top"),d=g.filter(u=>Object.values(_e).find(p=>p===u.direction)==="Bottom");c.length>0&&this.addTopMark([{time:n,type:l,data:c}],l,e),d.length>0&&this.addBottomMark([{time:n,type:l,data:d}],l,e)})})}recalculateMarks(){this._chartSeries&&([...this._marks],this.clearAllMarks())}refreshTimeframe(){if(!this._chartSeries)return;const t=this._chartSeries.series.data();if(!t||t.length<2)return;const e=this.autoDetectTimeframe(t);e!==this._timeframe&&(this._timeframe=e,this._tolerance=this.calculateTolerance(e),this.recalculateMarks())}addTopMark(t,e,i){switch(e){case"Text":t.forEach(r=>{const a=r.data.map(n=>{const o={text:n.text};return n.textColor!==void 0&&(o.textColor=n.textColor),n.backgroundColor!==void 0&&(o.backgroundColor=n.backgroundColor),n.isCircular!==void 0&&(o.isCircular=n.isCircular),n.fontSize!==void 0&&(o.fontSize=n.fontSize),n.padding!==void 0&&(o.padding=n.padding),o}),s=new On(r.time,a);i.series.attachPrimitive(s),this._marks.push(s)});break;case"Arrow":break;default:return}}addBottomMark(t,e,i){switch(e){case"Text":t.forEach(r=>{const a=r.data.map(n=>{const o={text:n.text};return n.textColor!==void 0&&(o.textColor=n.textColor),n.backgroundColor!==void 0&&(o.backgroundColor=n.backgroundColor),n.isCircular!==void 0&&(o.isCircular=n.isCircular),n.fontSize!==void 0&&(o.fontSize=n.fontSize),n.padding!==void 0&&(o.padding=n.padding),o}),s=new Hn(r.time,a);i.series.attachPrimitive(s),this._marks.push(s)});break;case"Arrow":break;default:return}}removeAllMark(){this._marks=[]}getTolerance(){return this._tolerance}getTimeframe(){return this._timeframe}getMarkCount(){return this._marks.length}clearAllMarks(t){const e=t||this._chartSeries;e&&this._marks.forEach(i=>{e.series.detachPrimitive(i)}),this._marks=[]}destroy(){this.clearAllMarks(),this._chartSeries=null}}class Nn{calculateADX(t,e){if(t.length<e+1)return{ADX:[],PlusDI:[],MinusDI:[]};const i={ADX:[],PlusDI:[],MinusDI:[]},r=t.map(S=>S.time),a=[0],s=[0],n=[0];for(let S=1;S<t.length;S++){const _=t[S].high,C=t[S].low,A=t[S-1].high,x=t[S-1].low,R=t[S-1].close,U=Math.max(_-C,Math.abs(_-R),Math.abs(C-R));a.push(U);const L=_-A,X=x-C;L>X&&L>0?(s.push(L),n.push(0)):X>L&&X>0?(s.push(0),n.push(X)):(s.push(0),n.push(0))}const o=[],h=[],l=[];let g=a.slice(0,e).reduce((S,_)=>S+_,0),c=s.slice(0,e).reduce((S,_)=>S+_,0),d=n.slice(0,e).reduce((S,_)=>S+_,0);o.push(g),h.push(c),l.push(d);for(let S=e;S<a.length;S++)g=g-g/e+a[S],c=c-c/e+s[S],d=d-d/e+n[S],o.push(g),h.push(c),l.push(d);const u=[],p=[],M=[];for(let S=0;S<o.length;S++){if(o[S]===0){u.push(0),p.push(0),M.push(0);continue}const _=h[S]/o[S]*100,C=l[S]/o[S]*100;u.push(_),p.push(C);const A=_+C,x=A>0?Math.abs(_-C)/A*100:0;M.push(x)}const k=[];if(M.length>=e){let S=M.slice(0,e).reduce((_,C)=>_+C,0)/e;k.push(S);for(let _=e;_<M.length;_++)S=(S*(e-1)+M[_])/e,k.push(S)}const P=e;for(let S=0;S<k.length;S++){const _=P+S;_<t.length&&(i.ADX.push({time:r[_],value:Math.min(100,Math.max(0,k[S])),...t[_].isVirtual&&{color:"transparent"}}),S<u.length&&i.PlusDI.push({time:r[_],value:Math.min(100,Math.max(0,u[S])),...t[_].isVirtual&&{color:"transparent"}}),S<p.length&&i.MinusDI.push({time:r[_],value:Math.min(100,Math.max(0,p[S])),...t[_].isVirtual&&{color:"transparent"}}))}return i}calculate(t,e){return t.forEach(i=>{const r=this.calculateADX(e,i.paramValue);let a=[];switch(i.paramName){case"ADX":a=r.ADX;break;case"+DI":a=r.PlusDI;break;case"-DI":a=r.MinusDI;break}a.length>0&&(i.data=a)}),t}}class wt{constructor(t,e,i,r,a,s,n,o,h){this.id=t,this.size=e,this.vertPosition=i,this.indicatorType=r,this.chartInstance=a,this.paneInstance=s,this.theme=n,this.onSettingsClick=o,this.onCloseClick=h,this._infoElement=null}init(t,e){}createInfoElement(){if(!this.paneInstance)return;const t=this.paneInstance.getHTMLElement();if(!t)return;this._infoElement=document.createElement("div"),this._infoElement.className="chart-pane-info",this._infoElement.style.cssText=`
21
+ `,ht={position:"absolute",left:`${l.x}px`,top:`${l.y}px`,background:r?.toolbar?.background||"#fafafa",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"8px",padding:"0",width:"400px",maxWidth:"90vw",height:"400px",maxHeight:"80vh",zIndex:1e4,boxShadow:"0 8px 24px rgba(0,0,0,0.3)",cursor:c?"grabbing":"default",userSelect:c?"none":"auto",display:"flex",flexDirection:"column"},ut={padding:"16px 16px 12px 16px",borderBottom:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,cursor:"grab",userSelect:"none",flexShrink:0},y={fontSize:"14px",fontWeight:"bold",color:r?.layout?.textColor||"#000000",margin:0},W={padding:"16px",flex:1,display:"flex",flexDirection:"column",overflow:"hidden"},nt={marginBottom:"16px",flex:1,overflowY:"auto",overflowX:"hidden",...j},ct={display:"flex",alignItems:"center",gap:"8px",marginBottom:"8px",padding:"8px",background:r?.toolbar?.background||"#fafafa",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px"},it={fontSize:"12px",color:r?.layout?.textColor||"#000000",minWidth:"80px",fontWeight:"bold"},B={width:"60px",padding:"4px 8px",background:r?.toolbar?.background||"#fafafa",color:r?.layout?.textColor||"#000000",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",fontSize:"12px"},G={width:"60px",padding:"4px 8px",background:r?.toolbar?.background||"#fafafa",color:r?.layout?.textColor||"#000000",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",fontSize:"12px"},rt={display:"flex",alignItems:"center",gap:"4px",position:"relative"},ot={width:"24px",height:"24px",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",cursor:"pointer"},dt={position:"absolute",top:0,left:0,width:"24px",height:"24px",border:"none",background:"transparent",cursor:"pointer",opacity:0},pt={background:"transparent",border:"none",fontSize:"16px",cursor:"pointer",padding:"0",width:"20px",height:"20px",display:"flex",alignItems:"center",justifyContent:"center",color:r?.chart?.downColor||"#ff4d4f"},bt={...pt,color:`${r?.toolbar?.border||"#d9d9d9"}`,cursor:"not-allowed"},mt={width:"100%",background:"transparent",color:r?.chart?.lineColor||"#2962FF",border:`2px dashed ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",padding:"8px 16px",fontSize:"12px",cursor:"pointer",marginBottom:"16px",flexShrink:0};({...mt,color:`${r?.toolbar?.border||"#d9d9d9"}`,borderColor:`${r?.toolbar?.border||"#d9d9d9"}`});const At={display:"flex",justifyContent:"flex-end",gap:"8px",flexShrink:0},Et={background:"transparent",color:r?.layout?.textColor||"#000000",border:`1px solid ${r?.toolbar?.border||"#d9d9d9"}`,borderRadius:"4px",padding:"6px 12px",fontSize:"12px",cursor:"pointer"},Rt={background:r?.toolbar?.button?.active||"#2962FF",color:r?.toolbar?.button?.activeTextColor||"#ffffff",border:"none",borderRadius:"4px",padding:"6px 12px",fontSize:"12px",cursor:"pointer"},yt={fontSize:"10px",color:`${r?.layout?.textColor||"#000000"}80`,marginTop:"8px",textAlign:"center",flexShrink:0},Ot={position:"fixed",top:0,left:0,right:0,bottom:0,zIndex:9999,background:"transparent"};return!f||!o?null:ue.createPortal(m.jsxs(E.Fragment,{children:[m.jsx("style",{children:st}),m.jsx("div",{style:Ot,onClick:$,children:m.jsxs("div",{ref:M,style:ht,onClick:V=>V.stopPropagation(),onMouseDown:at,onKeyDown:tt,children:[m.jsx("div",{ref:k,style:ut,onMouseDown:V=>{V.target===k.current&&V.preventDefault()},children:m.jsx("div",{style:y,children:K()})}),m.jsxs("div",{style:W,children:[m.jsx("div",{style:nt,className:"indicators-scrollbar",children:o.params?.map((V,I)=>m.jsxs("div",{style:ct,children:[m.jsx("div",{style:it,children:Z(I)}),m.jsx("input",{type:"number",style:B,value:V.paramValue,onChange:q=>A(I,Number(q.target.value)),onClick:q=>q.stopPropagation()}),m.jsxs("select",{style:G,value:V.lineWidth,onChange:q=>R(I,Number(q.target.value)),onClick:q=>q.stopPropagation(),children:[m.jsx("option",{value:1,children:"1px"}),m.jsx("option",{value:2,children:"2px"}),m.jsx("option",{value:3,children:"3px"}),m.jsx("option",{value:4,children:"4px"}),m.jsx("option",{value:5,children:"5px"})]}),m.jsxs("div",{style:rt,children:[m.jsx("div",{style:{...ot,backgroundColor:V.lineColor},onClick:q=>{q.currentTarget.nextSibling?.click()}}),m.jsx("input",{type:"color",style:dt,value:V.lineColor,onChange:q=>x(I,q.target.value),onClick:q=>q.stopPropagation()})]}),S()&&o.params&&m.jsx("button",{onClick:()=>C(I),style:o.params.length<=1?bt:pt,disabled:!o.params||o.params.length<=1,type:"button",title:o.params.length<=1?n.modal?.keepAtLeastOne||"至少保留一个参数":n.modal?.deleteParameter||"删除此参数",children:"×"})]},`${o.id}-${I}`))}),S()&&m.jsxs("button",{onClick:_,style:mt,type:"button",children:["+ ",n.modal?.addParameter||"添加参数"]}),m.jsxs("div",{style:At,children:[m.jsx("button",{onClick:X,style:Et,type:"button",children:n.systemSettings?.cancel||"取消"}),m.jsx("button",{onClick:L,style:Rt,type:"button",children:n.systemSettings?.confirm||"确定"})]}),m.jsxs("div",{style:yt,children:[n.tooltips?.ctrlEnterToConfirm||"Ctrl+Enter: 确认",", ",n.tooltips?.escToCancel||"Esc: 取消",", ",n.modal?.dragToMove||"拖动标题栏移动"]})]})]})})]}),document.body)};class Hn{constructor(t,e=[]){this._defaultIsCircular=!0,this._defaultFontSize=11,this._defaultPadding=2,this._defaultTextColor="white",this._defaultBackgroundColor="green",this._time=t,this._textItems=e}attached(t){this._chart=t.chart,this._series=t.series,t.requestUpdate()}updateAllViews(){}paneViews(){return this._renderer||(this._renderer={draw:t=>{const e=t.context??t._context;if(!e||!this._chart||!this._series)return;const i=this._chart.timeScale().timeToCoordinate(this._time);if(i==null)return;const r=this._series.data().find(n=>n.time===this._time);if(!r)return;const a=r.low;let s=this._series.priceToCoordinate(a);if(s!=null){s+=20,e.save();for(let n=0;n<this._textItems.length;n++){const o=this._textItems[n],h=s+n*40,l=o.fontSize??this._defaultFontSize,g="Arial";e.font=`${l}px ${g}`;const d=e.measureText(o.text).width,u=l,p=o.padding??this._defaultPadding,M=d+p*2,k=u+p*2,P=i-M/2,S=h-k/2;if(e.fillStyle=o.backgroundColor??this._defaultBackgroundColor,o.isCircular??this._defaultIsCircular){const _=Math.max(M,k)/2;e.beginPath(),e.arc(i,h,_,0,Math.PI*2),e.fill()}else e.fillRect(P,S,M,k);e.fillStyle=o.textColor??this._defaultTextColor,e.textAlign="center",e.textBaseline="middle",e.fillText(o.text,i,h)}e.restore()}}}),[{renderer:()=>this._renderer}]}addTextItem(t,e="white",i="blue",r=!1,a=this._defaultFontSize,s=this._defaultPadding){this._textItems.push({text:t,textColor:e,backgroundColor:i,isCircular:r,fontSize:a,padding:s}),this._chart&&this._chart.requestUpdate()}setTextItems(t){this._textItems=t,this._chart&&this._chart.requestUpdate()}updateText(t,e){this._textItems[t]&&(this._textItems[t].text=e,this._chart&&this._chart.requestUpdate())}updateColors(t,e,i){this._textItems[t]&&(this._textItems[t].textColor=e,this._textItems[t].backgroundColor=i,this._chart&&this._chart.requestUpdate())}updateCircular(t,e){this._textItems[t]&&(this._textItems[t].isCircular=e,this._chart&&this._chart.requestUpdate())}removeTextItem(t){this._textItems[t]&&(this._textItems.splice(t,1),this._chart&&this._chart.requestUpdate())}clearTextItems(){this._textItems=[],this._chart&&this._chart.requestUpdate()}getTextItemCount(){return this._textItems.length}}class On{constructor(t,e=[]){this._defaultIsCircular=!0,this._defaultFontSize=11,this._defaultPadding=2,this._defaultTextColor="white",this._defaultBackgroundColor="red",this._time=t,this._textItems=e}attached(t){this._chart=t.chart,this._series=t.series,t.requestUpdate()}updateAllViews(){}paneViews(){return this._renderer||(this._renderer={draw:t=>{const e=t.context??t._context;if(!e||!this._chart||!this._series)return;const i=this._chart.timeScale().timeToCoordinate(this._time);if(i==null)return;const r=this._series.data().find(n=>n.time===this._time);if(!r)return;const a=r.high;let s=this._series.priceToCoordinate(a);if(s!=null){s-=20,e.save();for(let n=0;n<this._textItems.length;n++){const o=this._textItems[n],h=s-n*40,l=o.fontSize??this._defaultFontSize,g="Arial";e.font=`${l}px ${g}`;const d=e.measureText(o.text).width,u=l,p=o.padding??this._defaultPadding,M=d+p*2,k=u+p*2,P=i-M/2,S=h-k/2;if(e.fillStyle=o.backgroundColor??this._defaultBackgroundColor,o.isCircular??this._defaultIsCircular){const _=Math.max(M,k)/2;e.beginPath(),e.arc(i,h,_,0,Math.PI*2),e.fill()}else e.fillRect(P,S,M,k);e.fillStyle=o.textColor??this._defaultTextColor,e.textAlign="center",e.textBaseline="middle",e.fillText(o.text,i,h)}e.restore()}}}),[{renderer:()=>this._renderer}]}addTextItem(t,e="white",i="blue",r=!1,a=this._defaultFontSize,s=this._defaultPadding){this._textItems.push({text:t,textColor:e,backgroundColor:i,isCircular:r,fontSize:a,padding:s}),this._chart&&this._chart.requestUpdate()}setTextItems(t){this._textItems=t,this._chart&&this._chart.requestUpdate()}updateText(t,e){this._textItems[t]&&(this._textItems[t].text=e,this._chart&&this._chart.requestUpdate())}updateColors(t,e,i){this._textItems[t]&&(this._textItems[t].textColor=e,this._textItems[t].backgroundColor=i,this._chart&&this._chart.requestUpdate())}updateCircular(t,e){this._textItems[t]&&(this._textItems[t].isCircular=e,this._chart&&this._chart.requestUpdate())}removeTextItem(t){this._textItems[t]&&(this._textItems.splice(t,1),this._chart&&this._chart.requestUpdate())}clearTextItems(){this._textItems=[],this._chart&&this._chart.requestUpdate()}getTextItemCount(){return this._textItems.length}}var _e=(f=>(f.Top="Top",f.Bottom="Bottom",f))(_e||{}),Yi=(f=>(f.Text="Text",f.Arrow="Arrow",f))(Yi||{});class jn{constructor(){this._marks=[],this._tolerance=1440*60*1e3,this._timeframe="1d",this._chartSeries=null}autoDetectTimeframe(t){if(!t||t.length<2)return"1d";const e=[];for(let r=1;r<Math.min(t.length,10);r++){const a=t[r].time-t[r-1].time;e.push(a)}const i=this.median(e);return i<=60*1e3?"1m":i<=300*1e3?"5m":i<=900*1e3?"15m":i<=3600*1e3?"1h":i<=14400*1e3?"4h":i<=1440*60*1e3?"1d":i<=10080*60*1e3?"1w":"1M"}median(t){if(t.length===0)return 0;t.sort((i,r)=>i-r);const e=Math.floor(t.length/2);return t.length%2?t[e]:(t[e-1]+t[e])/2}calculateTolerance(t){const e=t.slice(-1).toLowerCase(),i=parseInt(t.slice(0,-1))||1;switch(e){case"m":return Math.max(i*60*1e3,300*1e3);case"h":return i*60*60*1e3;case"d":return i*24*60*60*1e3;case"w":return i*7*24*60*60*1e3;case"M":return i*30*24*60*60*1e3;default:return 1440*60*1e3}}findClosestBarTime(t,e){const i=this.autoDetectTimeframe(t);i!==this._timeframe&&(this._timeframe=i,this._tolerance=this.calculateTolerance(i));let r=null,a=1/0;for(const s of t){const n=Math.abs(s.time-e);this._timeframe.endsWith("w")||this._timeframe.endsWith("M")?this.isInSameTimeUnit(s.time,e,this._timeframe)&&n<a&&(a=n,r=s.time):n<=this._tolerance&&n<a&&(a=n,r=s.time)}return r}isInSameTimeUnit(t,e,i){const r=new Date(t),a=new Date(e);if(i.endsWith("w")){const s=this.getWeekNumber(r),n=this.getWeekNumber(a);return s.year===n.year&&s.week===n.week}else if(i.endsWith("M"))return r.getFullYear()===a.getFullYear()&&r.getMonth()===a.getMonth();return!1}getWeekNumber(t){const e=new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate())),i=e.getUTCDay()||7;e.setUTCDate(e.getUTCDate()+4-i);const r=new Date(Date.UTC(e.getUTCFullYear(),0,1));return{year:e.getUTCFullYear(),week:Math.ceil(((e.getTime()-r.getTime())/864e5+1)/7)}}addMark(t,e){if(!e||!e.series)return;this._chartSeries=e;const i=e.series.data();if(!i||i.length===0)return;const r=new Map;t.forEach(s=>{r.has(s.time)||r.set(s.time,[]),r.get(s.time).push(s)});const a=new Map;r.forEach((s,n)=>{const o=this.findClosestBarTime(i,n);o!==null&&(a.has(o)||a.set(o,[]),s.forEach(h=>{a.get(o).push({...h,time:o})}))}),a.forEach((s,n)=>{const o=new Map;s.forEach(h=>{const l=Object.values(Yi).find(g=>g===h.type);l&&(o.has(l)||o.set(l,[]),o.get(l).push(h))}),o.forEach((h,l)=>{const g=h.flatMap(u=>u.data),c=g.filter(u=>Object.values(_e).find(p=>p===u.direction)==="Top"),d=g.filter(u=>Object.values(_e).find(p=>p===u.direction)==="Bottom");c.length>0&&this.addTopMark([{time:n,type:l,data:c}],l,e),d.length>0&&this.addBottomMark([{time:n,type:l,data:d}],l,e)})})}recalculateMarks(){this._chartSeries&&([...this._marks],this.clearAllMarks())}refreshTimeframe(){if(!this._chartSeries)return;const t=this._chartSeries.series.data();if(!t||t.length<2)return;const e=this.autoDetectTimeframe(t);e!==this._timeframe&&(this._timeframe=e,this._tolerance=this.calculateTolerance(e),this.recalculateMarks())}addTopMark(t,e,i){switch(e){case"Text":t.forEach(r=>{const a=r.data.map(n=>{const o={text:n.text};return n.textColor!==void 0&&(o.textColor=n.textColor),n.backgroundColor!==void 0&&(o.backgroundColor=n.backgroundColor),n.isCircular!==void 0&&(o.isCircular=n.isCircular),n.fontSize!==void 0&&(o.fontSize=n.fontSize),n.padding!==void 0&&(o.padding=n.padding),o}),s=new On(r.time,a);i.series.attachPrimitive(s),this._marks.push(s)});break;case"Arrow":break;default:return}}addBottomMark(t,e,i){switch(e){case"Text":t.forEach(r=>{const a=r.data.map(n=>{const o={text:n.text};return n.textColor!==void 0&&(o.textColor=n.textColor),n.backgroundColor!==void 0&&(o.backgroundColor=n.backgroundColor),n.isCircular!==void 0&&(o.isCircular=n.isCircular),n.fontSize!==void 0&&(o.fontSize=n.fontSize),n.padding!==void 0&&(o.padding=n.padding),o}),s=new Hn(r.time,a);i.series.attachPrimitive(s),this._marks.push(s)});break;case"Arrow":break;default:return}}removeAllMark(){this._marks=[]}getTolerance(){return this._tolerance}getTimeframe(){return this._timeframe}getMarkCount(){return this._marks.length}clearAllMarks(t){const e=t||this._chartSeries;e&&this._marks.forEach(i=>{e.series.detachPrimitive(i)}),this._marks=[]}destroy(){this.clearAllMarks(),this._chartSeries=null}}class Nn{calculateADX(t,e){if(t.length<e+1)return{ADX:[],PlusDI:[],MinusDI:[]};const i={ADX:[],PlusDI:[],MinusDI:[]},r=t.map(S=>S.time),a=[0],s=[0],n=[0];for(let S=1;S<t.length;S++){const _=t[S].high,C=t[S].low,A=t[S-1].high,x=t[S-1].low,R=t[S-1].close,U=Math.max(_-C,Math.abs(_-R),Math.abs(C-R));a.push(U);const L=_-A,X=x-C;L>X&&L>0?(s.push(L),n.push(0)):X>L&&X>0?(s.push(0),n.push(X)):(s.push(0),n.push(0))}const o=[],h=[],l=[];let g=a.slice(0,e).reduce((S,_)=>S+_,0),c=s.slice(0,e).reduce((S,_)=>S+_,0),d=n.slice(0,e).reduce((S,_)=>S+_,0);o.push(g),h.push(c),l.push(d);for(let S=e;S<a.length;S++)g=g-g/e+a[S],c=c-c/e+s[S],d=d-d/e+n[S],o.push(g),h.push(c),l.push(d);const u=[],p=[],M=[];for(let S=0;S<o.length;S++){if(o[S]===0){u.push(0),p.push(0),M.push(0);continue}const _=h[S]/o[S]*100,C=l[S]/o[S]*100;u.push(_),p.push(C);const A=_+C,x=A>0?Math.abs(_-C)/A*100:0;M.push(x)}const k=[];if(M.length>=e){let S=M.slice(0,e).reduce((_,C)=>_+C,0)/e;k.push(S);for(let _=e;_<M.length;_++)S=(S*(e-1)+M[_])/e,k.push(S)}const P=e;for(let S=0;S<k.length;S++){const _=P+S;_<t.length&&(i.ADX.push({time:r[_],value:Math.min(100,Math.max(0,k[S])),...t[_].isVirtual&&{color:"transparent"}}),S<u.length&&i.PlusDI.push({time:r[_],value:Math.min(100,Math.max(0,u[S])),...t[_].isVirtual&&{color:"transparent"}}),S<p.length&&i.MinusDI.push({time:r[_],value:Math.min(100,Math.max(0,p[S])),...t[_].isVirtual&&{color:"transparent"}}))}return i}calculate(t,e){return t.forEach(i=>{const r=this.calculateADX(e,i.paramValue);let a=[];switch(i.paramName){case"ADX":a=r.ADX;break;case"+DI":a=r.PlusDI;break;case"-DI":a=r.MinusDI;break}a.length>0&&(i.data=a)}),t}}class wt{constructor(t,e,i,r,a,s,n,o,h){this.id=t,this.size=e,this.vertPosition=i,this.indicatorType=r,this.chartInstance=a,this.paneInstance=s,this.theme=n,this.onSettingsClick=o,this.onCloseClick=h,this._infoElement=null}init(t,e){}createInfoElement(){if(!this.paneInstance)return;const t=this.paneInstance.getHTMLElement();if(!t)return;this._infoElement=document.createElement("div"),this._infoElement.className="chart-pane-info",this._infoElement.style.cssText=`
22
22
  position: absolute;
23
23
  top: 5px;
24
24
  left: 10px;
package/dist/index.mjs CHANGED
@@ -39568,6 +39568,8 @@ class Qn {
39568
39568
  };
39569
39569
  }
39570
39570
  addMark(t, e) {
39571
+ if (!e || !e.series)
39572
+ return;
39571
39573
  this._chartSeries = e;
39572
39574
  const i = e.series.data();
39573
39575
  if (!i || i.length === 0)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "candleview",
3
- "version": "2.3.5",
3
+ "version": "2.3.6",
4
4
  "description": "An AI-powered data visualization and charting engine designed for the financial industry.",
5
5
  "keywords": [
6
6
  "Finance",