@tradecanvas/core 1.84.1 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{WebGLSeriesRenderer-lwJz1WAg.cjs → WebGLSeriesRenderer-C1ehDGNo.cjs} +2 -2
- package/dist/{WebGLSeriesRenderer-lwJz1WAg.cjs.map → WebGLSeriesRenderer-C1ehDGNo.cjs.map} +1 -1
- package/dist/{WebGLSeriesRenderer-DguvFCTx.js → WebGLSeriesRenderer-m_tVyYqn.js} +2 -2
- package/dist/{WebGLSeriesRenderer-DguvFCTx.js.map → WebGLSeriesRenderer-m_tVyYqn.js.map} +1 -1
- package/dist/axis/GridRenderer.d.ts.map +1 -1
- package/dist/axis/PriceAxis.d.ts.map +1 -1
- package/dist/axis/TimeAxis.d.ts.map +1 -1
- package/dist/charts/PeriodLevelsRenderer.d.ts.map +1 -1
- package/dist/charts/pixelGrid.d.ts +20 -0
- package/dist/charts/pixelGrid.d.ts.map +1 -1
- package/dist/engine/CanvasLayer.d.ts +2 -1
- package/dist/engine/CanvasLayer.d.ts.map +1 -1
- package/dist/engine/DPRManager.d.ts +27 -0
- package/dist/engine/DPRManager.d.ts.map +1 -1
- package/dist/engine/LayerManager.d.ts +3 -1
- package/dist/engine/LayerManager.d.ts.map +1 -1
- package/dist/engine/RenderEngine.d.ts.map +1 -1
- package/dist/features/AlertManager.d.ts.map +1 -1
- package/dist/gpuContexts-CrF09Ngz.cjs +2 -0
- package/dist/gpuContexts-CrF09Ngz.cjs.map +1 -0
- package/dist/{gpuContexts-BXj2qguo.js → gpuContexts-D9JHR3h-.js} +70 -48
- package/dist/gpuContexts-D9JHR3h-.js.map +1 -0
- package/dist/index.cjs +8 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4287 -4207
- package/dist/index.js.map +1 -1
- package/dist/indicator.worker-Cd8ymg6p.cjs +2 -0
- package/dist/indicator.worker-Cd8ymg6p.cjs.map +1 -0
- package/dist/indicator.worker-R8CZwJjK.js +18 -0
- package/dist/indicator.worker-R8CZwJjK.js.map +1 -0
- package/dist/realtime/CurrentPriceLine.d.ts.map +1 -1
- package/dist/realtime/StreamManager.d.ts +8 -10
- package/dist/realtime/StreamManager.d.ts.map +1 -1
- package/dist/realtime/adapters/BinanceAdapter.d.ts.map +1 -1
- package/dist/realtime/feeds/feedAdapter.d.ts +38 -1
- package/dist/realtime/feeds/feedAdapter.d.ts.map +1 -1
- package/dist/realtime/feeds/streamSource.d.ts +38 -0
- package/dist/realtime/feeds/streamSource.d.ts.map +1 -0
- package/dist/trading/plot.d.ts.map +1 -1
- package/dist/ui/ChartLegend.d.ts +12 -0
- package/dist/ui/ChartLegend.d.ts.map +1 -1
- package/dist/ui/PriceLines.d.ts.map +1 -1
- package/dist/ui/SessionBreaks.d.ts +0 -10
- package/dist/ui/SessionBreaks.d.ts.map +1 -1
- package/dist/ui/shapes.d.ts +4 -1
- package/dist/ui/shapes.d.ts.map +1 -1
- package/dist/viewport/Viewport.d.ts +6 -1
- package/dist/viewport/Viewport.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/gpuContexts-BN9YuYEa.cjs +0 -2
- package/dist/gpuContexts-BN9YuYEa.cjs.map +0 -1
- package/dist/gpuContexts-BXj2qguo.js.map +0 -1
- package/dist/indicator.worker-1I8WNx4q.js +0 -18
- package/dist/indicator.worker-1I8WNx4q.js.map +0 -1
- package/dist/indicator.worker-g0us81yM.cjs +0 -2
- package/dist/indicator.worker-g0us81yM.cjs.map +0 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region src/indicators/worker/indicator.worker.ts?worker&inline
|
|
2
|
+
var e = "(function(){`rgba(76, 141, 255, 0.1)`.replace(/\\s+/g,``);function e(e){let t=e.length>0?e[e.length-1].time:NaN;return Number.isFinite(t)?Math.abs(t)>=1e11?1:1e3:1}function t(e,t){return t===void 0?Math.abs(e)>=1e11?e:e*1e3:e*t}function n(e,t=1){let n=e.slice(1);return(n.length===3||n.length===4)&&(n=[...n.slice(0,3)].map(e=>e+e).join(``)),`rgba(${parseInt(n.slice(0,2),16)}, ${parseInt(n.slice(2,4),16)}, ${parseInt(n.slice(4,6),16)}, ${t})`}function r(e,t){let r=e.trim();if(/^#([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(r))return n(r,t);let i=r.match(/^rgba?\\(\\s*(\\d+(?:\\.\\d+)?)[\\s,]+(\\d+(?:\\.\\d+)?)[\\s,]+(\\d+(?:\\.\\d+)?)/i);return i?`rgba(${i[1]}, ${i[2]}, ${i[3]}, ${t})`:e}var i=6e4,a=1440*i,o=15*i,s=8192,c=7*a,l=4096,u=new Set([`UTC`,`Etc/UTC`,`GMT`,`Etc/GMT`,`UCT`,`Etc/UCT`,`Universal`,`Etc/Universal`,`Zulu`,`Etc/Zulu`]),d=new Map,f=new Map,p=new Map;function m(e){let t=d.get(e);return t||(t=new Intl.DateTimeFormat(`en-US`,{timeZone:e,hourCycle:`h23`,year:`numeric`,month:`numeric`,day:`numeric`,hour:`numeric`,minute:`numeric`,second:`numeric`}),d.set(e,t)),t}function h(e){if(!e)return!1;try{return m(e),!0}catch{return!1}}function g(e,t){if(!Number.isFinite(t)||u.has(e))return 0;let n=p.get(e);n||(n=new Map,p.set(e,n));let r=Math.floor(t/c),i=n.get(r);return i||(i=_(e,r*c),n.size>=l&&n.clear(),n.set(r,i)),t<i.change?i.before:i.after}function _(e,t){let n=v(e,t),r=t+c-o,i=v(e,r);if(i===n)return{before:n,change:1/0,after:i};let a=t;for(;r-a>o;){let t=a+Math.floor((r-a)/o/2)*o;v(e,t)===n?a=t:r=t}return{before:n,change:r,after:i}}function v(e,t){let n=Math.floor(t/o),r=`${e}|${n}`,a=f.get(r);if(a!==void 0)return a;let c=n*o,l=1970,u=1,d=1,p=0,h=0,g=0;for(let t of m(e).formatToParts(new Date(c))){let e=Number(t.value);switch(t.type){case`year`:l=e;break;case`month`:u=e;break;case`day`:d=e;break;case`hour`:p=e%24;break;case`minute`:h=e;break;case`second`:g=e;break}}let _=Math.round((Date.UTC(l,u-1,d,p,h,g)-c)/i);return f.size>=s&&f.clear(),f.set(r,_),_}function y(e){return e===0||typeof e==`string`&&u.has(e)}function b(e,t){return e===null?-new Date(t).getTimezoneOffset():typeof e==`number`?e:g(e,t)}function ee(e,t){let n=e-b(t,e-a)*i;if(n+b(t,n)*i===e)return n;let r=e-b(t,e+a)*i;return r+b(t,r)*i===e?r:n}var x={\"1s\":1e3,\"5s\":5e3,\"15s\":15e3,\"30s\":3e4,\"1m\":6e4,\"3m\":18e4,\"5m\":3e5,\"15m\":9e5,\"30m\":18e5,\"45m\":27e5,\"1h\":36e5,\"2h\":72e5,\"3h\":108e5,\"4h\":144e5,\"6h\":216e5,\"8h\":288e5,\"12h\":432e5,\"1d\":864e5,\"2d\":1728e5,\"3d\":2592e5,\"1w\":6048e5,\"2w\":12096e5,\"1M\":2592e6,\"3M\":7776e6,\"6M\":15552e6,\"12M\":31536e6},S={s:1e3,m:6e4,h:36e5,d:864e5,w:6048e5,M:2592e6},te=/^([1-9]\\d*)([smhdwM])$/;function ne(e){let t=te.exec(e);if(!t)return null;let n=Number(t[1]);return Number.isSafeInteger(n)?{count:n,unit:t[2]}:null}function C(e){let t=x[e];if(t!==void 0)return t;let n=ne(e);return n?n.count*S[n.unit]:NaN}var w=20*36e5;function T(t){let n=Math.min(t.length,64);if(n<2)return;let r=e(t),i=1/0;for(let e=1;e<n;e++){let n=Math.abs(t[e].time-t[e-1].time)*r;n>0&&n<i&&(i=n)}return i===1/0?void 0:i>=w}var re=Date.UTC(1970,0,5),E=S.m,D=S.d,O=24,ie={count:1,unit:`m`},ae=256,k=new Map;function oe(e){let t=k.get(e);return t||(t=ne(e)??ie,k.size>=ae&&k.clear(),k.set(e,t)),t}function se({unit:e}){return e===`d`||e===`w`||e===`M`}function ce(e){return e.unit===`h`?e.count>1&&O%e.count===0:se(e)}function le(e){return ce(oe(e))}function ue(e){return e!==void 0&&!y(e)}function de(e,t,n=1){let r=oe(t),i=typeof n==`number`?n:n.weekStartsOn??1,a=typeof n==`number`?void 0:n.timeZone;return!ue(a)||!ce(r)||typeof n==`object`&&n.dates&&e%D===0?fe(e,r,i):ee(fe(e+b(a,e)*E,r,i),a)}function fe(e,{count:t,unit:n},r){if(n===`s`||n===`m`||n===`h`||n===`d`){let r=t*S[n];return Math.floor(e/r)*r}let i=new Date(e);if(n===`w`){let e=(i.getUTCDay()-r+7)%7,n=Date.UTC(i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()-e);if(t<=1)return n;let a=Math.floor((n-re)/(7*D));return re+Math.floor(a/t)*t*7*D}let a=i.getUTCFullYear()*12+i.getUTCMonth(),o=Math.floor(a/t)*t;return Date.UTC(Math.floor(o/12),o%12,1)}function pe(e,t){switch(t){case`open`:return e.open;case`high`:return e.high;case`low`:return e.low;case`hl2`:return(e.high+e.low)/2;case`hlc3`:return(e.high+e.low+e.close)/3;case`ohlc4`:return(e.open+e.high+e.low+e.close)/4;case`hlcc4`:return(e.high+e.low+2*e.close)/4;default:return e.close}}var A={amber:`#f2a93b`,up:`#1c9e6d`,down:`#e8505b`,ochre:`#c07c12`,blue:`#4688fa`,violet:`#9c73f8`,cyan:`#1398a8`,rose:`#e25592`,neutral:`#7d8696`,ink:`#131416`},me=.22;function he(e){return r(e,me)}var j=`#1b1d21`,M=`#e6e3dc`,ge=[A.blue,A.ochre,A.violet,A.cyan,A.rose];r(M,.14),r(M,0),r(M,.14),r(M,.08),r(j,.12),r(j,0),r(j,.13),r(j,.08);var _e={name:`terminal`,background:`#0E0E0E`,text:`#C0C0C0`,textSecondary:`#8A8A8A`,grid:`#1A1A1A`,crosshair:`#666666`,candleUp:`#00FF87`,candleDown:`#FF3B4D`,candleUpWick:`#00FF87`,candleDownWick:`#FF3B4D`,lineColor:`#3D8BFD`,areaTopColor:`rgba(61, 139, 253, 0.3)`,areaBottomColor:`rgba(61, 139, 253, 0.0)`,volumeUp:he(`#00FF87`),volumeDown:he(`#FF3B4D`),axisLine:`#1A1A1A`,axisLabel:`#8A8A8A`,axisLabelBackground:`#1A1A1A`,font:{family:`'Roboto Mono', 'JetBrains Mono', 'SF Mono', Consolas, monospace`,sizeSmall:10,sizeMedium:12,sizeLarge:14}};new Set([_e.volumeUp,_e.volumeDown]);function ve(e,t,n=1){return e===`solid`?[]:e===`dotted`?[n,n*2]:[...t]}var ye=(1+Math.sqrt(5))/2;Object.freeze({comfortable:Object.freeze({barLayout:`golden`,rightMargin:8,priceMargin:ye**-4.5,volumeGap:ye**-6,legendInset:12,legendTop:8,legendLineGap:4}),compact:Object.freeze({barLayout:`classic`,rightMargin:5,priceMargin:ye**-5,volumeGap:ye**-7,legendInset:8,legendTop:6,legendLineGap:3})}).comfortable.rightMargin;function N(e,t){return e*(t.barWidth+t.barSpacing)-t.offset+t.chartRect.x+t.barWidth/2}function P(e,t){let{min:n,max:r}=t.priceRange,{y:i,height:a}=t.chartRect,o;if(t.logScale&&n>0&&r>0){let t=Math.log(n),s=Math.log(r)-t;if(s===0)return i+a/2;o=(Math.log(Math.max(e,2**-52))-t)/s}else{let t=r-n;if(t===0)return i+a/2;o=(e-n)/t}return i+a*(t.invertScale?o:1-o)}function be(e){let{min:t,max:n}=e.priceRange,{y:r,height:i}=e.chartRect,a=e.invertScale===!0;if(e.logScale&&t>0&&n>0){let e=Math.log(t),o=Math.log(n)-e;if(o===0)return()=>r+i/2;let s=i/o,c=r+i;return a?t=>r+(Math.log(Math.max(t,2**-52))-e)*s:t=>c-(Math.log(Math.max(t,2**-52))-e)*s}let o=n-t;if(o===0)return()=>r+i/2;let s=i/o;return a?e=>r+(e-t)*s:e=>r+(n-e)*s}function F(e){return e.barWidth+e.barSpacing<1}function xe(e,t,n){return e>1.5*(Math.abs(n-t)+1)}var Se=class{started=!1;piece=0;lastX=NaN;lastY=NaN;col=NaN;lo=0;hi=0;width;constructor(e,t,n,r,i=[]){this.ctx=e,this.dense=r,this.dash=i,this.width=Number.isFinite(n)&&n>0?n:1,e.beginPath(),r?e.fillStyle=t:(e.strokeStyle=t,e.lineWidth=this.width,e.lineJoin=`round`)}add(e,t){!Number.isFinite(e)||!Number.isFinite(t)||(this.dense?this.addDense(e,t):this.started?this.ctx.lineTo(e,t):this.ctx.moveTo(e,t),this.started=!0,this.piece++,this.lastX=e,this.lastY=t)}gap(){this.endPiece(),this.flush(),this.started=!1,this.lastY=NaN}segment(e,t,n,r){(!this.started||e!==this.lastX||t!==this.lastY)&&(this.gap(),this.add(e,t)),this.add(n,r)}finish(){this.endPiece(),this.flush(),this.dense?this.ctx.fill():this.dash.length>0?(this.ctx.setLineDash([...this.dash]),this.ctx.stroke(),this.ctx.setLineDash([])):this.ctx.stroke()}endPiece(){if(!this.dense&&this.piece===1){let e=Math.max(this.width,3);this.ctx.moveTo(this.lastX-e,this.lastY),this.ctx.lineTo(this.lastX+e,this.lastY)}this.piece=0}addDense(e,t){let n=Math.floor(e);n!==this.col&&(this.flush(),this.col=n,this.lo=this.hi=Number.isNaN(this.lastY)?t:this.lastY),t<this.lo&&(this.lo=t),t>this.hi&&(this.hi=t)}flush(){if(Number.isNaN(this.col))return;let e=this.width/2,t=Math.max(1,this.width);this.ctx.rect(this.col+.5-t/2,this.lo-e,t,this.hi-this.lo+2*e),this.col=NaN}};function Ce(e,t,n,r,i,a=t.length){e.beginPath(),e.fillStyle=i;let o=NaN,s=0,c=0,l=NaN,u=NaN,d=()=>{Number.isNaN(o)||e.rect(o,s,1,c-s)};for(let e=0;e<a;e++){let i=Math.floor(t[e]),a=Math.min(n[e],r[e]),f=Math.max(n[e],r[e]);i!==o&&(d(),o=i,s=Number.isNaN(l)?a:Math.min(a,l),c=Number.isNaN(u)?f:Math.max(f,u)),a<s&&(s=a),f>c&&(c=f),l=a,u=f}d(),e.fill()}let we={session:`1d`,week:`1w`,month:`1M`},Te=6e4,Ee={};function De(e){return e===`session`||e===`week`||e===`month`}function Oe(t,n,r){let i=De(n)?we[n]:n,a=e(t),o=r&&!y(r)&&le(i)&&h(r)?r:null,s=o===null?Ee:{timeZone:o},c=o!==null&&T(t)===!0,l=C(i),u=(Number.isFinite(l)?l:Te)*1.5,d=NaN,f=NaN,p=NaN,m=!1;return e=>{let t=e*a,n=c&&t%864e5==0;if(t>=d&&t<f&&n===m)return p;m=n;let r=n?Ee:s;return d=de(t,i,r),f=de(d+u,i,r),p=o===null||n?d:de(t+g(o,t)*Te,i),p}}function ke(e,t,n){let r=e[t]?.[n];return e[t-1]?.[n]!==r&&e[t+1]?.[n]!==r}function Ae(e,t,n,r=`session`){return e[t]?.[r]===e[n]?.[r]?!1:!(ke(e,t,r)&&ke(e,n,r))}function je(e,t){return e.tone?e.tone===`sign`?(t[e.key]??0)>=0:t[e.tone.field]===1:!0}function Me(e,t){return t.plots?.[e.key]?.visible!==!1}let Ne=[6,4];function Pe(e,t,n){let r=e.plots?.[t];return{visible:r?.visible!==!1,dash:ve(r?.lineStyle??`solid`,Ne,n)}}function Fe(e,t,n,i,a,o=[]){let s=t.series;if(!s)return;let c=Math.max(0,n.visibleRange.from),l=Math.min(n.visibleRange.to,s.length-1);if(l<c)return;let u=be(n);for(let t of o){let a=r(i.colors[t.color]??i.colors[0],t.opacity??Ie);Le(e,s,t.between,c,l,n,u,a)}for(let t=0;t<a.length;t++){let r=a[t];if(!Me(r,i))continue;let o=(t>0?i.lineWidths[t]:void 0)??r.width??i.lineWidths[0]??1.5,d=ve(i.plots?.[r.key]?.lineStyle??r.lineStyle??`solid`,Ne,o),f=r.kind??`line`,p=r.breakOn,m=p===void 0?null:(e,t)=>Ae(s,e,t,p),h=e.globalAlpha;r.opacity!==void 0&&(e.globalAlpha=h*r.opacity);let g=r.tone&&r.downColor!==void 0?[!0,!1]:[null];try{for(let t of g){let a=i.colors[r.color]??i.colors[0],p=t===!1?i.colors[r.downColor]??a:a,h=e=>t===null||je(r,e)===t;f===`histogram`?Ve(e,s,r.key,c,l,n,u,p,h):f===`dots`?Be(e,s,r.key,c,l,n,u,p,h):ze(e,s,r.key,c,l,n,u,p,o,f===`step`,t===null?null:h,d,m)}}finally{e.globalAlpha=h}}}let Ie=.1;function Le(e,t,n,r,i,a,o,s){let c=i-r+1,l=new Float64Array(c),u=new Float64Array(c),d=new Float64Array(c),f=F(a),p=0,m=()=>{p>=2&&(f?Ce(e,l,u,d,s,p):Re(e,l,u,d,s,p)),p=0};for(let e=r;e<=i;e++){let r=I(t[e],n[0]),i=I(t[e],n[1]);if(r===void 0||i===void 0){m();continue}l[p]=N(e,a),u[p]=o(r),d[p]=o(i),p++}m()}function Re(e,t,n,r,i,a){e.beginPath(),e.moveTo(t[0],n[0]);for(let r=1;r<a;r++)e.lineTo(t[r],n[r]);for(let n=a-1;n>=0;n--)e.lineTo(t[n],r[n]);e.closePath(),e.fillStyle=i,e.fill()}function I(e,t){let n=e?.[t];return n!==void 0&&Number.isFinite(n)?n:void 0}function ze(e,t,n,r,i,a,o,s,c,l,u,d=[],f=null){let p=new Se(e,s,c,F(a),d),m=0,h=0,g=!1,_=-1;for(let e=r;e<=i;e++){let r=t[e],i=I(r,n);if(i===void 0){g=!1,p.gap();continue}g&&f?.(_,e)&&(g=!1,p.gap()),_=e;let s=N(e,a),c=o(i);u?g&&u(r)&&(l?(p.segment(m,h,s,h),p.add(s,c)):p.segment(m,h,s,c)):(g&&l&&p.add(s,h),p.add(s,c)),m=s,h=c,g=!0}p.finish()}function Be(e,t,n,r,i,a,o,s,c){let l=Math.max(1.5,a.barWidth*.15),u=F(a),d=NaN;e.beginPath(),e.fillStyle=s;for(let s=r;s<=i;s++){let r=t[s],i=I(r,n);if(i===void 0||!c(r))continue;let f=N(s,a);if(u){let e=Math.floor(f);if(e===d)continue;d=e}let p=o(i);e.moveTo(f+l,p),e.arc(f,p,l,0,Math.PI*2)}e.fill()}function Ve(e,t,n,r,i,a,o,s,c){let l=o(0);if(e.beginPath(),e.fillStyle=s,F(a)){let s=NaN,u=0,d=()=>{if(Number.isNaN(s))return;let t=o(u);e.rect(s,Math.min(t,l),1,Math.max(1,Math.abs(t-l)))};for(let e=r;e<=i;e++){let r=t[e],i=I(r,n);if(i===void 0||!c(r))continue;let o=Math.floor(N(e,a));o===s?Math.abs(i)>Math.abs(u)&&(u=i):(d(),s=o,u=i)}d(),e.fill();return}let u=Math.max(1,a.barWidth);for(let s=r;s<=i;s++){let r=t[s],i=I(r,n);if(i===void 0||!c(r))continue;let d=N(s,a),f=o(i);e.rect(d-u/2,Math.min(f,l),u,Math.max(1,Math.abs(f-l)))}e.fill()}var L=class{canResume(e,t,n){let r=t.series;if(!r||n<=0||n>r.length||r.length>e.length)return!1;for(let i=n;i<r.length;i++)if(r[i]&&!t.values.has(e[i].time))return!1;return!0}writePoint(e,t,n,r){e.series[n]=r,r?e.values.set(t[n].time,r):e.values.delete(t[n].time)}render(e,t,n,r){this.descriptor.plots&&Fe(e,t,n,r,this.descriptor.plots,this.descriptor.fills)}drawLine(e,t,n,r,i){if(t.length<2||i?.visible===!1)return;let a=new Se(e,n,r,xe(t.length,t[0].x,t[t.length-1].x),i?.dash);for(let e of t)a.add(e.x,e.y);a.finish()}drawBand(e,t,n,r){if(!(t.length<2||n.length<2)){if(t.length===n.length&&xe(t.length,t[0].x,t[t.length-1].x)){Ce(e,t.map(e=>e.x),t.map(e=>e.y),n.map(e=>e.y),r);return}e.beginPath(),e.moveTo(t[0].x,t[0].y);for(let n=1;n<t.length;n++)e.lineTo(t[n].x,t[n].y);for(let t=n.length-1;t>=0;t--)e.lineTo(n[t].x,n[t].y);e.closePath(),e.fillStyle=r,e.fill()}}drawHistogram(e,t,n){let r=n/2;for(let i of t){e.fillStyle=i.color;let t=Math.min(i.y,i.baseY),a=Math.abs(i.y-i.baseY);e.fillRect(i.x-r,t,n,Math.max(a,1))}}valuesToPoints(e,t,n,r){let i=[],{from:a,to:o}=r.visibleRange;for(let s=a;s<=o&&s<n.length;s++){let a=e.values.get(n[s].time);a&&a[t]!==void 0&&i.push({x:N(s,r),y:P(a[t],r)})}return i}},R=class e extends Map{keyBuf=[];valBuf=[];folded=!1;constructor(){super()}static fromAscending(t,n){let r=new e;for(let e=1;e<t.length;e++)if(!(t[e]>t[e-1])){for(let e=0;e<t.length;e++)r.set(t[e],n[e]);return r}return r.keyBuf=t,r.valBuf=n,r}set(e,t){if(this.folded)return super.set(e,t);let n=this.keyBuf,r=n.length;if(r===0||e>n[r-1])return n.push(e),this.valBuf.push(t),this;let i=this.indexOf(e);return i>=0?(this.valBuf[i]=t,this):(this.fold(),super.set(e,t))}get(e){if(this.folded)return super.get(e);let t=this.indexOf(e);return t>=0?this.valBuf[t]:void 0}has(e){return this.folded?super.has(e):this.indexOf(e)>=0}delete(e){if(this.folded)return super.delete(e);let t=this.indexOf(e);return t<0?!1:(this.keyBuf.splice(t,1),this.valBuf.splice(t,1),!0)}clear(){super.clear(),this.keyBuf=[],this.valBuf=[],this.folded=!1}get size(){return this.folded?super.size:this.keyBuf.length}forEach(e,t){this.fold(),super.forEach(e,t)}entries(){return this.fold(),super.entries()}keys(){return this.fold(),super.keys()}values(){return this.fold(),super.values()}[Symbol.iterator](){return this.fold(),super[Symbol.iterator]()}indexOf(e){let t=this.keyBuf,n=0,r=t.length-1;for(;n<=r;){let i=n+r>>1,a=t[i];if(a===e)return i;a<e?n=i+1:r=i-1}return-1}fold(){if(this.folded)return;this.folded=!0;let e=this.keyBuf,t=this.valBuf;for(let n=0;n<e.length;n++)super.set(e[n],t[n]);this.keyBuf=[],this.valBuf=[]}};function z(e,t,n){let r=e.params[t];if(typeof r==`number`&&Number.isFinite(r))return r;if(typeof r==`string`){let e=Number(r);if(Number.isFinite(e))return e}return n}function B(e,t,n,r=1){let i=z(e,t,n);return Math.max(r,Math.floor(i))}var He=class extends L{descriptor={id:`sma`,name:`Simple Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`SMA`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`SMA`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=new R,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++)if(a+=e[t].close,t>=n&&(a-=e[t-n].close),t>=n-1){let o={value:a/n};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=B(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;this.writePoint(n,e,t,{value:r/i})}return n}},Ue=class extends L{descriptor={id:`ema`,name:`Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`EMA`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`EMA`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=2/(n+1),i=new R,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++){if(t<n-1){o+=e[t].close;continue}o=t===n-1?(o+e[t].close)/n:(e[t].close-o)*r+o;let s={value:o};i.set(e[t].time,s),a[t]=s}return{values:i,series:a}}update(e,t,n,r){let i=B(t,`period`,20,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;let o=2/(i+1);for(let t=r;t<e.length;t++)a=(e[t].close-a)*o+a,this.writePoint(n,e,t,{value:a});return n}},We=class extends L{descriptor={id:`bb`,name:`Bollinger Bands`,placement:`overlay`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`BB`,inputs:{source:{source:!0},period:{kind:`int`,min:1},stdDev:{kind:`number`,min:.1,step:.1}},fills:[{between:[`upper`,`lower`],color:0,opacity:.1}],plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=z(t,`stdDev`,2),i=new R,a=Array(e.length).fill(null),o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(o+=c,s+=c*c,t>=n){let r=e[t-n].close;o-=r,s-=r*r}if(t>=n-1){let c=o/n,l=s/n-c*c,u=Math.sqrt(Math.max(0,l)),d={middle:c,upper:c+r*u,lower:c-r*u};i.set(e[t].time,d),a[t]=d}}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=B(t,`period`,20,1),a=z(t,`stdDev`,2);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=0;for(let n=t-i+1;n<=t;n++){let t=e[n].close;r+=t,o+=t*t}let s=r/i,c=Math.sqrt(Math.max(0,o/i-s*s));this.writePoint(n,e,t,{middle:s,upper:s+a*c,lower:s-a*c})}return n}};let Ge=[`session`,`week`,`month`,`all`];function Ke(e){let t=e.params.anchor;return Ge.includes(t)?t:`session`}function qe(e,t){let n=Ke(t);return n===`all`?null:Oe(e,n,t.exchangeTimeZone)}var Je=class extends L{descriptor={readsExchangeTimeZone:!0,id:`vwap`,name:`Volume Weighted Average Price`,placement:`overlay`,defaultConfig:{anchor:`session`},shortName:`VWAP`,inputs:{anchor:{options:Ge}},plots:[{key:`value`,title:`VWAP`,color:0,breakOn:`session`}]};kept=new WeakMap;workerState(e){return this.kept.get(e)}adoptWorkerState(e,t){t&&this.kept.set(e,t)}calculate(e,t){let n={values:new R,series:Array(e.length).fill(null)},r=qe(e,t),i=this.fill(n,e,r,0,null);return r&&this.kept.set(n,i),n}update(e,t,n,r){let i=qe(e,t),a=this.kept.get(n)??[],o=a.find(e=>e.index===r-1);if(!i||!o||r<64||r>=e.length||!this.canResume(e,n,r))return null;n.series.length=e.length;let s=this.fill(n,e,i,r,o),c=a.filter(t=>t.index<r&&t.index>=e.length-2);return this.kept.set(n,[...c,...s]),n}fill(e,t,n,r,i){let a=i&&n?n(t[i.index].time):void 0,o=i?.volume??0,s=i?.volumePrice??0,c=[];for(let i=r;i<t.length;i++){let r=t[i];if(n){let e=n(r.time);e!==a&&(o=0,s=0,a=e)}o+=r.volume,s+=(r.high+r.low+r.close)/3*r.volume,i>=t.length-2&&c.push({index:i,volume:o,volumePrice:s});let l=o>0?a===void 0?{value:s/o}:{value:s/o,session:a}:null;this.writePoint(e,t,i,l)}return c}};let Ye=ge[4];var Xe=class extends L{descriptor={id:`ichimoku`,name:`Ichimoku Cloud`,placement:`overlay`,defaultConfig:{tenkan:9,kijun:26,senkou:52,displacement:26},inputs:{tenkan:{kind:`int`,min:1},kijun:{kind:`int`,min:1},senkou:{kind:`int`,min:1},displacement:{kind:`int`,min:0}},shortName:`Ichimoku`,plots:[{key:`tenkan`,title:`Conversion`,color:0},{key:`kijun`,title:`Base`,color:1},{key:`senkouA`,title:`Lead A`,color:2},{key:`senkouB`,title:`Lead B`,color:3},{key:`chikou`,title:`Lagging Span`,color:4}]};calculate(e,t){let n=B(t,`tenkan`,9,1),r=B(t,`kijun`,26,1),i=B(t,`senkou`,52,1),a=B(t,`displacement`,26,0),o=new R,s=Array(e.length).fill(null),c=t=>{let n=new Float64Array(e.length),r=new Float64Array(e.length);for(let i=0;i<e.length;i++){let a=-1/0,o=1/0,s=Math.max(0,i-t+1);for(let t=s;t<=i;t++)e[t].high>a&&(a=e[t].high),e[t].low<o&&(o=e[t].low);n[i]=a,r[i]=o}return{highs:n,lows:r}},l=c(n),u=c(r),d=c(i),f=(e,t,n)=>n>=t-1?(e.highs[n]+e.lows[n])/2:void 0,p=e=>{let t=f(l,n,e),a=f(u,r,e),o={};t!==void 0&&a!==void 0&&(o.senkouA=(t+a)/2);let s=f(d,i,e);return s!==void 0&&(o.senkouB=s),o};for(let t=0;t<e.length;t++){let i={},c=f(l,n,t);c!==void 0&&(i.tenkan=c);let d=f(u,r,t);d!==void 0&&(i.kijun=d),t>=a&&Object.assign(i,p(t-a)),t+a<e.length&&(i.chikou=e[t+a].close),Object.keys(i).length>0&&(o.set(e[t].time,i),s[t]=i)}let m=Math.max(0,e.length-a),h=[];for(let t=m;t<e.length;t++)h.push(p(t));return{values:o,series:s,meta:{ahead:h,aheadFrom:m+a}}}render(e,t,n,i){let a=t.series;if(!a)return;let{from:o,to:s}=n.visibleRange,c=t.meta?.ahead,l=t.meta?.aheadFrom??a.length,u=s-o+1,d=u+(c?.length??0),f=new Float64Array(u),p=new Float64Array(u),m=0,h=new Float64Array(u),g=new Float64Array(u),_=0,v=new Float64Array(d),y=new Float64Array(d),b=0,ee=new Float64Array(d),x=new Float64Array(d),S=0,te=new Float64Array(u),ne=new Float64Array(u),C=0,w=new Float64Array(d),T=new Float64Array(d),re=new Float64Array(d),E=0,D=(e,t)=>{let r=t.senkouA,i=t.senkouB;r!==void 0&&(v[b]=e,y[b]=P(r,n),b++),i!==void 0&&(ee[S]=e,x[S]=P(i,n),S++),r!==void 0&&i!==void 0&&(w[E]=e,T[E]=y[b-1],re[E]=x[S-1],E++)};for(let e=o;e<=s&&e<a.length;e++){let t=a[e];if(!t)continue;let r=N(e,n);t.tenkan!==void 0&&(f[m]=r,p[m]=P(t.tenkan,n),m++),t.kijun!==void 0&&(h[_]=r,g[_]=P(t.kijun,n),_++),D(r,t),t.chikou!==void 0&&(te[C]=r,ne[C]=P(t.chikou,n),C++)}if(c){let e=n.chartRect.x-n.barWidth-n.barSpacing,t=n.chartRect.x+n.chartRect.width+n.barWidth+n.barSpacing;for(let r=0;r<c.length;r++){let i=N(l+r,n);if(i>t)break;i>=e&&D(i,c[r])}}if(E>1){e.beginPath(),e.moveTo(w[0],T[0]);for(let t=1;t<E;t++)e.lineTo(w[t],T[t]);for(let t=E-1;t>=0;t--)e.lineTo(w[t],re[t]);e.closePath(),e.fillStyle=r(i.colors[2]??`#1fa874`,.15),e.fill()}let O=(t,n,r,a,o,s)=>{let c=Pe(i,t,s);if(!(a<2||!c.visible)){e.beginPath(),e.strokeStyle=o,e.lineWidth=s,e.lineJoin=`round`,e.setLineDash(c.dash),e.moveTo(n[0],r[0]);for(let t=1;t<a;t++)e.lineTo(n[t],r[t]);e.stroke(),e.setLineDash([])}};O(`tenkan`,f,p,m,i.colors[0],i.lineWidths[0]),O(`kijun`,h,g,_,i.colors[1]??`#f2a93b`,i.lineWidths[0]),O(`senkouA`,v,y,b,i.colors[2]??`#1fa874`,1),O(`senkouB`,ee,x,S,i.colors[3]??`#e8505b`,1),O(`chikou`,te,ne,C,i.colors[4]??Ye,1)}},Ze=class extends L{descriptor={id:`psar`,name:`Parabolic SAR`,placement:`overlay`,defaultConfig:{step:.02,max:.2},inputs:{step:{kind:`number`,min:.01,step:.01},max:{kind:`number`,min:.01,step:.01}},shortName:`SAR`,plots:[{key:`value`,title:`SAR`,color:0,kind:`dots`,tone:{field:`trend`},downColor:1}]};calculate(e,t){let n=z(t,`step`,.02),r=z(t,`max`,.2),i=new R,a=Array(e.length).fill(null);if(e.length<2)return{values:i,series:a};let o=e[1].close>e[0].close,s=n,c=o?e[0].high:e[0].low,l=o?e[0].low:e[0].high,u={value:l,trend:o?1:-1};i.set(e[0].time,u),a[0]=u;for(let t=1;t<e.length;t++){let u=l;l=u+s*(c-u),o?(l=Math.min(l,e[t-1].low),t>=2&&(l=Math.min(l,e[t-2].low)),e[t].low<l?(o=!1,l=c,c=e[t].low,s=n):e[t].high>c&&(c=e[t].high,s=Math.min(s+n,r))):(l=Math.max(l,e[t-1].high),t>=2&&(l=Math.max(l,e[t-2].high)),e[t].high>l?(o=!0,l=c,c=e[t].high,s=n):e[t].low<c&&(c=e[t].low,s=Math.min(s+n,r)));let d={value:l,trend:o?1:-1};i.set(e[t].time,d),a[t]=d}return{values:i,series:a}}},Qe=class extends L{descriptor={id:`supertrend`,name:`Supertrend`,placement:`overlay`,defaultConfig:{period:10,multiplier:3},inputs:{period:{kind:`int`,min:1},multiplier:{kind:`number`,min:.1,step:.1}},shortName:`Supertrend`,plots:[{key:`value`,title:`Supertrend`,color:0,tone:{field:`trend`},downColor:1}]};calculate(e,t){let n=B(t,`period`,10,1),r=z(t,`multiplier`,3),i=new R,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};let o=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)o.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let s=0;for(let e=0;e<n;e++)s+=o[e];s/=n;let c=0,l=0,u=0,d=0,f=0,p=0,m=1;for(let t=n-1;t<e.length;t++){t>n-1&&(s=(s*(n-1)+o[t])/n);let h=(e[t].high+e[t].low)/2,g=h+r*s,_=h-r*s,v=e[Math.max(0,t-1)].close;c=g<u||v>u?g:u,l=_>d||v<d?_:d,f=p===u?e[t].close<=c?c:l:e[t].close>=l?l:c,m=f===l?1:-1;let y={value:f,trend:m};i.set(e[t].time,y),a[t]=y,u=c,d=l,p=f}return{values:i,series:a}}},$e=class extends L{descriptor={id:`keltner`,name:`Keltner Channel`,placement:`overlay`,defaultConfig:{emaPeriod:20,atrPeriod:10,multiplier:1.5},inputs:{emaPeriod:{kind:`int`,min:1},atrPeriod:{kind:`int`,min:1},multiplier:{kind:`number`,min:.1,step:.1}},shortName:`KC`,fills:[{between:[`upper`,`lower`],color:0,opacity:.08}],plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=B(t,`emaPeriod`,20,1),r=B(t,`atrPeriod`,10,1),i=z(t,`multiplier`,1.5),a=new R;if(e.length<Math.max(n,r))return{values:a};let o=2/(n+1),s=e[0].close,c=[s];for(let t=1;t<e.length;t++)s=(e[t].close-s)*o+s,c.push(s);let l=[e[0].high-e[0].low];for(let t=1;t<e.length;t++)l.push(Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close)));let u=0;for(let e=0;e<r;e++)u+=l[e];u/=r;let d=Array(e.length).fill(null),f=Math.max(n,r)-1;for(let t=f;t<e.length;t++){t>f&&(u=(u*(r-1)+l[t])/r);let n={middle:c[t],upper:c[t]+i*u,lower:c[t]-i*u};a.set(e[t].time,n),d[t]=n}return{values:a,series:d}}},et=class extends L{descriptor={id:`donchian`,name:`Donchian Channel`,placement:`overlay`,defaultConfig:{period:20},inputs:{period:{kind:`int`,min:1}},shortName:`DC`,fills:[{between:[`upper`,`lower`],color:0,opacity:.08}],plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1,width:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=new R,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={upper:a,middle:(a+o)/2,lower:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}};let tt=[`traditional`,`fibonacci`,`woodie`,`classic`,`camarilla`,`dm`];var nt=class extends L{descriptor={id:`pivots`,name:`Pivot Points`,placement:`overlay`,defaultConfig:{lookback:24,type:`traditional`},shortName:`Pivots`,inputs:{lookback:{kind:`int`,min:1},type:{options:tt}},plots:[{key:`r3`,title:`R3`,color:1,width:1,lineStyle:`dashed`},{key:`r2`,title:`R2`,color:1,width:1,lineStyle:`dashed`},{key:`r1`,title:`R1`,color:1,width:1,lineStyle:`dashed`},{key:`pp`,title:`P`,color:0},{key:`s1`,title:`S1`,color:2,width:1,lineStyle:`dashed`},{key:`s2`,title:`S2`,color:2,width:1,lineStyle:`dashed`},{key:`s3`,title:`S3`,color:2,width:1,lineStyle:`dashed`}]};calculate(e,t){let n=B(t,`lookback`,24,1),r=tt.includes(t.params.type)?t.params.type:`traditional`,i=new R,a=Array(e.length).fill(null);if(e.length<=n)return{values:i,series:a};for(let t=n;t<e.length;t++){let o=-1/0,s=1/0;for(let r=t-n;r<t;r++)e[r].high>o&&(o=e[r].high),e[r].low<s&&(s=e[r].low);let c=rt(r,e[t-n].open,o,s,e[t-1].close);i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}};function rt(e,t,n,r,i){let a=n-r;if(e===`dm`){let e=i<t?n+2*r+i:i>t?2*n+r+i:n+r+2*i;return{pp:e/4,r1:e/2-r,s1:e/2-n}}if(e===`camarilla`){let e=a*1.1;return{pp:(n+r+i)/3,r1:i+e/12,s1:i-e/12,r2:i+e/6,s2:i-e/6,r3:i+e/4,s3:i-e/4}}let o=e===`woodie`?(n+r+2*i)/4:(n+r+i)/3;if(e===`fibonacci`)return{pp:o,r1:o+.382*a,s1:o-.382*a,r2:o+.618*a,s2:o-.618*a,r3:o+a,s3:o-a};let s=2*o-r,c=2*o-n;return e===`classic`?{pp:o,r1:s,s1:c,r2:o+a,s2:o-a,r3:o+2*a,s3:o-2*a}:{pp:o,r1:s,s1:c,r2:o+a,s2:o-a,r3:n+2*(o-r),s3:r-2*(n-o)}}var it=class extends L{descriptor={id:`avwap`,name:`Anchored VWAP`,placement:`overlay`,defaultConfig:{anchorTime:0},inputs:{anchorTime:{kind:`int`}},shortName:`AVWAP`,plots:[{key:`value`,title:`AVWAP`,color:0}]};calculate(n,r){let i=z(r,`anchorTime`,0),a=new R,o=Array(n.length).fill(null),s=0;if(i>0){let r=e(n),c=t(i);if(s=n.findIndex(e=>e.time*r>=c),s<0)return{values:a,series:o}}let c=0,l=0;for(let e=s;e<n.length;e++){let t=(n[e].high+n[e].low+n[e].close)/3;if(c+=n[e].volume,l+=t*n[e].volume,c>0){let t={value:l/c};a.set(n[e].time,t),o[e]=t}}return{values:a,series:o}}},at=class extends L{descriptor={id:`zigzag`,name:`ZigZag`,placement:`overlay`,defaultConfig:{deviation:5},inputs:{deviation:{kind:`number`,min:.1,step:.1}},shortName:`ZigZag`,plots:[{key:`pivot`,title:`Pivot`,color:0}]};calculate(e,t){let n=Math.max(.01,z(t,`deviation`,5))/100,r=new R,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i,meta:{pivots:[]}};let a=[],o=null,s=0,c=e[0].close;for(let t=1;t<e.length;t++){let r=e[t].high,i=e[t].low;if(o===null){r>=c*(1+n)?(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i);continue}o===`up`?r>c?(s=t,c=r):i<=c*(1-n)&&(a.push({idx:s,price:c,type:`high`}),o=`down`,s=t,c=i):i<c?(s=t,c=i):r>=c*(1+n)&&(a.push({idx:s,price:c,type:`low`}),o=`up`,s=t,c=r)}a.push({idx:s,price:c,type:o===`up`?`high`:`low`});for(let t of a){let n={pivot:t.price};r.set(e[t.idx].time,n),i[t.idx]=n}return{values:r,series:i,meta:{pivots:a}}}render(e,t,n,r){if(r.plots?.pivot?.visible===!1)return;let i=t.meta?.pivots;if(!(!i||i.length<2)){e.beginPath(),e.strokeStyle=r.colors[0],e.lineWidth=r.lineWidths[0],e.lineJoin=`round`;for(let t=0;t<i.length;t++){let r=i[t],a=N(r.idx,n),o=P(r.price,n);t===0?e.moveTo(a,o):e.lineTo(a,o)}e.stroke()}}},ot=class extends L{descriptor={id:`lrc`,name:`Linear Regression Channel`,placement:`overlay`,defaultConfig:{period:100,stdDev:2,source:`close`},shortName:`LRC`,inputs:{source:{source:!0},period:{kind:`int`,min:2},stdDev:{kind:`number`,min:.1,step:.1}},fills:[{between:[`upper`,`lower`],color:0,opacity:.08}],plots:[{key:`upper`,title:`Upper`,color:0},{key:`middle`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=B(t,`period`,100,2),r=z(t,`stdDev`,2),i=new R,a=Array(e.length).fill(null);if(e.length<n)return{values:i,series:a};for(let t=n-1;t<e.length;t++){let o=t-n+1,s=0,c=0,l=0,u=0;for(let t=0;t<n;t++){let n=t,r=e[o+t].close;s+=n,c+=r,l+=n*r,u+=n*n}let d=n*u-s*s;if(d===0)continue;let f=(n*l-s*c)/d,p=(c-f*s)/n,m=0;for(let t=0;t<n;t++){let n=f*t+p,r=e[o+t].close-n;m+=r*r}let h=Math.sqrt(m/n),g=f*(n-1)+p,_={middle:g,upper:g+r*h,lower:g-r*h,slope:f};i.set(e[t].time,_),a[t]=_}return{values:i,series:a}}},st=class extends L{descriptor={id:`hma`,name:`Hull Moving Average`,placement:`overlay`,defaultConfig:{period:21,source:`close`},shortName:`HMA`,inputs:{source:{source:!0},period:{kind:`int`,min:2}},plots:[{key:`value`,title:`HMA`,color:0}]};calculate(e,t){let n=B(t,`period`,21,2),r=new R,i=Array(e.length).fill(null);if(e.length<n)return{values:r,series:i};let a=e.map(e=>e.close),o=Math.max(2,Math.floor(n/2)),s=Math.max(2,Math.floor(Math.sqrt(n))),c=ct(a,n),l=ct(a,o),u=lt(a.map((e,t)=>c[t]===null||l[t]===null?null:2*l[t]-c[t]),s);for(let t=0;t<e.length;t++){if(u[t]===null)continue;let n={value:u[t]};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}};function ct(e,t){let n=Array(e.length).fill(null);if(e.length<t)return n;let r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0;for(let n=0;n<t;n++)a+=e[i-n]*(t-n);n[i]=a/r}return n}function lt(e,t){let n=Array(e.length).fill(null),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-n];if(r===null){o=!1;break}a+=r*(t-n)}o&&(n[i]=a/r)}return n}var ut=class extends L{descriptor={readsExchangeTimeZone:!0,id:`mtfma`,name:`MTF Moving Average`,placement:`overlay`,defaultConfig:{period:50,timeframe:`1d`,source:`close`},shortName:`MTF MA`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`MA`,color:0}]};calculate(e,t){let n=B(t,`period`,50,1),r=String(t.params.timeframe??`1d`),i=new R,a=Array(e.length).fill(null);if(e.length===0)return{values:i,series:a};let o=[],s=Oe(e,r,t.exchangeTimeZone),c=s(e[0].time),l=e[0].close,u=null,d=()=>{if(o.length<n)return;let e=0;for(let t=o.length-n;t<o.length;t++)e+=o[t];u=e/n};for(let t=0;t<e.length;t++){let n=s(e[t].time);if(n!==c&&(o.push(l),d(),c=n),l=e[t].close,u!==null){let n={value:u};i.set(e[t].time,n),a[t]=n}}return{values:i,series:a}}},dt=class extends L{descriptor={readsExchangeTimeZone:!0,id:`svwap`,name:`Session VWAP`,placement:`overlay`,defaultConfig:{bands:1},inputs:{bands:{kind:`int`,min:0,max:3}},shortName:`SVWAP`,plots:[{key:`value`,title:`VWAP`,color:0,breakOn:`session`},{key:`u1`,title:`+1σ`,color:1,width:1,lineStyle:`dashed`,opacity:.55,breakOn:`session`},{key:`l1`,title:`−1σ`,color:1,width:1,lineStyle:`dashed`,opacity:.55,breakOn:`session`},{key:`u2`,title:`+2σ`,color:1,width:1,lineStyle:`dashed`,opacity:.55,breakOn:`session`},{key:`l2`,title:`−2σ`,color:1,width:1,lineStyle:`dashed`,opacity:.55,breakOn:`session`},{key:`u3`,title:`+3σ`,color:1,width:1,lineStyle:`dashed`,opacity:.55,breakOn:`session`},{key:`l3`,title:`−3σ`,color:1,width:1,lineStyle:`dashed`,opacity:.55,breakOn:`session`}]};calculate(e,t){let n=T(e)===!0?0:Math.min(3,B(t,`bands`,1,0)),r=new R,i=Array(e.length).fill(null);if(e.length===0)return{values:r,series:i};let a=Oe(e,`session`,t.exchangeTimeZone),o=a(e[0].time),s=0,c=0,l=0;for(let t=0;t<e.length;t++){let u=e[t],d=a(u.time);d!==o&&(s=0,c=0,l=0,o=d);let f=(u.high+u.low+u.close)/3;if(s+=f*u.volume,c+=f*f*u.volume,l+=u.volume,l>0){let e=s/l,a={value:e,session:o};if(n>0){let t=Math.max(0,c/l-e*e),r=Math.sqrt(t);for(let t=1;t<=n;t++)a[`u${t}`]=e+t*r,a[`l${t}`]=e-t*r}r.set(u.time,a),i[t]=a}}return{values:r,series:i}}},ft=class extends L{descriptor={id:`chandelier`,name:`Chandelier Exit`,placement:`overlay`,defaultConfig:{period:22,multiplier:3},inputs:{period:{kind:`int`,min:1},multiplier:{kind:`number`,min:.1,step:.1}},shortName:`CE`,plots:[{key:`long`,title:`Long`,color:0,lineStyle:`dashed`},{key:`short`,title:`Short`,color:1,lineStyle:`dashed`}]};calculate(e,t){let n=B(t,`period`,22,1),r=z(t,`multiplier`,3),i=new R,a=Array(e.length).fill(null),o=e.length;if(o<=n)return{values:i,series:a};let s=Array(o).fill(0);for(let t=1;t<o;t++){let n=e[t-1].close;s[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let c=0;for(let e=1;e<=n;e++)c+=s[e];c/=n;for(let t=n;t<o;t++){t>n&&(c=(c*(n-1)+s[t])/n);let o=-1/0,l=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>o&&(o=e[r].high),e[r].low<l&&(l=e[r].low);let u={long:o-r*c,short:l+r*c};i.set(e[t].time,u),a[t]=u}return{values:i,series:a}}},pt=class extends L{descriptor={id:`alligator`,name:`Alligator`,placement:`overlay`,defaultConfig:{jaw:13,teeth:8,lips:5,jawShift:8,teethShift:5,lipsShift:3},inputs:{jaw:{kind:`int`,min:1},teeth:{kind:`int`,min:1},lips:{kind:`int`,min:1},jawShift:{kind:`int`,min:0},teethShift:{kind:`int`,min:0},lipsShift:{kind:`int`,min:0}},shortName:`Alligator`,plots:[{key:`jaw`,title:`Jaw`,color:0},{key:`teeth`,title:`Teeth`,color:1},{key:`lips`,title:`Lips`,color:2}]};calculate(e,t){let n=B(t,`jaw`,13,1),r=B(t,`teeth`,8,1),i=B(t,`lips`,5,1),a=B(t,`jawShift`,8,0),o=B(t,`teethShift`,5,0),s=B(t,`lipsShift`,3,0),c=new R,l=e.length,u=Array(l).fill(null);if(l===0)return{values:c,series:u};let d=e.map(e=>(e.high+e.low)/2),f=mt(d,n),p=mt(d,r),m=mt(d,i),h=Array(l).fill(void 0),g=Array(l).fill(void 0),_=Array(l).fill(void 0);for(let e=0;e<l;e++)f[e]!==void 0&&e+a<l&&(h[e+a]=f[e]),p[e]!==void 0&&e+o<l&&(g[e+o]=p[e]),m[e]!==void 0&&e+s<l&&(_[e+s]=m[e]);for(let t=0;t<l;t++){if(h[t]===void 0&&g[t]===void 0&&_[t]===void 0)continue;let n={};h[t]!==void 0&&(n.jaw=h[t]),g[t]!==void 0&&(n.teeth=g[t]),_[t]!==void 0&&(n.lips=_[t]),c.set(e[t].time,n),u[t]=n}return{values:c,series:u}}};function mt(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<t)return r;let i=0;for(let n=0;n<t;n++)i+=e[n];let a=i/t;r[t-1]=a;for(let i=t;i<n;i++)a=(a*(t-1)+e[i])/t,r[i]=a;return r}var ht=class extends L{descriptor={id:`vwma`,name:`Volume Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`VWMA`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`VWMA`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=new R,i=Array(e.length).fill(null),a=0,o=0;for(let t=0;t<e.length;t++){let s=e[t].close*e[t].volume;if(a+=s,o+=e[t].volume,t>=n){let r=e[t-n];a-=r.close*r.volume,o-=r.volume}if(t>=n-1&&o>0){let n={value:a/o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=B(t,`period`,20,1);for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,a=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close*e[n].volume,a+=e[n].volume;this.writePoint(n,e,t,a>0?{value:r/a}:null)}return n}},gt=class extends L{descriptor={id:`wma`,name:`Weighted Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`WMA`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`WMA`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=new R,i=Array(e.length).fill(null),a=n*(n+1)/2,o=0,s=0;for(let t=0;t<e.length;t++){let c=e[t].close;if(s+=c*n-o,o+=c,t>=n&&(o-=e[t-n].close),t>=n-1){let n={value:s/a};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=B(t,`period`,20,1),a=i*(i+1)/2;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0,o=t-i+1;for(let t=0;t<i;t++)r+=e[o+t].close*(t+1);this.writePoint(n,e,t,{value:r/a})}return n}},_t=class extends L{descriptor={id:`envelope`,name:`Moving Average Envelope`,placement:`overlay`,defaultConfig:{period:20,percent:2.5,source:`close`},shortName:`Env`,inputs:{source:{source:!0},period:{kind:`int`,min:1},percent:{kind:`number`,min:0,step:.1}},fills:[{between:[`upper`,`lower`],color:0,opacity:.08}],plots:[{key:`upper`,title:`Upper`,color:0},{key:`basis`,title:`Basis`,color:1},{key:`lower`,title:`Lower`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=z(t,`percent`,2.5)/100,i=new R,a=Array(e.length).fill(null),o=0;for(let t=0;t<e.length;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let s=o/n,c={basis:s,upper:s*(1+r),lower:s*(1-r)};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=B(t,`period`,20,1),a=z(t,`percent`,2.5)/100;for(let t=r;t<e.length;t++){if(t<i-1){this.writePoint(n,e,t,null);continue}let r=0;for(let n=t-i+1;n<=t;n++)r+=e[n].close;let o=r/i;this.writePoint(n,e,t,{basis:o,upper:o*(1+a),lower:o*(1-a)})}return n}};function vt(e,t){let n=2/(t+1),r=Array(e.length).fill(null),i=0,a=0;for(let o=0;o<e.length;o++){if(o<t-1){a+=e[o];continue}i=o===t-1?(a+e[o])/t:(e[o]-i)*n+i,r[o]=i}return r}function yt(e,t,n){let r=Array(n).fill(null);for(let n=0;n<e.length;n++)e[n]!==null&&(r[t[n]]=e[n]);return r}function bt(e){let t=[],n=[];for(let r=0;r<e.length;r++)e[r]!==null&&(t.push(e[r]),n.push(r));return{values:t,indices:n}}var xt=class extends L{descriptor={id:`tema`,name:`Triple EMA`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`TEMA`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`TEMA`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=new R,i=Array(e.length).fill(null),a=vt(e.map(e=>e.close),n),o=bt(a),s=yt(vt(o.values,n),o.indices,e.length),c=bt(s),l=yt(vt(c.values,n),c.indices,e.length);for(let t=0;t<e.length;t++){let n=a[t],o=s[t],c=l[t];if(n===null||o===null||c===null)continue;let u={value:3*n-3*o+c};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}},St=class extends L{descriptor={id:`ao`,name:`Awesome Oscillator`,placement:`panel`,defaultConfig:{fast:5,slow:34},inputs:{fast:{kind:`int`,min:1},slow:{kind:`int`,min:1}},shortName:`AO`,plots:[{key:`value`,title:`AO`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e,t){let n=B(t,`fast`,5,1),r=B(t,`slow`,34,1),i=new R,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=(e[t].high+e[t].low)/2;let s=0,c=0,l;for(let t=0;t<e.length;t++)if(c+=o[t],t>=r&&(c-=o[t-r]),s+=o[t],t>=n&&(s-=o[t-n]),t>=r-1){let o=s/n-c/r,u={value:o,up:+(l===void 0||o>=l)};i.set(e[t].time,u),a[t]=u,l=o}return{values:i,series:a}}},Ct=class extends L{descriptor={id:`chaikinOsc`,name:`Chaikin Oscillator`,placement:`panel`,defaultConfig:{fast:3,slow:10},inputs:{fast:{kind:`int`,min:1},slow:{kind:`int`,min:1}},shortName:`Chaikin Osc`,plots:[{key:`value`,title:`Chaikin`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=B(t,`fast`,3,1),r=B(t,`slow`,10,1),i=new R,a=Array(e.length).fill(null);if(e.length<r)return{values:i,series:a};let o=2/(n+1),s=2/(r+1),c=0,l=0,u=0;for(let t=0;t<e.length;t++){let{high:n,low:d,close:f,volume:p}=e[t],m=n-d,h=m===0?0:(f-d-(n-f))/m;if(c+=h*p,t===0?(l=c,u=c):(l=(c-l)*o+l,u=(c-u)*s+u),t>=r-1){let n={value:l-u,adl:c};i.set(e[t].time,n),a[t]=n}}return{values:i,series:a}}},wt=class extends L{descriptor={id:`rsi`,name:`Relative Strength Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`RSI`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`RSI`,color:0}],scale:{min:0,max:100},levels:[30,70]};smoothing=new WeakMap;workerState(e){return this.smoothing.get(e)}adoptWorkerState(e,t){t&&this.smoothing.set(e,t)}calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null),a={values:r,series:i};if(e.length<n+1)return a;let o=[],s=[],c=0,l=0;for(let t=1;t<=n;t++){let n=e[t].close-e[t-1].close;n>0?c+=n:l-=n}c/=n,l/=n,o[n]=c,s[n]=l;let u={value:l===0?100:100-100/(1+c/l)};r.set(e[n].time,u),i[n]=u;for(let t=n+1;t<e.length;t++){let a=e[t].close-e[t-1].close,u=a>0?a:0,d=a<0?-a:0;c=(c*(n-1)+u)/n,l=(l*(n-1)+d)/n,o[t]=c,s[t]=l;let f={value:l===0?100:100-100/(1+c/l)};r.set(e[t].time,f),i[t]=f}return this.smoothing.set(a,{gain:o,loss:s}),a}update(e,t,n,r){let i=B(t,`period`,14,1),a=this.smoothing.get(n);if(!a||r<=i||!this.canResume(e,n,r))return null;let o=a.gain[r-1],s=a.loss[r-1];if(o===void 0||s===void 0)return null;for(let t=r;t<e.length;t++){let r=e[t].close-e[t-1].close,c=r>0?r:0,l=r<0?-r:0;o=(o*(i-1)+c)/i,s=(s*(i-1)+l)/i,a.gain[t]=o,a.loss[t]=s;let u=s===0?100:100-100/(1+o/s);this.writePoint(n,e,t,{value:u})}return n}},Tt=class extends L{descriptor={id:`macd`,name:`MACD`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9,source:`close`},shortName:`MACD`,inputs:{source:{source:!0},fast:{kind:`int`,min:1},slow:{kind:`int`,min:1},signal:{kind:`int`,min:1}},plots:[{key:`histogram`,title:`Histogram`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`macd`,title:`MACD`,color:0},{key:`signal`,title:`Signal`,color:1}]};emas=new WeakMap;workerState(e){return this.emas.get(e)}adoptWorkerState(e,t){t&&this.emas.set(e,t)}calculate(e,t){let n=B(t,`fast`,12,1),r=B(t,`slow`,26,1),i=B(t,`signal`,9,1),a=new R,o=Array(e.length).fill(null),s={values:a,series:o};if(e.length<r)return s;let c=2/(n+1),l=2/(r+1),u=2/(i+1),d=Array(e.length),f=Array(e.length),p=e[0].close,m=e[0].close,h=0,g=!1;for(let t=0;t<e.length;t++){let n=e[t].close;if(t===0?(p=n,m=n):(p=(n-p)*c+p,m=(n-m)*l+m),d[t]=p,f[t]=m,t>=r-1){let n=p-m;g?h=(n-h)*u+h:(h=n,g=!0);let r=n-h,i={macd:n,signal:h,histogram:r};a.set(e[t].time,i),o[t]=i}}return this.emas.set(s,{fast:d,slow:f}),s}update(e,t,n,r){let i=B(t,`fast`,12,1),a=B(t,`slow`,26,1),o=B(t,`signal`,9,1),s=this.emas.get(n);if(!s||r<a||!this.canResume(e,n,r))return null;let c=s.fast[r-1],l=s.slow[r-1],u=n.series[r-1]?.signal;if(c===void 0||l===void 0||u===void 0)return null;let d=2/(i+1),f=2/(a+1),p=2/(o+1);for(let t=r;t<e.length;t++){let r=e[t].close;c=(r-c)*d+c,l=(r-l)*f+l,s.fast[t]=c,s.slow[t]=l;let i=c-l;u=(i-u)*p+u,this.writePoint(n,e,t,{macd:i,signal:u,histogram:i-u})}return n}},Et=class extends L{descriptor={id:`stochastic`,name:`Stochastic Oscillator`,placement:`panel`,defaultConfig:{kPeriod:14,dPeriod:3,smooth:3},inputs:{kPeriod:{kind:`int`,min:1},dPeriod:{kind:`int`,min:1},smooth:{kind:`int`,min:1}},shortName:`Stoch`,plots:[{key:`k`,title:`%K`,color:0},{key:`d`,title:`%D`,color:1}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=B(t,`kPeriod`,14,1),r=B(t,`dPeriod`,3,1),i=B(t,`smooth`,3,1),a=new R,o=Array(e.length).fill(null);if(e.length<n)return{values:a,series:o};let s=[];for(let t=0;t<e.length;t++){if(t<n-1){s.push(0);continue}let r=-1/0,i=1/0;for(let a=t-n+1;a<=t;a++)e[a].high>r&&(r=e[a].high),e[a].low<i&&(i=e[a].low);s.push(r===i?50:(e[t].close-i)/(r-i)*100)}let c=[];for(let e=0;e<s.length;e++){if(e<n-1+i-1){c.push(0);continue}let t=0;for(let n=e-i+1;n<=e;n++)t+=s[n];c.push(t/i)}let l=n-1+i-1;for(let t=l;t<c.length;t++){let n={k:c[t]};if(t>=l+r-1){let e=0;for(let n=t-r+1;n<=t;n++)e+=c[n];n.d=e/r}a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=B(t,`kPeriod`,14,1),a=B(t,`dPeriod`,3,1),o=B(t,`smooth`,3,1),s=i-1+o-1,c=t=>{let n=-1/0,r=1/0;for(let a=t-i+1;a<=t;a++)e[a].high>n&&(n=e[a].high),e[a].low<r&&(r=e[a].low);return n===r?50:(e[t].close-r)/(n-r)*100},l=e=>{let t=0;for(let n=e-o+1;n<=e;n++)t+=c(n);return t/o};for(let t=r;t<e.length;t++){if(t<s||e.length<i){this.writePoint(n,e,t,null);continue}let r={k:l(t)};if(t>=s+a-1){let e=0;for(let n=t-a+1;n<=t;n++)e+=l(n);r.d=e/a}this.writePoint(n,e,t,r)}return n}},Dt=class extends L{descriptor={id:`atr`,name:`Average True Range`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:1}},shortName:`ATR`,plots:[{key:`value`,title:`ATR`,color:0}]};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null);if(e.length<Math.max(2,n))return{values:r,series:i};let a=[e[0].high-e[0].low];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n)}let o=0;for(let e=0;e<n;e++)o+=a[e];o/=n;let s={value:o};r.set(e[n-1].time,s),i[n-1]=s;for(let t=n;t<e.length;t++){o=(o*(n-1)+a[t])/n;let s={value:o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}update(e,t,n,r){let i=B(t,`period`,14,1);if(r<i||!this.canResume(e,n,r))return null;let a=n.series[r-1]?.value;if(a===void 0)return null;for(let t=r;t<e.length;t++){let r=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a=(a*(i-1)+r)/i,this.writePoint(n,e,t,{value:a})}return n}},Ot=class extends L{descriptor={id:`adx`,name:`Average Directional Index`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:1}},shortName:`ADX`,plots:[{key:`adx`,title:`ADX`,color:0},{key:`plusDI`,title:`+DI`,color:1},{key:`minusDI`,title:`−DI`,color:2}],scale:{min:0}};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null);if(e.length<n*2)return{values:r,series:i};let a=[],o=[],s=[];for(let t=1;t<e.length;t++){let n=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-e[t-1].close),Math.abs(e[t].low-e[t-1].close));a.push(n);let r=e[t].high-e[t-1].high,i=e[t-1].low-e[t].low;o.push(r>i&&r>0?r:0),s.push(i>r&&i>0?i:0)}let c=0,l=0,u=0;for(let e=0;e<n;e++)c+=a[e],l+=o[e],u+=s[e];let d=[];for(let t=n;t<a.length;t++){t>n&&(c=c-c/n+a[t],l=l-l/n+o[t],u=u-u/n+s[t]);let f=c===0?0:l/c*100,p=c===0?0:u/c*100,m=f+p,h=m===0?0:Math.abs(f-p)/m*100;d.push(h);let g=t+1,_={plusDI:f,minusDI:p,dx:h};r.set(e[g].time,_),i[g]=_}if(d.length>=n){let t=0;for(let e=0;e<n;e++)t+=d[e];t/=n;let a=n*2;if(a<e.length){let n=r.get(e[a].time);n&&(n.adx=t),i[a]&&(i[a].adx=t)}for(let a=n;a<d.length;a++){t=(t*(n-1)+d[a])/n;let o=a+n+1;if(o<e.length){let n=r.get(e[o].time);n&&(n.adx=t),i[o]&&(i[o].adx=t)}}}return{values:r,series:i}}},kt=class extends L{descriptor={id:`obv`,name:`On Balance Volume`,placement:`panel`,defaultConfig:{},shortName:`OBV`,plots:[{key:`value`,title:`OBV`,color:0}]};calculate(e,t){let n=new R,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0,a={value:i};n.set(e[0].time,a),r[0]=a;for(let t=1;t<e.length;t++){e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume);let a={value:i};n.set(e[t].time,a),r[t]=a}return{values:n,series:r}}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;for(let t=r;t<e.length;t++)e[t].close>e[t-1].close?i+=e[t].volume:e[t].close<e[t-1].close&&(i-=e[t].volume),this.writePoint(n,e,t,{value:i});return n}},At=class extends L{descriptor={id:`williamsR`,name:`Williams %R`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:1}},shortName:`%R`,plots:[{key:`value`,title:`%R`,color:0}],scale:{min:-100,max:0},levels:[-80,-20]};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=-1/0,o=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<o&&(o=e[r].low);let s={value:a===o?-50:(a-e[t].close)/(a-o)*-100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},jt=class extends L{descriptor={id:`cci`,name:`Commodity Channel Index`,placement:`panel`,defaultConfig:{period:20},inputs:{period:{kind:`int`,min:1}},shortName:`CCI`,plots:[{key:`value`,title:`CCI`,color:0}],levels:[-100,0,100]};calculate(e,t){let n=B(t,`period`,20,1),r=new R,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=(e[r].high+e[r].low+e[r].close)/3;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=(e[r].high+e[r].low+e[r].close)/3;s+=Math.abs(t-o)}let c=s/n,l=(e[t].high+e[t].low+e[t].close)/3,u={value:c===0?0:(l-o)/(.015*c)};r.set(e[t].time,u),i[t]=u}return{values:r,series:i}}},Mt=class extends L{descriptor={id:`mfi`,name:`Money Flow Index`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:1}},shortName:`MFI`,plots:[{key:`value`,title:`MFI`,color:0}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null);if(e.length<n+1)return{values:r,series:i};let a=e.map(e=>(e.high+e.low+e.close)/3),o=a.map((t,n)=>t*e[n].volume);for(let t=n;t<e.length;t++){let s=0,c=0;for(let e=t-n+1;e<=t;e++)a[e]>a[e-1]?s+=o[e]:a[e]<a[e-1]&&(c+=o[e]);let l={value:c===0?100:100-100/(1+s/c)};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}},Nt=class extends L{descriptor={id:`aroon`,name:`Aroon`,placement:`panel`,defaultConfig:{period:25},inputs:{period:{kind:`int`,min:1}},shortName:`Aroon`,plots:[{key:`up`,title:`Up`,color:0},{key:`down`,title:`Down`,color:1}],scale:{min:0,max:100}};calculate(e,t){let n=B(t,`period`,25,1),r=new R,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=0,o=0,s=-1/0,c=1/0;for(let r=0;r<=n;r++){let i=t-n+r;e[i].high>s&&(s=e[i].high,a=r),e[i].low<c&&(c=e[i].low,o=r)}let l={up:a/n*100,down:o/n*100};r.set(e[t].time,l),i[t]=l}return{values:r,series:i}}},Pt=class extends L{descriptor={id:`roc`,name:`Rate of Change`,placement:`panel`,defaultConfig:{period:12,source:`close`},shortName:`ROC`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`ROC`,color:0}],levels:[0]};calculate(e,t){let n=B(t,`period`,12,1),r=new R,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].close,o={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}},Ft=class extends L{descriptor={id:`tsi`,name:`True Strength Index`,placement:`panel`,defaultConfig:{longPeriod:25,shortPeriod:13,signalPeriod:7,source:`close`},shortName:`TSI`,inputs:{source:{source:!0},longPeriod:{kind:`int`,min:1},shortPeriod:{kind:`int`,min:1},signalPeriod:{kind:`int`,min:1}},plots:[{key:`tsi`,title:`TSI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};emaSmooth(e,t){let n=2/(t+1),r=[e[0]];for(let t=1;t<e.length;t++)r.push((e[t]-r[t-1])*n+r[t-1]);return r}calculate(e,t){let n=B(t,`longPeriod`,25,1),r=B(t,`shortPeriod`,13,1),i=B(t,`signalPeriod`,7,1),a=new R,o=Array(e.length).fill(null);if(e.length<2)return{values:a,series:o};let s=[],c=[];for(let t=1;t<e.length;t++){let n=e[t].close-e[t-1].close;s.push(n),c.push(Math.abs(n))}let l=this.emaSmooth(this.emaSmooth(s,n),r),u=this.emaSmooth(this.emaSmooth(c,n),r),d=[];for(let e=0;e<l.length;e++)d.push(u[e]===0?0:l[e]/u[e]*100);let f=this.emaSmooth(d,i);for(let t=0;t<d.length;t++){let n=t+1;if(n<e.length){let r={tsi:d[t],signal:f[t]};a.set(e[n].time,r),o[n]=r}}return{values:a,series:o}}},It=class extends L{descriptor={id:`cmf`,name:`Chaikin Money Flow`,placement:`panel`,defaultConfig:{period:20},inputs:{period:{kind:`int`,min:1}},shortName:`CMF`,plots:[{key:`value`,title:`CMF`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=B(t,`period`,20,1),r=new R,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0,o=0;for(let r=t-n+1;r<=t;r++){let t=e[r].high-e[r].low,n=t===0?0:(e[r].close-e[r].low-(e[r].high-e[r].close))/t;a+=n*e[r].volume,o+=e[r].volume}let s={value:o===0?0:a/o};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},Lt=class extends L{descriptor={id:`voldelta`,name:`Volume Delta`,placement:`panel`,defaultConfig:{mode:0},inputs:{mode:{kind:`int`,min:0,max:1}},shortName:`Vol Δ`,plots:[{key:`value`,title:`Delta`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e,t){let n=z(t,`mode`,0)>=1,r=new R,i=Array(e.length).fill(null),a=0;for(let t=0;t<e.length;t++){let o=e[t],s=o.close>=o.open,c=s?o.volume:-o.volume;a+=c;let l={value:n?a:c,up:+!!s};r.set(o.time,l),i[t]=l}return{values:r,series:i}}},Rt=class extends L{descriptor={id:`vortex`,name:`Vortex Indicator`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:1}},shortName:`VI`,plots:[{key:`viPlus`,title:`VI+`,color:0},{key:`viMinus`,title:`VI−`,color:1}],levels:[1]};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0),o=Array(e.length).fill(0),s=Array(e.length).fill(0);for(let t=1;t<e.length;t++){a[t]=Math.abs(e[t].high-e[t-1].low),o[t]=Math.abs(e[t].low-e[t-1].high);let n=e[t].high,r=e[t].low,i=e[t-1].close;s[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let c=0,l=0,u=0;for(let t=1;t<e.length;t++)if(c+=a[t],l+=o[t],u+=s[t],t>n&&(c-=a[t-n],l-=o[t-n],u-=s[t-n]),t>=n&&u>0){let n={viPlus:c/u,viMinus:l/u};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}},zt=class extends L{descriptor={id:`chop`,name:`Choppiness Index`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:2}},shortName:`CHOP`,plots:[{key:`value`,title:`CHOP`,color:0}],scale:{min:0,max:100},levels:[38.2,61.8]};calculate(e,t){let n=B(t,`period`,14,2),r=new R,i=Array(e.length).fill(null);if(e.length<=n)return{values:r,series:i};let a=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t].high,r=e[t].low,i=e[t-1].close;a[t]=Math.max(n-r,Math.abs(n-i),Math.abs(r-i))}let o=Math.log10(n),s=0;for(let t=1;t<e.length;t++)if(s+=a[t],t>n&&(s-=a[t-n]),t>=n){let a=-1/0,c=1/0;for(let r=t-n+1;r<=t;r++)e[r].high>a&&(a=e[r].high),e[r].low<c&&(c=e[r].low);let l=a-c;if(l>0&&s>0){let n={value:Math.max(0,Math.min(100,100*Math.log10(s/l)/o))};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}},Bt=class extends L{descriptor={id:`uo`,name:`Ultimate Oscillator`,placement:`panel`,defaultConfig:{fast:7,mid:14,slow:28},inputs:{fast:{kind:`int`,min:1},mid:{kind:`int`,min:1},slow:{kind:`int`,min:1}},shortName:`UO`,plots:[{key:`value`,title:`UO`,color:0}],scale:{min:0,max:100},levels:[30,70]};calculate(e,t){let n=B(t,`fast`,7,1),r=B(t,`mid`,14,1),i=B(t,`slow`,28,1),a=new R,o=Array(e.length).fill(null);if(e.length<=i)return{values:a,series:o};let s=Array(e.length).fill(0),c=Array(e.length).fill(0);for(let t=1;t<e.length;t++){let n=e[t-1].close,r=Math.min(e[t].low,n),i=Math.max(e[t].high,n);s[t]=e[t].close-r,c[t]=i-r}let l=(e,t,n)=>{let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r};for(let t=i;t<e.length;t++){let u=Vt(l(s,t,n),l(c,t,n)),d=Vt(l(s,t,r),l(c,t,r)),f=Vt(l(s,t,i),l(c,t,i)),p={value:100*(4*u+2*d+f)/7};a.set(e[t].time,p),o[t]=p}return{values:a,series:o}}};function Vt(e,t){return t===0?0:e/t}var Ht=class extends L{descriptor={id:`fi`,name:`Force Index`,placement:`panel`,defaultConfig:{period:13},inputs:{period:{kind:`int`,min:1}},shortName:`EFI`,plots:[{key:`value`,title:`EFI`,color:0}],levels:[0]};calculate(e,t){let n=B(t,`period`,13,1),r=new R,i=Array(e.length).fill(null);if(e.length<2)return{values:r,series:i};let a=2/(n+1),o;for(let t=1;t<e.length;t++){let s=(e[t].close-e[t-1].close)*e[t].volume;if(o=o===void 0?s:s*a+o*(1-a),t>=n){let n={value:o};r.set(e[t].time,n),i[t]=n}}return{values:r,series:i}}},Ut=class extends L{descriptor={id:`crsi`,name:`Connors RSI`,placement:`panel`,defaultConfig:{rsiPeriod:3,streakPeriod:2,rankPeriod:100,source:`close`},shortName:`CRSI`,inputs:{source:{source:!0},rsiPeriod:{kind:`int`,min:1},streakPeriod:{kind:`int`,min:1},rankPeriod:{kind:`int`,min:1}},plots:[{key:`value`,title:`CRSI`,color:0}],scale:{min:0,max:100},levels:[10,90]};calculate(e,t){let n=B(t,`rsiPeriod`,3,1),r=B(t,`streakPeriod`,2,1),i=B(t,`rankPeriod`,100,1),a=new R,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=e.map(e=>e.close),l=Wt(c,n),u=Array(s).fill(0);for(let e=1;e<s;e++)c[e]>c[e-1]?u[e]=u[e-1]>0?u[e-1]+1:1:c[e]<c[e-1]?u[e]=u[e-1]<0?u[e-1]-1:-1:u[e]=0;let d=Wt(u,r),f=Array(s).fill(0);for(let e=1;e<s;e++)f[e]=c[e-1]===0?0:(c[e]-c[e-1])/c[e-1]*100;for(let t=0;t<s;t++){if(t<i+1)continue;let n=l[t],r=d[t];if(n===void 0||r===void 0)continue;let s=0;for(let e=t-i;e<t;e++)f[e]<f[t]&&s++;let c=s/i*100,u={value:(n+r+c)/3};a.set(e[t].time,u),o[t]=u}return{values:a,series:o}}};function Wt(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1],s=n>0?n:0,c=n<0?-n:0;i=(i*(t-1)+s)/t,a=(a*(t-1)+c)/t,r[o]=a===0?100:100-100/(1+i/a)}return r}var Gt=class extends L{descriptor={id:`coppock`,name:`Coppock Curve`,placement:`panel`,defaultConfig:{longRoc:14,shortRoc:11,wma:10,source:`close`},shortName:`Coppock`,inputs:{source:{source:!0},longRoc:{kind:`int`,min:1},shortRoc:{kind:`int`,min:1},wma:{kind:`int`,min:1}},plots:[{key:`value`,title:`Coppock`,color:0}],levels:[0]};calculate(e,t){let n=B(t,`longRoc`,14,1),r=B(t,`shortRoc`,11,1),i=B(t,`wma`,10,1),a=new R,o=Array(e.length).fill(null),s=e.length,c=Math.max(n,r);if(s<=c+i)return{values:a,series:o};let l=e.map(e=>e.close),u=(e,t)=>l[e-t]===0?0:(l[e]-l[e-t])/l[e-t]*100,d=Array(s).fill(void 0);for(let e=c;e<s;e++)d[e]=u(e,n)+u(e,r);let f=i*(i+1)/2;for(let t=c+i-1;t<s;t++){let n=0,r=!0;for(let e=0;e<i;e++){let a=d[t-e];if(a===void 0){r=!1;break}n+=a*(i-e)}if(!r)continue;let s={value:n/f};a.set(e[t].time,s),o[t]=s}return{values:a,series:o}}},Kt=class extends L{descriptor={id:`kst`,name:`Know Sure Thing`,placement:`panel`,defaultConfig:{roc1:10,roc2:15,roc3:20,roc4:30,sma1:10,sma2:10,sma3:10,sma4:15,signal:9,source:`close`},shortName:`KST`,inputs:{source:{source:!0},roc1:{kind:`int`,min:1},roc2:{kind:`int`,min:1},roc3:{kind:`int`,min:1},roc4:{kind:`int`,min:1},sma1:{kind:`int`,min:1},sma2:{kind:`int`,min:1},sma3:{kind:`int`,min:1},sma4:{kind:`int`,min:1},signal:{kind:`int`,min:1}},plots:[{key:`value`,title:`KST`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=B(t,`roc1`,10,1),r=B(t,`roc2`,15,1),i=B(t,`roc3`,20,1),a=B(t,`roc4`,30,1),o=B(t,`sma1`,10,1),s=B(t,`sma2`,10,1),c=B(t,`sma3`,10,1),l=B(t,`sma4`,15,1),u=B(t,`signal`,9,1),d=new R,f=Array(e.length).fill(null),p=e.length;if(p<2)return{values:d,series:f};let m=e.map(e=>e.close),h=H(V(m,n),o),g=H(V(m,r),s),_=H(V(m,i),c),v=H(V(m,a),l),y=Array(p).fill(void 0);for(let e=0;e<p;e++)h[e]===void 0||g[e]===void 0||_[e]===void 0||v[e]===void 0||(y[e]=h[e]*1+g[e]*2+_[e]*3+v[e]*4);let b=H(y,u);for(let t=0;t<p;t++){if(y[t]===void 0)continue;let n={value:y[t]};b[t]!==void 0&&(n.signal=b[t]),d.set(e[t].time,n),f[t]=n}return{values:d,series:f}}};function V(e,t){let n=Array(e.length).fill(void 0);for(let r=t;r<e.length;r++)n[r]=e[r-t]===0?0:(e[r]-e[r-t])/e[r-t]*100;return n}function H(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){a=!1;break}i+=t}a&&(n[r]=i/t)}return n}var qt=class extends L{descriptor={id:`elderray`,name:`Elder Ray`,placement:`panel`,defaultConfig:{period:13},inputs:{period:{kind:`int`,min:1}},shortName:`Elder Ray`,plots:[{key:`bull`,title:`Bull`,color:0,kind:`histogram`},{key:`bear`,title:`Bear`,color:1,kind:`histogram`}]};calculate(e,t){let n=B(t,`period`,13,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=2/(n+1),s;for(let t=0;t<a;t++)if(s=s===void 0?e[t].close:e[t].close*o+s*(1-o),t>=n-1){let n={bull:e[t].high-s,bear:e[t].low-s};r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}render(e,t,n,r){let i=t.series;if(!i)return;let a=Math.max(0,n.visibleRange.from),o=Math.min(n.visibleRange.to,i.length-1),s=be(n),c=s(0),l=Math.max(1,n.barWidth/2),u=[[`bull`,r.colors[0],-l],[`bear`,r.colors[1]??r.colors[0],0]];for(let[t,d,f]of u)if(r.plots?.[t]?.visible!==!1){e.beginPath(),e.fillStyle=d;for(let r=a;r<=o;r++){let a=i[r]?.[t];if(a===void 0||!Number.isFinite(a))continue;let o=s(a);e.rect(N(r,n)+f,Math.min(o,c),l,Math.max(1,Math.abs(o-c)))}e.fill()}}},Jt=class extends L{descriptor={id:`stc`,name:`Schaff Trend Cycle`,placement:`panel`,defaultConfig:{fast:23,slow:50,cycle:10,source:`close`},shortName:`STC`,inputs:{source:{source:!0},fast:{kind:`int`,min:1},slow:{kind:`int`,min:1},cycle:{kind:`int`,min:1}},plots:[{key:`value`,title:`STC`,color:0}],scale:{min:0,max:100},levels:[25,75]};calculate(e,t){let n=B(t,`fast`,23,1),r=B(t,`slow`,50,1),i=B(t,`cycle`,10,1),a=new R,o=Array(e.length).fill(null),s=e.length;if(s===0)return{values:a,series:o};let c=e.map(e=>e.close),l=2/(n+1),u=2/(r+1),d=c[0],f=c[0],p=Array(s);for(let e=0;e<s;e++)d=e===0?c[0]:c[e]*l+d*(1-l),f=e===0?c[0]:c[e]*u+f*(1-u),p[e]=d-f;let m=Yt(Yt(p,i),i);for(let t=0;t<s;t++){let n=m[t];if(n===void 0)continue;let r={value:Math.max(0,Math.min(100,n))};a.set(e[t].time,r),o[t]=r}return{values:a,series:o}}};function Yt(e,t){let n=e.length,r=Array(n).fill(void 0),i;for(let a=0;a<n;a++){if(a<t-1)continue;let n=1/0,o=-1/0,s=!0;for(let r=a-t+1;r<=a;r++){let t=e[r];if(t===void 0){s=!1;break}t<n&&(n=t),t>o&&(o=t)}if(!s||e[a]===void 0)continue;let c=o-n>0?(e[a]-n)/(o-n)*100:50;i=i===void 0?c:i+.5*(c-i),r[a]=i}return r}var Xt=class extends L{descriptor={id:`kvo`,name:`Klinger Oscillator`,placement:`panel`,defaultConfig:{fast:34,slow:55,signal:13},inputs:{fast:{kind:`int`,min:1},slow:{kind:`int`,min:1},signal:{kind:`int`,min:1}},shortName:`KVO`,plots:[{key:`value`,title:`KVO`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=B(t,`fast`,34,1),r=B(t,`slow`,55,1),i=B(t,`signal`,13,1),a=new R,o=Array(e.length).fill(null),s=e.length;if(s<2)return{values:a,series:o};let c=2/(n+1),l=2/(r+1),u=2/(i+1),d,f=1,p=0,m=0,h,g,_;for(let t=0;t<s;t++){let n=e[t],i=n.high+n.low+n.close,s=d===void 0||i>d?1:-1,v=n.high-n.low;m=d===void 0?v:s===f?m+v:p+v;let y=m===0?0:n.volume*Math.abs(2*(v/m-1))*s*100;h=h===void 0?y:y*c+h*(1-c),g=g===void 0?y:y*l+g*(1-l);let b=h-g;if(_=_===void 0?b:b*u+_*(1-u),d=i,f=s,p=v,t>=r){let e={value:b,signal:_};a.set(n.time,e),o[t]=e}}return{values:a,series:o}}},Zt=class extends L{descriptor={id:`fisher`,name:`Fisher Transform`,placement:`panel`,defaultConfig:{period:9},inputs:{period:{kind:`int`,min:1}},shortName:`Fisher`,plots:[{key:`value`,title:`Fisher`,color:0},{key:`trigger`,title:`Trigger`,color:1}],levels:[0]};calculate(e,t){let n=B(t,`period`,9,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=e.map(e=>(e.high+e.low)/2),s=0,c=0;for(let t=n-1;t<a;t++){let a=-1/0,l=1/0;for(let e=t-n+1;e<=t;e++)o[e]>a&&(a=o[e]),o[e]<l&&(l=o[e]);s=.33*(a-l>0?2*(o[t]-l)/(a-l)-1:0)+.67*s,s=Math.max(-.999,Math.min(.999,s));let u=c;c=.5*Math.log((1+s)/(1-s))+.5*c;let d={value:c,trigger:u};r.set(e[t].time,d),i[t]=d}return{values:r,series:i}}},Qt=class extends L{descriptor={id:`dpo`,name:`Detrended Price Oscillator`,placement:`panel`,defaultConfig:{period:20,source:`close`},shortName:`DPO`,inputs:{source:{source:!0},period:{kind:`int`,min:2}},plots:[{key:`value`,title:`DPO`,color:0,kind:`histogram`,tone:`sign`,downColor:1}]};calculate(e,t){let n=B(t,`period`,20,2),r=Math.floor(n/2)+1,i=new R,a=Array(e.length).fill(null),o=e.length;if(o<n)return{values:i,series:a};let s=0;for(let t=0;t<o;t++)if(s+=e[t].close,t>=n&&(s-=e[t-n].close),t>=n-1&&t-r>=0){let o=s/n,c={value:e[t-r].close-o};i.set(e[t].time,c),a[t]=c}return{values:i,series:a}}},$t=class extends L{descriptor={id:`bop`,name:`Balance of Power`,placement:`panel`,defaultConfig:{smooth:14},inputs:{smooth:{kind:`int`,min:1}},shortName:`BOP`,plots:[{key:`value`,title:`BOP`,color:0}],scale:{min:-1,max:1},levels:[0]};calculate(e,t){let n=B(t,`smooth`,14,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a===0)return{values:r,series:i};let o=Array(a);for(let t=0;t<a;t++){let n=e[t].high-e[t].low;o[t]=n>0?(e[t].close-e[t].open)/n:0}let s=0;for(let t=0;t<a;t++)if(s+=o[t],t>=n&&(s-=o[t-n]),t>=n-1){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},en=class extends L{descriptor={id:`massindex`,name:`Mass Index`,placement:`panel`,defaultConfig:{ema:9,sum:25},inputs:{ema:{kind:`int`,min:1},sum:{kind:`int`,min:1}},shortName:`Mass`,plots:[{key:`value`,title:`Mass`,color:0}],levels:[26.5,27]};calculate(e,t){let n=B(t,`ema`,9,1),r=B(t,`sum`,25,1),i=new R,a=Array(e.length).fill(null),o=e.length;if(o<r)return{values:i,series:a};let s=2/(n+1),c,l,u=Array(o).fill(0);for(let t=0;t<o;t++){let n=e[t].high-e[t].low;c=c===void 0?n:n*s+c*(1-s),l=l===void 0?c:c*s+l*(1-s),u[t]=l===0?1:c/l}let d=0;for(let t=0;t<o;t++)if(d+=u[t],t>=r&&(d-=u[t-r]),t>=n+r){let n={value:d};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}},tn=class extends L{descriptor={id:`cmo`,name:`Chande Momentum`,placement:`panel`,defaultConfig:{period:9,source:`close`},shortName:`CMO`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`CMO`,color:0}],scale:{min:-100,max:100},levels:[-50,0,50]};calculate(e,t){let n=B(t,`period`,9,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=1;t<a;t++){let n=e[t].close-e[t-1].close;o[t]=n>0?n:0,s[t]=n<0?-n:0}let c=0,l=0;for(let t=1;t<a;t++)if(c+=o[t],l+=s[t],t>n&&(c-=o[t-n],l-=s[t-n]),t>=n){let n=c+l,a={value:n>0?100*(c-l)/n:0};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},nn=class extends L{descriptor={id:`trix`,name:`TRIX`,placement:`panel`,defaultConfig:{period:15,signal:9,source:`close`},shortName:`TRIX`,inputs:{source:{source:!0},period:{kind:`int`,min:1},signal:{kind:`int`,min:1}},plots:[{key:`value`,title:`TRIX`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=B(t,`period`,15,1),r=B(t,`signal`,9,1),i=new R,a=Array(e.length).fill(null),o=e.length;if(o<2)return{values:i,series:a};let s=U(U(U(e.map(e=>e.close),n),n),n),c=Array(o).fill(0);for(let e=1;e<o;e++)c[e]=s[e-1]===0?0:(s[e]-s[e-1])/s[e-1]*100;let l=U(c,r),u=3*n;for(let t=u;t<o;t++){let n={value:c[t],signal:l[t]};i.set(e[t].time,n),a[t]=n}return{values:i,series:a}}};function U(e,t){let n=2/(t+1),r=Array(e.length).fill(0),i=e[0]??0;r[0]=i;for(let t=1;t<e.length;t++)i=e[t]*n+i*(1-n),r[t]=i;return r}var rn=class extends L{descriptor={id:`emv`,name:`Ease of Movement`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:1}},shortName:`EOM`,plots:[{key:`value`,title:`EOM`,color:0}],levels:[0]};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a<2)return{values:r,series:i};let o=Array(a).fill(0);for(let t=1;t<a;t++){let n=(e[t].high+e[t].low)/2,r=(e[t-1].high+e[t-1].low)/2,i=e[t].high-e[t].low,a=e[t].volume;o[t]=a>0?(n-r)*i/a:0}let s=0;for(let t=1;t<a;t++)if(s+=o[t],t>n&&(s-=o[t-n]),t>=n){let a={value:s/n};r.set(e[t].time,a),i[t]=a}return{values:r,series:i}}},an=class extends L{descriptor={id:`pvt`,name:`Price Volume Trend`,placement:`panel`,defaultConfig:{},shortName:`PVT`,plots:[{key:`value`,title:`PVT`,color:0}]};calculate(e,t){let n=new R,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close;i!==0&&(a+=e[t].volume*(e[t].close-i)/i);let o={value:a};n.set(e[t].time,o),r[t]=o}return{values:n,series:r}}},on=class extends L{descriptor={id:`wad`,name:`Williams A/D`,placement:`panel`,defaultConfig:{},shortName:`WAD`,plots:[{key:`value`,title:`WAD`,color:0}]};calculate(e,t){let n=new R,r=Array(e.length).fill(null),i=e.length;if(i===0)return{values:n,series:r};let a=0;n.set(e[0].time,{value:0}),r[0]={value:0};for(let t=1;t<i;t++){let i=e[t-1].close,o=e[t].close;o>i?a+=o-Math.min(e[t].low,i):o<i&&(a+=o-Math.max(e[t].high,i));let s={value:a};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}},sn=class extends L{descriptor={id:`chaikinvol`,name:`Chaikin Volatility`,placement:`panel`,defaultConfig:{ema:10,roc:10},inputs:{ema:{kind:`int`,min:1},roc:{kind:`int`,min:1}},shortName:`CV`,plots:[{key:`value`,title:`CV`,color:0}],levels:[0]};calculate(e,t){let n=B(t,`ema`,10,1),r=B(t,`roc`,10,1),i=new R,a=Array(e.length).fill(null),o=e.length;if(o<=r)return{values:i,series:a};let s=2/(n+1),c=Array(o),l=e[0].high-e[0].low;c[0]=l;for(let t=1;t<o;t++)l=(e[t].high-e[t].low)*s+l*(1-s),c[t]=l;for(let t=n+r;t<o;t++){let n=c[t-r],o={value:n===0?0:(c[t]-n)/n*100};i.set(e[t].time,o),a[t]=o}return{values:i,series:a}}},cn=class extends L{descriptor={id:`rvi`,name:`Relative Vigor Index`,placement:`panel`,defaultConfig:{period:10},inputs:{period:{kind:`int`,min:1}},shortName:`RVGI`,plots:[{key:`value`,title:`RVGI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=B(t,`period`,10,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a<n+3)return{values:r,series:i};let o=Array(a).fill(0),s=Array(a).fill(0);for(let t=0;t<a;t++)o[t]=e[t].close-e[t].open,s[t]=e[t].high-e[t].low;let c=(e,t)=>(e[t]+2*e[t-1]+2*e[t-2]+e[t-3])/6,l=Array(a).fill(void 0),u=Array(a).fill(void 0);for(let e=3;e<a;e++)l[e]=c(o,e),u[e]=c(s,e);let d=Array(a).fill(void 0);for(let e=3+n-1;e<a;e++){let t=0,r=0;for(let i=e-n+1;i<=e;i++)t+=l[i],r+=u[i];d[e]=r===0?0:t/r}for(let t=0;t<a;t++){if(d[t]===void 0)continue;let n={value:d[t]};t>=3&&d[t-3]!==void 0&&(n.signal=(d[t]+2*d[t-1]+2*d[t-2]+d[t-3])/6),r.set(e[t].time,n),i[t]=n}return{values:r,series:i}}},ln=class extends L{descriptor={id:`stochrsi`,name:`Stochastic RSI`,placement:`panel`,defaultConfig:{rsiPeriod:14,stochPeriod:14,k:3,d:3,source:`close`},shortName:`Stoch RSI`,inputs:{source:{source:!0},rsiPeriod:{kind:`int`,min:1},stochPeriod:{kind:`int`,min:1},k:{kind:`int`,min:1},d:{kind:`int`,min:1}},plots:[{key:`k`,title:`%K`,color:0},{key:`d`,title:`%D`,color:1}],scale:{min:0,max:100},levels:[20,80]};calculate(e,t){let n=B(t,`rsiPeriod`,14,1),r=B(t,`stochPeriod`,14,1),i=B(t,`k`,3,1),a=B(t,`d`,3,1),o=new R,s=Array(e.length).fill(null),c=e.length;if(c<=n+r)return{values:o,series:s};let l=un(e.map(e=>e.close),n),u=Array(c).fill(void 0);for(let e=0;e<c;e++){if(l[e]===void 0)continue;let t=1/0,n=-1/0,i=!0;for(let a=e-r+1;a<=e;a++){if(a<0||l[a]===void 0){i=!1;break}l[a]<t&&(t=l[a]),l[a]>n&&(n=l[a])}i&&(u[e]=n-t>0?(l[e]-t)/(n-t)*100:0)}let d=dn(u,i),f=dn(d,a);for(let t=0;t<c;t++){if(d[t]===void 0)continue;let n={k:d[t]};f[t]!==void 0&&(n.d=f[t]),o.set(e[t].time,n),s[t]=n}return{values:o,series:s}}};function un(e,t){let n=e.length,r=Array(n).fill(void 0);if(n<=t)return r;let i=0,a=0;for(let n=1;n<=t;n++){let t=e[n]-e[n-1];t>=0?i+=t:a-=t}i/=t,a/=t,r[t]=a===0?100:100-100/(1+i/a);for(let o=t+1;o<n;o++){let n=e[o]-e[o-1];i=(i*(t-1)+(n>0?n:0))/t,a=(a*(t-1)+(n<0?-n:0))/t,r[o]=a===0?100:100-100/(1+i/a)}return r}function dn(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=!0;for(let n=r-t+1;n<=r;n++){if(e[n]===void 0){a=!1;break}i+=e[n]}a&&(n[r]=i/t)}return n}var fn=class extends L{descriptor={id:`ppo`,name:`Percentage Price Oscillator`,placement:`panel`,defaultConfig:{fast:12,slow:26,signal:9,source:`close`},shortName:`PPO`,inputs:{source:{source:!0},fast:{kind:`int`,min:1},slow:{kind:`int`,min:1},signal:{kind:`int`,min:1}},plots:[{key:`hist`,title:`Histogram`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`value`,title:`PPO`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=B(t,`fast`,12,1),r=B(t,`slow`,26,1),i=B(t,`signal`,9,1),a=new R,o=Array(e.length).fill(null),s=e.length;if(s<=r)return{values:a,series:o};let c=e.map(e=>e.close),l=pn(c,n),u=pn(c,r),d=Array(s).fill(void 0);for(let e=0;e<s;e++)l[e]===void 0||u[e]===void 0||u[e]===0||(d[e]=(l[e]-u[e])/u[e]*100);let f=pn(d,i);for(let t=0;t<s;t++){if(d[t]===void 0)continue;let n={value:d[t]};f[t]!==void 0&&(n.signal=f[t],n.hist=d[t]-f[t]),a.set(e[t].time,n),o[t]=n}return{values:a,series:o}}};function pn(e,t){let n=e.length,r=Array(n).fill(void 0),i=2/(t+1),a,o=0,s=0;for(let c=0;c<n;c++){let n=e[c];n!==void 0&&(a===void 0?(o+=n,s++,s===t&&(a=o/t,r[c]=a)):(a=n*i+a*(1-i),r[c]=a))}return r}var mn=class extends L{descriptor={id:`ac`,name:`Accelerator Oscillator`,placement:`panel`,defaultConfig:{},shortName:`AC`,plots:[{key:`value`,title:`AC`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}]};calculate(e){let t=new R,n=Array(e.length).fill(null),r=e.length;if(r<38)return{values:t,series:n};let i=e.map(e=>(e.high+e.low)/2),a=Array(r).fill(void 0);for(let e=33;e<r;e++)a[e]=hn(i,e,5)-hn(i,e,34);let o;for(let i=37;i<r;i++){let r=0;for(let e=i-4;e<=i;e++)r+=a[e];let s=a[i]-r/5,c=o===void 0?s>=0:s>=o;o=s;let l={value:s,up:+!!c};t.set(e[i].time,l),n[i]=l}return{values:t,series:n}}};function hn(e,t,n){let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i];return r/n}var gn=class extends L{descriptor={id:`rmi`,name:`Relative Momentum Index`,placement:`panel`,defaultConfig:{period:20,momentum:5,source:`close`},shortName:`RMI`,inputs:{source:{source:!0},period:{kind:`int`,min:1},momentum:{kind:`int`,min:1}},plots:[{key:`value`,title:`RMI`,color:0}],scale:{min:0,max:100},levels:[30,70]};calculate(e,t){let n=B(t,`period`,20,1),r=B(t,`momentum`,5,1),i=new R,a=Array(e.length).fill(null),o=e.length;if(o<=n+r)return{values:i,series:a};let s=e.map(e=>e.close),c=Array(o).fill(0),l=Array(o).fill(0);for(let e=r;e<o;e++){let t=s[e]-s[e-r];c[e]=t>0?t:0,l[e]=t<0?-t:0}let u=0,d=0,f=r+n;for(let e=r+1;e<=f;e++)u+=c[e],d+=l[e];u/=n,d/=n;let p=t=>{let n={value:d===0?100:100-100/(1+u/d)};i.set(e[t].time,n),a[t]=n};p(f);for(let e=f+1;e<o;e++)u=(u*(n-1)+c[e])/n,d=(d*(n-1)+l[e])/n,p(e);return{values:i,series:a}}},_n=class extends L{descriptor={id:`disparity`,name:`Disparity Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`DI`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`DI`,color:0}],levels:[0]};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++)if(o+=e[t].close,t>=n&&(o-=e[t-n].close),t>=n-1){let a=o/n,s={value:a===0?0:(e[t].close-a)/a*100};r.set(e[t].time,s),i[t]=s}return{values:r,series:i}}},vn=class extends L{descriptor={id:`qstick`,name:`Qstick`,placement:`panel`,defaultConfig:{period:8},inputs:{period:{kind:`int`,min:1}},shortName:`Qstick`,plots:[{key:`value`,title:`Qstick`,color:0}],levels:[0]};calculate(e,t){let n=B(t,`period`,8,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a<n)return{values:r,series:i};let o=0;for(let t=0;t<a;t++){let a=e[t].close-e[t].open;if(o+=a,t>=n&&(o-=e[t-n].close-e[t-n].open),t>=n-1){let a={value:o/n};r.set(e[t].time,a),i[t]=a}}return{values:r,series:i}}},yn=class extends L{descriptor={id:`pgo`,name:`Pretty Good Oscillator`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:1}},shortName:`PGO`,plots:[{key:`value`,title:`PGO`,color:0}],levels:[-3,0,3]};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null),a=e.length;if(a<=n)return{values:r,series:i};let o=Array(a).fill(0);for(let t=0;t<a;t++){if(t===0){o[t]=e[t].high-e[t].low;continue}let n=e[t-1].close;o[t]=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-n),Math.abs(e[t].low-n))}let s=Array(a).fill(void 0),c=0;for(let e=1;e<=n;e++)c+=o[e];s[n]=c/n;for(let e=n+1;e<a;e++)s[e]=(s[e-1]*(n-1)+o[e])/n;let l=0;for(let t=0;t<a;t++)if(l+=e[t].close,t>=n&&(l-=e[t-n].close),t>=n&&s[t]!==void 0&&s[t]>0){let a=l/n,o={value:(e[t].close-a)/s[t]};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}},bn=class extends L{descriptor={id:`stddev`,name:`Standard Deviation`,placement:`panel`,defaultConfig:{period:20,source:`close`},shortName:`StdDev`,inputs:{source:{source:!0},period:{kind:`int`,min:1}},plots:[{key:`value`,title:`StdDev`,color:0}]};calculate(e,t){let n=B(t,`period`,20,1),r=new R,i=Array(e.length).fill(null);for(let t=n-1;t<e.length;t++){let a=0;for(let r=t-n+1;r<=t;r++)a+=e[r].close;let o=a/n,s=0;for(let r=t-n+1;r<=t;r++){let t=e[r].close-o;s+=t*t}let c={value:Math.sqrt(s/n)};r.set(e[t].time,c),i[t]=c}return{values:r,series:i}}};let xn=.32;function Sn(e){return Number.isFinite(e)?xn*Math.min(1,Math.max(0,e)):xn}var Cn=class extends L{descriptor={id:`volumeProfile`,name:`Volume Profile`,placement:`overlay`,defaultConfig:{rows:24},inputs:{rows:{kind:`int`,min:1}},shortName:`VP`,plots:[]};calculate(e,t){let n=B(t,`rows`,24,1),r=new R,i=Array(e.length).fill(null);if(e.length===0)return{values:r,series:i};let a=1/0,o=-1/0;for(let t of e)t.low<a&&(a=t.low),t.high>o&&(o=t.high);let s=(o-a||1)/n,c=Array(n).fill(0);for(let t of e){let e=(t.high+t.low+t.close)/3,r=Math.min(n-1,Math.floor((e-a)/s));c[r]+=t.volume}for(let e=0;e<n;e++){let t=a+(e+.5)*s;r.set(e,{price:t,volume:c[e],rowIndex:e})}return{values:r,series:i,meta:{minPrice:a,maxPrice:o,rows:n,rowHeight:s,bins:c,maxVolume:Math.max(...c)}}}render(e,t,n,r){let{chartRect:i}=n,a=t.meta;if(!a||a.maxVolume===0)return;let{minPrice:o,rows:s,rowHeight:c,bins:l,maxVolume:u}=a,d=i.width*.3,f=be(n),p=r.colors[0]??A.blue,m=r.colors[1]??A.amber;e.save(),e.globalAlpha=Sn(r.opacity);for(let t=0;t<s;t++){let n=l[t]/u*d;if(n<=0)continue;let r=f(o+t*c),a=f(o+(t+1)*c);e.fillStyle=l[t]>u*.7?m:p,e.fillRect(i.x,Math.min(r,a),n,Math.max(Math.abs(r-a)-1,1))}e.restore()}},wn=class extends L{descriptor={id:`ad`,name:`Accumulation/Distribution`,placement:`panel`,defaultConfig:{},shortName:`A/D`,plots:[{key:`value`,title:`A/D`,color:0}]};calculate(e,t){let n=new R,r=Array(e.length).fill(null);if(e.length===0)return{values:n,series:r};let i=0;for(let t=0;t<e.length;t++){let a=e[t].high-e[t].low,o=a===0?0:(e[t].close-e[t].low-(e[t].high-e[t].close))/a;i+=o*e[t].volume;let s={value:i};n.set(e[t].time,s),r[t]=s}return{values:n,series:r}}},Tn=class extends L{descriptor={id:`vroc`,name:`Volume Rate of Change`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:1}},shortName:`VROC`,plots:[{key:`value`,title:`VROC`,color:0}],levels:[0]};calculate(e,t){let n=B(t,`period`,14,1),r=new R,i=Array(e.length).fill(null);for(let t=n;t<e.length;t++){let a=e[t-n].volume,o={value:a===0?0:(e[t].volume-a)/a*100};r.set(e[t].time,o),i[t]=o}return{values:r,series:i}}};function W(e,t){let n=new R;for(let r=0;r<t.length;r++){let i=t[r];i&&n.set(e[r].time,i)}return{values:n,series:t}}function G(e){return e.map(e=>e.close)}function K(e,t){let n=Array(e.length).fill(void 0),r=0,i=0;for(let a=0;a<e.length;a++){let o=e[a];if(o===void 0){r=0,i=0;continue}r+=o,i++,i>t&&(r-=e[a-t]),i>=t&&(n[a]=r/t)}return n}function En(e,t,n){let r=Array(e.length).fill(void 0),i=0,a=0,o;for(let s=0;s<e.length;s++){let c=e[s];if(c!==void 0){if(o===void 0){i+=c,a++,a===t&&(r[s]=o=i/t);continue}o+=n*(c-o),r[s]=o}}return r}function q(e,t){return En(e,t,2/(t+1))}function Dn(e,t){let n=Array(e.length).fill(void 0),r=t*(t+1)/2;for(let i=t-1;i<e.length;i++){let a=0,o=!0;for(let n=0;n<t;n++){let r=e[i-t+1+n];if(r===void 0){o=!1;break}a+=r*(n+1)}o&&(n[i]=a/r)}return n}function On(e,t){return En(e,t,1/t)}function kn(e,t){let n=Array(e.length).fill(void 0);for(let r=t-1;r<e.length;r++){let i=0,a=0,o=!0;for(let n=r-t+1;n<=r;n++){let t=e[n];if(t===void 0){o=!1;break}i+=t,a+=t*t}if(!o)continue;let s=i/t;n[r]=Math.sqrt(Math.max(0,a/t-s*s))}return n}function An(e){return e.map((t,n)=>{if(n===0)return t.high-t.low;let r=e[n-1].close;return Math.max(t.high-t.low,Math.abs(t.high-r),Math.abs(t.low-r))})}function jn(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return;t>r&&(r=t)}return r}function Mn(e,t,n){if(t<n-1)return;let r=1/0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return;t<r&&(r=t)}return r}function J(e,t=`value`){return e.map(e=>e!==void 0&&Number.isFinite(e)?{[t]:e}:null)}function Nn(e,t,n){if(t<n-1||t>=e.length)return;let r=0,i=0;for(let a=t-n+1;a<=t;a++){let t=e[a].close;r+=t,i+=t*t}let a=r/n;return{mean:a,sd:Math.sqrt(Math.max(0,i/n-a*a))}}function Y(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++)e[i].high>r&&(r=e[i].high);return r}function X(e,t,n){if(t<n-1)return;let r=1/0;for(let i=t-n+1;i<=t;i++)e[i].low<r&&(r=e[i].low);return r}function Pn(e,t,n){if(t<n-1)return;let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i].close;return r/n}function Z(e,t,n){if(n<2||t<n-1)return;let r=n,i=(r-1)/2,a=0;for(let n=0;n<r;n++)a+=e[t-r+1+n].close;a/=r;let o=0,s=0,c=0;for(let n=0;n<r;n++){let l=n-i,u=e[t-r+1+n].close-a;o+=l*u,s+=l*l,c+=u*u}let l=o/s,u=a-l*i,d=0;for(let n=0;n<r;n++){let i=e[t-r+1+n].close-(u+l*n);d+=i*i}return{slope:l,end:u+l*(r-1),stdErr:r>2?Math.sqrt(d/(r-2)):0,r:c===0?0:o/Math.sqrt(s*c)}}var Fn=class extends L{descriptor={id:`dema`,name:`Double Exponential Moving Average`,placement:`overlay`,defaultConfig:{period:20,source:`close`},shortName:`DEMA`,inputs:{period:{kind:`int`,min:1},source:{source:!0}},plots:[{key:`value`,title:`DEMA`,color:0}]};emas=new WeakMap;workerState(e){return this.emas.get(e)}adoptWorkerState(e,t){t&&this.emas.set(e,t)}calculate(e,t){let n=B(t,`period`,20,1),r=q(G(e),n),i=q(r,n),a=W(e,J(r.map((e,t)=>e!==void 0&&i[t]!==void 0?2*e-i[t]:void 0)));return this.emas.set(a,{e1:r,e2:i}),a}update(e,t,n,r){let i=this.emas.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.e1[r-1],o=i.e2[r-1];if(a===void 0||o===void 0)return null;let s=2/(B(t,`period`,20,1)+1);for(let t=r;t<e.length;t++)a+=s*(e[t].close-a),o+=s*(a-o),i.e1[t]=a,i.e2[t]=o,this.writePoint(n,e,t,{value:2*a-o});return n}},In=class extends L{descriptor={id:`smma`,name:`Smoothed Moving Average`,placement:`overlay`,defaultConfig:{period:14,source:`close`},shortName:`SMMA`,inputs:{period:{kind:`int`,min:1},source:{source:!0}},plots:[{key:`value`,title:`SMMA`,color:0}]};calculate(e,t){return W(e,J(On(G(e),B(t,`period`,14,1))))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;let a=B(t,`period`,14,1);for(let t=r;t<e.length;t++)i+=(e[t].close-i)/a,this.writePoint(n,e,t,{value:i});return n}};let Ln=new WeakMap;function Rn(e){let t=Ln.get(e);return t||Ln.set(e,t=Array.from(e)),t}var Q=class extends L{times=new WeakMap;workerState(){}adoptWorkerState(e,t,n){this.times.set(e,Rn(n))}lookback(e){return 0}revisesBefore(e){return this.lookback(this.read(e))}calculate(e,t){let n=this.read(t),r=Array(e.length);for(let t=0;t<e.length;t++)r[t]=this.pointAt(e,t,n);let i=W(e,r);return this.times.set(i,e.map(e=>e.time)),i}update(e,t,n,r){let i=this.times.get(n);if(!i||!this.canResume(e,n,r))return null;for(let t=r;t<i.length&&t<e.length;t++)if(i[t]!==e[t].time)return null;let a=this.read(t);for(let t=Math.max(0,r-this.lookback(a));t<e.length;t++)this.writePoint(n,e,t,this.pointAt(e,t,a));i.length=e.length;for(let t=r;t<e.length;t++)i[t]=e[t].time;return n}},zn=class extends Q{descriptor={id:`alma`,name:`Arnaud Legoux Moving Average`,placement:`overlay`,defaultConfig:{period:9,offset:.85,sigma:6,source:`close`},shortName:`ALMA`,inputs:{period:{kind:`int`,min:1,max:5e3},offset:{kind:`number`,min:0,max:1,step:.05},sigma:{kind:`number`,min:.5,step:.5},source:{source:!0}},plots:[{key:`value`,title:`ALMA`,color:0}]};read(e){let t=Math.min(5e3,B(e,`period`,9,1)),n=Math.min(1,Math.max(0,z(e,`offset`,.85))),r=Math.max(.5,z(e,`sigma`,6)),i=n*(t-1),a=t/r,o=Array.from({length:t},(e,t)=>Math.exp(-((t-i)**2)/(2*a*a)));return{period:t,weights:o,norm:o.reduce((e,t)=>e+t,0)}}pointAt(e,t,{period:n,weights:r,norm:i}){if(t<n-1)return null;let a=0;for(let i=0;i<n;i++)a+=r[i]*e[t-n+1+i].close;return{value:a/i}}},Bn=class extends L{descriptor={id:`kama`,name:`Kaufman Adaptive Moving Average`,placement:`overlay`,defaultConfig:{period:10,fast:2,slow:30,source:`close`},shortName:`KAMA`,inputs:{period:{kind:`int`,min:1},fast:{kind:`int`,min:1},slow:{kind:`int`,min:1},source:{source:!0}},plots:[{key:`value`,title:`KAMA`,color:0}]};calculate(e,t){let n=W(e,Array(e.length).fill(null)),r=B(t,`period`,10,1);return e.length<=r||this.extend(e,t,n,r,e[r-1].close),n}update(e,t,n,r){if(r<=B(t,`period`,10,1)||!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;return i===void 0?null:(this.extend(e,t,n,r,i),n)}extend(e,t,n,r,i){let a=B(t,`period`,10,1),o=2/(B(t,`fast`,2,1)+1),s=2/(B(t,`slow`,30,1)+1);for(let t=r;t<e.length;t++){let r=0;for(let n=t-a+1;n<=t;n++)r+=Math.abs(e[n].close-e[n-1].close);let c=Math.abs(e[t].close-e[t-a].close),l=((r>0?c/r:0)*(o-s)+s)**2;i+=l*(e[t].close-i),this.writePoint(n,e,t,{value:i})}}},Vn=class extends Q{descriptor={id:`lsma`,name:`Least Squares Moving Average`,placement:`overlay`,defaultConfig:{period:25,offset:0,source:`close`},shortName:`LSMA`,inputs:{period:{kind:`int`,min:2,max:5e3},offset:{kind:`int`,step:1},source:{source:!0}},plots:[{key:`value`,title:`LSMA`,color:0}]};read(e){let t=Math.min(5e3,B(e,`period`,25,2)),n=Math.round(B(e,`offset`,0,-1e3)),r=t*(t-1)/2;return{period:t,offset:n,sx:r,denom:t*((t-1)*t*(2*t-1)/6)-r*r}}pointAt(e,t,{period:n,offset:r,sx:i,denom:a}){if(t<n-1)return null;let o=0,s=0;for(let r=0;r<n;r++){let i=e[t-n+1+r].close;o+=i,s+=r*i}let c=(n*s-i*o)/a;return{value:(o-c*i)/n+c*(n-1-r)}}},Hn=class extends L{descriptor={id:`mcginley`,name:`McGinley Dynamic`,placement:`overlay`,defaultConfig:{period:14,source:`close`},shortName:`McGinley`,inputs:{period:{kind:`int`,min:1},source:{source:!0}},plots:[{key:`value`,title:`McGinley`,color:0}]};calculate(e,t){let n=B(t,`period`,14,1),r=q(G(e),n),i=Array(e.length).fill(void 0),a;for(let t=0;t<e.length;t++)a=a===void 0?r[t]:Un(a,e[t].close,n),i[t]=a;return W(e,J(i))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let i=n.series[r-1]?.value;if(i===void 0)return null;let a=B(t,`period`,14,1);for(let t=r;t<e.length;t++)i=Un(i,e[t].close,a),this.writePoint(n,e,t,{value:i});return n}};function Un(e,t,n){return e>0&&t>0?e+(t-e)/(n*(t/e)**4):t}function Wn(e){return e.params.type===`ema`?[`ema`,`ema`]:e.params.type===`sma-ema`?[`sma`,`ema`]:[`sma`,`sma`]}var Gn=class extends L{descriptor={id:`macross`,name:`MA Cross`,placement:`overlay`,defaultConfig:{fast:9,slow:21,type:`sma`,source:`close`},shortName:`MA Cross`,inputs:{fast:{kind:`int`,min:1},slow:{kind:`int`,min:1},type:{options:[`sma`,`ema`,`sma-ema`]},source:{source:!0}},plots:[{key:`fast`,title:`Fast`,color:0},{key:`slow`,title:`Slow`,color:1}]};calculate(e,t){let[n,r]=Wn(t),i=G(e),a=(t,n)=>t===`ema`?q(i,n):e.map((t,r)=>Pn(e,r,n)),o=a(n,B(t,`fast`,9,1)),s=a(r,B(t,`slow`,21,1));return W(e,o.map((e,t)=>Kn(e,s[t])))}update(e,t,n,r){if(!this.canResume(e,n,r))return null;let[i,a]=Wn(t),o=B(t,`fast`,9,1),s=B(t,`slow`,21,1),c=n.series[r-1]?.fast,l=n.series[r-1]?.slow;if(i===`ema`&&c===void 0||a===`ema`&&l===void 0)return null;for(let t=r;t<e.length;t++){let r=e[t].close;c=i===`ema`?c+2/(o+1)*(r-c):Pn(e,t,o),l=a===`ema`?l+2/(s+1)*(r-l):Pn(e,t,s),this.writePoint(n,e,t,Kn(c,l))}return n}};function Kn(e,t){return e===void 0&&t===void 0?null:{...e===void 0?{}:{fast:e},...t===void 0?{}:{slow:t}}}var qn=class extends Q{descriptor={id:`fractals`,name:`Williams Fractals`,placement:`overlay`,defaultConfig:{period:2},shortName:`Fractals`,inputs:{period:{kind:`int`,min:1,max:10}},plots:[{key:`up`,title:`Up`,color:0,kind:`dots`},{key:`down`,title:`Down`,color:1,kind:`dots`}]};read(e){return B(e,`period`,2,1)}lookback(e){return e}pointAt(e,t,n){if(t<n||t>e.length-n-1)return null;let r=!0,i=!0;for(let a=t-n;a<=t+n&&(r||i);a++)a!==t&&(e[a].high>=e[t].high&&(r=!1),e[a].low<=e[t].low&&(i=!1));return!r&&!i?null:{...r?{up:e[t].high}:{},...i?{down:e[t].low}:{}}}},Jn=class extends L{descriptor={id:`cks`,name:`Chande Kroll Stop`,placement:`overlay`,defaultConfig:{p:10,x:1,q:9},shortName:`CKS`,inputs:{p:{kind:`int`,label:`ATR length`,min:1},x:{kind:`number`,label:`ATR multiplier`,min:0,step:.1},q:{kind:`int`,label:`Stop length`,min:1}},plots:[{key:`long`,title:`Stop Long`,color:0},{key:`short`,title:`Stop Short`,color:1}]};states=new WeakMap;workerState(e){return this.states.get(e)}adoptWorkerState(e,t){t&&this.states.set(e,t)}calculate(e,t){let n=B(t,`p`,10,1),r=z(t,`x`,1),i=B(t,`q`,9,1),a={atr:On(An(e),n),firstHigh:[],firstLow:[]};for(let t=0;t<e.length;t++)Yn(e,a,t,n,r);let o=W(e,e.map((e,t)=>Xn(a,t,i)));return this.states.set(o,a),o}update(e,t,n,r){let i=this.states.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.atr[r-1];if(a===void 0)return null;let o=B(t,`p`,10,1),s=z(t,`x`,1),c=B(t,`q`,9,1);for(let t=r;t<e.length;t++){let r=e[t-1].close,l=Math.max(e[t].high-e[t].low,Math.abs(e[t].high-r),Math.abs(e[t].low-r));a+=(l-a)/o,i.atr[t]=a,Yn(e,i,t,o,s),this.writePoint(n,e,t,Xn(i,t,c))}return n}};function Yn(e,t,n,r,i){let a=t.atr[n],o=Y(e,n,r),s=X(e,n,r);t.firstHigh[n]=o!==void 0&&a!==void 0?o-i*a:void 0,t.firstLow[n]=s!==void 0&&a!==void 0?s+i*a:void 0}function Xn(e,t,n){let r=jn(e.firstHigh,t,n),i=Mn(e.firstLow,t,n);return r!==void 0&&i!==void 0?{long:i,short:r}:null}var Zn=class extends Q{descriptor={id:`bbpb`,name:`Bollinger Bands %B`,placement:`panel`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`%B`,inputs:{period:{kind:`int`,min:2},stdDev:{kind:`number`,min:.1,step:.1},source:{source:!0}},plots:[{key:`value`,title:`%B`,color:0}],levels:[0,.5,1]};read(e){return{period:B(e,`period`,20,2),k:z(e,`stdDev`,2)}}pointAt(e,t,{period:n,k:r}){let i=Nn(e,t,n);return!i||i.sd===0?null:{value:(e[t].close-(i.mean-r*i.sd))/(2*r*i.sd)}}},Qn=class extends Q{descriptor={id:`bbw`,name:`Bollinger BandWidth`,placement:`panel`,defaultConfig:{period:20,stdDev:2,source:`close`},shortName:`BBW`,inputs:{period:{kind:`int`,min:2},stdDev:{kind:`number`,min:.1,step:.1},source:{source:!0}},plots:[{key:`value`,title:`BBW`,color:0}]};read(e){return{period:B(e,`period`,20,2),k:z(e,`stdDev`,2)}}pointAt(e,t,{period:n,k:r}){let i=Nn(e,t,n);return!i||i.mean===0?null:{value:2*r*i.sd/i.mean}}},$n=class extends Q{descriptor={id:`mom`,name:`Momentum`,placement:`panel`,defaultConfig:{period:10,source:`close`},shortName:`MOM`,inputs:{period:{kind:`int`,min:1},source:{source:!0}},plots:[{key:`value`,title:`MOM`,color:0}],levels:[0]};read(e){return B(e,`period`,10,1)}pointAt(e,t,n){return t>=n?{value:e[t].close-e[t-n].close}:null}},er=class extends Q{descriptor={id:`hv`,name:`Historical Volatility`,placement:`panel`,defaultConfig:{period:10,annual:365,source:`close`},shortName:`HV`,inputs:{period:{kind:`int`,min:2},annual:{kind:`number`,label:`Bars per year`,min:1},source:{source:!0}},plots:[{key:`value`,title:`HV`,color:0}],scale:{min:0}};read(e){return{period:B(e,`period`,10,2),annual:Math.max(1,z(e,`annual`,365))}}pointAt(e,t,{period:n,annual:r}){if(t<n)return null;let i=0,a=0;for(let r=t-n+1;r<=t;r++){let t=e[r-1].close,n=e[r].close;if(!(t>0&&n>0))return null;let o=Math.log(n/t);i+=o,a+=o*o}let o=i/n;return{value:100*Math.sqrt(Math.max(0,a/n-o*o))*Math.sqrt(r)}}},tr=class extends L{descriptor={id:`vo`,name:`Volume Oscillator`,placement:`panel`,defaultConfig:{short:5,long:10},shortName:`Vol Osc`,inputs:{short:{kind:`int`,min:1},long:{kind:`int`,min:1}},plots:[{key:`value`,title:`Vol Osc`,color:0}],levels:[0]};emas=new WeakMap;workerState(e){return this.emas.get(e)}adoptWorkerState(e,t){t&&this.emas.set(e,t)}calculate(e,t){let n=e.map(e=>e.volume),r=q(n,B(t,`short`,5,1)),i=q(n,B(t,`long`,10,1)),a=W(e,J(r.map((e,t)=>nr(e,i[t]))));return this.emas.set(a,{fast:r,slow:i}),a}update(e,t,n,r){let i=this.emas.get(n);if(!i||!this.canResume(e,n,r))return null;let a=i.fast[r-1],o=i.slow[r-1];if(a===void 0||o===void 0)return null;let s=2/(B(t,`short`,5,1)+1),c=2/(B(t,`long`,10,1)+1);for(let t=r;t<e.length;t++){a+=s*(e[t].volume-a),o+=c*(e[t].volume-o),i.fast[t]=a,i.slow[t]=o;let r=nr(a,o);this.writePoint(n,e,t,r===void 0?null:{value:r})}return n}};function nr(e,t){return e===void 0||t===void 0||t===0?void 0:100*(e-t)/t}var rr=class extends L{descriptor={id:`ulcer`,name:`Ulcer Index`,placement:`panel`,defaultConfig:{period:14,source:`close`},shortName:`Ulcer`,inputs:{period:{kind:`int`,min:1},source:{source:!0}},plots:[{key:`value`,title:`Ulcer`,color:0}],scale:{min:0}};drawdowns=new WeakMap;workerState(e){return this.drawdowns.get(e)}adoptWorkerState(e,t){t&&this.drawdowns.set(e,t)}calculate(e,t){let n=B(t,`period`,14,1),r=e.map((t,r)=>ir(e,r,n)),i=W(e,e.map((e,t)=>ar(r,t,n)));return this.drawdowns.set(i,r),i}update(e,t,n,r){let i=this.drawdowns.get(n);if(!i||!this.canResume(e,n,r))return null;let a=B(t,`period`,14,1);for(let t=r;t<e.length;t++)i[t]=ir(e,t,a);i.length=e.length;for(let t=r;t<e.length;t++)this.writePoint(n,e,t,ar(i,t,a));return n}};function ir(e,t,n){if(t<n-1)return;let r=-1/0;for(let i=t-n+1;i<=t;i++)e[i].close>r&&(r=e[i].close);return r===0?void 0:100*(e[t].close-r)/r}function ar(e,t,n){if(t<n-1)return null;let r=0;for(let i=t-n+1;i<=t;i++){let t=e[i];if(t===void 0)return null;r+=t*t}return{value:Math.sqrt(r/n)}}var or=class extends L{descriptor={id:`smi`,name:`Stochastic Momentum Index`,placement:`panel`,defaultConfig:{period:10,smooth:3,signal:3},shortName:`SMI`,inputs:{period:{kind:`int`,min:1},smooth:{kind:`int`,min:1},signal:{kind:`int`,min:1}},plots:[{key:`smi`,title:`SMI`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[40,-40]};calculate(e,t){let n=B(t,`period`,10,1),r=B(t,`smooth`,3,1),i=B(t,`signal`,3,1),a=Array(e.length).fill(void 0),o=Array(e.length).fill(void 0);for(let t=n-1;t<e.length;t++){let r=Y(e,t,n),i=X(e,t,n);r===void 0||i===void 0||(a[t]=e[t].close-(r+i)/2,o[t]=r-i)}let s=q(q(a,r),r),c=q(q(o,r),r),l=s.map((e,t)=>{let n=c[t]===void 0?void 0:c[t]/2;if(!(e===void 0||n===void 0))return n===0?0:Math.max(-100,Math.min(100,100*e/n))}),u=q(l,i);return W(e,l.map((e,t)=>{if(e===void 0)return null;let n={smi:e};return u[t]!==void 0&&(n.signal=u[t]),n}))}},sr=class extends L{descriptor={id:`rvix`,name:`Relative Volatility Index`,placement:`panel`,defaultConfig:{period:10,smooth:14},shortName:`RVI (vol)`,inputs:{period:{kind:`int`,min:2},smooth:{kind:`int`,min:1}},plots:[{key:`value`,title:`RVI`,color:0}],levels:[80,50,20],scale:{min:0,max:100}};calculate(e,t){let n=B(t,`period`,10,2),r=B(t,`smooth`,14,1),i=kn(G(e),n),a=i.map((t,n)=>t===void 0||n===0?void 0:e[n].close>e[n-1].close?t:0),o=i.map((t,n)=>t===void 0||n===0?void 0:e[n].close<e[n-1].close?t:0),s=q(a,r),c=q(o,r);return W(e,J(s.map((e,t)=>{let n=c[t];if(!(e===void 0||n===void 0))return e+n===0?50:100*e/(e+n)})))}},cr=class extends Q{descriptor={id:`trendstrength`,name:`Trend Strength Index`,placement:`panel`,defaultConfig:{period:14},shortName:`TSI (trend)`,inputs:{period:{kind:`int`,min:2}},plots:[{key:`value`,title:`Trend`,color:0}],levels:[0],scale:{min:-1,max:1}};read(e){return B(e,`period`,14,2)}pointAt(e,t,n){let r=Z(e,t,n);return r?{value:r.r}:null}},lr=class extends Q{descriptor={id:`lrslope`,name:`Linear Regression Slope`,placement:`panel`,defaultConfig:{period:14},shortName:`LR Slope`,inputs:{period:{kind:`int`,min:2}},plots:[{key:`value`,title:`Slope`,color:0}],levels:[0]};read(e){return B(e,`period`,14,2)}pointAt(e,t,n){let r=Z(e,t,n);return r?{value:r.slope}:null}},ur=class extends Q{descriptor={id:`stderror`,name:`Standard Error`,placement:`panel`,defaultConfig:{period:14},shortName:`StdErr`,inputs:{period:{kind:`int`,min:3}},plots:[{key:`value`,title:`StdErr`,color:0}],scale:{min:0}};read(e){return B(e,`period`,14,3)}pointAt(e,t,n){let r=Z(e,t,n);return r?{value:r.stdErr}:null}},dr=class extends Q{descriptor={id:`adr`,name:`Average Day Range`,placement:`panel`,defaultConfig:{period:14},shortName:`ADR`,inputs:{period:{kind:`int`,min:1}},plots:[{key:`value`,title:`ADR`,color:0}],scale:{min:0}};read(e){return B(e,`period`,14,1)}pointAt(e,t,n){if(t<n-1)return null;let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i].high-e[i].low;return{value:r/n}}},fr=class extends Q{descriptor={id:`netvolume`,name:`Net Volume`,placement:`panel`,defaultConfig:{},shortName:`Net Vol`,plots:[{key:`value`,title:`Net`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}],levels:[0]};read(e){return null}pointAt(e,t){if(t===0)return null;let n=e[t].close-e[t-1].close,r=e[t].volume??0;return{value:n>0?r:n<0?-r:0,up:+(n>=0)}}lookback(){return 1}},pr=class extends L{descriptor={id:`seb`,name:`Standard Error Bands`,placement:`overlay`,defaultConfig:{period:21,mult:2,smooth:3},shortName:`SEB`,inputs:{period:{kind:`int`,min:3},mult:{kind:`number`,min:0,step:.1},smooth:{kind:`int`,min:1}},plots:[{key:`upper`,title:`Upper`,color:1},{key:`middle`,title:`Middle`,color:0},{key:`lower`,title:`Lower`,color:1}]};calculate(e,t){let n=B(t,`period`,21,3),r=z(t,`mult`,2),i=B(t,`smooth`,3,1),a=Array(e.length).fill(void 0),o=Array(e.length).fill(void 0),s=Array(e.length).fill(void 0);for(let t=0;t<e.length;t++){let i=Z(e,t,n);i&&(a[t]=i.end,o[t]=i.end+r*i.stdErr,s[t]=i.end-r*i.stdErr)}let c=K(a,i),l=K(o,i),u=K(s,i);return W(e,c.map((e,t)=>e===void 0||l[t]===void 0||u[t]===void 0?null:{middle:e,upper:l[t],lower:u[t]}))}};let mr=[3,5,8,10,12,15],hr=[30,35,40,45,50,60];var gr=class extends L{descriptor={id:`gmma`,name:`Guppy Multiple Moving Average`,placement:`overlay`,defaultConfig:{},shortName:`GMMA`,plots:[...mr.map(e=>({key:`s${e}`,title:`EMA ${e}`,color:0})),...hr.map(e=>({key:`l${e}`,title:`EMA ${e}`,color:1}))]};calculate(e,t){let n=G(e),r=[...mr.map(e=>[`s${e}`,q(n,e)]),...hr.map(e=>[`l${e}`,q(n,e)])];return W(e,e.map((e,t)=>{let n={},i=!1;for(let[e,a]of r)a[t]!==void 0&&(n[e]=a[t],i=!0);return i?n:null}))}},_r=class extends L{descriptor={id:`maribbon`,name:`Moving Average Ribbon`,placement:`overlay`,defaultConfig:{ma1:20,ma2:50,ma3:100,ma4:200,exponential:0},shortName:`MA Ribbon`,inputs:{ma1:{kind:`int`,min:1},ma2:{kind:`int`,min:1},ma3:{kind:`int`,min:1},ma4:{kind:`int`,min:1},exponential:{kind:`int`,min:0,max:1}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1},{key:`ma3`,title:`MA 3`,color:2},{key:`ma4`,title:`MA 4`,color:3}]};calculate(e,t){let n=z(t,`exponential`,0)>=1?q:K,r=G(e),i=[`ma1`,`ma2`,`ma3`,`ma4`],a=[20,50,100,200],o=i.map((e,i)=>[e,n(r,B(t,e,a[i],1))]);return W(e,e.map((e,t)=>{let n={},r=!1;for(let[e,i]of o)i[t]!==void 0&&(n[e]=i[t],r=!0);return r?n:null}))}},vr=class extends Q{read(e){return null}pointAt(e,t){return{value:this.price(e[t])}}},yr=class extends vr{descriptor={id:`avgprice`,name:`Average Price`,placement:`overlay`,defaultConfig:{},shortName:`OHLC4`,plots:[{key:`value`,title:`Average`,color:0}]};price(e){return(e.open+e.high+e.low+e.close)/4}},br=class extends vr{descriptor={id:`medprice`,name:`Median Price`,placement:`overlay`,defaultConfig:{},shortName:`HL2`,plots:[{key:`value`,title:`Median`,color:0}]};price(e){return(e.high+e.low)/2}},xr=class extends vr{descriptor={id:`typprice`,name:`Typical Price`,placement:`overlay`,defaultConfig:{},shortName:`HLC3`,plots:[{key:`value`,title:`Typical`,color:0}]};price(e){return(e.high+e.low+e.close)/3}},Sr=class extends vr{descriptor={id:`wclose`,name:`Weighted Close`,placement:`overlay`,defaultConfig:{},shortName:`HLCC4`,plots:[{key:`value`,title:`Weighted`,color:0}]};price(e){return(e.high+e.low+2*e.close)/4}},Cr=class extends Q{descriptor={id:`psy`,name:`Psychological Line`,placement:`panel`,defaultConfig:{period:10},inputs:{period:{kind:`int`,min:1}},shortName:`PSY`,plots:[{key:`value`,title:`PSY`,color:0}],scale:{min:0,max:100},levels:[25,75]};read(e){return B(e,`period`,10,1)}pointAt(e,t,n){if(t<n)return null;let r=0;for(let i=t-n+1;i<=t;i++)e[i].close>e[i-1].close&&r++;return{value:r/n*100}}},wr=class extends Q{descriptor={id:`newpsy`,name:`New Psychological Line`,placement:`panel`,defaultConfig:{period:10},inputs:{period:{kind:`int`,min:1}},shortName:`New PSY`,plots:[{key:`value`,title:`New PSY`,color:0}],scale:{min:-100,max:100},levels:[-50,0,50]};read(e){return B(e,`period`,10,1)}pointAt(e,t,n){if(t<n)return null;let r=0,i=0,a=0,o=0;for(let s=t-n+1;s<=t;s++){let t=e[s].close-e[s-1].close;t>0?(r++,a+=t):t<0&&(i++,o-=t)}let s=a+o;return{value:s===0?0:(r*a-i*o)/(s*n)*100}}},Tr=class extends Q{descriptor={id:`vr`,name:`Volume Ratio`,placement:`panel`,defaultConfig:{period:20},inputs:{period:{kind:`int`,min:1}},shortName:`VR`,plots:[{key:`value`,title:`VR`,color:0}],levels:[70,150,450]};read(e){return B(e,`period`,20,1)}pointAt(e,t,n){if(t<n)return null;let r=0,i=0,a=0;for(let o=t-n+1;o<=t;o++){let t=e[o].close-e[o-1].close;t>0?r+=e[o].volume:t<0?i+=e[o].volume:a+=e[o].volume}let o=i+a/2;return o>0?{value:(r+a/2)/o*100}:null}},Er=class extends Q{descriptor={id:`abratio`,name:`AB Ratio`,placement:`panel`,defaultConfig:{period:26},inputs:{period:{kind:`int`,min:1}},shortName:`AB Ratio`,plots:[{key:`a`,title:`A`,color:0},{key:`b`,title:`B`,color:1}],levels:[100]};read(e){return B(e,`period`,26,1)}pointAt(e,t,n){if(t<n)return null;let r=0,i=0,a=0,o=0;for(let s=t-n+1;s<=t;s++){let{open:t,high:n,low:c}=e[s],l=e[s-1].close;r+=n-t,i+=t-c,a+=Math.max(0,n-l),o+=Math.max(0,l-c)}let s={};return i>0&&(s.a=r/i*100),o>0&&(s.b=a/o*100),s.a!==void 0||s.b!==void 0?s:null}},Dr=class extends L{descriptor={id:`sonar`,name:`Sonar`,placement:`panel`,defaultConfig:{period:20,lookback:9,signal:9},inputs:{period:{kind:`int`,min:1},lookback:{kind:`int`,min:1},signal:{kind:`int`,min:1}},shortName:`Sonar`,plots:[{key:`sonar`,title:`Sonar`,color:0},{key:`signal`,title:`Signal`,color:1}],levels:[0]};calculate(e,t){let n=B(t,`period`,20,1),r=B(t,`lookback`,9,1),i=B(t,`signal`,9,1),a=q(G(e),n),o=a.map((e,t)=>e!==void 0&&t>=r&&a[t-r]!==void 0?e-a[t-r]:void 0),s=q(o,i);return W(e,o.map((e,t)=>e===void 0?null:s[t]===void 0?{sonar:e}:{sonar:e,signal:s[t]}))}},Or=class extends Q{descriptor={id:`sigma`,name:`Sigma`,placement:`panel`,defaultConfig:{period:20},inputs:{period:{kind:`int`,min:2}},shortName:`Sigma`,plots:[{key:`value`,title:`Sigma`,color:0}],levels:[-2,0,2]};read(e){return B(e,`period`,20,2)}pointAt(e,t,n){let r=Nn(e,t,n);return r?{value:r.sd<=Math.abs(r.mean)*1e-9?0:(e[t].close-r.mean)/r.sd}:null}},kr=class extends Q{descriptor={id:`vhf`,name:`Vertical Horizontal Filter`,placement:`panel`,defaultConfig:{period:28},inputs:{period:{kind:`int`,min:1}},shortName:`VHF`,plots:[{key:`value`,title:`VHF`,color:0}]};read(e){return B(e,`period`,28,1)}pointAt(e,t,n){if(t<n)return null;let r=e[t-n].close,i=r,a=0;for(let o=t-n+1;o<=t;o++){let t=e[o].close;t>r&&(r=t),t<i&&(i=t),a+=Math.abs(t-e[o-1].close)}return a>0?{value:(r-i)/a}:null}},Ar=class extends Q{descriptor={id:`rsquared`,name:`R-Squared`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:2}},shortName:`R²`,plots:[{key:`value`,title:`R²`,color:0}],scale:{min:0,max:1}};read(e){return B(e,`period`,14,2)}pointAt(e,t,n){let r=Z(e,t,n);return r?{value:r.r*r.r}:null}};function jr(e,t){let n=e[t];if(t===0)return n.high-n.low;let r=e[t-1].close;return Math.max(n.high-n.low,Math.abs(n.high-r),Math.abs(n.low-r))}var Mr=class extends Q{descriptor={id:`rwi`,name:`Random Walk Index`,placement:`panel`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:2}},shortName:`RWI`,plots:[{key:`high`,title:`RWI High`,color:0},{key:`low`,title:`RWI Low`,color:1}],levels:[1]};read(e){return B(e,`period`,14,2)}pointAt(e,t,n){if(t<n)return null;let r=0,i=0,a=jr(e,t);for(let o=1;o<=n;o++){if(o>1){let n=a/o*Math.sqrt(o);n>0&&(r=Math.max(r,(e[t].high-e[t-o].low)/n),i=Math.max(i,(e[t-o].high-e[t].low)/n))}a+=jr(e,t-o)}return{high:r,low:i}}},Nr=class extends L{calculate(e,t){let n=Array(e.length).fill(void 0),r=1e3;for(let t=0;t<e.length;t++){if(t>0){let n=e[t-1].close;n!==0&&this.counts(e[t].volume,e[t-1].volume)&&(r*=e[t].close/n)}n[t]=r}let i=q(n,B(t,`signal`,255,1));return W(e,n.map((e,t)=>i[t]===void 0?{value:e}:{value:e,signal:i[t]}))}},Pr=class extends Nr{descriptor={id:`nvi`,name:`Negative Volume Index`,placement:`panel`,defaultConfig:{signal:255},inputs:{signal:{kind:`int`,min:1}},shortName:`NVI`,plots:[{key:`value`,title:`NVI`,color:0},{key:`signal`,title:`Signal`,color:1}]};counts(e,t){return e<t}},Fr=class extends Nr{descriptor={id:`pvi`,name:`Positive Volume Index`,placement:`panel`,defaultConfig:{signal:255},inputs:{signal:{kind:`int`,min:1}},shortName:`PVI`,plots:[{key:`value`,title:`PVI`,color:0},{key:`signal`,title:`Signal`,color:1}]};counts(e,t){return e>t}},Ir=class extends Q{descriptor={id:`tr`,name:`True Range`,placement:`panel`,defaultConfig:{},shortName:`TR`,plots:[{key:`value`,title:`TR`,color:0}]};read(e){return null}pointAt(e,t){let n=e[t];if(t===0)return{value:n.high-n.low};let r=e[t-1].close;return{value:Math.max(n.high-n.low,Math.abs(n.high-r),Math.abs(n.low-r))}}},Lr=class extends Q{descriptor={id:`iii`,name:`Intraday Intensity`,placement:`panel`,defaultConfig:{period:21},inputs:{period:{kind:`int`,min:1}},shortName:`III`,plots:[{key:`value`,title:`III %`,color:0,kind:`histogram`,tone:`sign`,downColor:1}],scale:{zero:!0},levels:[0]};read(e){return B(e,`period`,21,1)}pointAt(e,t,n){if(t<n-1)return null;let r=0,i=0;for(let a=t-n+1;a<=t;a++){let t=e[a];i+=t.volume,t.high>t.low&&(r+=t.volume*(2*t.close-t.high-t.low)/(t.high-t.low))}return i>0?{value:Math.max(-100,Math.min(100,r/i*100))}:{value:0}}},Rr=class extends Q{descriptor={id:`volpct`,name:`Volume vs Average`,placement:`panel`,defaultConfig:{period:20},inputs:{period:{kind:`int`,min:1}},shortName:`Vol %`,plots:[{key:`value`,title:`Vol %`,color:0,kind:`histogram`,tone:`sign`,downColor:1}],scale:{zero:!0},levels:[0]};read(e){return B(e,`period`,20,1)}pointAt(e,t,n){if(t<n-1)return null;let r=0;for(let i=t-n+1;i<=t;i++)r+=e[i].volume;let i=r/n,a=(e[t].volume-i)/i*100;return i>0&&Number.isFinite(a)?{value:a}:null}},zr=class extends Q{descriptor={id:`volchange`,name:`Volume Change`,placement:`panel`,defaultConfig:{},shortName:`Vol Δ`,plots:[{key:`value`,title:`Volume`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}],scale:{zero:!0}};read(e){return null}pointAt(e,t){let{volume:n}=e[t];return Number.isFinite(n)?{value:n,up:+(t===0||n>=e[t-1].volume)}:null}},Br=class extends Q{descriptor={id:`tradevalue`,name:`Trade Value`,placement:`panel`,defaultConfig:{},shortName:`Value`,plots:[{key:`value`,title:`Value`,color:0,kind:`histogram`,tone:{field:`up`},downColor:1}],scale:{zero:!0}};read(e){return null}pointAt(e,t){let n=e[t],r=n.close*n.volume;return Number.isFinite(r)?{value:r,up:+(n.close>=n.open)}:null}},Vr=class extends L{descriptor={id:`binarywave`,name:`Binary Wave`,placement:`panel`,defaultConfig:{ma:20,fast:12,slow:26,signal:9,roc:12,stoch:14},inputs:{ma:{kind:`int`,min:1},fast:{kind:`int`,min:1},slow:{kind:`int`,min:1},signal:{kind:`int`,min:1},roc:{kind:`int`,min:1},stoch:{kind:`int`,min:1}},shortName:`Binary Wave`,plots:[{key:`value`,title:`Wave`,color:0,kind:`step`}],scale:{min:-4,max:4},levels:[0]};calculate(e,t){let n=G(e),r=K(n,B(t,`ma`,20,1)),i=q(n,B(t,`fast`,12,1)),a=q(n,B(t,`slow`,26,1)),o=i.map((e,t)=>e!==void 0&&a[t]!==void 0?e-a[t]:void 0),s=q(o,B(t,`signal`,9,1)),c=B(t,`roc`,12,1),l=B(t,`stoch`,14,1),u=e=>e?1:-1;return W(e,J(e.map((t,i)=>{let a=Y(e,i,l),d=X(e,i,l);if(r[i]===void 0||o[i]===void 0||s[i]===void 0||i<c||a===void 0||d===void 0)return;let f=a>d?(t.close-d)/(a-d)*100:50;return u(t.close>r[i])+u(o[i]>s[i])+u(t.close>n[i-c])+u(f>50)})))}},Hr=class extends L{descriptor={id:`sroc`,name:`Smoothed Rate of Change`,placement:`panel`,defaultConfig:{ema:13,roc:21},inputs:{ema:{kind:`int`,min:1},roc:{kind:`int`,min:1}},shortName:`S-ROC`,plots:[{key:`value`,title:`S-ROC`,color:0}],levels:[0]};calculate(e,t){let n=q(G(e),B(t,`ema`,13,1)),r=B(t,`roc`,21,1);return W(e,J(n.map((e,t)=>{let i=t>=r?n[t-r]:void 0;return e!==void 0&&i!==void 0&&i!==0?(e-i)/Math.abs(i)*100:void 0})))}},Ur=class extends Q{descriptor={id:`tsf`,name:`Time Series Forecast`,placement:`overlay`,defaultConfig:{period:14},inputs:{period:{kind:`int`,min:2}},shortName:`TSF`,plots:[{key:`value`,title:`TSF`,color:0}]};read(e){return B(e,`period`,14,2)}pointAt(e,t,n){let r=Z(e,t,n);return r?{value:r.end+r.slope}:null}},Wr=class extends Q{descriptor={id:`demark`,name:`DeMark Projected Range`,placement:`overlay`,defaultConfig:{},shortName:`DeMark`,plots:[{key:`high`,title:`Projected high`,color:0,kind:`step`},{key:`low`,title:`Projected low`,color:1,kind:`step`}]};read(e){return null}pointAt(e,t){if(t===0)return null;let{open:n,high:r,low:i,close:a}=e[t-1],o=a>n?2*r+i+a:a<n?r+2*i+a:r+i+2*a;return{high:o/2-i,low:o/2-r}}},Gr=class extends L{descriptor={id:`rainbow`,name:`Moving Average Rainbow`,placement:`overlay`,defaultConfig:{first:10,step:10,count:10,exponential:0},shortName:`Rainbow`,inputs:{first:{kind:`int`,min:1},step:{kind:`int`,min:1},count:{kind:`int`,min:1,max:20},exponential:{kind:`int`,min:0,max:1}},plots:Array.from({length:20},(e,t)=>({key:`ma${t+1}`,title:`MA ${t+1}`,color:t%ge.length}))};calculate(e,t){let n=B(t,`first`,10,1),r=B(t,`step`,10,1),i=Math.min(20,B(t,`count`,10,1)),a=B(t,`exponential`,0,0)>=1?q:K,o=G(e),s=Array.from({length:i},(e,t)=>[`ma${t+1}`,a(o,n+t*r)]);return W(e,e.map((e,t)=>{let n={},r=!1;for(let[e,i]of s)i[t]!==void 0&&(n[e]=i[t],r=!0);return r?n:null}))}},Kr=class{bodies=new Map;ranges=new Map;trends=new Map;constructor(e,t){this.data=e,this.period=t}open(e){return this.data[e].open}high(e){return this.data[e].high}low(e){return this.data[e].low}close(e){return this.data[e].close}body(e){return Math.abs(this.data[e].close-this.data[e].open)}range(e){return this.data[e].high-this.data[e].low}bodyTop(e){return Math.max(this.data[e].open,this.data[e].close)}bodyBottom(e){return Math.min(this.data[e].open,this.data[e].close)}mid(e){return(this.data[e].open+this.data[e].close)/2}upper(e){return this.data[e].high-this.bodyTop(e)}lower(e){return this.bodyBottom(e)-this.data[e].low}white(e){return this.data[e].close>this.data[e].open}black(e){return this.data[e].close<this.data[e].open}avgBody(e){let t=this.bodies.get(e);return t===void 0&&(t=this.averageBefore(e,e=>this.body(e)),this.bodies.set(e,t)),t}avgRange(e){let t=this.ranges.get(e);return t===void 0&&(t=this.averageBefore(e,e=>this.range(e)),this.ranges.set(e,t)),t}averageBefore(e,t){let n=Math.max(0,e-this.period);if(e<=n)return t(e);let r=0;for(let i=n;i<e;i++)r+=t(i);return r/(e-n)}bodyScale(e){return Math.max(this.avgBody(e),this.avgRange(e)*.25)}long(e,t=e){let n=this.bodyScale(t);return n>0&&this.body(e)>n}short(e,t=e){return this.body(e)<this.bodyScale(t)*.5}doji(e){return this.range(e)>0&&this.body(e)<=this.range(e)*.1}marubozu(e,t=e){return this.long(e,t)&&this.upper(e)<=this.range(e)*.05&&this.lower(e)<=this.range(e)*.05}same(e,t,n){return Math.abs(e-t)<=this.avgRange(n)*.05}bodyGapUp(e,t){return this.bodyBottom(t)>this.bodyTop(e)}bodyGapDown(e,t){return this.bodyTop(t)<this.bodyBottom(e)}bodyInside(e,t){return this.bodyTop(t)<=this.bodyTop(e)&&this.bodyBottom(t)>=this.bodyBottom(e)&&this.body(t)<this.body(e)}trendBefore(e){let t=this.trends.get(e);return t===void 0&&(t=this.readTrend(e),this.trends.set(e,t)),t}readTrend(e){let t=e-1;if(t<this.period-1)return null;let n=0;for(let e=t-this.period+1;e<=t;e++)n+=this.close(e);let r=n/this.period,i=this.close(t),a=this.close(t-this.period+1);return i>r&&i>a?`up`:i<r&&i<a?`down`:null}};function $(e,t,n,r,i,a,o,s){return{info:Object.freeze({id:e,name:t,short:n,direction:r,kind:i,bars:a}),trend:o,test:s}}function qr(e,t){let n=e.range(t);return n>0&&n>=e.avgRange(t)*.5&&e.body(t)<=n*.35&&e.lower(t)>=2*Math.max(e.body(t),n*.05)&&e.upper(t)<=n*.1}function Jr(e,t){let n=e.range(t);return n>0&&n>=e.avgRange(t)*.5&&e.body(t)<=n*.35&&e.upper(t)>=2*Math.max(e.body(t),n*.05)&&e.lower(t)<=n*.1}let Yr=[$(`doji`,`Doji`,`Doji`,`neutral`,`indecision`,1,null,(e,t)=>e.doji(t)),$(`longLeggedDoji`,`Long-Legged Doji`,`LL Doji`,`neutral`,`indecision`,1,null,(e,t)=>e.doji(t)&&e.upper(t)>=e.range(t)*.3&&e.lower(t)>=e.range(t)*.3&&e.range(t)>e.avgRange(t)),$(`dragonflyDoji`,`Dragonfly Doji`,`Dragonfly`,`bullish`,`reversal`,1,`down`,(e,t)=>e.doji(t)&&e.upper(t)<=e.range(t)*.1&&e.lower(t)>=e.range(t)*.6),$(`gravestoneDoji`,`Gravestone Doji`,`Gravestone`,`bearish`,`reversal`,1,`up`,(e,t)=>e.doji(t)&&e.lower(t)<=e.range(t)*.1&&e.upper(t)>=e.range(t)*.6),$(`hammer`,`Hammer`,`Hammer`,`bullish`,`reversal`,1,`down`,qr),$(`hangingMan`,`Hanging Man`,`Hanging`,`bearish`,`reversal`,1,`up`,qr),$(`invertedHammer`,`Inverted Hammer`,`Inv Hammer`,`bullish`,`reversal`,1,`down`,Jr),$(`shootingStar`,`Shooting Star`,`Shooting`,`bearish`,`reversal`,1,`up`,Jr),$(`spinningTop`,`Spinning Top`,`Spinning`,`neutral`,`indecision`,1,null,(e,t)=>!e.doji(t)&&e.body(t)<=e.range(t)*.3&&e.upper(t)>e.body(t)&&e.lower(t)>e.body(t)),$(`bullishMarubozu`,`Bullish Marubozu`,`Marubozu`,`bullish`,`continuation`,1,null,(e,t)=>e.white(t)&&e.marubozu(t)),$(`bearishMarubozu`,`Bearish Marubozu`,`Marubozu`,`bearish`,`continuation`,1,null,(e,t)=>e.black(t)&&e.marubozu(t)),$(`bullishBeltHold`,`Bullish Belt Hold`,`Belt Hold`,`bullish`,`reversal`,1,`down`,(e,t)=>e.white(t)&&e.long(t)&&e.lower(t)<=e.range(t)*.05&&e.upper(t)>e.range(t)*.05),$(`bearishBeltHold`,`Bearish Belt Hold`,`Belt Hold`,`bearish`,`reversal`,1,`up`,(e,t)=>e.black(t)&&e.long(t)&&e.upper(t)<=e.range(t)*.05&&e.lower(t)>e.range(t)*.05)],Xr=[$(`bullishEngulfing`,`Bullish Engulfing`,`Engulf`,`bullish`,`reversal`,2,`down`,(e,t)=>{let n=t-1;return e.black(n)&&e.white(t)&&e.open(t)<=e.close(n)&&e.close(t)>=e.open(n)&&e.body(t)>e.body(n)}),$(`bearishEngulfing`,`Bearish Engulfing`,`Engulf`,`bearish`,`reversal`,2,`up`,(e,t)=>{let n=t-1;return e.white(n)&&e.black(t)&&e.open(t)>=e.close(n)&&e.close(t)<=e.open(n)&&e.body(t)>e.body(n)}),$(`bullishHarami`,`Bullish Harami`,`Harami`,`bullish`,`reversal`,2,`down`,(e,t)=>e.black(t-1)&&e.long(t-1,t-1)&&!e.doji(t)&&e.bodyInside(t-1,t)&&e.body(t)<e.body(t-1)*.6),$(`bearishHarami`,`Bearish Harami`,`Harami`,`bearish`,`reversal`,2,`up`,(e,t)=>e.white(t-1)&&e.long(t-1,t-1)&&!e.doji(t)&&e.bodyInside(t-1,t)&&e.body(t)<e.body(t-1)*.6),$(`bullishHaramiCross`,`Bullish Harami Cross`,`Harami +`,`bullish`,`reversal`,2,`down`,(e,t)=>e.black(t-1)&&e.long(t-1,t-1)&&e.doji(t)&&e.bodyInside(t-1,t)),$(`bearishHaramiCross`,`Bearish Harami Cross`,`Harami +`,`bearish`,`reversal`,2,`up`,(e,t)=>e.white(t-1)&&e.long(t-1,t-1)&&e.doji(t)&&e.bodyInside(t-1,t)),$(`piercingLine`,`Piercing Line`,`Piercing`,`bullish`,`reversal`,2,`down`,(e,t)=>{let n=t-1;return e.black(n)&&e.long(n,n)&&e.white(t)&&e.open(t)<e.low(n)&&e.close(t)>e.mid(n)&&e.close(t)<e.open(n)}),$(`darkCloudCover`,`Dark Cloud Cover`,`Dark Cloud`,`bearish`,`reversal`,2,`up`,(e,t)=>{let n=t-1;return e.white(n)&&e.long(n,n)&&e.black(t)&&e.open(t)>e.high(n)&&e.close(t)<e.mid(n)&&e.close(t)>e.open(n)}),$(`tweezerBottom`,`Tweezer Bottom`,`Tweezer`,`bullish`,`reversal`,2,`down`,(e,t)=>e.black(t-1)&&e.white(t)&&e.same(e.low(t-1),e.low(t),t-1)),$(`tweezerTop`,`Tweezer Top`,`Tweezer`,`bearish`,`reversal`,2,`up`,(e,t)=>e.white(t-1)&&e.black(t)&&e.same(e.high(t-1),e.high(t),t-1)),$(`bullishKicking`,`Bullish Kicking`,`Kicking`,`bullish`,`reversal`,2,null,(e,t)=>e.black(t-1)&&e.marubozu(t-1,t-1)&&e.white(t)&&e.marubozu(t,t-1)&&e.low(t)>e.high(t-1)),$(`bearishKicking`,`Bearish Kicking`,`Kicking`,`bearish`,`reversal`,2,null,(e,t)=>e.white(t-1)&&e.marubozu(t-1,t-1)&&e.black(t)&&e.marubozu(t,t-1)&&e.high(t)<e.low(t-1)),$(`bullishCounterattack`,`Bullish Counterattack`,`Counter`,`bullish`,`reversal`,2,`down`,(e,t)=>e.black(t-1)&&e.long(t-1,t-1)&&e.white(t)&&e.long(t,t-1)&&e.same(e.close(t),e.close(t-1),t-1)),$(`bearishCounterattack`,`Bearish Counterattack`,`Counter`,`bearish`,`reversal`,2,`up`,(e,t)=>e.white(t-1)&&e.long(t-1,t-1)&&e.black(t)&&e.long(t,t-1)&&e.same(e.close(t),e.close(t-1),t-1)),$(`matchingLow`,`Matching Low`,`Match Low`,`bullish`,`reversal`,2,`down`,(e,t)=>e.black(t-1)&&e.long(t-1,t-1)&&e.black(t)&&e.same(e.close(t),e.close(t-1),t-1)),$(`homingPigeon`,`Homing Pigeon`,`Pigeon`,`bullish`,`reversal`,2,`down`,(e,t)=>e.black(t-1)&&e.long(t-1,t-1)&&e.black(t)&&e.short(t,t-1)&&e.bodyInside(t-1,t)),$(`onNeck`,`On Neck`,`On Neck`,`bearish`,`continuation`,2,`down`,(e,t)=>{let n=t-1;return e.black(n)&&e.long(n,n)&&e.white(t)&&e.open(t)<e.low(n)&&e.same(e.close(t),e.low(n),n)&&e.close(t)<e.close(n)}),$(`inNeck`,`In Neck`,`In Neck`,`bearish`,`continuation`,2,`down`,(e,t)=>{let n=t-1;return e.black(n)&&e.long(n,n)&&e.white(t)&&e.open(t)<e.low(n)&&e.close(t)>e.close(n)&&e.close(t)<=e.close(n)+e.body(n)*.1}),$(`thrusting`,`Thrusting`,`Thrusting`,`bearish`,`continuation`,2,`down`,(e,t)=>{let n=t-1;return e.black(n)&&e.long(n,n)&&e.white(t)&&e.open(t)<e.low(n)&&e.close(t)>e.close(n)+e.body(n)*.1&&e.close(t)<e.mid(n)}),$(`bullishSeparatingLines`,`Bullish Separating Lines`,`Separating`,`bullish`,`continuation`,2,`up`,(e,t)=>e.black(t-1)&&e.white(t)&&e.long(t,t-1)&&e.lower(t)<=e.range(t)*.05&&e.same(e.open(t),e.open(t-1),t-1)),$(`bearishSeparatingLines`,`Bearish Separating Lines`,`Separating`,`bearish`,`continuation`,2,`down`,(e,t)=>e.white(t-1)&&e.black(t)&&e.long(t,t-1)&&e.upper(t)<=e.range(t)*.05&&e.same(e.open(t),e.open(t-1),t-1))];function Zr(e,t){for(let n=t;n<t+3;n++)if(!e.white(n)||e.short(n,t)||e.upper(n)>e.body(n)*.25||n>t&&(e.close(n)<=e.close(n-1)||e.open(n)<e.open(n-1)||e.open(n)>e.close(n-1)))return!1;return!0}function Qr(e,t){for(let n=t;n<t+3;n++)if(!e.black(n)||e.short(n,t)||e.lower(n)>e.body(n)*.25||n>t&&(e.close(n)>=e.close(n-1)||e.open(n)>e.open(n-1)||e.open(n)<e.close(n-1)))return!1;return!0}function $r(e,t,n,r){for(let i=t+1;i<=n;i++)if(r?e.close(i)>=e.close(i-1):e.close(i)<=e.close(i-1))return!1;return!0}function ei(e,t,n,r,i){for(let a=n;a<=r;a++)if((i?!e.black(a):!e.white(a))||e.long(a,t)||e.high(a)>e.high(t)||e.low(a)<e.low(t))return!1;return!0}let ti=[$(`morningStar`,`Morning Star`,`M. Star`,`bullish`,`reversal`,3,`down`,(e,t)=>{let n=t-2,r=t-1;return e.black(n)&&e.long(n,n)&&e.short(r,n)&&!e.doji(r)&&e.bodyGapDown(n,r)&&e.white(t)&&e.close(t)>e.mid(n)}),$(`eveningStar`,`Evening Star`,`E. Star`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.long(n,n)&&e.short(r,n)&&!e.doji(r)&&e.bodyGapUp(n,r)&&e.black(t)&&e.close(t)<e.mid(n)}),$(`morningDojiStar`,`Morning Doji Star`,`M. Doji`,`bullish`,`reversal`,3,`down`,(e,t)=>{let n=t-2,r=t-1;return e.black(n)&&e.long(n,n)&&e.doji(r)&&e.bodyGapDown(n,r)&&e.white(t)&&e.close(t)>e.mid(n)}),$(`eveningDojiStar`,`Evening Doji Star`,`E. Doji`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.long(n,n)&&e.doji(r)&&e.bodyGapUp(n,r)&&e.black(t)&&e.close(t)<e.mid(n)}),$(`bullishAbandonedBaby`,`Bullish Abandoned Baby`,`Abandoned`,`bullish`,`reversal`,3,`down`,(e,t)=>{let n=t-2,r=t-1;return e.black(n)&&e.long(n,n)&&e.doji(r)&&e.high(r)<e.low(n)&&e.white(t)&&!e.short(t,n)&&e.low(t)>e.high(r)}),$(`bearishAbandonedBaby`,`Bearish Abandoned Baby`,`Abandoned`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.long(n,n)&&e.doji(r)&&e.low(r)>e.high(n)&&e.black(t)&&!e.short(t,n)&&e.high(t)<e.low(r)}),$(`threeWhiteSoldiers`,`Three White Soldiers`,`3 Soldiers`,`bullish`,`reversal`,3,null,(e,t)=>Zr(e,t-2)),$(`threeBlackCrows`,`Three Black Crows`,`3 Crows`,`bearish`,`reversal`,3,null,(e,t)=>Qr(e,t-2)),$(`threeInsideUp`,`Three Inside Up`,`3 Inside`,`bullish`,`reversal`,3,`down`,(e,t)=>{let n=t-2,r=t-1;return e.black(n)&&e.long(n,n)&&e.white(r)&&e.bodyInside(n,r)&&e.white(t)&&e.close(t)>e.open(n)}),$(`threeInsideDown`,`Three Inside Down`,`3 Inside`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.long(n,n)&&e.black(r)&&e.bodyInside(n,r)&&e.black(t)&&e.close(t)<e.open(n)}),$(`threeOutsideUp`,`Three Outside Up`,`3 Outside`,`bullish`,`reversal`,3,`down`,(e,t)=>{let n=t-2,r=t-1;return e.black(n)&&e.white(r)&&e.open(r)<=e.close(n)&&e.close(r)>=e.open(n)&&e.body(r)>e.body(n)&&e.white(t)&&e.close(t)>e.close(r)}),$(`threeOutsideDown`,`Three Outside Down`,`3 Outside`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.black(r)&&e.open(r)>=e.close(n)&&e.close(r)<=e.open(n)&&e.body(r)>e.body(n)&&e.black(t)&&e.close(t)<e.close(r)}),$(`upsideGapTwoCrows`,`Upside Gap Two Crows`,`2 Crows Gap`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.long(n,n)&&e.black(r)&&e.short(r,n)&&e.bodyGapUp(n,r)&&e.black(t)&&e.open(t)>e.open(r)&&e.close(t)<e.close(r)&&e.close(t)>e.close(n)}),$(`twoCrows`,`Two Crows`,`2 Crows`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.long(n,n)&&e.black(r)&&e.bodyGapUp(n,r)&&e.black(t)&&e.open(t)<e.open(r)&&e.open(t)>e.close(r)&&e.close(t)<e.close(n)&&e.close(t)>e.open(n)}),$(`bullishTriStar`,`Bullish Tri-Star`,`Tri-Star`,`bullish`,`reversal`,3,`down`,(e,t)=>{let n=t-2,r=t-1;return e.doji(n)&&e.doji(r)&&e.doji(t)&&e.bodyGapDown(n,r)&&e.bodyGapUp(r,t)}),$(`bearishTriStar`,`Bearish Tri-Star`,`Tri-Star`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.doji(n)&&e.doji(r)&&e.doji(t)&&e.bodyGapUp(n,r)&&e.bodyGapDown(r,t)}),$(`upsideTasukiGap`,`Upside Tasuki Gap`,`Tasuki`,`bullish`,`continuation`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.white(r)&&e.low(r)>e.high(n)&&e.black(t)&&e.open(t)<e.close(r)&&e.open(t)>e.open(r)&&e.close(t)<e.low(r)&&e.close(t)>e.high(n)}),$(`downsideTasukiGap`,`Downside Tasuki Gap`,`Tasuki`,`bearish`,`continuation`,3,`down`,(e,t)=>{let n=t-2,r=t-1;return e.black(n)&&e.black(r)&&e.high(r)<e.low(n)&&e.white(t)&&e.open(t)>e.close(r)&&e.open(t)<e.open(r)&&e.close(t)>e.high(r)&&e.close(t)<e.low(n)}),$(`stickSandwich`,`Stick Sandwich`,`Sandwich`,`bullish`,`reversal`,3,`down`,(e,t)=>{let n=t-2,r=t-1;return e.black(n)&&e.white(r)&&e.low(r)>e.close(n)&&e.black(t)&&e.same(e.close(t),e.close(n),n)}),$(`advanceBlock`,`Advance Block`,`Adv Block`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.white(n)&&e.long(n,n)&&e.white(r)&&e.white(t)&&e.close(r)>e.close(n)&&e.close(t)>e.close(r)&&e.open(r)>e.open(n)&&e.open(r)<=e.close(n)&&e.open(t)>e.open(r)&&e.open(t)<=e.close(r)&&e.body(t)<e.body(r)&&e.body(r)<e.body(n)&&e.upper(t)>e.upper(n)}),$(`identicalThreeCrows`,`Identical Three Crows`,`Ident Crows`,`bearish`,`reversal`,3,`up`,(e,t)=>{let n=t-2,r=t-1;return e.black(n)&&e.black(r)&&e.black(t)&&e.close(r)<e.close(n)&&e.close(t)<e.close(r)&&e.same(e.open(r),e.close(n),n)&&e.same(e.open(t),e.close(r),n)&&e.lower(n)<=e.body(n)*.25&&e.lower(r)<=e.body(r)*.25&&e.lower(t)<=e.body(t)*.25})],ni=[$(`bullishThreeLineStrike`,`Bullish Three-Line Strike`,`Strike`,`bullish`,`continuation`,4,`up`,(e,t)=>{let n=t-3;return e.white(n)&&e.white(n+1)&&e.white(n+2)&&$r(e,n,n+2,!1)&&e.open(n+1)>=e.open(n)&&e.open(n+1)<=e.close(n)&&e.open(n+2)>=e.open(n+1)&&e.open(n+2)<=e.close(n+1)&&e.black(t)&&e.open(t)>e.close(n+2)&&e.close(t)<e.open(n)}),$(`bearishThreeLineStrike`,`Bearish Three-Line Strike`,`Strike`,`bearish`,`continuation`,4,`down`,(e,t)=>{let n=t-3;return e.black(n)&&e.black(n+1)&&e.black(n+2)&&$r(e,n,n+2,!0)&&e.open(n+1)<=e.open(n)&&e.open(n+1)>=e.close(n)&&e.open(n+2)<=e.open(n+1)&&e.open(n+2)>=e.close(n+1)&&e.white(t)&&e.open(t)<e.close(n+2)&&e.close(t)>e.open(n)}),$(`risingThreeMethods`,`Rising Three Methods`,`Rising 3`,`bullish`,`continuation`,5,`up`,(e,t)=>{let n=t-4;return e.white(n)&&e.long(n,n)&&ei(e,n,n+1,n+3,!0)&&$r(e,n+1,n+3,!0)&&e.white(t)&&e.long(t,n)&&e.open(t)>e.close(t-1)&&e.close(t)>e.close(n)}),$(`fallingThreeMethods`,`Falling Three Methods`,`Falling 3`,`bearish`,`continuation`,5,`down`,(e,t)=>{let n=t-4;return e.black(n)&&e.long(n,n)&&ei(e,n,n+1,n+3,!1)&&$r(e,n+1,n+3,!1)&&e.black(t)&&e.long(t,n)&&e.open(t)<e.close(t-1)&&e.close(t)<e.close(n)}),$(`matHold`,`Mat Hold`,`Mat Hold`,`bullish`,`continuation`,5,`up`,(e,t)=>{let n=t-4;if(!(e.white(n)&&e.long(n,n)&&e.black(n+1)&&e.short(n+1,n)&&e.bodyGapUp(n,n+1)))return!1;for(let t=n+1;t<=n+3;t++)if(e.long(t,n)||e.bodyBottom(t)<e.mid(n))return!1;let r=Math.max(e.high(n+1),e.high(n+2),e.high(n+3));return e.close(n+3)<e.close(n+1)&&e.white(t)&&e.open(t)>e.close(t-1)&&e.close(t)>r}),$(`bullishBreakaway`,`Bullish Breakaway`,`Breakaway`,`bullish`,`reversal`,5,`down`,(e,t)=>{let n=t-4;return e.black(n)&&e.long(n,n)&&e.black(n+1)&&e.bodyGapDown(n,n+1)&&e.close(n+2)<e.close(n+1)&&e.close(n+3)<e.close(n+2)&&e.black(n+3)&&e.white(t)&&e.close(t)>e.open(n+1)&&e.close(t)<e.close(n)}),$(`bearishBreakaway`,`Bearish Breakaway`,`Breakaway`,`bearish`,`reversal`,5,`up`,(e,t)=>{let n=t-4;return e.white(n)&&e.long(n,n)&&e.white(n+1)&&e.bodyGapUp(n,n+1)&&e.close(n+2)>e.close(n+1)&&e.close(n+3)>e.close(n+2)&&e.white(n+3)&&e.black(t)&&e.close(t)<e.open(n+1)&&e.close(t)>e.close(n)}),$(`concealingBabySwallow`,`Concealing Baby Swallow`,`Swallow`,`bullish`,`reversal`,4,`down`,(e,t)=>{let n=t-3;return e.black(n)&&e.marubozu(n,n)&&e.black(n+1)&&e.marubozu(n+1,n)&&e.black(n+2)&&e.open(n+2)<e.close(n+1)&&e.high(n+2)>e.close(n+1)&&e.black(t)&&e.open(t)>e.high(n+2)&&e.close(t)<e.low(n+2)}),$(`ladderBottom`,`Ladder Bottom`,`Ladder`,`bullish`,`reversal`,5,`down`,(e,t)=>{let n=t-4;for(let t=n;t<=n+3;t++)if(!e.black(t))return!1;for(let t=n+1;t<=n+2;t++)if(e.open(t)>=e.open(t-1)||e.close(t)>=e.close(t-1))return!1;return e.upper(n+3)>e.body(n+3)&&e.white(t)&&e.open(t)>e.open(n+3)&&e.close(t)>e.high(n+3)})],ri=[...Yr,...Xr,...ti,...ni],ii=ri.map(e=>e.info);function ai(e){if(!e.patterns)return ri;let t=new Set(e.patterns);return ri.filter(e=>t.has(e.info.id))}function oi(e,t,n){let r=[];for(let i of n){let n=t-i.info.bars+1;n<0||i.trend&&e.trendBefore(n)!==i.trend||i.test(e,t)&&r.push(i)}return r}function si(e={}){return ai(e)}var ci=class extends Q{descriptor={id:`candlepatterns`,name:`Candlestick Patterns`,placement:`overlay`,defaultConfig:{trendPeriod:10,reversal:1,continuation:1,indecision:0},shortName:`Patterns`,inputs:{trendPeriod:{kind:`int`,min:2},reversal:{kind:`int`,min:0,max:1},continuation:{kind:`int`,min:0,max:1},indecision:{kind:`int`,min:0,max:1}},plots:[{key:`bull`,title:`Bullish`,color:3,kind:`dots`},{key:`bear`,title:`Bearish`,color:4,kind:`dots`},{key:`neutral`,title:`Indecision`,color:1,kind:`dots`}]};read(e){let t=new Set;return B(e,`reversal`,1,0)>=1&&t.add(`reversal`),B(e,`continuation`,1,0)>=1&&t.add(`continuation`),B(e,`indecision`,0,0)>=1&&t.add(`indecision`),{trendPeriod:B(e,`trendPeriod`,10,2),defs:si().filter(e=>t.has(e.info.kind))}}pointAt(e,t,{trendPeriod:n,defs:r}){let i=oi(new Kr(e,n),t,r);if(i.length===0)return null;let a=i[0];for(let e of i)e.info.bars>=a.info.bars&&(a=e);let o=e[t],s={code:ii.indexOf(a.info),count:i.length};return a.info.direction===`bullish`?s.bull=o.low:a.info.direction===`bearish`?s.bear=o.high:s.neutral=o.high,s}render(e,t,n,r){let i=t.series;if(!i)return;let a=Math.max(0,Math.floor(n.visibleRange.from)),o=Math.min(i.length-1,Math.ceil(n.visibleRange.to)),s=n.barWidth+n.barSpacing>=12,{chartRect:c}=n,l=c.y+10,u=c.y+c.height-10,d=e=>r.plots?.[e]?.visible!==!1;e.save(),e.globalAlpha=r.opacity,e.font=`10px sans-serif`,e.textAlign=`center`;let f=-1/0,p=-1/0;for(let t=a;t<=o;t++){let a=i[t];if(!a)continue;let o=N(t,n),c=ii[a.code??-1]?.short??``;if(a.bull!==void 0&&d(`bull`)){let t=P(a.bull,n)+4;e.fillStyle=r.colors[3]??r.colors[0],li(e,o,t,`up`),s&&c&&(p=ui(e,c,o,Math.min(u,t+6+2),`top`,p))}else if(a.bear!==void 0&&d(`bear`)){let t=P(a.bear,n)-4;e.fillStyle=r.colors[4]??r.colors[0],li(e,o,t,`down`),s&&c&&(f=ui(e,c,o,Math.max(l,t-6-2),`bottom`,f))}else if(a.neutral!==void 0&&d(`neutral`)){let t=P(a.neutral,n)-4-6/2;e.fillStyle=r.colors[1]??r.colors[0],e.beginPath(),e.arc(o,t,6/2-1,0,Math.PI*2),e.fill(),s&&c&&(f=ui(e,c,o,Math.max(l,t-6/2-2),`bottom`,f))}}e.restore()}};function li(e,t,n,r){e.beginPath(),r===`up`?(e.moveTo(t,n),e.lineTo(t-3,n+6),e.lineTo(t+3,n+6)):(e.moveTo(t,n),e.lineTo(t-3,n-6),e.lineTo(t+3,n-6)),e.closePath(),e.fill()}function ui(e,t,n,r,i,a){let o=e.measureText(t).width/2;return n-o<a+2?a:(e.textBaseline=i,e.fillText(t,n,r),n+o)}var di=class extends L{descriptor={id:`machannel`,name:`Moving Average Channel`,placement:`overlay`,defaultConfig:{upperLength:20,lowerLength:20,upperOffset:0,lowerOffset:0},shortName:`MA Channel`,inputs:{upperLength:{kind:`int`,min:1},lowerLength:{kind:`int`,min:1},upperOffset:{kind:`int`,min:-500,max:500},lowerOffset:{kind:`int`,min:-500,max:500}},fills:[{between:[`upper`,`lower`],color:0,opacity:.08}],plots:[{key:`upper`,title:`Upper`,color:0},{key:`lower`,title:`Lower`,color:1}]};calculate(e,t){let n=pi(K(e.map(e=>e.high),B(t,`upperLength`,20,1)),fi(t,`upperOffset`)),r=pi(K(e.map(e=>e.low),B(t,`lowerLength`,20,1)),fi(t,`lowerOffset`));return W(e,n.map((e,t)=>{let n=r[t];return e===void 0&&n===void 0?null:{...e===void 0?{}:{upper:e},...n===void 0?{}:{lower:n}}}))}};function fi(e,t){let n=Number(e.params[t]??0);return Number.isFinite(n)?Math.max(-500,Math.min(500,Math.round(n))):0}function pi(e,t){return e.map((n,r)=>e[r-t])}var mi=class extends Q{descriptor={id:`hamming`,name:`Moving Average Hamming`,placement:`overlay`,defaultConfig:{period:10,source:`close`},shortName:`HMA (Hamming)`,inputs:{period:{kind:`int`,min:2,max:500},source:{source:!0}},plots:[{key:`value`,title:`MA`,color:0}]};read(e){let t=Math.min(500,B(e,`period`,10,2)),n=Array.from({length:t},(e,n)=>.54-.46*Math.cos(2*Math.PI*n/(t-1)));return{weights:n,total:n.reduce((e,t)=>e+t,0)}}pointAt(e,t,{weights:n,total:r}){let i=t-n.length+1;if(i<0)return null;let a=0;for(let t=0;t<n.length;t++)a+=n[t]*e[i+t].close;return{value:a/r}}};let hi=[`sma`,`ema`,`wma`];function gi(e,t,n){return e===`ema`?q(t,n):e===`wma`?Dn(t,n):K(t,n)}var _i=class extends L{calculate(e,t){let n=hi.includes(t.params.type)?t.params.type:`sma`,r=G(e),i=this.lengths.map(([e,i])=>gi(n,r,B(t,e,i,1)));return W(e,e.map((e,t)=>{let n={};return i.forEach((e,r)=>{let i=e[t];i!==void 0&&(n[`ma${r+1}`]=i)}),Object.keys(n).length>0?n:null}))}},vi=class extends _i{lengths=[[`first`,20],[`second`,50]];descriptor={id:`madouble`,name:`Moving Average Double`,placement:`overlay`,defaultConfig:{first:20,second:50,type:`sma`,source:`close`},shortName:`MA x2`,inputs:{first:{kind:`int`,min:1},second:{kind:`int`,min:1},type:{options:hi},source:{source:!0}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1}]}},yi=class extends _i{lengths=[[`first`,10],[`second`,20],[`third`,50]];descriptor={id:`matriple`,name:`Moving Average Triple`,placement:`overlay`,defaultConfig:{first:10,second:20,third:50,type:`sma`,source:`close`},shortName:`MA x3`,inputs:{first:{kind:`int`,min:1},second:{kind:`int`,min:1},third:{kind:`int`,min:1},type:{options:hi},source:{source:!0}},plots:[{key:`ma1`,title:`MA 1`,color:0},{key:`ma2`,title:`MA 2`,color:1},{key:`ma3`,title:`MA 3`,color:2}]}},bi=class extends L{descriptor={id:`volindex`,name:`Volatility Index`,placement:`overlay`,defaultConfig:{period:7,mult:3},shortName:`VI`,inputs:{period:{kind:`int`,min:1},mult:{kind:`number`,label:`ATR multiple`,min:.1,step:.1}},plots:[{key:`sar`,title:`Stop`,color:0,kind:`dots`,tone:{field:`long`},downColor:1}]};calculate(e,t){let n=B(t,`period`,7,1),r=Math.max(.1,z(t,`mult`,3)),i=On(An(e),n),a=Array(e.length).fill(null),o=null,s=0;for(let t=0;t<e.length;t++){let n=i[t];if(n===void 0)continue;let c=e[t].close,l=n*r;o===null?(o=c>=e[0].close,s=c):o?(s=Math.max(s,c),c<s-l&&(o=!1,s=c)):(s=Math.min(s,c),c>s+l&&(o=!0,s=c)),a[t]={sar:o?s-l:s+l,long:+!!o}}return W(e,a)}},xi=class extends L{descriptor={id:`asi`,name:`Accumulative Swing Index`,placement:`panel`,defaultConfig:{limit:10},shortName:`ASI`,inputs:{limit:{kind:`number`,label:`Limit move`,min:1e-4,step:.1}},plots:[{key:`value`,title:`ASI`,color:0}],scale:{zero:!0}};calculate(e,t){let n=Math.max(1e-9,z(t,`limit`,10)),r=Array(e.length).fill(null),i=0;for(let t=1;t<e.length;t++)i+=Si(e[t-1],e[t],n),r[t]={value:i};return W(e,r)}};function Si(e,t,n){let r=Math.abs(t.high-e.close),i=Math.abs(t.low-e.close),a=t.high-t.low,o=Math.abs(e.close-e.open),s;return s=r>=i&&r>=a?r-.5*i+.25*o:i>=r&&i>=a?i-.5*r+.25*o:a+.25*o,s===0?0:50*(t.close-e.close+.5*(t.close-t.open)+.25*(e.close-e.open))/s*(Math.max(r,i)/n)}var Ci=class extends Q{descriptor={id:`advdecline`,name:`Advance/Decline`,placement:`panel`,defaultConfig:{length:10},shortName:`A/D Ratio`,inputs:{length:{kind:`int`,min:1}},plots:[{key:`value`,title:`Ratio`,color:0}],scale:{min:0}};read(e){return{length:B(e,`length`,10,1)}}pointAt(e,t,{length:n}){if(t<n-1)return null;let r=0,i=0;for(let a=t-n+1;a<=t;a++)e[a].close>e[a].open?r++:e[a].close<e[a].open&&i++;return{value:i===0?r:r/i}}},wi=class extends Q{descriptor={id:`majority`,name:`Majority Rule`,placement:`panel`,defaultConfig:{period:14},shortName:`Majority`,inputs:{period:{kind:`int`,min:1}},plots:[{key:`value`,title:`Majority`,color:0}],scale:{min:0,max:100},levels:[50]};read(e){return{period:B(e,`period`,14,1)}}pointAt(e,t,{period:n}){if(t<n)return null;let r=0;for(let i=t-n+1;i<=t;i++)e[i].close>e[i-1].close&&r++;return{value:100*r/n}}},Ti=class extends L{descriptor={id:`chopzone`,name:`Chop Zone`,placement:`panel`,defaultConfig:{},shortName:`Chop Zone`,plots:[{key:`angle`,title:`Angle`,color:0,kind:`histogram`}],scale:{zero:!0}};calculate(e,t){let n=q(G(e),34),r=Array(e.length).fill(null);for(let t=1;t<e.length;t++){let i=n[t],a=n[t-1],o=Y(e,t,30),s=X(e,t,30);if(i===void 0||a===void 0||o===void 0||s===void 0||o===s)continue;let c=e[t],l=(c.high+c.low+c.close)/3;if(!(l>0&&s>0))continue;let u=(i-a)/l*(25/(o-s)*s);r[t]={angle:Math.atan(u)*180/Math.PI}}return W(e,r)}render(e,t,n,r){if(r.plots?.angle?.visible===!1)return;let i=t.series;if(!i)return;let{from:a,to:o}=n.visibleRange,s=P(0,n),c=[];for(let e=a;e<=o&&e<i.length;e++){let t=i[e]?.angle;t!==void 0&&c.push({x:N(e,n),y:P(t,n),baseY:s,color:Ei(t)})}this.drawHistogram(e,c,Math.max(1,n.barWidth))}};function Ei(e){return e>=5?`#26C6DA`:e>=3.57?`#43A047`:e>=2.14?`#A5D6A7`:e>=.71?`#009688`:e<=-5?`#D50000`:e<=-3.57?`#E91E63`:e<=-2.14?`#FF6D00`:e<=-.71?`#FFB74D`:`#FDD835`}var Di=class extends L{descriptor={id:`smiergodic`,name:`SMI Ergodic`,placement:`panel`,defaultConfig:{short:5,long:20,signal:5,source:`close`},shortName:`SMIIO`,inputs:{short:{kind:`int`,min:1},long:{kind:`int`,min:1},signal:{kind:`int`,min:1},source:{source:!0}},plots:[{key:`oscillator`,title:`Oscillator`,color:2,kind:`histogram`,tone:`sign`,downColor:3},{key:`indicator`,title:`Indicator`,color:0},{key:`signal`,title:`Signal`,color:1}],scale:{zero:!0}};calculate(e,t){let n=B(t,`short`,5,1),r=B(t,`long`,20,1),i=e.map((t,n)=>n===0?void 0:t.close-e[n-1].close),a=q(q(i,r),n),o=q(q(i.map(e=>e===void 0?void 0:Math.abs(e)),r),n),s=a.map((e,t)=>e===void 0||!o[t]?void 0:e/o[t]),c=q(s,B(t,`signal`,5,1));return W(e,s.map((e,t)=>{if(e===void 0)return null;let n=c[t];return n===void 0?{indicator:e}:{indicator:e,signal:n,oscillator:e-n}}))}},Oi=class extends L{descriptor={id:`po`,name:`Price Oscillator`,placement:`panel`,defaultConfig:{short:10,long:21,source:`close`},shortName:`PO`,inputs:{short:{kind:`int`,min:1},long:{kind:`int`,min:1},source:{source:!0}},plots:[{key:`value`,title:`PO`,color:0}],scale:{zero:!0}};calculate(e,t){let n=G(e),r=K(n,B(t,`short`,10,1)),i=K(n,B(t,`long`,21,1));return W(e,J(r.map((e,t)=>e===void 0||i[t]===void 0?void 0:e-i[t])))}};let ki=e=>({period:B(e,`period`,10,1),annual:Math.max(1,z(e,`annual`,365))}),Ai={period:{kind:`int`,min:1},annual:{kind:`number`,label:`Bars per year`,min:1}};var ji=class extends Q{descriptor={id:`volohlc`,name:`Volatility O-H-L-C`,placement:`panel`,defaultConfig:{period:10,annual:365},shortName:`Vol OHLC`,inputs:Ai,plots:[{key:`value`,title:`Volatility`,color:0}],scale:{min:0}};read(e){return ki(e)}pointAt(e,t,{period:n,annual:r}){if(t<n-1)return null;let i=0;for(let r=t-n+1;r<=t;r++){let{open:t,high:n,low:a,close:o}=e[r];if(!(t>0&&n>0&&a>0&&o>0))return null;i+=.5*Math.log(n/a)**2-(2*Math.LN2-1)*Math.log(o/t)**2}return{value:100*Math.sqrt(Math.max(0,i/n*r))}}},Mi=class extends Q{descriptor={id:`volzt`,name:`Volatility Zero Trend Close-to-Close`,placement:`panel`,defaultConfig:{period:10,annual:365},shortName:`Vol ZT`,inputs:Ai,plots:[{key:`value`,title:`Volatility`,color:0}],scale:{min:0}};read(e){return ki(e)}pointAt(e,t,{period:n,annual:r}){if(t<n)return null;let i=0;for(let r=t-n+1;r<=t;r++){let t=e[r-1].close,n=e[r].close;if(!(t>0&&n>0))return null;i+=Math.log(n/t)**2}return{value:100*Math.sqrt(i/n*r)}}};let Ni=[()=>new He,()=>new Ue,()=>new We,()=>new Je,()=>new Xe,()=>new Ze,()=>new Qe,()=>new $e,()=>new et,()=>new nt,()=>new it,()=>new at,()=>new ot,()=>new st,()=>new ut,()=>new dt,()=>new ft,()=>new pt,()=>new ht,()=>new gt,()=>new _t,()=>new xt,()=>new wt,()=>new Tt,()=>new Et,()=>new Dt,()=>new Ot,()=>new kt,()=>new At,()=>new jt,()=>new Mt,()=>new Nt,()=>new Pt,()=>new Ft,()=>new It,()=>new bn,()=>new Cn,()=>new wn,()=>new Tn,()=>new St,()=>new Ct,()=>new Lt,()=>new Rt,()=>new zt,()=>new Bt,()=>new Ht,()=>new Ut,()=>new Gt,()=>new Kt,()=>new qt,()=>new Jt,()=>new Xt,()=>new Zt,()=>new Qt,()=>new $t,()=>new en,()=>new tn,()=>new nn,()=>new rn,()=>new an,()=>new on,()=>new sn,()=>new cn,()=>new ln,()=>new fn,()=>new mn,()=>new gn,()=>new _n,()=>new vn,()=>new yn,()=>new Fn,()=>new In,()=>new zn,()=>new Bn,()=>new Vn,()=>new Hn,()=>new Gn,()=>new qn,()=>new Jn,()=>new Zn,()=>new Qn,()=>new $n,()=>new er,()=>new tr,()=>new rr,()=>new or,()=>new sr,()=>new cr,()=>new lr,()=>new ur,()=>new dr,()=>new fr,()=>new pr,()=>new gr,()=>new _r,()=>new yr,()=>new br,()=>new xr,()=>new di,()=>new mi,()=>new vi,()=>new yi,()=>new bi,()=>new xi,()=>new Ci,()=>new wi,()=>new Ti,()=>new Di,()=>new Oi,()=>new ji,()=>new Mi,()=>new Cr,()=>new wr,()=>new Tr,()=>new Er,()=>new Dr,()=>new Or,()=>new kr,()=>new Ar,()=>new Mr,()=>new Pr,()=>new Fr,()=>new Ir,()=>new Lr,()=>new Rr,()=>new zr,()=>new Br,()=>new Vr,()=>new Hr,()=>new Ur,()=>new Sr,()=>new Wr,()=>new Gr,()=>new ci];function Pi(e,t,n=null,r=0){let i=n&&r>0&&r<=n.length?n:[],a=i===n?r:0;i.length=e.length;for(let n=a;n<e.length;n++){let r=e[n];i[n]={...r,close:pe(r,t)}}return i}function Fi(e){let{time:t,open:n,high:r,low:i,close:a,volume:o}=e,s=Array(t.length);for(let e=0;e<t.length;e++)s[e]={time:t[e],open:n[e],high:r[e],low:i[e],close:a[e],volume:o[e]};return s}function Ii(e){let t=new Set;for(let n of e)if(n)for(let e in n)t.add(e);return[...t]}function Li(e,t){if(e===t)return!0;let n=Object.keys(e);return n.length===Object.keys(t).length?n.every(n=>Object.is(e[n],t[n])):!1}function Ri(e,t,n){if(t.length>n.length)return!1;let r=0;for(let i=0;i<t.length;i++){let a=t[i];if(!a)continue;r++;let o=e.values.get(n[i]);if(!o||!Li(o,a))return!1}return r===e.values.size}function zi(e,t){let n=e.meta?{meta:e.meta}:{},r=e.series;if(!r)return{present:null,keys:[],columns:[],nans:[],values:new Map(e.values),...n};let i=Ii(r),a=new Uint8Array(r.length),o=i.map(()=>new Float64Array(r.length).fill(NaN)),s=i.map(()=>null);for(let e=0;e<r.length;e++){let t=r[e];if(t){a[e]=1;for(let n=0;n<i.length;n++){let a=t[i[n]];a!==void 0&&(o[n][e]=a,Number.isNaN(a)&&((s[n]??=new Uint8Array(r.length))[e]=1))}}}return{present:a,keys:i,columns:o,nans:s,values:Ri(e,r,t)?null:new Map(e.values),...n}}function Bi(e){let t=e.columns.map(e=>e.buffer);for(let n of e.nans)n&&t.push(n.buffer);return e.present&&t.push(e.present.buffer),t}function Vi(e){let t=e;return typeof t.workerState==`function`&&typeof t.adoptWorkerState==`function`}function Hi(e){if(!Array.isArray(e)||e.length<1024)return!1;for(let t=0;t<e.length;t++){let n=e[t];if(n!==void 0&&typeof n!=`number`)return!1}return!0}function Ui(e,t){let n=new Float64Array(e.length),r=null;for(let t=0;t<e.length;t++){let i=e[t];i===void 0?(r??=new Uint8Array(e.length))[t]=1:n[t]=i}return t.push(n.buffer),r&&t.push(r.buffer),{tcPacked:`numbers`,values:n,missing:r}}function Wi(e){let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Gi(e,t){if(Hi(e))return Ui(e,t);if(Array.isArray(e))return e.map(e=>Gi(e,t));if(!e||typeof e!=`object`)return e;if(!Wi(e))throw Error(`An indicator state to send from the worker must be plain arrays and objects`);let n={};for(let[r,i]of Object.entries(e))n[r]=Gi(i,t);return n}var Ki=class{bars=null;bySource=new Map;constructor(e){this.columns=e}barsFor(e){if(this.bars??=Fi(this.columns),!e||e===`close`)return this.bars;let t=this.bySource.get(e);return t||this.bySource.set(e,t=Pi(this.bars,e)),t}};function qi(){let e=new Map;for(let t of Ni){let n=t();e.set(n.descriptor.id,n)}return e}let Ji=e=>setTimeout(e,0);function Yi(e){return e instanceof Error?e.message:`Unknown worker error`}function Xi(e,{job:t,batch:n},r){let{requestId:i,indicatorId:a}=t,o=e.get(a);if(!o){r({type:`error`,requestId:i,message:`Unknown indicator: ${a}`},[]);return}try{let e=o.calculate(n.barsFor(t.source),t.config),a=[],s=Vi(o)?Gi(o.workerState(e),a):void 0,c={...zi(e,n.columns.time),...s===void 0?{}:{state:s}};r({type:`result`,requestId:i,output:c},[...Bi(c),...a])}catch(e){r({type:`error`,requestId:i,message:Yi(e)},[])}}function Zi(e,t=Ji){let n=qi(),r=[],i=!1,a=()=>{i=!1;let t=r.shift();t&&Xi(n,t,e),r.length>0&&o()},o=()=>{i||(i=!0,t(a))},s=e=>{let t=new Set(e);for(let e=r.length-1;e>=0;e--)t.has(r[e].job.requestId)&&r.splice(e,1)};return t=>{if(t.type===`ping`)e({type:`pong`,requestId:t.requestId},[]);else if(t.type===`cancel`)s(t.requestIds);else if(t.type===`calculate`){let e=new Ki(t.bars);for(let n of t.jobs)r.push({job:n,batch:e});o()}}}let Qi=self,$i=Zi((e,t)=>Qi.postMessage(e,t));Qi.addEventListener(`message`,e=>$i(e.data))})();", t = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", e], { type: "text/javascript;charset=utf-8" });
|
|
3
|
+
function n(n) {
|
|
4
|
+
let r;
|
|
5
|
+
try {
|
|
6
|
+
if (r = t && (self.URL || self.webkitURL).createObjectURL(t), !r) throw "";
|
|
7
|
+
let e = new Worker(r, { name: n?.name });
|
|
8
|
+
return e.addEventListener("error", () => {
|
|
9
|
+
(self.URL || self.webkitURL).revokeObjectURL(r);
|
|
10
|
+
}), e;
|
|
11
|
+
} catch {
|
|
12
|
+
return new Worker("data:text/javascript;charset=utf-8," + encodeURIComponent(e), { name: n?.name });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { n as default };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=indicator.worker-R8CZwJjK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indicator.worker-R8CZwJjK.js","names":[],"sources":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurrentPriceLine.d.ts","sourceRoot":"","sources":["../../src/realtime/CurrentPriceLine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"CurrentPriceLine.d.ts","sourceRoot":"","sources":["../../src/realtime/CurrentPriceLine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAOjE,+FAA+F;AAC/F,MAAM,WAAW,YAAY;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAKD;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,UAAU,CAAK;IACvB,iEAAiE;IACjE,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,GAAG,CAA6B;IAExC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IASrD,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI;IAI5B,SAAS,IAAI,OAAO;IAIpB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIjD,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB,kEAAkE;IAClE,MAAM,IAAI,YAAY,GAAG,IAAI;IAI7B,0CAA0C;IAC1C,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAKlF,4EAA4E;IAC5E,OAAO,CAAC,MAAM;IAUd;;;OAGG;IACH,UAAU,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAqBtF,qEAAqE;IACrE,SAAS,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;CAkCtF"}
|
|
@@ -42,7 +42,8 @@ export interface StreamEvents {
|
|
|
42
42
|
}
|
|
43
43
|
export declare class StreamManager extends Emitter<StreamEvents> {
|
|
44
44
|
private config;
|
|
45
|
-
|
|
45
|
+
/** Where the bars come from: a feed, or an adapter as one. */
|
|
46
|
+
private source;
|
|
46
47
|
private aggregator;
|
|
47
48
|
private reconnector;
|
|
48
49
|
readonly priceLine: CurrentPriceLine;
|
|
@@ -53,7 +54,6 @@ export declare class StreamManager extends Emitter<StreamEvents> {
|
|
|
53
54
|
private sentPreviousClose;
|
|
54
55
|
/** When the bar `previousClose` is the close of starts, ms: a correction of it moves the close. */
|
|
55
56
|
private previousCloseTime;
|
|
56
|
-
private unsubscribers;
|
|
57
57
|
private heartbeatTimer;
|
|
58
58
|
private lastMessageTime;
|
|
59
59
|
/** Bumped by every connect attempt and by disconnect — see doConnect. */
|
|
@@ -62,13 +62,6 @@ export declare class StreamManager extends Emitter<StreamEvents> {
|
|
|
62
62
|
private timeZone;
|
|
63
63
|
/** When the history's last bar starts, ms (null: no history yet): bars from ticks follow its grid. */
|
|
64
64
|
private historyEnd;
|
|
65
|
-
/** The wrapper that builds the timeframes the feed lacks (null: it serves every one): bars from ticks start where its do. */
|
|
66
|
-
private resampler;
|
|
67
|
-
/**
|
|
68
|
-
* Whether silence means a dead connection. A feed's doesn't: it says when
|
|
69
|
-
* its connection drops, and a quiet one (a daily chart, a closed market) is fine.
|
|
70
|
-
*/
|
|
71
|
-
private watchSilence;
|
|
72
65
|
constructor();
|
|
73
66
|
connect(config: StreamConfig): Promise<void>;
|
|
74
67
|
disconnect(): void;
|
|
@@ -106,7 +99,12 @@ export declare class StreamManager extends Emitter<StreamEvents> {
|
|
|
106
99
|
private tickZone;
|
|
107
100
|
private doConnect;
|
|
108
101
|
private wireReconnector;
|
|
109
|
-
|
|
102
|
+
/** The stream as its source's subscriber. */
|
|
103
|
+
private subscriber;
|
|
104
|
+
private onConnection;
|
|
105
|
+
private onTick;
|
|
106
|
+
/** A bar the source formed itself (most do). */
|
|
107
|
+
private onBar;
|
|
110
108
|
/** The close the price's change is measured from: `bar`'s. */
|
|
111
109
|
private setPreviousClose;
|
|
112
110
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StreamManager.d.ts","sourceRoot":"","sources":["../../src/realtime/StreamManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EAEd,OAAO,EACP,OAAO,EACP,aAAa,EACb,UAAU,EACV,SAAS,EACV,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"StreamManager.d.ts","sourceRoot":"","sources":["../../src/realtime/StreamManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,cAAc,EAEd,OAAO,EACP,OAAO,EACP,aAAa,EACb,UAAU,EACV,SAAS,EACV,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,kCAAkC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,wBAAwB;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,oHAAoH;IACpH,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC7D,gEAAgE;IAChE,KAAK,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,+BAA+B;IAC/B,gBAAgB,EAAE,cAAc,CAAC;IACjC,qBAAqB;IACrB,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,2EAA2E;IAC3E,UAAU,EAAE,UAAU,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAiDD,qBAAa,aAAc,SAAQ,OAAO,CAAC,YAAY,CAAC;IACtD,OAAO,CAAC,MAAM,CAA6B;IAC3C,8DAA8D;IAC9D,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,WAAW,CAAmB;IACtC,QAAQ,CAAC,SAAS,mBAA0B;IAE5C,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAuB;IAC5C,yDAAyD;IACzD,OAAO,CAAC,iBAAiB,CAAuB;IAChD,mGAAmG;IACnG,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,eAAe,CAAK;IAC5B,yEAAyE;IACzE,OAAO,CAAC,UAAU,CAAK;IACvB,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAuB;IACvC,sGAAsG;IACtG,OAAO,CAAC,UAAU,CAAuB;;IAUnC,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IA2ClD,UAAU,IAAI,IAAI;IAwBlB;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBnE,kBAAkB,IAAI,eAAe;IAIrC;;;;;;;;;OASG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAMtC,iBAAiB,IAAI,cAAc;IAQnC,YAAY,IAAI,MAAM,GAAG,IAAI;IAM7B;;;;;;;;;OASG;IACH,OAAO,CAAC,aAAa;IAerB,0HAA0H;IAC1H,OAAO,CAAC,QAAQ;YAMF,SAAS;IA2CvB,OAAO,CAAC,eAAe;IAevB,6CAA6C;IAC7C,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,MAAM;IAYd,gDAAgD;IAChD,OAAO,CAAC,KAAK;IAKb,8DAA8D;IAC9D,OAAO,CAAC,gBAAgB;IAKxB;;;;;;;;OAQG;IACH,OAAO,CAAC,cAAc;IAMtB,0GAA0G;IAC1G,OAAO,CAAC,YAAY;IAMpB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,QAAQ;IAUhB;;;;;;;OAOG;IACH,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI;IAaxC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,aAAa;IAOrB,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BinanceAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/BinanceAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,OAAO,EACP,KAAK,EACL,KAAK,EACL,UAAU,EACV,mBAAmB,EACnB,SAAS,EACV,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"BinanceAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/adapters/BinanceAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,OAAO,EACP,KAAK,EACL,KAAK,EACL,UAAU,EACV,mBAAmB,EACnB,SAAS,EACV,MAAM,sBAAsB,CAAC;AAoE9B;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAe,YAAW,WAAW;IAChD,QAAQ,CAAC,IAAI,aAAa;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,mBAAmB,EAA0B,SAAS,EAAE,CAAC;IAElE,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAA6D;IAC9E,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,wDAAwD;IACxD,OAAO,CAAC,UAAU,CAAsC;IACxD,+GAA+G;IAC/G,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmB;gBAEjC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAO5D,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAMxC,UAAU,IAAI,IAAI;IAiBlB,kBAAkB,IAAI,eAAe;IAI/B,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAOzF,8FAA8F;IACxF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKxF,0FAA0F;IACpF,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAW/D,OAAO,CAAC,WAAW;IAanB;;;;;OAKG;IACH,eAAe,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI;IA+E5F,gGAAgG;IAC1F,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAQjE,0FAA0F;IAC1F,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI;IAiDhF,0EAA0E;IAC1E,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;YAI3F,WAAW;IAiBzB,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IASpF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAIrF,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,SAAS;IAmDjB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,SAAS;CASlB"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DataAdapter, DataFeed, StreamConfig } from '@tradecanvas/commons';
|
|
1
|
+
import { BarsSubscription, ConnectionState, DataAdapter, DataAdapterConfig, DataAdapterEventType, DataAdapterListener, DataFeed, FeedSubscriber, OHLCBar, StreamConfig, TimeFrame } from '@tradecanvas/commons';
|
|
2
2
|
/**
|
|
3
3
|
* Whether `adapter` was made from a feed (`adapterFromFeed`). A feed says
|
|
4
4
|
* itself when its connection drops, so the stream doesn't take a quiet one
|
|
@@ -20,6 +20,43 @@ export declare function streamAdapterOf(config: Pick<StreamConfig, 'adapter' | '
|
|
|
20
20
|
* old subscription sends after a connect replaced it is dropped.
|
|
21
21
|
*/
|
|
22
22
|
export declare function adapterFromFeed(feed: DataFeed): DataAdapter;
|
|
23
|
+
/**
|
|
24
|
+
* The adapter `adapterFromFeed` makes. A stream takes the feed's live bars
|
|
25
|
+
* through `subscribe`, as the feed sends them, and loads through
|
|
26
|
+
* `fetchHistory`: the adapter's part is then the requests it aborts.
|
|
27
|
+
*/
|
|
28
|
+
export declare class FeedAdapter implements DataAdapter {
|
|
29
|
+
private readonly feed;
|
|
30
|
+
readonly name: string;
|
|
31
|
+
readonly supportedTimeframes?: readonly TimeFrame[];
|
|
32
|
+
/** Older bars before `before`; left out for a feed with only the newest (`pagesBack: false`). */
|
|
33
|
+
readonly fetchHistoryBefore?: (symbol: string, timeframe: TimeFrame, before: number, limit: number) => Promise<OHLCBar[]>;
|
|
34
|
+
private state;
|
|
35
|
+
private listeners;
|
|
36
|
+
private unsubscribe;
|
|
37
|
+
/** One controller per series asked for: a disconnect aborts the streamed series' only. */
|
|
38
|
+
private requests;
|
|
39
|
+
/** The series the last connect subscribed to. */
|
|
40
|
+
private streamed;
|
|
41
|
+
constructor(feed: DataFeed);
|
|
42
|
+
fetchHistory(symbol: string, timeframe: TimeFrame, limit?: number): Promise<OHLCBar[]>;
|
|
43
|
+
connect(config: DataAdapterConfig): void;
|
|
44
|
+
/**
|
|
45
|
+
* Live bars of `request`, in place of the series subscribed before: sent
|
|
46
|
+
* as the adapter's events, and to `to` as the feed sends them. `disconnect`
|
|
47
|
+
* stops them.
|
|
48
|
+
*/
|
|
49
|
+
subscribe(request: BarsSubscription, to?: FeedSubscriber): void;
|
|
50
|
+
disconnect(): void;
|
|
51
|
+
getConnectionState(): ConnectionState;
|
|
52
|
+
on<T = unknown>(event: DataAdapterEventType, listener: DataAdapterListener<T>): void;
|
|
53
|
+
off<T = unknown>(event: DataAdapterEventType, listener: DataAdapterListener<T>): void;
|
|
54
|
+
dispose(): void;
|
|
55
|
+
private signalFor;
|
|
56
|
+
private stopSubscription;
|
|
57
|
+
private setState;
|
|
58
|
+
private emit;
|
|
59
|
+
}
|
|
23
60
|
/**
|
|
24
61
|
* A `DataFeed` on top of `adapter`: `getBars` loads through `fetchHistory`
|
|
25
62
|
* and pages through `fetchHistoryBefore` (none: no older bars, `pagesBack` false), and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/feeds/feedAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"feedAdapter.d.ts","sourceRoot":"","sources":["../../../src/realtime/feeds/feedAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,QAAQ,EACR,cAAc,EACd,OAAO,EAEP,YAAY,EAEZ,SAAS,EACV,MAAM,sBAAsB,CAAC;AAU9B;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE3D;AAID,8FAA8F;AAC9F,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,IAAI,QAAQ,CAE7E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC,GAAG,WAAW,CAK3F;AAYD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,CAM3D;AAED;;;;GAIG;AACH,qBAAa,WAAY,YAAW,WAAW;IAajC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAZjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,mBAAmB,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACpD,iGAAiG;IACjG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1H,OAAO,CAAC,KAAK,CAAmC;IAChD,OAAO,CAAC,SAAS,CAA6D;IAC9E,OAAO,CAAC,WAAW,CAA6B;IAChD,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAsC;IACtD,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAuB;gBAEV,IAAI,EAAE,QAAQ;IAU3C,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAInF,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAIxC;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI;IAoD/D,UAAU,IAAI,IAAI;IAUlB,kBAAkB,IAAI,eAAe;IAIrC,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IASpF,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,GAAG,IAAI;IAIrF,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,IAAI;CAIb;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,QAAQ,CAc9D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { BarsSubscription, FeedSubscriber, OHLCBar, StreamConfig } from '@tradecanvas/commons';
|
|
2
|
+
import { ResamplingAdapter } from '../adapters/ResamplingAdapter.js';
|
|
3
|
+
/** The message of an error a source sent without one. */
|
|
4
|
+
export declare const UNNAMED_SOURCE_ERROR = "Adapter error";
|
|
5
|
+
/**
|
|
6
|
+
* What a stream runs on, in a feed's terms: it asks for the newest bars,
|
|
7
|
+
* subscribes to the live ones, and hears them through a `FeedSubscriber`.
|
|
8
|
+
* It keeps one live series, the stream's: subscribing again takes the place
|
|
9
|
+
* of the series before.
|
|
10
|
+
*/
|
|
11
|
+
export interface StreamSource {
|
|
12
|
+
/** The wrapper that builds the timeframes the source lacks (null: it serves every one). */
|
|
13
|
+
readonly resampler: ResamplingAdapter | null;
|
|
14
|
+
/**
|
|
15
|
+
* Whether silence means a dead connection. A feed's doesn't: it says when
|
|
16
|
+
* its connection drops, and a quiet one (a daily chart, a closed market) is fine.
|
|
17
|
+
*/
|
|
18
|
+
readonly watchSilence: boolean;
|
|
19
|
+
/** Who hears the source from now on, until `release`. */
|
|
20
|
+
listen(subscriber: FeedSubscriber): void;
|
|
21
|
+
/** The newest `countBack` bars of `series`. */
|
|
22
|
+
getBars(series: BarsSubscription, countBack: number): Promise<OHLCBar[]>;
|
|
23
|
+
/** Live bars of `series`, in place of the series subscribed before. */
|
|
24
|
+
subscribeBars(series: BarsSubscription): void;
|
|
25
|
+
/** Stops the live bars; a feed's requests for their series are aborted. */
|
|
26
|
+
unsubscribe(): void;
|
|
27
|
+
/** Lets go of the source: the subscriber hears no more of it. */
|
|
28
|
+
release(): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The source a stream runs on: the config's feed, or its adapter as one.
|
|
32
|
+
* Timeframes the source lacks (7m, 90m…) are built from one it has, and tick
|
|
33
|
+
* timeframes (100T) from its trades; both wrap adapters, so a feed with
|
|
34
|
+
* either is read through them, as an adapter is. Throws when the config has
|
|
35
|
+
* neither an adapter nor a feed, or both.
|
|
36
|
+
*/
|
|
37
|
+
export declare function streamSourceOf(config: Pick<StreamConfig, 'adapter' | 'feed'>): StreamSource;
|
|
38
|
+
//# sourceMappingURL=streamSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamSource.d.ts","sourceRoot":"","sources":["../../../src/realtime/feeds/streamSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAKhB,cAAc,EACd,OAAO,EAEP,YAAY,EAEb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAkB,MAAM,kCAAkC,CAAC;AAIrF,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,kBAAkB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,2FAA2F;IAC3F,QAAQ,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC7C;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,yDAAyD;IACzD,MAAM,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IACzC,+CAA+C;IAC/C,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,uEAAuE;IACvE,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9C,2EAA2E;IAC3E,WAAW,IAAI,IAAI,CAAC;IACpB,iEAAiE;IACjE,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,MAAM,CAAC,GAAG,YAAY,CAS3F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plot.d.ts","sourceRoot":"","sources":["../../src/trading/plot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"plot.d.ts","sourceRoot":"","sources":["../../src/trading/plot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,0GAA0G;AAC1G,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,OAAO,CAGlE;AAED,iCAAiC;AACjC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAGtE;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CASzI"}
|
package/dist/ui/ChartLegend.d.ts
CHANGED
|
@@ -36,6 +36,10 @@ export declare class ChartLegend {
|
|
|
36
36
|
/** How far right of the plot's edge the top rows reached on the last draw (px). */
|
|
37
37
|
private drawnWidth;
|
|
38
38
|
private locale;
|
|
39
|
+
/** Room to the plot's side and top, and under each line (px): the chart's density sets them. */
|
|
40
|
+
private inset;
|
|
41
|
+
private top;
|
|
42
|
+
private lineGap;
|
|
39
43
|
private pricePrecision;
|
|
40
44
|
/** The height last told to the resize listener; null before the first draw. */
|
|
41
45
|
private reportedHeight;
|
|
@@ -87,6 +91,14 @@ export declare class ChartLegend {
|
|
|
87
91
|
* shifts as digits change.
|
|
88
92
|
*/
|
|
89
93
|
private priceCells;
|
|
94
|
+
/** The legend's distance from the plot's side and top, and the space under each of its lines, px. */
|
|
95
|
+
setSpacing(spacing: {
|
|
96
|
+
inset: number;
|
|
97
|
+
top: number;
|
|
98
|
+
lineGap: number;
|
|
99
|
+
}): void;
|
|
100
|
+
/** The legend's distance from the plot's side, px. */
|
|
101
|
+
getInset(): number;
|
|
90
102
|
/**
|
|
91
103
|
* How far below the plot's top edge the title, price and volume rows reach
|
|
92
104
|
* (the indicator row excluded), so other content can stack under them: as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartLegend.d.ts","sourceRoot":"","sources":["../../src/ui/ChartLegend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGtF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,WAAW,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB,EAAE,YAUnC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA8C;IAC5D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,QAAQ,CAAwB;IACxC,wFAAwF;IACxF,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,UAAU,CAAwD;IAC1E,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAM;IACtB,4EAA4E;IAC5E,OAAO,CAAC,WAAW,CAAuB;IAC1C,mFAAmF;IACnF,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,cAAc,CAAuB;IAC7C,+EAA+E;IAC/E,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAA6B;IAEnD;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAItD;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,YAAY;IAOpB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAK9C,uCAAuC;IACvC,SAAS,IAAI,YAAY;IAIzB;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIjD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM/B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM9B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjC,2FAA2F;IAC3F,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,GAAE,OAAO,GAAG,IAAW,GAAG,IAAI;IAKnE,kBAAkB,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI;IAIlF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAMxC,kEAAkE;IAClE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMnC;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,UAAU;IAgBlB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA8ClB;;;;;OAKG;IACH,SAAS,IAAI,MAAM;IAUnB;;;;;OAKG;IACH,QAAQ,IAAI,MAAM;IAKlB,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IA2FpG,kGAAkG;IAClG,OAAO,CAAC,UAAU;CAQnB"}
|
|
1
|
+
{"version":3,"file":"ChartLegend.d.ts","sourceRoot":"","sources":["../../src/ui/ChartLegend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGtF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,WAAW,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB,EAAE,YAUnC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA8C;IAC5D,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,SAAS,CAAM;IACvB,OAAO,CAAC,QAAQ,CAAwB;IACxC,wFAAwF;IACxF,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,UAAU,CAAwD;IAC1E,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAM;IACtB,4EAA4E;IAC5E,OAAO,CAAC,WAAW,CAAuB;IAC1C,mFAAmF;IACnF,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,MAAM,CAAW;IACzB,gGAAgG;IAChG,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,cAAc,CAAuB;IAC7C,+EAA+E;IAC/E,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,cAAc,CAA6B;IAEnD;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAItD;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,YAAY;IAOpB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAK9C,uCAAuC;IACvC,SAAS,IAAI,YAAY;IAIzB;;;OAGG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIjD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAM/B,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM9B,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjC,2FAA2F;IAC3F,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,GAAE,OAAO,GAAG,IAAW,GAAG,IAAI;IAKnE,kBAAkB,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI;IAIlF,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAMxC,kEAAkE;IAClE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMnC;;;;OAIG;IACH,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,UAAU;IAgBlB;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA8ClB,qGAAqG;IACrG,UAAU,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAQ1E,sDAAsD;IACtD,QAAQ,IAAI,MAAM;IAIlB;;;;;OAKG;IACH,SAAS,IAAI,MAAM;IAUnB;;;;;OAKG;IACH,QAAQ,IAAI,MAAM;IAKlB,MAAM,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI;IA2FpG,kGAAkG;IAClG,OAAO,CAAC,UAAU;CAQnB"}
|