openalgo-charts 2.5.2 → 2.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- import{sourceValues as e,supertrend as l,atr as t,sessionStartFlags as o,calendarPeriodFlags as n,DEFAULT_TIMEZONE as r,isValidTimezone as a,isNewZonedPeriod as i,utcSecondsToIstParts as s,IST_OFFSET_SECONDS as c,rsi as p,trueRange as u,withAlpha as y,isNewZonedWeek as f,isNewZonedMonth as d,utcSecondsToZonedParts as m,zonedWallClockToUtcSeconds as b,IndicatorInputError as h,resolveInterval as g,parseSessionSpec as k,bucketStartOf as w,zonedWeekIndex as C,zonedDayIndex as v,startOfZonedDay as M,registerIndicator as A}from"./openalgo-charts.mjs";function N(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;let n=0,r=0;for(let a=0;a<t;a++){const t=e[a];if(Number.isFinite(t)?n+=t:r+=1,a>=l){const t=e[a-l];Number.isFinite(t)?n-=t:r-=1}a>=l-1&&(o[a]=0===r?n/l:NaN)}return o}function x(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;const n=l*(l+1)/2;for(let r=l-1;r<t;r++){let t=0;for(let o=0;o<l;o++)t+=e[r-o]*(l-o);o[r]=t/n}return o}function S(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;let n=0;for(let t=0;t<l;t++)n+=e[t];let r=n/l;o[l-1]=r;for(let n=l;n<t;n++)r=(r*(l-1)+e[n])/l,o[n]=r;return o}function L(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;const n=N(e,l);for(let r=l-1;r<t;r++){let t=0;const a=n[r];for(let o=0;o<l;o++){const l=e[r-o]-a;t+=l*l}o[r]=Math.sqrt(t/l)}return o}function B(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0)return o;for(let n=l-1;n<t;n++){let t=-1/0;for(let o=0;o<l;o++)e[n-o]>t&&(t=e[n-o]);o[n]=t}return o}function K(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0)return o;for(let n=l-1;n<t;n++){let t=1/0;for(let o=0;o<l;o++)e[n-o]<t&&(t=e[n-o]);o[n]=t}return o}function W(e){const l=new Array(e.length);for(let t=0;t<e.length;t++){const o=e[t];l[t]=Number.isFinite(o)?o:null}return l}function D(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;let n=0;for(let t=0;t<l;t++)n+=e[t];let r=n/l;o[l-1]=r;const a=2/(l+1);for(let n=l;n<t;n++)r=e[n]*a+r*(1-a),o[n]=r;return o}function F(e,l=1){const t=e.length,o=new Array(t).fill(NaN);for(let n=l;n<t;n++)o[n]=e[n]-e[n-l];return o}function R(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0)return o;for(let n=l;n<t;n++){const t=e[n-l];o[n]=0===t?NaN:100*(e[n]-t)/t}return o}function U(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;const n=N(e,l);for(let r=l-1;r<t;r++){let t=0;for(let o=0;o<l;o++)t+=Math.abs(e[r-o]-n[r]);o[r]=t/l}return o}function T(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0)return o;for(let n=l;n<t;n++){let t=0;for(let o=1;o<=l;o++)e[n-o]<=e[n]&&(t+=1);o[n]=100*t/l}return o}function P(e,l,t,o){const n=e.length,r=new Array(n).fill(NaN);if(l<=0||o<=0||n<l)return r;const a=t*(l-1),i=l/o,s=new Array(l);let c=0;for(let e=0;e<l;e++){const l=Math.exp(-(e-a)*(e-a)/(2*i*i));s[e]=l,c+=l}if(0===c)return r;for(let t=l-1;t<n;t++){let o=0;for(let n=0;n<l;n++)o+=e[t-(l-1-n)]*s[n];r[t]=o/c}return r}function O(e,l,t){const o=e.length,n=new Array(o);for(let t=0;t<o;t++)n[t]=e[t]*(l[t]??0);const r=N(n,t),a=N(l,t),i=new Array(o).fill(NaN);for(let e=0;e<o;e++)i[e]=0===a[e]?NaN:r[e]/a[e];return i}function I(e,l){return H(e,l,!0)}function V(e,l){return H(e,l,!1)}function H(e,l,t){const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;for(let r=l-1;r<o;r++){let o=e[r],a=0;for(let n=1;n<l;n++){const l=e[r-n];(t?l>o:l<o)&&(o=l,a=n)}n[r]=0===a?0:-a}return n}function E(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;let n=0;for(let r=0;r<t;r++)n+=e[r],r>=l&&(n-=e[r-l]),r>=l-1&&(o[r]=n);return o}function $(e){const l=e.length,t=new Array(l);let o=0;for(let n=0;n<l;n++){const l=e[n];Number.isFinite(l)&&(o+=l),t[n]=o}return t}function q(e,l,t=0){const o=e.length,n=new Array(o).fill(NaN);if(l<=1||o<l)return n;const r=(l-1)*l/2,a=l*((l-1)*l*(2*l-1)/6)-r*r;if(0===a)return n;for(let i=l-1;i<o;i++){let o=0,s=0;for(let t=0;t<l;t++){const n=e[i-(l-1-t)];o+=n,s+=n*t}const c=(l*s-r*o)/a,p=(o-c*r)/l;n[i]=p+c*(l-1-t)}return n}function z(e){const l=e.length,t=new Array(l).fill(NaN);for(let o=3;o<l;o++)t[o]=(e[o-3]+2*e[o-2]+2*e[o-1]+e[o])/6;return t}function Z(e,l,t,o){const n=e.length,r=new Array(n).fill(NaN),a=B(l,o),i=K(t,o);for(let l=0;l<n;l++){const t=a[l]-i[l];r[l]=0===t?NaN:100*(e[l]-i[l])/t}return r}function Y(e,l,t){const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;for(let r=l-1;r<o;r++){const o=e.slice(r-l+1,r+1);if(o.some(e=>!Number.isFinite(e)))continue;o.sort((e,l)=>e-l);const a=Math.max(1,Math.ceil(t/100*l));n[r]=o[a-1]}return n}function j(e,l,t){const o=e.length,n=new Array(o).fill(NaN);if(t<=1||o<t)return n;for(let r=t-1;r<o;r++){let o=0,a=0,i=0,s=0,c=0;for(let n=0;n<t;n++){const t=e[r-n],p=l[r-n];o+=t,a+=p,i+=t*t,s+=p*p,c+=t*p}const p=t*c-o*a,u=Math.sqrt(t*i-o*o)*Math.sqrt(t*s-a*a);n[r]=0===u?NaN:p/u}return n}function G(e,l){const t=e.length,o=new Array(t).fill(NaN),n=N(e,l),r=U(e,l);for(let l=0;l<t;l++)o[l]=0===r[l]?NaN:(e[l]-n[l])/(.015*r[l]);return o}function X(e,l,t){return _(e,l,t,!0)}function J(e,l,t){return _(e,l,t,!1)}function _(e,l,t,o){const n=e.length,r=new Array(n).fill(NaN);for(let a=l+t;a<n;a++){const n=a-t,i=e[n];if(!Number.isFinite(i))continue;let s=!0;for(let t=1;t<=l&&s;t++){const l=e[n-t];Number.isFinite(l)&&!(o?l>=i:l<=i)||(s=!1)}for(let l=1;l<=t&&s;l++){const t=e[n+l];Number.isFinite(t)&&!(o?t>=i:t<=i)||(s=!1)}s&&(r[a]=i)}return r}function Q(e){const l=e.length,t=new Array(l).fill(NaN);let o=-1;for(let n=0;n<l;n++)e[n]&&(o=n),o>=0&&(t[n]=n-o);return t}function ee(e,l,t){const o=e.length,n=new Array(o).fill(NaN),r=[];for(let a=0;a<o;a++){e[a]&&r.push(a);const o=r.length-1-t;o>=0&&(n[a]=l[r[o]])}return n}const le=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},te=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},oe=(e,l="source")=>e[l]??"close";function ne(l,t,o,n){return{id:l,name:t,category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"Color",default:o}],plots:[{key:"ma",type:"line",title:t,colorKey:"color",style:{color:o,lineWidth:1.5}}],calc:(l,t)=>({ma:W(n(e(l,oe(t)),le(t,"length",9)))})}}const re=ne("sma","SMA","#4f8cff",N),ae=ne("wma","WMA","#ab47bc",x),ie=ne("ema","EMA","#f5a623",D),se={id:"bollinger",name:"Bollinger Bands",category:"Volatility",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:2,max:1e3,step:1},{key:"stdDev",type:"number",label:"StdDev",default:2,min:.1,max:10,step:.1},{key:"source",type:"source",label:"Source",default:"close"},{key:"basisColor",type:"color",label:"Basis",default:"#f5a623"},{key:"bandColor",type:"color",label:"Bands",default:"#4f8cff"}],plots:[{key:"upper",type:"line",title:"BB Upper",colorKey:"bandColor",style:{lineWidth:1}},{key:"basis",type:"line",title:"BB Basis",colorKey:"basisColor",style:{lineWidth:1.5}},{key:"lower",type:"line",title:"BB Lower",colorKey:"bandColor",style:{lineWidth:1}}],calc:(l,t)=>{const o=e(l,oe(t)),n=le(t,"length",20),r=le(t,"stdDev",2),a=N(o,n),i=L(o,n),s=a.map((e,l)=>e+r*i[l]),c=a.map((e,l)=>e-r*i[l]);return{upper:W(s),basis:W(a),lower:W(c)}}},ce=e=>Math.floor(((e=>Math.floor((e+c)/86400))(e)-4)/7);function pe(e,l){return l===r?(l,t)=>function(e,l,t){if("week"===e)return ce(l)!==ce(t);const o=s(l),n=s(t);return o.year!==n.year||"year"!==e&&("quarter"===e?Math.floor((o.month-1)/3)!==Math.floor((n.month-1)/3):o.month!==n.month)}(e,l,t):(t,o)=>i(t,o,e,l)}function ue(e,l){if(0===l)return e.slice();const t=new Array(e.length).fill(NaN);for(let o=0;o<e.length;o++){const n=o+l;n>=0&&n<e.length&&(t[n]=e[o])}return t}const ye={id:"vwap",name:"VWAP",category:"Volume",placement:"onchart",inputs:[{key:"anchor",type:"select",label:"Anchor Period",default:"session",options:[{label:"Session",value:"session"},{label:"Week",value:"week"},{label:"Month",value:"month"},{label:"Quarter",value:"quarter"},{label:"Year",value:"year"},{label:"Continuous",value:"continuous"}]},{key:"source",type:"source",label:"Source",default:"hlc3"},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"calcMode",type:"select",label:"Bands Calculation Mode",default:"stdev",options:[{label:"Standard Deviation",value:"stdev"},{label:"Percentage",value:"percent"}],group:"Bands"},{key:"showBand1",type:"boolean",label:"Band #1",default:!0,group:"Bands"},{key:"bandMult1",type:"number",label:"Bands Multiplier #1",default:1,min:0,step:.5,group:"Bands"},{key:"showBand2",type:"boolean",label:"Band #2",default:!1,group:"Bands"},{key:"bandMult2",type:"number",label:"Bands Multiplier #2",default:2,min:0,step:.5,group:"Bands"},{key:"showBand3",type:"boolean",label:"Band #3",default:!1,group:"Bands"},{key:"bandMult3",type:"number",label:"Bands Multiplier #3",default:3,min:0,step:.5,group:"Bands"},{key:"color",type:"color",label:"VWAP",default:"#2962ff"},{key:"band1Color",type:"color",label:"Band #1",default:"#4caf50",group:"Bands"},{key:"band2Color",type:"color",label:"Band #2",default:"#808000",group:"Bands"},{key:"band3Color",type:"color",label:"Band #3",default:"#00bcd4",group:"Bands"}],plots:[{key:"vwap",type:"line",title:"VWAP",colorKey:"color",style:{lineWidth:1.5}},{key:"upper1",type:"line",title:"Upper Band #1",colorKey:"band1Color",style:{lineWidth:1}},{key:"lower1",type:"line",title:"Lower Band #1",colorKey:"band1Color",style:{lineWidth:1}},{key:"upper2",type:"line",title:"Upper Band #2",colorKey:"band2Color",style:{lineWidth:1}},{key:"lower2",type:"line",title:"Lower Band #2",colorKey:"band2Color",style:{lineWidth:1}},{key:"upper3",type:"line",title:"Upper Band #3",colorKey:"band3Color",style:{lineWidth:1}},{key:"lower3",type:"line",title:"Lower Band #3",colorKey:"band3Color",style:{lineWidth:1}}],fills:[{between:["upper1","lower1"],colorUpKey:"band1Color",colorDownKey:"band1Color",opacity:.05},{between:["upper2","lower2"],colorUpKey:"band2Color",colorDownKey:"band2Color",opacity:.05},{between:["upper3","lower3"],colorUpKey:"band3Color",colorDownKey:"band3Color",opacity:.05}],calc:(l,t)=>{const i=l.length,s=e(l,oe(t)),c="string"==typeof t.anchor?t.anchor:"session",p="percent"===t.calcMode,u=Math.round(le(t,"offset",0)),y=new Array(i).fill(NaN),f=new Array(i).fill(NaN),d=function(e,l,t){if("continuous"===l)return new Array(e.length).fill(!1);const r=e.map(e=>e.time);return"session"===l?o(r,t):n(r,pe(l,t))}(l,c,(e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===r?r:a(l)?l:r})(t));let m=0,b=0,h=0;for(let e=0;e<i;e++){d[e]&&(m=0,b=0,h=0);const t=l[e].volume??0,o=s[e];if(m+=o*t,h+=o*o*t,b+=t,b<=0)continue;const n=m/b;y[e]=n;const r=Math.max(0,h/b-n*n);f[e]=p?.01*n:Math.sqrt(r)}const g=(e,l,t)=>{const o=new Array(i).fill(NaN);if(!e)return o;for(let e=0;e<i;e++)Number.isFinite(y[e])&&Number.isFinite(f[e])&&(o[e]=y[e]+t*f[e]*l);return o},k=!1!==t.showBand1,w=!0===t.showBand2,C=!0===t.showBand3,v=le(t,"bandMult1",1),M=le(t,"bandMult2",2),A=le(t,"bandMult3",3);return{vwap:W(ue(y,u)),upper1:W(ue(g(k,v,1),u)),lower1:W(ue(g(k,v,-1),u)),upper2:W(ue(g(w,M,1),u)),lower2:W(ue(g(w,M,-1),u)),upper3:W(ue(g(C,A,1),u)),lower3:W(ue(g(C,A,-1),u))}}},fe={id:"supertrend",name:"Supertrend",category:"Trend",placement:"onchart",inputs:[{key:"period",type:"number",label:"ATR Period",default:10,min:1,max:200,step:1},{key:"multiplier",type:"number",label:"Multiplier",default:3,min:.1,max:20,step:.1},{key:"upColor",type:"color",label:"Uptrend",default:"#26a69a"},{key:"downColor",type:"color",label:"Downtrend",default:"#ef5350"}],plots:[{key:"up",type:"line",title:"Supertrend Up",colorKey:"upColor",style:{lineWidth:2}},{key:"down",type:"line",title:"Supertrend Down",colorKey:"downColor",style:{lineWidth:2}}],fills:[{between:["bodyMid","up"],colorUpKey:"upColor",colorDownKey:"upColor",opacity:.1},{between:["bodyMid","down"],colorUpKey:"downColor",colorDownKey:"downColor",opacity:.1}],calc:(e,t)=>{const o=l(e,le(t,"period",10),le(t,"multiplier",3)),n=[],r=[],a=[];for(let l=0;l<o.length;l++){const t=o[l],i=Number.isFinite(t.value);n.push(i&&-1===t.direction?t.value:null),r.push(i&&1===t.direction?t.value:null);const s=e[l];a.push(i&&void 0!==s?(s.open+s.close)/2:null)}return{up:n,down:r,bodyMid:a}}},de={id:"parabolic-sar",name:"Parabolic SAR",category:"Trend",placement:"onchart",inputs:[{key:"start",type:"number",label:"Start",default:.02,min:.001,max:1,step:.001},{key:"increment",type:"number",label:"Increment",default:.02,min:.001,max:1,step:.001},{key:"maximum",type:"number",label:"Maximum",default:.2,min:.01,max:1,step:.01},{key:"color",type:"color",label:"Color",default:"#e0b020"}],plots:[{key:"sar",type:"line",title:"SAR",colorKey:"color",style:{markersOnly:!0,markerRadius:1.5}}],calc:(e,l)=>{const t=e.length,o=new Array(t).fill(NaN);if(t<2)return{sar:W(o)};const n=le(l,"start",.02),r=le(l,"increment",.02),a=le(l,"maximum",.2);let i=e[1].close>=e[0].close,s=i?e[0].low:e[0].high,c=i?e[1].high:e[1].low,p=n;o[1]=s;for(let l=2;l<t;l++){s+=p*(c-s),i&&e[l].low<s?(i=!1,s=Math.max(c,e[l].high),c=e[l].low,p=n):!i&&e[l].high>s?(i=!0,s=Math.min(c,e[l].low),c=e[l].high,p=n):i&&e[l].high>c?(c=e[l].high,p=Math.min(a,p+r)):!i&&e[l].low<c&&(c=e[l].low,p=Math.min(a,p+r));const t=e[l-1].low,u=e[l-1].high,y=e[l-2].low,f=e[l-2].high;s=i?Math.min(s,t,y):Math.max(s,u,f),o[l]=s}return{sar:W(o)}}};function me(e,l){const t=e.length,o=new Array(t).fill(NaN);for(let n=0;n<t;n++){const r=n-l;r>=0&&r<t&&(o[n]=e[r])}return o}const be={id:"ichimoku",name:"Ichimoku Cloud",category:"Trend",placement:"onchart",inputs:[{key:"conversionPeriod",type:"number",label:"Conversion",default:9,min:1,max:200,step:1},{key:"basePeriod",type:"number",label:"Base",default:26,min:1,max:200,step:1},{key:"laggingSpanPeriod",type:"number",label:"Lagging Span",default:52,min:1,max:400,step:1},{key:"displacement",type:"number",label:"Displacement",default:26,min:0,max:200,step:1},{key:"conversionColor",type:"color",label:"Conversion",default:"#4f8cff"},{key:"baseColor",type:"color",label:"Base",default:"#ef5350"},{key:"spanAColor",type:"color",label:"Span A",default:"#26a69a"},{key:"spanBColor",type:"color",label:"Span B",default:"#ab47bc"},{key:"laggingColor",type:"color",label:"Lagging",default:"#8892a6"},{key:"cloudUpColor",type:"color",label:"Cloud up",default:"#26a69a"},{key:"cloudDownColor",type:"color",label:"Cloud down",default:"#ef5350"}],plots:[{key:"conversion",type:"line",title:"Tenkan-sen",colorKey:"conversionColor",style:{lineWidth:1}},{key:"base",type:"line",title:"Kijun-sen",colorKey:"baseColor",style:{lineWidth:1}},{key:"spanA",type:"line",title:"Senkou Span A",colorKey:"spanAColor",style:{lineWidth:1}},{key:"spanB",type:"line",title:"Senkou Span B",colorKey:"spanBColor",style:{lineWidth:1}},{key:"lagging",type:"line",title:"Chikou Span",colorKey:"laggingColor",style:{lineWidth:1}}],fills:[{between:["spanA","spanB"],colorUpKey:"cloudUpColor",colorDownKey:"cloudDownColor",opacity:.14}],calc:(e,l)=>{const t=e.length,o=le(l,"conversionPeriod",9),n=le(l,"basePeriod",26),r=le(l,"laggingSpanPeriod",52),a=le(l,"displacement",26),i=l=>{const o=new Array(t).fill(NaN);for(let n=l-1;n<t;n++){let t=-1/0,r=1/0;for(let o=0;o<l;o++)e[n-o].high>t&&(t=e[n-o].high),e[n-o].low<r&&(r=e[n-o].low);o[n]=(t+r)/2}return o},s=i(o),c=i(n),p=s.map((e,l)=>(e+c[l])/2),u=i(r),y=e.map(e=>e.close);return{conversion:W(s),base:W(c),spanA:W(me(p,a)),spanB:W(me(u,a)),lagging:W(me(y,-a))}}},he={id:"halftrend",name:"HalfTrend",category:"Trend",placement:"onchart",inputs:[{key:"amplitude",type:"number",label:"Amplitude",default:2,min:1,max:100,step:1},{key:"channelDeviation",type:"number",label:"Channel Deviation",default:2,min:0,max:20,step:.1},{key:"atrPeriod",type:"number",label:"ATR Period",default:100,min:1,max:500,step:1},{key:"showChannels",type:"boolean",label:"Show Channels",default:!0},{key:"showSignals",type:"boolean",label:"Show Signals",default:!0},{key:"showLabels",type:"boolean",label:"Show Buy/Sell Labels",default:!0},{key:"upColor",type:"color",label:"Uptrend",default:"#2962ff"},{key:"downColor",type:"color",label:"Downtrend",default:"#ef5350"}],plots:[{key:"up",type:"line",title:"HalfTrend Up",colorKey:"upColor",style:{lineWidth:2}},{key:"down",type:"line",title:"HalfTrend Down",colorKey:"downColor",style:{lineWidth:2}},{key:"atrHigh",type:"line",title:"Channel High",colorKey:"downColor",style:{markersOnly:!0,markerRadius:1}},{key:"atrLow",type:"line",title:"Channel Low",colorKey:"upColor",style:{markersOnly:!0,markerRadius:1}},{key:"buySignal",type:"line",title:"Buy",colorKey:"upColor",style:{markersOnly:!0,markerRadius:3.5}},{key:"sellSignal",type:"line",title:"Sell",colorKey:"downColor",style:{markersOnly:!0,markerRadius:3.5}}],fills:[{between:["up","atrLow"],colorUpKey:"upColor",colorDownKey:"upColor",opacity:.15},{between:["down","atrHigh"],colorUpKey:"downColor",colorDownKey:"downColor",opacity:.15}],markers:({bars:e,values:l,settings:t})=>{if(!1===t.showLabels)return[];const o=l.buySignal??[],n=l.sellSignal??[],r=[];for(let l=0;l<e.length;l++){const a=o[l];if(null!=a){r.push({time:e[l].time,position:"atPrice",price:a,shape:"labelUp",size:"small",color:te(t,"upColor","#2962ff"),text:"Buy"});continue}const i=n[l];null!=i&&r.push({time:e[l].time,position:"atPrice",price:i,shape:"labelDown",size:"small",color:te(t,"downColor","#ef5350"),text:"Sell"})}return r},calc:(e,l)=>{const o=e.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=new Array(o).fill(null),c=new Array(o).fill(null),p={up:n,down:r,atrHigh:a,atrLow:i,buySignal:s,sellSignal:c};if(0===o)return p;const u=Math.max(1,Math.round(le(l,"amplitude",2))),y=le(l,"channelDeviation",2),f=!1!==l.showChannels,d=!1!==l.showSignals,m=e.map(e=>e.high),b=e.map(e=>e.low),h=t(m,b,e.map(e=>e.close),Math.max(1,Math.round(le(l,"atrPeriod",100)))),g=N(m,u),k=N(b,u),w=B(m,u),C=K(b,u);let v=0,M=0,A=b[0],x=m[0],S=0,L=0,W=!1;for(let l=0;l<o;l++){const t=h[l]/2,o=y*t,p=w[l],u=C[l],N=l>0?m[l-1]:m[0],B=l>0?b[l-1]:b[0],K=W?v:-1;let D;1===M?(Number.isFinite(u)&&(A=Math.max(u,A)),Number.isFinite(g[l])&&g[l]<A&&e[l].close<B&&(v=1,M=0,x=p)):(Number.isFinite(p)&&(x=Math.min(p,x)),Number.isFinite(k[l])&&k[l]>x&&e[l].close>N&&(v=0,M=1,A=u)),0===v?(1===K?(S=L,d&&Number.isFinite(t)&&(s[l]=S-t)):S=-1===K?A:Math.max(A,S),D=S):(0===K?(L=S,d&&Number.isFinite(t)&&(c[l]=L+t)):L=-1===K?x:Math.min(x,L),D=L),W=!0,Number.isFinite(D)&&(0===v?n[l]=D:r[l]=D,f&&Number.isFinite(o)&&(a[l]=D+o,i[l]=D-o))}return p}},ge=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},ke=e=>e.source??"close",we=(e,l)=>new Array(e).fill(l);function Ce(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=l(e.slice(n),n);for(let e=0;e<r.length&&n+e<t;e++)o[n+e]=r[e];return o}const ve={id:"rsi",name:"RSI",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"Color",default:"#e0b020"},{key:"overbought",type:"number",label:"Overbought",default:70,min:50,max:100,step:1},{key:"oversold",type:"number",label:"Oversold",default:30,min:0,max:50,step:1},{key:"bandColor",type:"color",label:"Background",default:"#7e57c2"}],plots:[{key:"rsi",type:"line",title:"RSI",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["upperLevel","lowerLevel"],colorUpKey:"bandColor",colorDownKey:"bandColor",opacity:.1}],calc:(l,t)=>({rsi:W(p(e(l,ke(t)),ge(t,"length",14))),upperLevel:we(l.length,ge(t,"overbought",70)),lowerLevel:we(l.length,ge(t,"oversold",30))}),levels:e=>[{price:ge(e,"overbought",70),color:"#ef5350",title:"OB",dashed:!0},{price:50,color:"#5a6b8c",title:"",dashed:!0},{price:ge(e,"oversold",30),color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},Me={id:"macd",name:"MACD",category:"Momentum",placement:"pane",inputs:[{key:"fastPeriod",type:"number",label:"Fast",default:12,min:1,max:500,step:1},{key:"slowPeriod",type:"number",label:"Slow",default:26,min:1,max:500,step:1},{key:"signalPeriod",type:"number",label:"Signal",default:9,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"macdColor",type:"color",label:"MACD",default:"#2962ff"},{key:"histUpColor",type:"color",label:"Histogram up",default:"#26a69a"},{key:"histUpFadeColor",type:"color",label:"Histogram up (weakening)",default:"#a7d8d2"},{key:"histDownColor",type:"color",label:"Histogram down",default:"#ef5350"},{key:"histDownFadeColor",type:"color",label:"Histogram down (weakening)",default:"#f5b0ae"},{key:"signalColor",type:"color",label:"Signal",default:"#ff6d00"}],plots:[{key:"histogram",type:"histogram",title:"Histogram",style:{color:"#3a4666",base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.histogram?.[l-1],r=null==n||!Number.isFinite(n)||e>=n,a=(e,l)=>{const t=o[e];return"string"==typeof t?t:l};return e>=0?r?a("histUpColor","#26a69a"):a("histUpFadeColor","#a7d8d2"):r?a("histDownFadeColor","#f5b0ae"):a("histDownColor","#ef5350")}},{key:"macd",type:"line",title:"MACD",colorKey:"macdColor",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,ke(t)),n=D(o,ge(t,"fastPeriod",12)),r=D(o,ge(t,"slowPeriod",26)),a=n.map((e,l)=>e-r[l]),i=Ce(a,e=>D(e,ge(t,"signalPeriod",9))),s=a.map((e,l)=>e-i[l]);return{macd:W(a),signal:W(i),histogram:W(s)}},levels:()=>[{price:0,color:"#5a6b8c",dashed:!0}]},Ae={id:"stochastic",name:"Stochastic",category:"Momentum",placement:"pane",inputs:[{key:"kPeriod",type:"number",label:"%K Length",default:14,min:1,max:500,step:1},{key:"kSmoothing",type:"number",label:"%K Smoothing",default:1,min:1,max:100,step:1},{key:"dPeriod",type:"number",label:"%D Smoothing",default:3,min:1,max:100,step:1},{key:"kColor",type:"color",label:"%K",default:"#4f8cff"},{key:"dColor",type:"color",label:"%D",default:"#f5a623"},{key:"bandColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"k",type:"line",title:"%K",colorKey:"kColor",style:{lineWidth:1.5}},{key:"d",type:"line",title:"%D",colorKey:"dColor",style:{lineWidth:1.5}}],fills:[{between:["upperLevel","lowerLevel"],colorUpKey:"bandColor",colorDownKey:"bandColor",opacity:.1}],calc:(e,l)=>{const t=B(e.map(e=>e.high),ge(l,"kPeriod",14)),o=K(e.map(e=>e.low),ge(l,"kPeriod",14)),n=e.map((e,l)=>{const n=t[l]-o[l];return n>0?(e.close-o[l])/n*100:NaN}),r=N(n,ge(l,"kSmoothing",1)),a=N(r,ge(l,"dPeriod",3));return{k:W(r),d:W(a),upperLevel:we(e.length,80),lowerLevel:we(e.length,20)}},levels:()=>[{price:80,color:"#ef5350",title:"OB",dashed:!0},{price:20,color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},Ne={id:"adx",name:"ADX / DMI",category:"Trend",placement:"pane",inputs:[{key:"period",type:"number",label:"DI Length",default:14,min:1,max:500,step:1},{key:"adxPeriod",type:"number",label:"ADX Smoothing",default:14,min:1,max:500,step:1},{key:"adxColor",type:"color",label:"ADX",default:"#e0e3ea"},{key:"plusColor",type:"color",label:"+DI",default:"#26a69a"},{key:"minusColor",type:"color",label:"-DI",default:"#ef5350"}],plots:[{key:"plusDi",type:"line",title:"+DI",colorKey:"plusColor",style:{lineWidth:1}},{key:"minusDi",type:"line",title:"-DI",colorKey:"minusColor",style:{lineWidth:1}},{key:"adx",type:"line",title:"ADX",colorKey:"adxColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=ge(l,"period",14),n=e.map(e=>e.high),r=e.map(e=>e.low),a=e.map(e=>e.close),i=u(n,r,a);t>0&&(i[0]=NaN);const s=new Array(t).fill(0),c=new Array(t).fill(0);for(let e=1;e<t;e++){const l=n[e]-n[e-1],t=r[e-1]-r[e];s[e]=l>t&&l>0?l:0,c[e]=t>l&&t>0?t:0}const p=i.findIndex(e=>Number.isFinite(e)),y=new Array(t).fill(NaN);if(p>=0){const e=S(i.slice(p),o);for(let l=0;l<e.length&&p+l<t;l++)y[p+l]=e[l]}const f=S(s,o),d=S(c,o),m=new Array(t).fill(NaN),b=new Array(t).fill(NaN),h=new Array(t).fill(NaN);let g=NaN,k=NaN;for(let e=0;e<t;e++){const l=y[e];if(Number.isFinite(l)&&0!==l&&(g=f[e]/l*100,k=d[e]/l*100),!Number.isFinite(g)||!Number.isFinite(k))continue;m[e]=g,b[e]=k;const t=g+k;h[e]=t>0?Math.abs(g-k)/t*100:0}const w=h.findIndex(e=>Number.isFinite(e)),C=new Array(t).fill(NaN);if(w>=0){const e=S(h.slice(w),ge(l,"adxPeriod",14));for(let l=0;l<e.length;l++)C[w+l]=e[l]}return{plusDi:W(m),minusDi:W(b),adx:W(C)}},levels:()=>[{price:25,color:"#5a6b8c",title:"25",dashed:!0}]},xe={id:"cci",name:"CCI",category:"Momentum",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:20,min:1,max:500,step:1},{key:"constant",type:"number",label:"Constant",default:.015,min:.001,max:1,step:.001},{key:"color",type:"color",label:"Color",default:"#26c6da"},{key:"bandColor",type:"color",label:"Background",default:"#2196f3"},{key:"maType",type:"select",label:"Type",default:"SMA",options:[{label:"None",value:"None"},{label:"SMA",value:"SMA"},{label:"SMA + Bollinger Bands",value:"SMA + Bollinger Bands"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}],group:"Smoothing"},{key:"maLength",type:"number",label:"Length",default:20,min:1,max:500,step:1,group:"Smoothing"},{key:"bbMult",type:"number",label:"BB StdDev",default:2,min:.001,max:50,step:.5,group:"Smoothing"},{key:"maColor",type:"color",label:"CCI-based MA",default:"#ffeb3b",group:"Smoothing"},{key:"bbUpperColor",type:"color",label:"Upper Bollinger Band",default:"#4caf50",group:"Smoothing"},{key:"bbLowerColor",type:"color",label:"Lower Bollinger Band",default:"#4caf50",group:"Smoothing"}],plots:[{key:"cci",type:"line",title:"CCI",colorKey:"color",style:{lineWidth:1.5}},{key:"ma",type:"line",title:"CCI-based MA",colorKey:"maColor",style:{lineWidth:1.5}},{key:"bbUpper",type:"line",title:"Upper Bollinger Band",colorKey:"bbUpperColor",style:{lineWidth:1}},{key:"bbLower",type:"line",title:"Lower Bollinger Band",colorKey:"bbLowerColor",style:{lineWidth:1}}],fills:[{between:["upperLevel","lowerLevel"],colorUpKey:"bandColor",colorDownKey:"bandColor",opacity:.1},{between:["bbUpper","bbLower"],colorUpKey:"bbUpperColor",colorDownKey:"bbUpperColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=ge(l,"period",20),n=ge(l,"constant",.015),r=e.map(e=>(e.high+e.low+e.close)/3),a=N(r,o),i=new Array(t).fill(NaN);for(let e=o-1;e<t;e++){let l=0;for(let t=0;t<o;t++)l+=Math.abs(r[e-t]-a[e]);const t=l/o;i[e]=t>0?(r[e]-a[e])/(n*t):0}const s=((e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t})(l,"maType","SMA"),c=((e,l,t,o=1)=>Math.max(o,Math.round(ge(e,l,t))))(l,"maLength",20),p=ge(l,"bbMult",2),u="None"===s?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return Ce(l,e=>D(e,o));case"SMMA (RMA)":return Ce(l,e=>S(e,o));case"WMA":return Ce(l,e=>x(e,o));case"VWMA":return Ce(l,(e,l)=>O(e,t.slice(l),o));default:return Ce(l,e=>N(e,o))}}(s,i,e.map(e=>e.volume??0),c),y="SMA + Bollinger Bands"===s?Ce(i,e=>L(e,c)).map(e=>e*p):new Array(t).fill(NaN);return{cci:W(i),ma:W(u),bbUpper:W(u.map((e,l)=>e+y[l])),bbLower:W(u.map((e,l)=>e-y[l])),upperLevel:we(t,100),lowerLevel:we(t,-100)}},levels:()=>[{price:100,color:"#ef5350",dashed:!0},{price:0,color:"#5a6b8c",dashed:!0},{price:-100,color:"#26a69a",dashed:!0}]},Se={id:"mfi",name:"Money Flow Index",category:"Momentum",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#ab47bc"},{key:"bandColor",type:"color",label:"Background",default:"#7e57c2"}],plots:[{key:"mfi",type:"line",title:"MFI",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["upperLevel","lowerLevel"],colorUpKey:"bandColor",colorDownKey:"bandColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=ge(l,"period",14),n=e.map(e=>(e.high+e.low+e.close)/3),r=new Array(t).fill(0),a=new Array(t).fill(0);for(let l=1;l<t;l++){const t=n[l]*(e[l].volume??0);n[l]>n[l-1]?r[l]=t:n[l]<n[l-1]&&(a[l]=t)}const i=new Array(t).fill(NaN);for(let e=o;e<t;e++){let l=0,t=0;for(let n=0;n<o;n++)l+=r[e-n],t+=a[e-n];i[e]=0===t?100:100-100/(1+l/t)}return{mfi:W(i),upperLevel:we(t,80),lowerLevel:we(t,20)}},levels:()=>[{price:80,color:"#ef5350",title:"OB",dashed:!0},{price:20,color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},Le={id:"atr",name:"ATR",category:"Volatility",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#f5a623"}],plots:[{key:"atr",type:"line",title:"ATR",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>({atr:W(t(e.map(e=>e.high),e.map(e=>e.low),e.map(e=>e.close),ge(l,"period",14)))})},Be={id:"williams-vix-fix",name:"William VIX FIX",category:"Volatility",placement:"pane",inputs:[{key:"pd",type:"number",label:"LookBack Period Standard Deviation High",default:22,min:1,max:500,step:1},{key:"bbl",type:"number",label:"Bollinger Band Length",default:20,min:1,max:500,step:1},{key:"mult",type:"number",label:"Bollinger Band Standard Deviation Up",default:2,min:1,max:5,step:.1},{key:"lb",type:"number",label:"Look Back Period Percentile High",default:50,min:1,max:500,step:1},{key:"ph",type:"number",label:"Highest Percentile",default:.85,min:0,max:1,step:.01},{key:"pl",type:"number",label:"Lowest Percentile",default:1.01,min:1,max:2,step:.01},{key:"hp",type:"boolean",label:"Show High Range",default:!1},{key:"sd",type:"boolean",label:"Show Standard Deviation Line",default:!1},{key:"highColor",type:"color",label:"Alert",default:"#00ff00"},{key:"normalColor",type:"color",label:"Normal",default:"#808080"},{key:"rangeColor",type:"color",label:"Range",default:"#ffa500"},{key:"bandColor",type:"color",label:"Band",default:"#00ffff"}],plots:[{key:"wvf",type:"histogram",title:"Williams Vix Fix",style:{lineWidth:4,base:0},colorBy:({index:e,values:l,settings:t})=>{const o=l.wvf?.[e],n=l.alertUpper?.[e],r=l.alertHigh?.[e],a=(e,l)=>"string"==typeof t[e]?t[e]:l;if(null==o)return;return null!=n&&o>=n||null!=r&&o>=r?a("highColor","#00ff00"):a("normalColor","#808080")}},{key:"rangeHigh",type:"line",title:"Range High Percentile",colorKey:"rangeColor",style:{lineWidth:4}},{key:"rangeLow",type:"line",title:"Range Low Percentile",colorKey:"rangeColor",style:{lineWidth:4}},{key:"upperBand",type:"line",title:"Upper Band",colorKey:"bandColor",style:{lineWidth:3}}],calc:(e,l)=>{const t=e.length,o=e.map(e=>e.close),n=e.map(e=>e.low),r=ge(l,"pd",22),a=ge(l,"bbl",20),i=ge(l,"mult",2),s=ge(l,"lb",50),c=ge(l,"ph",.85),p=ge(l,"pl",1.01),u=!0===l.hp,y=!0===l.sd,f=B(o,r),d=new Array(t);for(let e=0;e<t;e++){const l=f[e];d[e]=Number.isFinite(l)&&0!==l?(l-n[e])/l*100:NaN}const m=L(d,a),b=N(d,a),h=B(d,s),g=K(d,s),k=new Array(t),w=new Array(t),C=new Array(t),v=new Array(t),M=new Array(t);for(let e=0;e<t;e++){const l=b[e]+i*m[e],t=h[e]*c,o=g[e]*p;k[e]=Number.isFinite(l)?l:null,w[e]=Number.isFinite(t)?t:null,C[e]=y?k[e]:null,v[e]=u?w[e]:null,M[e]=u&&Number.isFinite(o)?o:null}return{wvf:W(d),rangeHigh:v,rangeLow:M,upperBand:C,alertUpper:k,alertHigh:w}}},Ke=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},We=(e,l,t,o=1)=>Math.max(o,Math.round(Ke(e,l,t))),De=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t};const Fe={id:"volume",name:"Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#3a4666"},{key:"colorByDirection",type:"boolean",label:"Match candle direction",default:!1},{key:"upColor",type:"color",label:"Up candle",default:"#26a69a"},{key:"downColor",type:"color",label:"Down candle",default:"#ef5350"},{key:"showMA",type:"boolean",label:"Show moving average",default:!1,group:"Moving average"},{key:"maPeriod",type:"number",label:"Period",default:20,min:1,max:500,step:1,group:"Moving average"},{key:"maColor",type:"color",label:"Color",default:"#e6b53c",group:"Moving average"}],plots:[{key:"volume",type:"histogram",title:"Volume",colorKey:"color",style:{base:0},colorBy:({index:e,values:l,settings:t})=>!0===t.colorByDirection?-1===l.direction[e]?De(t,"downColor","#ef5350"):De(t,"upColor","#26a69a"):void 0},{key:"ma",type:"line",title:"Volume average",colorKey:"maColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.map(e=>e.volume??0);return{volume:W(t),direction:e.map(e=>e.close>=e.open?1:-1),ma:!0===l.showMA?W(N(t,We(l,"maPeriod",20))):t.map(()=>null)}}},Re={id:"obv",name:"On-Balance Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#26c6da"},{key:"maType",type:"select",label:"Type",default:"None",options:[{label:"None",value:"None"},{label:"SMA",value:"SMA"},{label:"SMA + Bollinger Bands",value:"SMA + Bollinger Bands"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}],group:"Smoothing"},{key:"maLength",type:"number",label:"Length",default:9,min:1,max:500,step:1,group:"Smoothing"},{key:"bbMult",type:"number",label:"BB StdDev",default:2,min:.001,max:50,step:.5,group:"Smoothing"},{key:"maColor",type:"color",label:"OBV-based MA",default:"#ffeb3b",group:"Smoothing"},{key:"bbUpperColor",type:"color",label:"Upper Bollinger Band",default:"#4caf50",group:"Smoothing"},{key:"bbLowerColor",type:"color",label:"Lower Bollinger Band",default:"#4caf50",group:"Smoothing"}],plots:[{key:"obv",type:"line",title:"OBV",colorKey:"color",style:{lineWidth:1.5}},{key:"ma",type:"line",title:"OBV-based MA",colorKey:"maColor",style:{lineWidth:1.5}},{key:"bbUpper",type:"line",title:"Upper Bollinger Band",colorKey:"bbUpperColor",style:{lineWidth:1}},{key:"bbLower",type:"line",title:"Lower Bollinger Band",colorKey:"bbLowerColor",style:{lineWidth:1}}],fills:[{between:["bbUpper","bbLower"],colorUpKey:"bbUpperColor",colorDownKey:"bbUpperColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=new Array(t).fill(NaN);let n=0;for(let l=0;l<t;l++){if(l>0){const t=e[l].volume??0;e[l].close>e[l-1].close?n+=t:e[l].close<e[l-1].close&&(n-=t)}o[l]=n}const r=De(l,"maType","None"),a=We(l,"maLength",9),i=Ke(l,"bbMult",2),s="None"===r?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return D(l,o);case"SMMA (RMA)":return S(l,o);case"WMA":return x(l,o);case"VWMA":return O(l,t,o);default:return N(l,o)}}(r,o,e.map(e=>e.volume??0),a),c="SMA + Bollinger Bands"===r?L(o,a).map(e=>e*i):new Array(t).fill(NaN);return{obv:W(o),ma:W(s),bbUpper:W(s.map((e,l)=>e+c[l])),bbLower:W(s.map((e,l)=>e-c[l]))}}},Ue={id:"adl",name:"Accumulation/Distribution",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#4f8cff"}],plots:[{key:"adl",type:"line",title:"A/D Line",colorKey:"color",style:{lineWidth:1.5}}],calc:e=>{const l=new Array(e.length).fill(NaN);let t=0;for(let o=0;o<e.length;o++){const n=e[o],r=n.high-n.low;r>0&&(t+=(n.close-n.low-(n.high-n.close))/r*(n.volume??0)),l[o]=t}return{adl:W(l)}}},Te=e=>void 0!==e&&Number.isFinite(e)?e:null,Pe=(e,l,t)=>"string"==typeof e[l]&&""!==e[l]?e[l]:t,Oe={id:"open-interest",name:"Open Interest",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Open interest",default:"#26c6da"}],plots:[{key:"oi",type:"line",title:"Open interest",colorKey:"color",priceFormat:{type:"volume"},style:{lineWidth:1.5}}],calc:e=>({oi:e.map(e=>Te(e.oi))})},Ie={id:"open-interest-change",name:"Open Interest Change",category:"Volume",placement:"pane",inputs:[{key:"upColor",type:"color",label:"Increase",default:"#26a69a"},{key:"downColor",type:"color",label:"Decrease",default:"#ef5350"}],plots:[{key:"change",type:"histogram",title:"OI change",colorKey:"upColor",style:{base:0},priceFormat:{type:"volume"},colorBy:({value:e,settings:l})=>{const t=e<0?Pe(l,"downColor","#ef5350"):Pe(l,"upColor","#26a69a"),o=l["change:opacity"];return"number"==typeof o&&Number.isFinite(o)&&o<100?y(t,Math.max(0,o)/100):t}}],calc:e=>({change:e.map((l,t)=>{const o=Te(l.oi),n=Te(e[t-1]?.oi);return null===o||null===n?null:o-n})})},Ve=[["longBuildupColor","#26a69a"],["shortBuildupColor","#ef5350"],["shortCoveringColor","#42a5f5"],["longUnwindingColor","#ffb74d"]],He={id:"open-interest-buildup",name:"Open Interest Buildup",category:"Volume",placement:"onchart",inputs:[{key:"longBuildupColor",type:"color",label:"Long buildup",default:"#26a69a"},{key:"shortBuildupColor",type:"color",label:"Short buildup",default:"#ef5350"},{key:"shortCoveringColor",type:"color",label:"Short covering",default:"#42a5f5"},{key:"longUnwindingColor",type:"color",label:"Long unwinding",default:"#ffb74d"},{key:"unchanged",type:"select",label:"Unchanged reading",default:"neutral",options:[{value:"neutral",label:"Neutral"},{value:"up",label:"Treat as up"}]}],plots:[],calc:(e,l)=>({state:e.map((t,o)=>{const n=e[o-1],r=Te(t.oi),a=Te(n?.oi);if(void 0===n||null===r||null===a)return null;const i=t.close-n.close,s=r-a;return Number.isFinite(i)&&("up"===l.unchanged||0!==i&&0!==s)?s>=0?i>=0?1:2:i>=0?3:4:null})}),barColors:({values:e,settings:l})=>e.state.map(e=>{if(null===e)return null;const[t,o]=Ve[e-1];return Pe(l,t,o)})},Ee=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},$e=(e,l,t,o=1)=>Math.max(o,Math.round(Ee(e,l,t))),qe=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},ze=(e,l="source")=>e[l]??"close",Ze=e=>e.map(e=>e.high),Ye=e=>e.map(e=>e.low);function je(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=D(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}function Ge(e,l,t){const o=e.length,n=new Array(o).fill(NaN);if(l<=0)return n;for(let r=l-1;r<o;r++){let o=t?-1/0:1/0,a=!0;for(let n=0;n<l;n++){const l=e[r-n];if(!Number.isFinite(l)){a=!1;break}(t?l>o:l<o)&&(o=l)}a&&(n[r]=o)}return n}function Xe(e,l){const t=e.length,o=new Array(t).fill(NaN);for(let n=0;n<t;n++){const r=n-l;r>=0&&r<t&&(o[n]=e[r])}return o}const Je=.05,_e={id:"alma",name:"Arnaud Legoux Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"offset",type:"number",label:"Offset",default:.85,min:0,max:1,step:.01},{key:"sigma",type:"number",label:"Sigma",default:6,min:.1,max:100,step:.1},{key:"color",type:"color",label:"ALMA",default:"#2962ff"}],plots:[{key:"alma",type:"line",title:"ALMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>({alma:W(P(e(l,"close"),$e(t,"length",9),Ee(t,"offset",.85),Ee(t,"sigma",6)))})},Qe={id:"dema",name:"Double EMA",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"DEMA",default:"#43a047"}],plots:[{key:"dema",type:"line",title:"DEMA",colorKey:"color",style:{color:"#43a047",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,ze(t)),n=$e(t,"length",9),r=D(o,n),a=je(r,n);return{dema:W(r.map((e,l)=>2*e-a[l]))}}};const el={id:"hma",name:"Hull Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:2,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"HMA",default:"#2962ff"}],plots:[{key:"hma",type:"line",title:"HMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,ze(t)),n=$e(t,"length",9,2),r=Math.max(.5,n/2),a=Math.max(1,Math.floor(Math.sqrt(n))),i=function(e,l){const t=e.length,o=new Array(t).fill(NaN),n=Math.ceil(l);if(l<=0||t<n)return o;let r=0;for(let e=0;e<n;e++)r+=l-e;for(let a=n-1;a<t;a++){let t=0;for(let o=0;o<n;o++)t+=e[a-o]*(l-o);o[a]=t/r}return o}(o,r),s=x(o,n);return{hma:W(x(i.map((e,l)=>2*e-s[l]),a))}}},ll={id:"envelope",name:"Envelope",category:"Volatility",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:1e3,step:1},{key:"percent",type:"number",label:"Percent",default:10,min:0,max:100,step:.1},{key:"source",type:"source",label:"Source",default:"close"},{key:"exponential",type:"boolean",label:"Exponential",default:!1},{key:"basisColor",type:"color",label:"Basis",default:"#ff6d00"},{key:"bandColor",type:"color",label:"Bands",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"Env Upper",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}},{key:"basis",type:"line",title:"Env Basis",colorKey:"basisColor",style:{color:"#ff6d00",lineWidth:1.5}},{key:"lower",type:"line",title:"Env Lower",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:Je}],calc:(l,t)=>{const o=e(l,ze(t)),n=$e(t,"length",20),r=Ee(t,"percent",10)/100,a=!0===t.exponential?D(o,n):N(o,n);return{upper:W(a.map(e=>e*(1+r))),basis:W(a),lower:W(a.map(e=>e*(1-r)))}}},tl={id:"donchian",name:"Donchian Channels",category:"Volatility",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:1e3,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"basisColor",type:"color",label:"Basis",default:"#ff6d00"},{key:"bandColor",type:"color",label:"Bands",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"DC Upper",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}},{key:"basis",type:"line",title:"DC Basis",colorKey:"basisColor",style:{color:"#ff6d00",lineWidth:1.5}},{key:"lower",type:"line",title:"DC Lower",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:Je}],calc:(e,l)=>{const t=$e(l,"length",20),o=Math.round(Ee(l,"offset",0)),n=B(Ze(e),t),r=K(Ye(e),t),a=n.map((e,l)=>(e+r[l])/2);return{upper:W(Xe(n,o)),basis:W(Xe(a,o)),lower:W(Xe(r,o))}}},ol={id:"chande-kroll-stop",name:"Chande Kroll Stop",category:"Trend",placement:"onchart",inputs:[{key:"p",type:"number",label:"ATR Length (p)",default:10,min:1,max:500,step:1},{key:"x",type:"number",label:"ATR Coefficient (x)",default:1,min:1,max:100,step:1},{key:"q",type:"number",label:"Stop Length (q)",default:9,min:1,max:500,step:1},{key:"longColor",type:"color",label:"Stop Long",default:"#2962ff"},{key:"shortColor",type:"color",label:"Stop Short",default:"#ff6d00"}],plots:[{key:"stopLong",type:"line",title:"Stop Long",colorKey:"longColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"stopShort",type:"line",title:"Stop Short",colorKey:"shortColor",style:{color:"#ff6d00",lineWidth:1.5}}],calc:(e,l)=>{const o=$e(l,"p",10),n=$e(l,"x",1),r=$e(l,"q",9),a=Ze(e),i=Ye(e),s=t(a,i,e.map(e=>e.close),o),c=B(a,o).map((e,l)=>e-n*s[l]);return{stopLong:W(Ge(K(i,o).map((e,l)=>e+n*s[l]),r,!1)),stopShort:W(Ge(c,r,!0))}}},nl={id:"chandelier-exit",name:"Chandelier Exit",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:22,min:1,max:500,step:1},{key:"atrLength",type:"number",label:"ATR length",default:22,min:1,max:500,step:1},{key:"atrMultiplier",type:"number",label:"ATR multiplier",default:3,min:0,max:50,step:.01},{key:"longColor",type:"color",label:"Long exit",default:"#2962ff"},{key:"shortColor",type:"color",label:"Short exit",default:"#ff6d00"}],plots:[{key:"longExit",type:"line",title:"Long Exit",colorKey:"longColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"shortExit",type:"line",title:"Short Exit",colorKey:"shortColor",style:{color:"#ff6d00",lineWidth:1.5}}],calc:(e,l)=>{const o=$e(l,"length",22),n=Ee(l,"atrMultiplier",3),r=Ze(e),a=Ye(e),i=t(r,a,e.map(e=>e.close),$e(l,"atrLength",22));return{longExit:W(B(r,o).map((e,l)=>e-n*i[l])),shortExit:W(K(a,o).map((e,l)=>e+n*i[l]))}}};const rl={id:"standard-error-bands",name:"Standard Error Bands",category:"Volatility",placement:"onchart",inputs:[{key:"periods",type:"number",label:"Periods",default:21,min:3,max:1e3,step:1},{key:"errors",type:"number",label:"Standard Errors",default:2,min:0,max:100,step:.1},{key:"method",type:"select",label:"Method",default:"Simple",options:[{label:"Simple",value:"Simple"},{label:"Exponential",value:"Exponential"},{label:"Weighted",value:"Weighted"}]},{key:"averagePeriods",type:"number",label:"Averaging Periods",default:3,min:1,max:1e3,step:1},{key:"basisColor",type:"color",label:"Basis",default:"#ff6d00"},{key:"bandColor",type:"color",label:"Bands",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"SEB Upper",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}},{key:"basis",type:"line",title:"SEB Basis",colorKey:"basisColor",style:{color:"#ff6d00",lineWidth:1.5}},{key:"lower",type:"line",title:"SEB Lower",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:Je}],calc:(l,t)=>{const o=e(l,"close"),n=$e(t,"periods",21,3),r=Ee(t,"errors",2),a=$e(t,"averagePeriods",3),i=function(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<3||t<l)return o;const n=(l+1)/2;for(let r=l-1;r<t;r++){let t=0;for(let o=0;o<l;o++)t+=e[r-o];const a=t/l;let i=0,s=0,c=0;for(let t=0;t<l;t++){const l=a-e[r-t],o=n-t-1;i+=l*l,s+=o*l,c+=o*o}o[r]=Math.sqrt((i-s*s/c)/(l-2))}return o}(o,n),s=q(o,n,0),c=e=>W("Exponential"===t.method?je(e,a):"Weighted"===t.method?x(e,a):N(e,a));return{upper:c(s.map((e,l)=>e+r*i[l])),basis:c(s),lower:c(s.map((e,l)=>e-r*i[l]))}}},al={id:"ma-channel",name:"Moving Average Channel",category:"Volatility",placement:"onchart",inputs:[{key:"upperLength",type:"number",label:"Upper Length",default:20,min:1,max:1e3,step:1},{key:"lowerLength",type:"number",label:"Lower Length",default:20,min:1,max:1e3,step:1},{key:"upperOffset",type:"number",label:"Upper Offset",default:0,min:-500,max:500,step:1},{key:"lowerOffset",type:"number",label:"Lower Offset",default:0,min:-500,max:500,step:1},{key:"upperColor",type:"color",label:"Upper",default:"#2962ff"},{key:"lowerColor",type:"color",label:"Lower",default:"#ff6d00"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"MAC Upper",colorKey:"upperColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"lower",type:"line",title:"MAC Lower",colorKey:"lowerColor",style:{color:"#ff6d00",lineWidth:1.5}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:Je}],calc:(e,l)=>({upper:W(Xe(N(Ze(e),$e(l,"upperLength",20)),Math.round(Ee(l,"upperOffset",0)))),lower:W(Xe(N(Ye(e),$e(l,"lowerLength",20)),Math.round(Ee(l,"lowerOffset",0))))})},il="#00ff00",sl="#ff0000",cl="#ff9800",pl=e=>Math.max(1,Math.floor(e)),ul=e=>Math.max(1,Math.round(Math.sqrt(e)));function yl(e,l,t){return"Ehma"===l?function(e,l){const t=D(e,pl(l/2)),o=D(e,l);return je(t.map((e,l)=>2*e-o[l]),ul(l))}(e,t):"Thma"===l?function(e,l){const t=x(e,pl(l/3)),o=x(e,pl(l/2)),n=x(e,l);return x(t.map((e,l)=>3*e-o[l]-n[l]),l)}(e,pl(t/2)):function(e,l){const t=x(e,pl(l/2)),o=x(e,l);return x(t.map((e,l)=>2*e-o[l]),ul(l))}(e,t)}const fl=(e,l,t)=>{if(!1===t.switchColor)return qe(t,"neutralColor",cl);const o=e?.[l],n=e?.[l-2];return"number"==typeof o&&"number"==typeof n&&o>n?qe(t,"bullishColor",il):qe(t,"bearishColor",sl)},dl={id:"hull-suite",name:"Hull Suite",category:"Trend",placement:"onchart",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"mode",type:"select",label:"Variation",default:"Hma",options:[{label:"HMA",value:"Hma"},{label:"THMA",value:"Thma"},{label:"EHMA",value:"Ehma"}]},{key:"length",type:"number",label:"Length",default:55,min:1,max:1e3,step:1},{key:"lengthMult",type:"number",label:"Length Multiplier",default:1,min:.1,max:10,step:.1},{key:"switchColor",type:"boolean",label:"Color Hull By Trend",default:!0},{key:"candleCol",type:"boolean",label:"Color Candles By Trend",default:!1},{key:"visualSwitch",type:"boolean",label:"Show Band",default:!0},{key:"bullishColor",type:"color",label:"Bullish Color",default:il},{key:"bearishColor",type:"color",label:"Bearish Color",default:sl},{key:"neutralColor",type:"color",label:"Neutral Color",default:cl}],plots:[{key:"mhull",type:"line",title:"Hull",colorKey:"neutralColor",style:{color:cl,lineWidth:2},colorBy:({index:e,values:l,settings:t})=>fl(l.mhull,e,t)},{key:"shull",type:"line",title:"Hull Displaced",colorKey:"neutralColor",style:{color:cl,lineWidth:2},colorBy:({index:e,values:l,settings:t})=>fl(l.mhull,e,t)}],fills:[{between:["mhull","shull"],colorUp:il,colorDown:sl,colorUpKey:"bullishColor",colorDownKey:"bearishColor",opacity:.6}],calc:(l,t)=>{const o=e(l,ze(t)),n=pl($e(t,"length",55)*Ee(t,"lengthMult",1)),r=yl(o,qe(t,"mode","Hma"),n),a=!1!==t.visualSwitch;return{mhull:W(r),shull:W(a?Xe(r,2):new Array(r.length).fill(NaN))}},barColors:({bars:e,values:l,settings:t})=>!0===t.candleCol?e.map((e,o)=>fl(l.mhull,o,t)):e.map(()=>null)},ml=[_e,Qe,el,ll,tl,ol,nl,rl,al,dl],bl=(e,l,t)=>Math.max(1,Math.floor(((e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t})(e,l,t))),hl=l=>e(l,"hl2"),gl={id:"aroon",name:"Aroon",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"upColor",type:"color",label:"Aroon Up",default:"#fb8c00"},{key:"downColor",type:"color",label:"Aroon Down",default:"#2962ff"}],plots:[{key:"up",type:"line",title:"Aroon Up",colorKey:"upColor",style:{lineWidth:1.5}},{key:"down",type:"line",title:"Aroon Down",colorKey:"downColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=bl(l,"length",14),o=I(e.map(e=>e.high),t+1),n=V(e.map(e=>e.low),t+1),r=e=>e.map(e=>100*(e+t)/t);return{up:W(r(o)),down:W(r(n))}},levels:()=>[{price:50,color:"#5a6b8c",dashed:!0}],range:()=>({min:0,max:100})},kl={id:"aroon-oscillator",name:"Aroon Oscillator",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"upColor",type:"color",label:"Positive",default:"#4caf50"},{key:"downColor",type:"color",label:"Negative",default:"#ff5252"}],plots:[{key:"osc",type:"line",title:"Oscillator",colorKey:"upColor",style:{lineWidth:1.5}}],fills:[{between:["osc","zero"],colorUpKey:"upColor",colorDownKey:"downColor",opacity:.1}],calc:(e,l)=>{const t=bl(l,"length",14),o=I(e.map(e=>e.high),t+1),n=V(e.map(e=>e.low),t+1),r=o.map((e,l)=>100*(e-n[l])/t);return{osc:W(r),zero:r.map(e=>Number.isFinite(e)?0:null)}},levels:()=>[{price:90,color:"#5a6b8c",title:"Upper level",dashed:!0},{price:0,color:"#787b86"},{price:-90,color:"#5a6b8c",title:"Lower level",dashed:!0}],range:()=>({min:-100,max:100})},wl={id:"awesome-oscillator",name:"Awesome Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"upColor",type:"color",label:"Rising",default:"#009688"},{key:"downColor",type:"color",label:"Falling",default:"#f44336"}],plots:[{key:"ao",type:"column",title:"AO",colorKey:"upColor",style:{base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.ao?.[l-1],r=(e,l)=>"string"==typeof o[e]?o[e]:l;return null==n||!Number.isFinite(n)||e-n>0?r("upColor","#009688"):r("downColor","#f44336")}}],calc:e=>{const l=hl(e),t=N(l,5),o=N(l,34);return{ao:W(t.map((e,l)=>e-o[l]))}},levels:()=>[{price:0,color:"#787b86"}]},Cl={id:"balance-of-power",name:"Balance of Power",category:"Momentum",placement:"pane",inputs:[{key:"color",type:"color",label:"BOP",default:"#ff5252"}],plots:[{key:"bop",type:"line",title:"BOP",colorKey:"color",style:{lineWidth:1.5}}],calc:e=>({bop:e.map(e=>{const l=e.high-e.low;return 0===l?null:(e.close-e.open)/l})}),levels:()=>[{price:0,color:"#787b86"}]},vl={id:"chande-momentum",name:"Chande Momentum Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"Chande MO",default:"#2962ff"}],plots:[{key:"cmo",type:"line",title:"Chande MO",colorKey:"color",style:{lineWidth:1.5}}],calc:(l,t)=>{const o=l.length,n=bl(t,"length",9),r=F(e(l,(e=>e.source??"close")(t))),a=new Array(Math.max(0,o-1)),i=new Array(Math.max(0,o-1));for(let e=1;e<o;e++){const l=r[e];a[e-1]=l>=0?l:0,i[e-1]=l>=0?0:-l}const s=E(a,n),c=E(i,n),p=new Array(o).fill(NaN);for(let e=0;e<s.length;e++){const l=s[e]+c[e];p[e+1]=0===l?NaN:100*(s[e]-c[e])/l}return{cmo:W(p)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]},Ml={id:"coppock-curve",name:"Coppock Curve",category:"Momentum",placement:"pane",inputs:[{key:"wmaLength",type:"number",label:"WMA Length",default:10,min:1,max:500,step:1},{key:"longRoCLength",type:"number",label:"Long RoC Length",default:14,min:1,max:500,step:1},{key:"shortRoCLength",type:"number",label:"Short RoC Length",default:11,min:1,max:500,step:1},{key:"color",type:"color",label:"Coppock Curve",default:"#2962ff"}],plots:[{key:"curve",type:"line",title:"Coppock Curve",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.map(e=>e.close),o=R(t,bl(l,"longRoCLength",14)),n=R(t,bl(l,"shortRoCLength",11));return{curve:W(x(o.map((e,l)=>e+n[l]),bl(l,"wmaLength",10)))}}},Al={id:"dpo",name:"Detrended Price Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:21,min:1,max:500,step:1},{key:"isCentered",type:"boolean",label:"Centered",default:!1},{key:"color",type:"color",label:"DPO",default:"#43a047"}],plots:[{key:"dpo",type:"line",title:"DPO",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=bl(l,"period",21),n=Math.floor(o/2)+1,r=e.map(e=>e.close),a=N(r,o),i=new Array(t).fill(NaN);if(!0===l.isCentered)for(let e=0;e+n<t;e++)i[e]=r[e]-a[e+n];else for(let e=n;e<t;e++)i[e]=r[e]-a[e-n];return{dpo:W(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line"}]},Nl={id:"fisher-transform",name:"Fisher Transform",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:500,step:1},{key:"fisherColor",type:"color",label:"Fisher",default:"#2962ff"},{key:"triggerColor",type:"color",label:"Trigger",default:"#ff6d00"}],plots:[{key:"fisher",type:"line",title:"Fisher",colorKey:"fisherColor",style:{lineWidth:1.5}},{key:"trigger",type:"line",title:"Trigger",colorKey:"triggerColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=bl(l,"length",9),n=hl(e),r=B(n,o),a=K(n,o),i=new Array(t).fill(NaN);let s=0,c=0;for(let e=0;e<t;e++){const l=r[e]-a[e];if(!Number.isFinite(l)){s=0,c=0;continue}const t=.66*((n[e]-a[e])/Math.max(l,.001)-.5)+.67*s,o=t>.99?.999:t<-.99?-.999:t,p=.5*Math.log((1+o)/(1-o))+.5*c;i[e]=p,s=o,c=p}const p=new Array(t).fill(NaN);for(let e=1;e<t;e++)p[e]=i[e-1];return{fisher:W(i),trigger:W(p)}},levels:()=>[{price:1.5,color:"#e91e63",title:"1.5"},{price:.75,color:"#787b86",title:"0.75"},{price:0,color:"#e91e63",title:"0"},{price:-.75,color:"#787b86",title:"-0.75"},{price:-1.5,color:"#e91e63",title:"-1.5"}]};function xl(e){const l=e.length,t=new Array(l).fill(0);for(let o=0;o<l;o++){const l=o>0?t[o-1]:0;o>0&&e[o]===e[o-1]?t[o]=0:o>0&&e[o]>e[o-1]?t[o]=l<=0?1:l+1:t[o]=l>=0?-1:l-1}return t}const Sl={id:"connors-rsi",name:"Connors RSI",category:"Momentum",placement:"pane",inputs:[{key:"lenrsi",type:"number",label:"RSI Length",default:3,min:1,max:500,step:1},{key:"lenupdown",type:"number",label:"UpDown Length",default:2,min:1,max:500,step:1},{key:"lenroc",type:"number",label:"ROC Length",default:100,min:1,max:1e3,step:1},{key:"color",type:"color",label:"CRSI",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"crsi",type:"line",title:"CRSI",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=e.map(e=>e.close),n=p(o,bl(l,"lenrsi",3)),r=p(xl(o),bl(l,"lenupdown",2)),a=T(R(o,1).slice(1),bl(l,"lenroc",100)),i=new Array(t).fill(NaN);for(let e=0;e<a.length;e++)i[e+1]=a[e];const s=new Array(t);for(let e=0;e<t;e++)s[e]=(n[e]+r[e]+i[e])/3;return{crsi:W(s),bandHigh:new Array(t).fill(70),bandLow:new Array(t).fill(30)}},levels:()=>[{price:70,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band",dashed:!0},{price:30,color:"#787b86",title:"Lower Band"}],range:()=>({min:0,max:100})},Ll=[gl,kl,wl,Cl,vl,Ml,Al,Nl,Sl];function Bl(e,l){return`${e}${Math.round(255*(1-l/100)).toString(16).padStart(2,"0")}`}const Kl=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Wl=e=>e.source??"close",Dl=(e,l,t)=>"string"==typeof e[l]?e[l]:t;function Fl(e,l,t){const o=e.length,n=N(e,l),r=L(e,l),a=new Array(o),i=new Array(o);for(let e=0;e<o;e++){const l=t*r[e];a[e]=n[e]+l,i[e]=n[e]-l}return{middle:n,upper:a,lower:i}}function Rl(e,l){const t=e.length;if(0===l)return e.slice();const o=new Array(t).fill(NaN);for(let n=0;n<t;n++){const r=n+l;r>=0&&r<t&&(o[r]=e[n])}return o}const Ul={id:"bollinger-percent-b",name:"Bollinger Bands %b",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:2e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"mult",type:"number",label:"StdDev",default:2,min:.001,max:50,step:.1},{key:"color",type:"color",label:"Bollinger Bands %b",default:"#2962ff"},{key:"fillColor",type:"color",label:"Middle Background",default:"#2962ff"}],plots:[{key:"percentB",type:"line",title:"Bollinger Bands %b",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(l,t)=>{const o=e(l,Wl(t)),{upper:n,lower:r}=Fl(o,Kl(t,"length",20),Kl(t,"mult",2)),a=new Array(o.length);for(let e=0;e<o.length;e++){const l=n[e]-r[e];a[e]=l>0?(o[e]-r[e])/l:NaN}return{percentB:W(a),bandHigh:new Array(l.length).fill(1),bandLow:new Array(l.length).fill(0)}},levels:()=>[{price:1,color:"#f23645",title:"Overbought",dashed:!0},{price:.5,color:"#2962ff",title:"Middle Band"},{price:0,color:"#089981",title:"Oversold",dashed:!0}]},Tl={id:"bollinger-bandwidth",name:"Bollinger BandWidth",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:2e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"mult",type:"number",label:"StdDev",default:2,min:.001,max:50,step:.1},{key:"expansionLength",type:"number",label:"Highest Expansion Length",default:125,min:1,max:5e3,step:1,tooltip:"Bars searched for the widest bandwidth reading, drawn as the upper reference line."},{key:"contractionLength",type:"number",label:"Lowest Contraction Length",default:125,min:1,max:5e3,step:1,tooltip:"Bars searched for the narrowest bandwidth reading, drawn as the lower reference line. A squeeze is price sitting on it."},{key:"color",type:"color",label:"Bollinger BandWidth",default:"#2962ff"},{key:"expansionColor",type:"color",label:"Highest Expansion",default:"#f23645"},{key:"contractionColor",type:"color",label:"Lowest Contraction",default:"#089981"}],plots:[{key:"bandwidth",type:"line",title:"Bollinger BandWidth",colorKey:"color",style:{lineWidth:1.5},priceFormat:{type:"percent"}},{key:"expansion",type:"line",title:"Highest Expansion",colorKey:"expansionColor",style:{lineWidth:1}},{key:"contraction",type:"line",title:"Lowest Contraction",colorKey:"contractionColor",style:{lineWidth:1}}],calc:(l,t)=>{const o=e(l,Wl(t)),{middle:n,upper:r,lower:a}=Fl(o,Kl(t,"length",20),Kl(t,"mult",2)),i=new Array(o.length);for(let e=0;e<o.length;e++)i[e]=0===n[e]?NaN:(r[e]-a[e])/n[e]*100;return{bandwidth:W(i),expansion:W(B(i,Kl(t,"expansionLength",125))),contraction:W(K(i,Kl(t,"contractionLength",125)))}}},Pl={id:"bb-trend",name:"BBTrend",category:"Volatility",placement:"pane",inputs:[{key:"shortLength",type:"number",label:"Short BB Length",default:20,min:1,max:2e3,step:1},{key:"longLength",type:"number",label:"Long BB Length",default:50,min:1,max:2e3,step:1},{key:"stdDevMult",type:"number",label:"StdDev",default:2,min:.001,max:50,step:.1},{key:"posColor",type:"color",label:"Above zero",default:"#089981"},{key:"negColor",type:"color",label:"Below zero",default:"#f23645"}],plots:[{key:"bbtrend",type:"column",title:"BBTrend",colorKey:"posColor",style:{base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.bbtrend?.[l-1],r="number"==typeof n&&Number.isFinite(n);return r&&e>0?Bl(Dl(o,"posColor","#089981"),e>=n?25:50):r&&e<0?Bl(Dl(o,"negColor","#f23645"),e>n?50:25):Bl(Dl(o,"posColor","#089981"),50)}}],calc:(e,l)=>{const t=e.map(e=>e.close),o=Kl(l,"stdDevMult",2),n=Fl(t,Kl(l,"shortLength",20),o),r=Fl(t,Kl(l,"longLength",50),o),a=new Array(t.length);for(let e=0;e<t.length;e++){const l=Math.abs(n.lower[e]-r.lower[e])-Math.abs(n.upper[e]-r.upper[e]);a[e]=0===n.middle[e]?NaN:l/n.middle[e]*100}return{bbtrend:W(a)}},levels:()=>[{price:0,color:"#5a6b8c",title:"Zero line",dashed:!0}]},Ol={id:"choppiness-index",name:"Choppiness Index",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:2e3,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"CHOP",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"chop",type:"line",title:"CHOP",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const t=Kl(l,"length",14),o=e.map(e=>e.high),n=e.map(e=>e.low),r=E(u(o,n,e.map(e=>e.close)),t),a=B(o,t),i=K(n,t),s=Math.log10(t),c=new Array(e.length).fill(NaN);if(0!==s)for(let l=0;l<e.length;l++){const e=a[l]-i[l];if(!(e>0))continue;const t=r[l]/e;t>0&&(c[l]=100*Math.log10(t)/s)}return{chop:W(Rl(c,Kl(l,"offset",0))),bandHigh:new Array(e.length).fill(61.8),bandLow:new Array(e.length).fill(38.2)}},levels:()=>[{price:61.8,color:"#787b86",title:"Upper Band",dashed:!0},{price:50,color:"#787b86",title:"Middle Band"},{price:38.2,color:"#787b86",title:"Lower Band",dashed:!0}],range:()=>({min:0,max:100})},Il={id:"historical-volatility",name:"Historical Volatility",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:2e3,step:1},{key:"per",type:"number",label:"Days per bar unit",default:1,min:1,max:365,step:1,tooltip:"Calendar days each bar covers, used to annualise: 1 for intraday and daily, 7 for weekly and above."},{key:"color",type:"color",label:"HV",default:"#2962ff"}],plots:[{key:"hv",type:"line",title:"HV",colorKey:"color",style:{lineWidth:1.5},priceFormat:{type:"percent"}}],calc:(e,l)=>{const t=e.length,o=Kl(l,"per",1),n=new Array(t).fill(NaN);for(let l=1;l<t;l++){const t=e[l-1].close,o=e[l].close;n[l]=t>0&&o>0?Math.log(o/t):NaN}const r=L(n,Kl(l,"length",10)),a=o>0?Math.sqrt(365/o):NaN;return{hv:W(r.map(e=>100*e*a))}}},Vl={id:"average-daily-range",name:"Average Daily Range",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:2e3,step:1},{key:"color",type:"color",label:"ADR",default:"#2962ff"}],plots:[{key:"adr",type:"line",title:"ADR",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>({adr:W(N(e.map(e=>e.high-e.low),Kl(l,"length",14)))})},Hl=4*Math.atan(1),El={id:"chop-zone",name:"Chop Zone",category:"Volatility",placement:"pane",inputs:[{key:"turquoiseColor",type:"color",label:"Steep up",default:"#26c6da"},{key:"darkGreenColor",type:"color",label:"Up",default:"#43a047"},{key:"paleGreenColor",type:"color",label:"Mild up",default:"#a5d6a7"},{key:"limeColor",type:"color",label:"Slight up",default:"#009688"},{key:"yellowColor",type:"color",label:"Flat",default:"#fdd835"},{key:"lightOrangeColor",type:"color",label:"Slight down",default:"#ffb74d"},{key:"orangeColor",type:"color",label:"Mild down",default:"#ff6d00"},{key:"redColor",type:"color",label:"Down",default:"#e91e63"},{key:"darkRedColor",type:"color",label:"Steep down",default:"#d50000"}],plots:[{key:"chopZone",type:"column",title:"Chop Zone",colorKey:"yellowColor",style:{base:0},colorBy:({index:e,values:l,settings:t})=>{const o=l.angle?.[e],n=(e,l)=>Dl(t,e,l);return null!=o&&Number.isFinite(o)?o>=5?n("turquoiseColor","#26c6da"):o>=3.57?n("darkGreenColor","#43a047"):o>=2.14?n("paleGreenColor","#a5d6a7"):o>=.71?n("limeColor","#009688"):o<=-5?n("darkRedColor","#d50000"):o<=-3.57?n("redColor","#e91e63"):o<=-2.14?n("orangeColor","#ff6d00"):o<=-.71?n("lightOrangeColor","#ffb74d"):n("yellowColor","#fdd835"):n("yellowColor","#fdd835")}}],calc:e=>{const l=e.length,t=B(e.map(e=>e.high),30),o=K(e.map(e=>e.high),30),n=D(e.map(e=>e.close),34),r=new Array(l).fill(NaN);for(let a=1;a<l;a++){const l=t[a]-o[a],i=(e[a].high+e[a].low+e[a].close)/3;if(!(l>0)||0===i)continue;const s=25/l*o[a],c=(n[a-1]-n[a])/i*s;if(!Number.isFinite(c))continue;const p=Math.sqrt(1+c*c),u=Math.round(180*Math.acos(1/p)/Hl);r[a]=c>0?-u:u}return{chopZone:new Array(l).fill(1),angle:W(r)}},range:()=>({min:0,max:1})},$l={id:"chaikin-volatility",name:"Chaikin Volatility",category:"Volatility",placement:"pane",inputs:[{key:"periods",type:"number",label:"Periods",default:10,min:1,max:2e3,step:1},{key:"rocLookback",type:"number",label:"Rate of Change Lookback",default:10,min:1,max:2e3,step:1},{key:"color",type:"color",label:"Chaikin Volatility",default:"#ab47bc"}],plots:[{key:"chaikinVolatility",type:"line",title:"Chaikin Volatility",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>({chaikinVolatility:W(R(D(e.map(e=>e.high-e.low),Kl(l,"periods",10)),Kl(l,"rocLookback",10)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},ql={id:"standard-deviation",name:"Standard Deviation",category:"Volatility",placement:"pane",inputs:[{key:"periods",type:"number",label:"Periods",default:5,min:1,max:2e3,step:1},{key:"deviations",type:"number",label:"Deviations",default:1,min:.001,max:50,step:.1},{key:"color",type:"color",label:"Standard Deviation",default:"#089981"}],plots:[{key:"stdDev",type:"line",title:"Standard Deviation",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Kl(l,"deviations",1);return{stdDev:W(L(e.map(e=>e.close),Kl(l,"periods",5)).map(e=>e*t))}}},zl={id:"standard-error",name:"Standard Error",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:3,max:2e3,step:1},{key:"color",type:"color",label:"Standard Error",default:"#ff6d00"}],plots:[{key:"stdErr",type:"line",title:"Standard Error",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Math.max(3,Math.trunc(Kl(l,"length",14))),o=e.map(e=>e.close),n=(t+1)/2;let r=0;for(let e=0;e<t;e++)r+=(n-e-1)**2;const a=new Array(o.length).fill(NaN);for(let e=t-1;e<o.length;e++){let l=0;for(let n=0;n<t;n++)l+=o[e-n];const i=l/t;let s=0,c=0;for(let l=0;l<t;l++){const t=i-o[e-l];s+=t*t,c+=(n-l-1)*t}a[e]=Math.sqrt((s-c*c/r)/(t-2))}return{stdErr:W(a)}}},Zl=[Ul,Tl,Pl,Ol,Il,Vl,El,$l,ql,zl],Yl=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},jl=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function Gl(e){const l=new Array(e.length);for(let t=0;t<e.length;t++){const o=e[t],n=o.close===o.high&&o.close===o.low||o.high===o.low;l[t]=n?0:(2*o.close-o.low-o.high)/(o.high-o.low)*jl(o)}return l}function Xl(e,l){const t=new Array(e.length).fill(NaN),o=e.findIndex(e=>Number.isFinite(e));if(o<0)return t;const n=D(e.slice(o),l);for(let e=0;e<n.length;e++)t[o+e]=n[e];return t}const Jl={id:"chaikin-money-flow",name:"Chaikin Money Flow",category:"Volume",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#43a047"}],plots:[{key:"cmf",type:"line",title:"CMF",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Yl(l,"length",20),o=E(Gl(e),t),n=E(e.map(jl),t),r=new Array(e.length).fill(NaN);for(let l=0;l<e.length;l++)n[l]>0&&(r[l]=o[l]/n[l]);return{cmf:W(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},_l={id:"chaikin-oscillator",name:"Chaikin Oscillator",category:"Volume",placement:"pane",inputs:[{key:"short",type:"number",label:"Fast Length",default:3,min:1,max:500,step:1},{key:"long",type:"number",label:"Slow Length",default:10,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#ec407a"}],plots:[{key:"osc",type:"line",title:"Chaikin Oscillator",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=$(Gl(e)),o=Xl(t,Yl(l,"short",3)),n=Xl(t,Yl(l,"long",10)),r=new Array(e.length);for(let l=0;l<e.length;l++)r[l]=o[l]-n[l];return{osc:W(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Ql={id:"ease-of-movement",name:"Ease of Movement",category:"Volume",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"divisor",type:"number",label:"Divisor",default:1e4,min:1,max:1e6,step:1},{key:"color",type:"color",label:"Color",default:"#43a047"}],plots:[{key:"eom",type:"line",title:"EOM",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Yl(l,"divisor",1e4),o=F(e.map(e=>(e.high+e.low)/2)),n=new Array(e.length);for(let l=0;l<e.length;l++){const r=e[l],a=jl(r);n[l]=0===a?NaN:t*o[l]*(r.high-r.low)/a}return{eom:W(N(n,Yl(l,"length",14)))}}},et={id:"elder-force-index",name:"Elder Force Index",category:"Volume",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:13,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#f44336"}],plots:[{key:"efi",type:"line",title:"Elder Force Index",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=F(e.map(e=>e.close)),o=new Array(e.length);for(let l=0;l<e.length;l++)o[l]=t[l]*jl(e[l]);return{efi:W(Xl(o,Yl(l,"length",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},lt={id:"net-volume",name:"Net Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#2196f3"}],plots:[{key:"net",type:"histogram",title:"Net Volume",colorKey:"color",style:{base:0}}],calc:e=>{const l=new Array(e.length).fill(0);for(let t=1;t<e.length;t++){const o=e[t].close-e[t-1].close;l[t]=o>0?jl(e[t]):o<0?-jl(e[t]):0}return{net:W(l)}}},tt=[Jl,_l,Ql,et,lt],ot=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},nt=(e,l,t,o=1)=>Math.max(o,Math.round(ot(e,l,t))),rt=(e,l="source")=>e[l]??"close";function at(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=D(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}const it={id:"kama",name:"Kaufman's Adaptive Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"erLength",type:"number",label:"ER Length",default:10,min:1,max:1e3,step:1},{key:"fastLength",type:"number",label:"Fast Length",default:2,min:1,max:1e3,step:1},{key:"slowLength",type:"number",label:"Slow Length",default:30,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"KAMA",default:"#2962ff"}],plots:[{key:"kama",type:"line",title:"KAMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,rt(t)),n=o.length,r=nt(t,"erLength",10),a=new Array(n).fill(NaN);if(n<=r)return{kama:W(a)};const i=F(o,1);for(let e=0;e<n;e++)i[e]=Number.isFinite(i[e])?Math.abs(i[e]):0;const s=E(i,r),c=F(o,r),p=2/(nt(t,"fastLength",2)+1),u=2/(nt(t,"slowLength",30)+1);let y=o[r];a[r]=y;for(let e=r+1;e<n;e++){const l=s[e],t=(Number.isFinite(l)&&0!==l?Math.abs(c[e])/l:0)*(p-u)+u;y+=t*t*(o[e]-y),a[e]=y}return{kama:W(a)}}},st={id:"keltner-channel",name:"Keltner Channels",category:"Volatility",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:1e3,step:1},{key:"mult",type:"number",label:"Multiplier",default:2,min:.1,max:50,step:.1},{key:"source",type:"source",label:"Source",default:"close"},{key:"exp",type:"boolean",label:"Use Exponential MA",default:!0},{key:"bandsStyle",type:"select",label:"Bands Style",default:"Average True Range",options:[{label:"Average True Range",value:"Average True Range"},{label:"True Range",value:"True Range"},{label:"Range",value:"Range"}]},{key:"atrlength",type:"number",label:"ATR Length",default:10,min:1,max:1e3,step:1},{key:"basisColor",type:"color",label:"Basis",default:"#2962ff"},{key:"bandColor",type:"color",label:"Bands",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"Upper",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}},{key:"basis",type:"line",title:"Basis",colorKey:"basisColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"lower",type:"line",title:"Lower",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.05}],calc:(l,o)=>{const n=l.length,r=nt(o,"length",20),a=ot(o,"mult",2),i=e(l,rt(o)),s=((e,l,t)=>{const o=e[l];return"boolean"==typeof o?o:t})(o,"exp",!0)?D(i,r):N(i,r),c=l.map(e=>e.high),p=l.map(e=>e.low),y=l.map(e=>e.close),f=((e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t})(o,"bandsStyle","Average True Range");let d;d="True Range"===f?u(c,p,y):"Range"===f?S(c.map((e,l)=>e-p[l]),r):t(c,p,y,nt(o,"atrlength",10));const m=new Array(n).fill(NaN),b=new Array(n).fill(NaN);for(let e=0;e<n;e++){const l=d[e]*a;m[e]=s[e]+l,b[e]=s[e]-l}return{upper:W(m),basis:W(s),lower:W(b)}}},ct={id:"lsma",name:"Least Squares Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:25,min:2,max:1e3,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"LSMA",default:"#2962ff"}],plots:[{key:"lsma",type:"line",title:"LSMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>({lsma:W(q(e(l,rt(t)),nt(t,"length",25,2),Math.round(ot(t,"offset",0))))})},pt={id:"klinger-oscillator",name:"Klinger Oscillator",category:"Volume",placement:"pane",inputs:[{key:"kvoColor",type:"color",label:"Klinger Oscillator",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#43a047"}],plots:[{key:"kvo",type:"line",title:"Klinger Oscillator",colorKey:"kvoColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{color:"#43a047",lineWidth:1.5}}],calc:l=>{const t=l.length,o=F(e(l,"hlc3"),1),n=new Array(t);for(let e=0;e<t;e++){const t=l[e].volume??0;n[e]=o[e]>=0?t:-t}const r=D(n,34),a=D(n,55),i=new Array(t).fill(NaN);for(let e=0;e<t;e++)i[e]=r[e]-a[e];return{kvo:W(i),signal:W(at(i,13))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},ut={id:"know-sure-thing",name:"Know Sure Thing",category:"Momentum",placement:"pane",inputs:[{key:"roclen1",type:"number",label:"ROC Length #1",default:10,min:1,max:1e3,step:1},{key:"roclen2",type:"number",label:"ROC Length #2",default:15,min:1,max:1e3,step:1},{key:"roclen3",type:"number",label:"ROC Length #3",default:20,min:1,max:1e3,step:1},{key:"roclen4",type:"number",label:"ROC Length #4",default:30,min:1,max:1e3,step:1},{key:"smalen1",type:"number",label:"SMA Length #1",default:10,min:1,max:1e3,step:1},{key:"smalen2",type:"number",label:"SMA Length #2",default:10,min:1,max:1e3,step:1},{key:"smalen3",type:"number",label:"SMA Length #3",default:10,min:1,max:1e3,step:1},{key:"smalen4",type:"number",label:"SMA Length #4",default:15,min:1,max:1e3,step:1},{key:"siglen",type:"number",label:"Signal Line Length",default:9,min:1,max:1e3,step:1},{key:"kstColor",type:"color",label:"KST",default:"#009688"},{key:"signalColor",type:"color",label:"Signal",default:"#f44336"}],plots:[{key:"kst",type:"line",title:"KST",colorKey:"kstColor",style:{color:"#009688",lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{color:"#f44336",lineWidth:1.5}}],calc:(l,t)=>{const o=l.length,n=e(l,"close"),r=(e,l,o,r)=>N(R(n,nt(t,e,l)),nt(t,o,r)),a=r("roclen1",10,"smalen1",10),i=r("roclen2",15,"smalen2",10),s=r("roclen3",20,"smalen3",10),c=r("roclen4",30,"smalen4",15),p=new Array(o).fill(NaN);for(let e=0;e<o;e++)p[e]=a[e]+2*i[e]+3*s[e]+4*c[e];return{kst:W(p),signal:W(N(p,nt(t,"siglen",9)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},yt={id:"linreg-slope",name:"Linear Regression Slope",category:"Trend",placement:"pane",inputs:[{key:"periods",type:"number",label:"Periods",default:14,min:2,max:1e3,step:1},{key:"color",type:"color",label:"Slope",default:"#ff5252"}],plots:[{key:"slope",type:"line",title:"Slope",colorKey:"color",style:{color:"#ff5252",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,"close"),n=o.length,r=nt(t,"periods",14,2),a=new Array(n).fill(NaN),i=r*(r+1)/2,s=r*r*(r*r-1)/12;for(let e=r-1;e<n;e++){let l=0,t=0;for(let n=0;n<r;n++){const a=o[e-n];l+=a,t+=a*(r-n)}a[e]=(r*t-i*l)/s}return{slope:W(a)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},ft=[it,st,ct,pt,ut,yt],dt=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},mt=(e,l,t,o=1)=>Math.max(o,Math.round(dt(e,l,t))),bt=(e,l,t)=>Math.round(dt(e,l,t)),ht=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},gt=(e,l,t)=>{const o=e[l];return"boolean"==typeof o?o:t},kt=(e,l="source")=>e[l]??"close",wt=e=>e.map(e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0);function Ct(e,l){const t=e.length,o=new Array(t).fill(NaN);for(let n=0;n<t;n++){const r=n-l;r>=0&&r<t&&(o[n]=e[r])}return o}function vt(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=D(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}const Mt={id:"ma-cross",name:"MA Cross",category:"Trend",placement:"onchart",inputs:[{key:"shortLength",type:"number",label:"Short MA Length",default:9,min:1,max:1e3,step:1},{key:"longLength",type:"number",label:"Long MA Length",default:26,min:1,max:1e3,step:1},{key:"shortColor",type:"color",label:"Short MA",default:"#ff6d00"},{key:"longColor",type:"color",label:"Long MA",default:"#43a047"},{key:"crossColor",type:"color",label:"Cross",default:"#2962ff"}],plots:[{key:"short",type:"line",title:"Short MA",colorKey:"shortColor",style:{color:"#ff6d00",lineWidth:1.5}},{key:"long",type:"line",title:"Long MA",colorKey:"longColor",style:{color:"#43a047",lineWidth:1.5}},{key:"cross",type:"line",title:"Cross",colorKey:"crossColor",style:{markersOnly:!0,markerRadius:3}}],calc:(l,t)=>{const o=e(l,"close"),n=N(o,mt(t,"shortLength",9)),r=N(o,mt(t,"longLength",21)),a=function(e,l){const t=e.length,o=new Array(t).fill(!1);for(let n=1;n<t;n++){const t=e[n-1],r=l[n-1],a=e[n],i=l[n];Number.isFinite(t)&&Number.isFinite(r)&&Number.isFinite(a)&&Number.isFinite(i)&&(o[n]=a>i&&t<=r||a<i&&t>=r)}return o}(n,r);return{short:W(n),long:W(r),cross:n.map((e,l)=>a[l]?e:null)}}},At={id:"mcginley-dynamic",name:"McGinley Dynamic",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:1e3,step:1},{key:"color",type:"color",label:"McGinley Dynamic",default:"#2962ff"}],plots:[{key:"mg",type:"line",title:"McGinley Dynamic",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,"close"),n=mt(t,"length",14),r=D(o,n),a=new Array(o.length).fill(NaN);let i=NaN;for(let e=0;e<o.length;e++){if(Number.isFinite(i)&&0!==i){const l=n*Math.pow(o[e]/i,4),t=i+(o[e]-i)/l;a[e]=Number.isFinite(t)?t:r[e]}else a[e]=r[e];i=a[e]}return{mg:W(a)}}},Nt={id:"median",name:"Median",category:"Trend",placement:"onchart",inputs:[{key:"source",type:"source",label:"Median Source",default:"hl2"},{key:"length",type:"number",label:"Median Length",default:3,min:1,max:1e3,step:1},{key:"atrLength",type:"number",label:"ATR Length",default:14,min:1,max:1e3,step:1},{key:"atrMult",type:"number",label:"ATR Multiplier",default:2,min:0,max:50,step:.1},{key:"medianColor",type:"color",label:"Median",default:"#ff5252"},{key:"upperColor",type:"color",label:"Upper Band",default:"#00e676"},{key:"lowerColor",type:"color",label:"Lower Band",default:"#e040fb"},{key:"emaColor",type:"color",label:"Median EMA",default:"#2196f3"}],plots:[{key:"median",type:"line",title:"Median",colorKey:"medianColor",style:{color:"#ff5252",lineWidth:3}},{key:"upper",type:"line",title:"Upper Band",colorKey:"upperColor",style:{color:"#00e676",lineWidth:1}},{key:"lower",type:"line",title:"Lower Band",colorKey:"lowerColor",style:{color:"#e040fb",lineWidth:1}},{key:"medianEma",type:"line",title:"Median EMA",colorKey:"emaColor",style:{color:"#2196f3",lineWidth:1}}],fills:[{between:["median","medianEma"],colorUpKey:"upperColor",colorDownKey:"lowerColor",opacity:.9}],calc:(l,o)=>{const n=e(l,kt(o)),r=mt(o,"length",3),a=dt(o,"atrMult",2),i=Y(n,r,50),s=t(l.map(e=>e.high),l.map(e=>e.low),l.map(e=>e.close),mt(o,"atrLength",14));return{median:W(i),upper:W(i.map((e,l)=>e+a*s[l])),lower:W(i.map((e,l)=>e-a*s[l])),medianEma:W(vt(i,r))}}},xt=[{label:"SMA",value:"SMA"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}];function St(e,l,t,o){switch(e){case"EMA":return D(l,o);case"SMMA (RMA)":return S(l,o);case"WMA":return x(l,o);case"VWMA":return O(l,t,o);default:return N(l,o)}}const Lt=[{lane:1,length:20,color:"#f6c309"},{lane:2,length:50,color:"#fb9800"},{lane:3,length:100,color:"#fb6500"},{lane:4,length:200,color:"#f60c0c"}],Bt={id:"ma-ribbon",name:"Moving Average Ribbon",category:"Trend",placement:"onchart",inputs:Lt.flatMap(e=>function(e,l,t){const o=`MA #${e}`;return[{key:`showMa${e}`,type:"boolean",label:o,default:!0,group:o},{key:`ma${e}Type`,type:"select",label:"Type",default:"SMA",options:xt,group:o},{key:`ma${e}Source`,type:"source",label:"Source",default:"close",group:o},{key:`ma${e}Length`,type:"number",label:"Length",default:l,min:1,max:1e3,step:1,group:o},{key:`ma${e}Color`,type:"color",label:"Color",default:t,group:o}]}(e.lane,e.length,e.color)),plots:Lt.map(e=>({key:`ma${e.lane}`,type:"line",title:`MA #${e.lane}`,colorKey:`ma${e.lane}Color`,style:{color:e.color,lineWidth:1.5}})),calc:(l,t)=>{const o=wt(l),n={};for(const{lane:r,length:a}of Lt){if(!gt(t,`showMa${r}`,!0)){n[`ma${r}`]=new Array(l.length).fill(null);continue}const i=e(l,kt(t,`ma${r}Source`));n[`ma${r}`]=W(St(ht(t,`ma${r}Type`,"SMA"),i,o,mt(t,`ma${r}Length`,a)))}return n}},Kt={id:"tema",name:"Triple EMA",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"color",type:"color",label:"TEMA",default:"#2962ff"}],plots:[{key:"tema",type:"line",title:"TEMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,"close"),n=mt(t,"length",9),r=D(o,n),a=vt(r,n),i=vt(a,n);return{tema:W(r.map((e,l)=>3*(e-a[l])+i[l]))}}},Wt={id:"twap",name:"Time Weighted Average Price",category:"Trend",placement:"onchart",inputs:[{key:"anchor",type:"select",label:"Anchor Period",default:"session",options:[{label:"Session",value:"session"},{label:"Continuous",value:"continuous"}]},{key:"source",type:"source",label:"Source",default:"ohlc4"},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"TWAP",default:"#dd7a28"}],plots:[{key:"twap",type:"line",title:"TWAP",colorKey:"color",style:{color:"#dd7a28",lineWidth:1.5}}],calc:(l,t)=>{const n=e(l,kt(t)),i="continuous"!==t.anchor?o(l.map(e=>e.time),(e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===r?r:a(l)?l:r})(t)):null,s=new Array(l.length).fill(NaN);let c=0,p=0;for(let e=0;e<l.length;e++)null!==i&&i[e]&&(c=0,p=0),c+=n[e],p+=1,s[e]=c/p;return{twap:W(Ct(s,bt(t,"offset",0)))}}},Dt={id:"vwma",name:"Volume Weighted Moving Average",category:"Volume",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"VWMA",default:"#2962ff"}],plots:[{key:"vwma",type:"line",title:"VWMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>({vwma:W(Ct(O(e(l,kt(t)),wt(l),mt(t,"length",20)),bt(t,"offset",0)))})},Ft={id:"alligator",name:"Williams Alligator",category:"Trend",placement:"onchart",inputs:[{key:"jawLength",type:"number",label:"Jaw Length",default:21,min:1,max:1e3,step:1},{key:"teethLength",type:"number",label:"Teeth Length",default:13,min:1,max:1e3,step:1},{key:"lipsLength",type:"number",label:"Lips Length",default:8,min:1,max:1e3,step:1},{key:"jawOffset",type:"number",label:"Jaw Offset",default:8,min:-500,max:500,step:1},{key:"teethOffset",type:"number",label:"Teeth Offset",default:5,min:-500,max:500,step:1},{key:"lipsOffset",type:"number",label:"Lips Offset",default:3,min:-500,max:500,step:1},{key:"jawColor",type:"color",label:"Jaw",default:"#2962ff"},{key:"teethColor",type:"color",label:"Teeth",default:"#e91e63"},{key:"lipsColor",type:"color",label:"Lips",default:"#66bb6a"}],plots:[{key:"jaw",type:"line",title:"Jaw",colorKey:"jawColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"teeth",type:"line",title:"Teeth",colorKey:"teethColor",style:{color:"#e91e63",lineWidth:1.5}},{key:"lips",type:"line",title:"Lips",colorKey:"lipsColor",style:{color:"#66bb6a",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,"hl2");return{jaw:W(Ct(S(o,mt(t,"jawLength",13)),bt(t,"jawOffset",8))),teeth:W(Ct(S(o,mt(t,"teethLength",8)),bt(t,"teethOffset",5))),lips:W(Ct(S(o,mt(t,"lipsLength",5)),bt(t,"lipsOffset",3)))}}},Rt={id:"smma",name:"Smoothed Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:7,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"SMMA",default:"#673ab7"}],plots:[{key:"smma",type:"line",title:"SMMA",colorKey:"color",style:{color:"#673ab7",lineWidth:1.5}}],calc:(l,t)=>({smma:W(S(e(l,kt(t)),mt(t,"length",7)))})};function Ut(e,l,t){const o=vt(e,l);if(0===t)return o;const n=vt(o,l);return o.map((e,l)=>e*(1+t)-n[l]*t)}const Tt={id:"t3",name:"T3 Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:5,min:1,max:1e3,step:1},{key:"factor",type:"number",label:"Factor",default:.7,min:0,max:1,step:.1},{key:"highlightMovements",type:"boolean",label:"Highlight Movements",default:!0},{key:"source",type:"source",label:"Source",default:"close"},{key:"upColor",type:"color",label:"Rising",default:"#26a69a"},{key:"downColor",type:"color",label:"Falling",default:"#ff5252"},{key:"neutralColor",type:"color",label:"T3",default:"#6d1e7f"}],plots:[{key:"t3",type:"line",title:"T3",colorKey:"neutralColor",style:{color:"#6d1e7f",lineWidth:2},colorBy:({value:e,index:l,values:t,settings:o})=>{if(!gt(o,"highlightMovements",!0))return ht(o,"neutralColor","#6d1e7f");const n=t.t3?.[l-1];return"number"==typeof n&&Number.isFinite(n)&&e>n?ht(o,"upColor","#26a69a"):ht(o,"downColor","#ff5252")}}],calc:(l,t)=>{const o=e(l,kt(t)),n=mt(t,"length",5),r=dt(t,"factor",.7),a=Ut(o,n,r),i=Ut(a,n,r);return{t3:W(Ut(i,n,r))}}},Pt=[Mt,At,Nt,Bt,Kt,Wt,Dt,Ft,Rt,Tt],Ot=(e,l,t)=>Math.max(1,Math.floor(((e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t})(e,l,t))),It=e=>e.source??"close",Vt=(e,l,t)=>"string"==typeof e[l]?e[l]:t;function Ht(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=D(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}function Et(e,l,t){const o=F(e),n=e=>Ht(Ht(e,t),l),r=n(o),a=n(o.map(e=>Math.abs(e)));return r.map((e,l)=>e/a[l]*100)}const $t={id:"momentum",name:"Momentum",category:"Momentum",placement:"pane",inputs:[{key:"len",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"MOM",default:"#2962ff"}],plots:[{key:"mom",type:"line",title:"MOM",colorKey:"color",style:{lineWidth:1.5}}],calc:(l,t)=>({mom:W(F(e(l,It(t)),Ot(t,"len",10)))})},qt={id:"roc",name:"Rate Of Change",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"ROC",default:"#2962ff"}],plots:[{key:"roc",type:"line",title:"ROC",colorKey:"color",style:{lineWidth:1.5}}],calc:(l,t)=>({roc:W(R(e(l,It(t)),Ot(t,"length",9)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]};function zt(e,l,t){return"SMA"===t?N(e,l):Ht(e,l)}const Zt={id:"ppo",name:"Percentage Price Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"fastLength",type:"number",label:"Fast length",default:12,min:1,max:500,step:1},{key:"slowLength",type:"number",label:"Slow length",default:26,min:1,max:500,step:1},{key:"signalLength",type:"number",label:"Signal length",default:9,min:1,max:500,step:1},{key:"oscType",type:"select",label:"Oscillator MA type",default:"EMA",options:[{label:"EMA",value:"EMA"},{label:"SMA",value:"SMA"}]},{key:"sigType",type:"select",label:"Signal MA type",default:"EMA",options:[{label:"EMA",value:"EMA"},{label:"SMA",value:"SMA"}]},{key:"histUpColor",type:"color",label:"Histogram up",default:"#26a69a"},{key:"histUpFadeColor",type:"color",label:"Histogram up (weakening)",default:"#b2dfdb"},{key:"histDownFadeColor",type:"color",label:"Histogram down (weakening)",default:"#ffcdd2"},{key:"histDownColor",type:"color",label:"Histogram down",default:"#ff5252"},{key:"ppoColor",type:"color",label:"PPO",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal line",default:"#ff6d00"}],plots:[{key:"hist",type:"column",title:"Histogram",colorKey:"histUpColor",style:{base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.hist?.[l-1],r=(e,l)=>"string"==typeof o[e]?o[e]:l,a="number"==typeof n&&Number.isFinite(n)&&e>n;return e>=0?a?r("histUpColor","#26a69a"):r("histUpFadeColor","#b2dfdb"):a?r("histDownFadeColor","#ffcdd2"):r("histDownColor","#ff5252")}},{key:"ppo",type:"line",title:"PPO",colorKey:"ppoColor",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal line",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,It(t)),n=Vt(t,"oscType","EMA"),r=zt(o,Ot(t,"fastLength",12),n),a=zt(o,Ot(t,"slowLength",26),n),i=r.map((e,l)=>0===a[l]?NaN:100*(e-a[l])/a[l]),s=zt(i,Ot(t,"signalLength",9),Vt(t,"sigType","EMA"));return{hist:W(i.map((e,l)=>e-s[l])),ppo:W(i),signal:W(s)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Yt={id:"trix",name:"TRIX",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:18,min:1,max:500,step:1},{key:"color",type:"color",label:"TRIX",default:"#f44336"}],plots:[{key:"trix",type:"line",title:"TRIX",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Ot(l,"length",18);return{trix:W(F(Ht(Ht(Ht(e.map(e=>e.close>0?Math.log(e.close):NaN),t),t),t)).map(e=>1e4*e))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},jt={id:"tsi",name:"True Strength Index",category:"Momentum",placement:"pane",inputs:[{key:"long",type:"number",label:"Long Length",default:25,min:1,max:500,step:1},{key:"short",type:"number",label:"Short Length",default:13,min:1,max:500,step:1},{key:"signal",type:"number",label:"Signal Length",default:13,min:1,max:500,step:1},{key:"color",type:"color",label:"True Strength Index",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#e91e63"}],plots:[{key:"tsi",type:"line",title:"True Strength Index",colorKey:"color",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Et(e.map(e=>e.close),Ot(l,"short",13),Ot(l,"long",25));return{tsi:W(t),signal:W(Ht(t,Ot(l,"signal",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Gt={id:"smi-ergodic-indicator",name:"SMI Ergodic Indicator",category:"Momentum",placement:"pane",inputs:[{key:"longlen",type:"number",label:"Long Length",default:20,min:1,max:500,step:1},{key:"shortlen",type:"number",label:"Short Length",default:5,min:1,max:500,step:1},{key:"siglen",type:"number",label:"Signal Line Length",default:5,min:1,max:500,step:1},{key:"color",type:"color",label:"SMI",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#ff6d00"}],plots:[{key:"erg",type:"line",title:"SMI",colorKey:"color",style:{lineWidth:1.5}},{key:"sig",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Et(e.map(e=>e.close),Ot(l,"shortlen",5),Ot(l,"longlen",20));return{erg:W(t),sig:W(Ht(t,Ot(l,"siglen",5)))}}},Xt={id:"smi-ergodic-oscillator",name:"SMI Ergodic Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"longlen",type:"number",label:"Long Length",default:20,min:1,max:500,step:1},{key:"shortlen",type:"number",label:"Short Length",default:5,min:1,max:500,step:1},{key:"siglen",type:"number",label:"Signal Line Length",default:5,min:1,max:500,step:1},{key:"color",type:"color",label:"SMI Ergodic Oscillator",default:"#ff5252"}],plots:[{key:"osc",type:"histogram",title:"SMI Ergodic Oscillator",colorKey:"color",style:{base:0}}],calc:(e,l)=>{const t=Et(e.map(e=>e.close),Ot(l,"shortlen",5),Ot(l,"longlen",20)),o=Ht(t,Ot(l,"siglen",5));return{osc:W(t.map((e,l)=>e-o[l]))}}},Jt={id:"smi",name:"Stochastic Momentum Index",category:"Momentum",placement:"pane",inputs:[{key:"lengthK",type:"number",label:"%K Length",default:10,min:1,max:15e3,step:1},{key:"lengthD",type:"number",label:"%D Length",default:3,min:1,max:4999,step:1},{key:"lengthEMA",type:"number",label:"EMA Length",default:3,min:1,max:4999,step:1},{key:"color",type:"color",label:"SMI",default:"#2196f3"},{key:"emaColor",type:"color",label:"SMI-based EMA",default:"#ff9800"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"smi",type:"line",title:"SMI",colorKey:"color",style:{lineWidth:1.5}},{key:"ema",type:"line",title:"SMI-based EMA",colorKey:"emaColor",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const t=Ot(l,"lengthK",10),o=Ot(l,"lengthD",3),n=B(e.map(e=>e.high),t),r=K(e.map(e=>e.low),t),a=n.map((e,l)=>e-r[l]),i=e=>Ht(Ht(e,o),o),s=i(e.map((e,l)=>e.close-(n[l]+r[l])/2)),c=i(a),p=s.map((e,l)=>0===c[l]?NaN:e/c[l]*200);return{smi:W(p),ema:W(Ht(p,Ot(l,"lengthEMA",3))),bandHigh:new Array(e.length).fill(40),bandLow:new Array(e.length).fill(-40)}},levels:()=>[{price:40,color:"#787b86",title:"Overbought Line",dashed:!0},{price:0,color:"#787b86",title:"Middle Line",dashed:!0},{price:-40,color:"#787b86",title:"Oversold Line",dashed:!0}]},_t=[$t,qt,Zt,Yt,jt,Gt,Xt,Jt],Qt=(e,l,t)=>Math.max(1,Math.floor(((e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t})(e,l,t))),eo=(e,l,t)=>"string"==typeof e[l]?e[l]:t,lo=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function to(e,l,t){const o=new Array(e.length).fill(NaN);let n=0;for(;n<e.length;){if(!Number.isFinite(e[n])){n+=1;continue}let r=n;for(;r<e.length&&Number.isFinite(e[r]);)r+=1;const a=t(e.slice(n,r),l);for(let e=0;e<a.length;e++)o[n+e]=a[e];n=r}return o}const oo=e=>"SMA"===e?N:D;function no(e,l,t,o){return{id:e,name:l,category:"Volume",placement:"pane",inputs:[{key:"maLength",type:"number",label:"EMA length",default:255,min:1,max:5e3,step:1},{key:"color",type:"color",label:t,default:"#2962ff"},{key:"emaColor",type:"color",label:`${t}-based EMA`,default:"#ff9800"}],plots:[{key:e,type:"line",title:t,colorKey:"color",style:{lineWidth:1.5}},{key:"ema",type:"line",title:`${t}-based EMA`,colorKey:"emaColor",style:{lineWidth:1.5}}],calc:(l,t)=>{const n=function(e,l){const t=new Array(e.length);let o=1;for(let n=0;n<e.length;n++){if(n>0){const t=e[n-1].close;("falling"===l?lo(e[n])<lo(e[n-1]):lo(e[n])>lo(e[n-1]))&&0!==t&&Number.isFinite(t)&&(o*=e[n].close/t)}t[n]=1e3*o}return t}(l,o);return{[e]:W(n),ema:W(to(n,Qt(t,"maLength",255),D))}}}}const ro=no("nvi","Negative Volume Index","NVI","falling"),ao=no("pvi","Positive Volume Index","PVI","rising"),io={id:"pvt",name:"Price Volume Trend",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"PVT",default:"#2962ff"}],plots:[{key:"pvt",type:"line",title:"PVT",colorKey:"color",style:{lineWidth:1.5}}],calc:e=>{const l=new Array(e.length).fill(NaN);for(let t=1;t<e.length;t++){const o=e[t-1].close;0!==o&&Number.isFinite(o)&&(l[t]=(e[t].close-o)/o*lo(e[t]))}return{pvt:W($(l))}}},so={id:"pvo",name:"Percentage Volume Oscillator",category:"Volume",placement:"pane",inputs:[{key:"fastLength",type:"number",label:"Fast length",default:12,min:1,max:500,step:1},{key:"slowLength",type:"number",label:"Slow length",default:26,min:1,max:500,step:1},{key:"signalLength",type:"number",label:"Signal length",default:9,min:1,max:500,step:1},{key:"oscType",type:"select",label:"Oscillator MA type",default:"EMA",options:[{label:"EMA",value:"EMA"},{label:"SMA",value:"SMA"}]},{key:"sigType",type:"select",label:"Signal MA type",default:"EMA",options:[{label:"EMA",value:"EMA"},{label:"SMA",value:"SMA"}]},{key:"histUpColor",type:"color",label:"Histogram up",default:"#26a69a"},{key:"histUpFadeColor",type:"color",label:"Histogram up (weakening)",default:"#b2dfdb"},{key:"histDownFadeColor",type:"color",label:"Histogram down (weakening)",default:"#ffcdd2"},{key:"histDownColor",type:"color",label:"Histogram down",default:"#ff5252"},{key:"color",type:"color",label:"PVO",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal line",default:"#ff6d00"}],plots:[{key:"hist",type:"column",title:"Histogram",colorKey:"histUpColor",style:{base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.hist?.[l-1],r=null!=n&&Number.isFinite(n)&&e>n,a=(e,l)=>"string"==typeof o[e]?o[e]:l;return e>=0?r?a("histUpColor","#26a69a"):a("histUpFadeColor","#b2dfdb"):r?a("histDownFadeColor","#ffcdd2"):a("histDownColor","#ff5252")}},{key:"pvo",type:"line",title:"PVO",colorKey:"color",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal line",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=e.map(lo),n=oo(eo(l,"oscType","EMA")),r=n(o,Qt(l,"fastLength",12)),a=n(o,Qt(l,"slowLength",26)),i=new Array(t).fill(NaN);for(let e=0;e<t;e++)0!==a[e]&&(i[e]=100*(r[e]-a[e])/a[e]);const s=to(i,Qt(l,"signalLength",9),oo(eo(l,"sigType","EMA"))),c=new Array(t);for(let e=0;e<t;e++)c[e]=i[e]-s[e];return{hist:W(c),pvo:W(i),signal:W(s)}},levels:()=>[{price:0,color:"#787b8680",title:"Zero"}]},co={id:"mass-index",name:"Mass Index",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"color",type:"color",label:"Mass Index",default:"#2962ff"}],plots:[{key:"mi",type:"line",title:"Mass Index",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=D(e.map(e=>e.high-e.low),9),n=to(o,9,D),r=new Array(t).fill(NaN);for(let e=0;e<t;e++)0!==n[e]&&(r[e]=o[e]/n[e]);return{mi:W(to(r,Qt(l,"length",10),E))}}},po={id:"ulcer-index",name:"Ulcer Index",category:"Volatility",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"color",type:"color",label:"Ulcer Index",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"ui",type:"line",title:"Ulcer Index",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["ui","zero"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(l,t)=>{const o=l.length,n=Qt(t,"length",14),r=e(l,(e=>e.source??"close")(t)),a=B(r,n),i=new Array(o).fill(NaN);for(let e=0;e<o;e++){const l=a[e];if(!Number.isFinite(l)||0===l)continue;const t=100*(r[e]-l)/l;i[e]=t*t}const s=N(i,n),c=new Array(o);for(let e=0;e<o;e++)c[e]=Math.sqrt(s[e]);return{ui:W(c),zero:c.map(e=>Number.isFinite(e)?0:null)}},levels:()=>[{price:0,color:"#2196f3",title:"Zero"}]},uo=[ro,ao,io,so,co,po],yo=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},fo=(e,l,t,o=1)=>Math.max(o,Math.round(yo(e,l,t))),mo=(e,l,t)=>Math.round(yo(e,l,t)),bo=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},ho=(e,l="source")=>e[l]??"close";function go(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=l(e.slice(n),n);for(let e=0;e<r.length&&n+e<t;e++)o[n+e]=r[e];return o}function ko(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0)return o;const n=N(e,l),r=2/(l+1);let a=NaN;for(let l=0;l<t;l++){if(Number.isFinite(a)){const t=e[l];a=Number.isFinite(t)?t*r+a*(1-r):NaN}else a=n[l];o[l]=a}return o}function wo(e,l){if(0===l)return e.slice();const t=e.length,o=new Array(t).fill(null);for(let n=0;n<t;n++){const r=n+l;r>=0&&r<t&&(o[r]=e[n])}return o}const Co={id:"stochastic-rsi",name:"Stochastic RSI",category:"Momentum",placement:"pane",inputs:[{key:"smoothK",type:"number",label:"K",default:3,min:1,max:100,step:1},{key:"smoothD",type:"number",label:"D",default:3,min:1,max:100,step:1},{key:"lengthRSI",type:"number",label:"RSI Length",default:14,min:1,max:500,step:1},{key:"lengthStoch",type:"number",label:"Stochastic Length",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"RSI Source",default:"close"},{key:"kColor",type:"color",label:"K",default:"#2962ff"},{key:"dColor",type:"color",label:"D",default:"#ff6d00"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"k",type:"line",title:"K",colorKey:"kColor",style:{lineWidth:1.5}},{key:"d",type:"line",title:"D",colorKey:"dColor",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(l,t)=>{const o=fo(t,"lengthStoch",14),n=go(p(e(l,ho(t)),fo(t,"lengthRSI",14)),e=>Z(e,e,e,o)),r=go(n,e=>N(e,fo(t,"smoothK",3))),a=go(r,e=>N(e,fo(t,"smoothD",3)));return{k:W(r),d:W(a),bandHigh:new Array(l.length).fill(80),bandLow:new Array(l.length).fill(20)}},levels:()=>[{price:80,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band"},{price:20,color:"#787b86",title:"Lower Band"}],range:()=>({min:0,max:100})},vo={id:"williams-percent-r",name:"Williams Percent Range",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"%R",default:"#7e57c2"},{key:"fillColor",type:"color",label:"Background",default:"#7e57c2"}],plots:[{key:"percentR",type:"line",title:"%R",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(l,t)=>{const o=fo(t,"length",14),n=e(l,ho(t)),r=B(l.map(e=>e.high),o),a=K(l.map(e=>e.low),o),i=n.map((e,l)=>{const t=r[l]-a[l];return 0===t?NaN:100*(e-r[l])/t});return{percentR:W(i),bandHigh:new Array(l.length).fill(-20),bandLow:new Array(l.length).fill(-80)}},levels:()=>[{price:-20,color:"#787b86",title:"Upper Band"},{price:-50,color:"#787b86",title:"Middle Level",dashed:!0},{price:-80,color:"#787b86",title:"Lower Band"}],range:()=>({min:-100,max:0})},Mo={id:"ultimate-oscillator",name:"Ultimate Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"length1",type:"number",label:"Fast Length",default:7,min:1,max:500,step:1},{key:"length2",type:"number",label:"Middle Length",default:14,min:1,max:500,step:1},{key:"length3",type:"number",label:"Slow Length",default:28,min:1,max:500,step:1},{key:"color",type:"color",label:"Oscillator",default:"#f44336"}],plots:[{key:"uo",type:"line",title:"Oscillator",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=Math.max(0,t-1),n=new Array(o),r=new Array(o);for(let l=1;l<t;l++){const t=e[l-1].close,o=Math.max(e[l].high,t),a=Math.min(e[l].low,t);n[l-1]=e[l].close-a,r[l-1]=o-a}const a=e=>{const l=E(n,e),t=E(r,e);return l.map((e,l)=>0===t[l]?NaN:e/t[l])},i=a(fo(l,"length1",7)),s=a(fo(l,"length2",14)),c=a(fo(l,"length3",28)),p=new Array(t).fill(NaN);for(let e=0;e<o;e++)p[e+1]=100*(4*i[e]+2*s[e]+c[e])/7;return{uo:W(p)}}},Ao={id:"relative-vigor-index",name:"Relative Vigor Index",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"rvgiColor",type:"color",label:"RVGI",default:"#008000"},{key:"signalColor",type:"color",label:"Signal",default:"#ff0000"}],plots:[{key:"rvgi",type:"line",title:"RVGI",colorKey:"rvgiColor",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=fo(l,"length",10),o=z(e.map(e=>e.close-e.open)),n=z(e.map(e=>e.high-e.low)),r=go(o,e=>E(e,t)),a=go(n,e=>E(e,t)),i=r.map((e,l)=>0===a[l]?NaN:e/a[l]),s=go(i,e=>z(e)),c=mo(l,"offset",0);return{rvgi:wo(W(i),c),signal:wo(W(s),c)}}};const No={id:"relative-volatility-index",name:"Relative Volatility Index",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"RVI",default:"#7e57c2"},{key:"fillColor",type:"color",label:"Background",default:"#7e57c2"},{key:"maType",type:"select",label:"Type",default:"SMA",options:[{label:"None",value:"None"},{label:"SMA",value:"SMA"},{label:"SMA + Bollinger Bands",value:"SMA + Bollinger Bands"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}],group:"Smoothing"},{key:"maLength",type:"number",label:"Length",default:14,min:1,max:500,step:1,group:"Smoothing"},{key:"bbMult",type:"number",label:"BB StdDev",default:2,min:.001,max:50,step:.5,group:"Smoothing"},{key:"maColor",type:"color",label:"RVI-based MA",default:"#ffeb3b",group:"Smoothing"},{key:"bbUpperColor",type:"color",label:"Upper Bollinger Band",default:"#4caf50",group:"Smoothing"},{key:"bbLowerColor",type:"color",label:"Lower Bollinger Band",default:"#4caf50",group:"Smoothing"}],plots:[{key:"rvi",type:"line",title:"RVI",colorKey:"color",style:{lineWidth:1.5}},{key:"ma",type:"line",title:"RVI-based MA",colorKey:"maColor",style:{lineWidth:1.5}},{key:"bbUpper",type:"line",title:"Upper Bollinger Band",colorKey:"bbUpperColor",style:{lineWidth:1}},{key:"bbLower",type:"line",title:"Lower Bollinger Band",colorKey:"bbLowerColor",style:{lineWidth:1}}],fills:[{between:["bbUpper","bbLower"],colorUpKey:"bbUpperColor",colorDownKey:"bbUpperColor",opacity:.1},{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=e.map(e=>e.close),n=L(o,fo(l,"length",10)),r=F(o),a=new Array(t),i=new Array(t);for(let e=0;e<t;e++){const l=r[e];a[e]=Number.isFinite(l)&&l<=0?0:n[e],i[e]=Number.isFinite(l)&&l>0?0:n[e]}const s=ko(a,14),c=ko(i,14),p=new Array(t).fill(NaN);for(let e=0;e<t;e++){const l=s[e]+c[e];p[e]=0===l?NaN:s[e]/l*100}const u=bo(l,"maType","SMA"),y=fo(l,"maLength",14),f=yo(l,"bbMult",2),d="SMA + Bollinger Bands"===u,m="None"===u?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return ko(l,o);case"SMMA (RMA)":return go(l,e=>S(e,o));case"WMA":return go(l,e=>x(e,o));case"VWMA":return go(l,(e,l)=>O(e,t.slice(l),o));default:return go(l,e=>N(e,o))}}(u,p,e.map(e=>e.volume??0),y),b=d?go(p,e=>L(e,y)).map(e=>e*f):new Array(t).fill(NaN),h=mo(l,"offset",0);return{rvi:wo(W(p),h),ma:W(m),bbUpper:W(m.map((e,l)=>e+b[l])),bbLower:W(m.map((e,l)=>e-b[l])),bandHigh:new Array(t).fill(80),bandLow:new Array(t).fill(20)}},levels:()=>[{price:80,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band"},{price:20,color:"#787b86",title:"Lower Band"}]},xo={id:"woodies-cci",name:"Woodies CCI",category:"Momentum",placement:"pane",inputs:[{key:"cciTurboLength",type:"number",label:"CCI Turbo Length",default:6,min:3,max:14,step:1},{key:"cci14Length",type:"number",label:"CCI 14 Length",default:14,min:7,max:20,step:1},{key:"upColor",type:"color",label:"Five bars up",default:"#009688"},{key:"downColor",type:"color",label:"Five bars down",default:"#f44336"},{key:"turboColor",type:"color",label:"CCI Turbo",default:"#009688"},{key:"cciColor",type:"color",label:"CCI 14",default:"#f44336"}],plots:[{key:"hist",type:"histogram",title:"CCI Turbo Histogram",colorKey:"upColor",style:{base:0},colorBy:({index:e,values:l,settings:t})=>{const o=bo(t,"upColor","#009688"),n=bo(t,"downColor","#f44336"),r=t=>{const o=l.hist?.[e-t];return"number"==typeof o&&Number.isFinite(o)?o:null};let a=!0,i=!0;for(let e=1;e<=5;e+=1){const l=r(e);(null===l||l<=0)&&(a=!1),(null===l||l>=0)&&(i=!1)}if(a)return o;if(i)return n;const s=r(0);return null!==s&&s<0?o:n}},{key:"turbo",type:"line",title:"CCI Turbo",colorKey:"turboColor",style:{lineWidth:1.5}},{key:"cci14",type:"line",title:"CCI 14",colorKey:"cciColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.map(e=>e.close),o=G(t,fo(l,"cciTurboLength",6)),n=G(t,fo(l,"cci14Length",14));return{hist:W(n),turbo:W(o),cci14:W(n)}},levels:()=>[{price:100,color:"#787b86",title:"Hundred Line",dashed:!0},{price:0,color:"#787b86",title:"Zero Line"},{price:-100,color:"#787b86",title:"Minus Line",dashed:!0}]},So=[{weight:1,roc:10,smooth:10},{weight:2,roc:15,smooth:10},{weight:3,roc:20,smooth:10},{weight:4,roc:30,smooth:15},{weight:1,roc:40,smooth:50},{weight:2,roc:65,smooth:65},{weight:3,roc:75,smooth:75},{weight:4,roc:100,smooth:100},{weight:1,roc:195,smooth:130},{weight:2,roc:265,smooth:130},{weight:3,roc:390,smooth:130},{weight:4,roc:530,smooth:195}],Lo={id:"special-k",name:"Pring's Special K",category:"Momentum",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"length1",type:"number",label:"Signal length 1",default:100,min:1,max:1e3,step:1},{key:"length2",type:"number",label:"Signal length 2",default:100,min:1,max:1e3,step:1},{key:"color",type:"color",label:"Special K",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#ff6d00"}],plots:[{key:"specialK",type:"line",title:"Special K",colorKey:"color",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(l,t)=>{const o=l.length,n=e(l,ho(t)),r=new Array(o).fill(0);for(const e of So){const l=go(R(n,e.roc),l=>N(l,e.smooth));for(let t=0;t<o;t++)r[t]+=e.weight*l[t]}const a=go(r,e=>N(e,fo(t,"length1",100))),i=go(a,e=>N(e,fo(t,"length2",100)));return{specialK:W(r),signal:W(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero"}]},Bo=[Co,vo,Mo,Ao,No,xo,Lo],Ko=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Wo=(e,l,t)=>Math.max(1,Math.floor(Ko(e,l,t))),Do=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},Fo=(e,l="source")=>e[l]??"close",Ro=(e,l)=>!1!==e[l];function Uo(e,l){const t=new Array(e.length).fill(NaN);for(let o=l;o<e.length;o++)t[o]=e[o-l];return t}function To(e,l){const t=new Array(e.length).fill(!1);for(let o=l;o<e.length;o++)t[o]=e[o-l];return t}const Po={id:"vortex",name:"Vortex Indicator",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:2,max:500,step:1},{key:"upColor",type:"color",label:"VI +",default:"#2962ff"},{key:"downColor",type:"color",label:"VI -",default:"#e91e63"}],plots:[{key:"vip",type:"line",title:"VI +",colorKey:"upColor",style:{lineWidth:1.5}},{key:"vim",type:"line",title:"VI -",colorKey:"downColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=Wo(l,"length",14),n=new Array(t).fill(NaN),r=new Array(t).fill(NaN);if(0===t)return{vip:W(n),vim:W(r)};const a=e.map(e=>e.high),i=e.map(e=>e.low),s=e.map(e=>e.close),c=new Array(t-1),p=new Array(t-1);for(let e=1;e<t;e++)c[e-1]=Math.abs(a[e]-i[e-1]),p[e-1]=Math.abs(i[e]-a[e-1]);const y=E(c,o),f=E(p,o),d=E(u(a,i,s),o);for(let e=1;e<t;e++)n[e]=y[e-1]/d[e],r[e]=f[e-1]/d[e];return{vip:W(n),vim:W(r)}}},Oo={id:"volatility-stop",name:"Volatility Stop",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:2,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"factor",type:"number",label:"Multiplier",default:2,min:.25,max:20,step:.25},{key:"upColor",type:"color",label:"Uptrend",default:"#009688"},{key:"downColor",type:"color",label:"Downtrend",default:"#f44336"}],plots:[{key:"up",type:"line",title:"Volatility Stop Up",colorKey:"upColor",style:{markersOnly:!0,markerRadius:1.5}},{key:"down",type:"line",title:"Volatility Stop Down",colorKey:"downColor",style:{markersOnly:!0,markerRadius:1.5}}],calc:(l,o)=>{const n=l.length,r=new Array(n).fill(null),a=new Array(n).fill(null);if(0===n)return{up:r,down:a};const i=e(l,Fo(o)),s=Ko(o,"factor",2),c=l.map(e=>e.high),p=l.map(e=>e.low),y=l.map(e=>e.close),f=t(c,p,y,Wo(o,"length",20)),d=u(c,p,y);let m=i[0],b=i[0],h=!0,g=NaN;for(let e=0;e<n;e++){const l=i[e],t=Number.isFinite(f[e])?f[e]*s:d[e];m=Math.max(m,l),b=Math.min(b,l);let o=h?Math.max(g,m-t):Math.min(g,b+t);Number.isFinite(o)||(o=l);const n=l-o>=0;e>0&&n!==h&&(m=l,b=l,o=n?m-t:b+t),h=n,g=o,Number.isFinite(o)&&(n?r[e]=o:a[e]=o)}return{up:r,down:a}}},Io={id:"trend-strength-index",name:"Trend Strength Index",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:2,max:500,step:1},{key:"color",type:"color",label:"Trend Strength Index",default:"#7e57c2"},{key:"bullishColor",type:"color",label:"Bullish Color",default:"#089981"},{key:"bearishColor",type:"color",label:"Bearish Color",default:"#f23645"}],plots:[{key:"tsi",type:"line",title:"Trend Strength Index",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.map((e,l)=>l);return{tsi:W(j(e.map(e=>e.close),t,Wo(l,"length",14)))}},levels:e=>[{price:1,color:Do(e,"bullishColor","#089981"),title:"TSI Bullish Band"},{price:0,color:"#787b86",title:"TSI Middle Band",dashed:!0},{price:-1,color:Do(e,"bearishColor","#f23645"),title:"TSI Bearish Band"}],range:()=>({min:-1,max:1})};function Vo(e,l,t,o){const n=e[l];if(!Number.isFinite(n))return!1;const r=l=>l>=0&&l<e.length&&Number.isFinite(e[l])&&(o?e[l]<n:e[l]>n),a=l=>l>=0&&l<e.length&&Number.isFinite(e[l])&&(o?e[l]<=n:e[l]>=n);for(let e=1;e<=t;e++)if(!r(l+e))return!1;for(let e=0;e<=4;e++){let o=!0;for(let t=1;t<=e&&o;t++)a(l-t)||(o=!1);for(let n=1;n<=t&&o;n++)r(l-e-n)||(o=!1);if(o)return!0}return!1}const Ho={id:"williams-fractals",name:"Williams Fractals",category:"Trend",placement:"onchart",inputs:[{key:"periods",type:"number",label:"Periods",default:2,min:2,max:100,step:1},{key:"showUp",type:"boolean",label:"Show Up Fractals",default:!0},{key:"showDown",type:"boolean",label:"Show Down Fractals",default:!0},{key:"upColor",type:"color",label:"Up Fractal",default:"#009688"},{key:"downColor",type:"color",label:"Down Fractal",default:"#f44336"}],plots:[{key:"fractals",type:"line",title:"Fractals",colorKey:"upColor"}],calc:(e,l)=>{const t=e.length,o=new Array(t).fill(null),n=new Array(t).fill(null),r=new Array(t).fill(null),a={fractals:o,upFractal:n,downFractal:r};if(0===t)return a;const i=Math.max(2,Wo(l,"periods",2)),s=e.map(e=>e.high),c=e.map(e=>e.low),p=Ro(l,"showUp"),u=Ro(l,"showDown");for(let e=0;e<t;e++)p&&Vo(s,e,i,!0)&&(n[e]=s[e]),u&&Vo(c,e,i,!1)&&(r[e]=c[e]);return a},markers:({bars:e,values:l,settings:t})=>{const o=l.upFractal??[],n=l.downFractal??[],r=Do(t,"upColor","#009688"),a=Do(t,"downColor","#f44336"),i=[];for(let l=0;l<e.length;l++){const t=o[l];null!=t&&i.push({time:e[l].time,position:"atPrice",price:t,shape:"triangleUp",size:"small",color:r});const s=n[l];null!=s&&i.push({time:e[l].time,position:"atPrice",price:s,shape:"triangleDown",size:"small",color:a})}return i}},Eo={id:"rsi-divergence",name:"RSI Divergence Indicator",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"RSI Period",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"RSI Source",default:"close"},{key:"lbR",type:"number",label:"Pivot Lookback Right",default:5,min:1,max:100,step:1},{key:"lbL",type:"number",label:"Pivot Lookback Left",default:5,min:1,max:100,step:1},{key:"rangeUpper",type:"number",label:"Max of Lookback Range",default:60,min:1,max:1e3,step:1},{key:"rangeLower",type:"number",label:"Min of Lookback Range",default:5,min:1,max:1e3,step:1},{key:"plotBull",type:"boolean",label:"Plot Bullish",default:!0},{key:"plotHiddenBull",type:"boolean",label:"Plot Hidden Bullish",default:!1},{key:"plotBear",type:"boolean",label:"Plot Bearish",default:!0},{key:"plotHiddenBear",type:"boolean",label:"Plot Hidden Bearish",default:!1},{key:"color",type:"color",label:"RSI",default:"#2962ff"},{key:"bullColor",type:"color",label:"Bullish",default:"#4caf50"},{key:"bearColor",type:"color",label:"Bearish",default:"#ff5252"}],plots:[{key:"rsi",type:"line",title:"RSI",colorKey:"color",style:{lineWidth:2}}],calc:(l,t)=>{const o=l.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=p(e(l,Fo(t)),Wo(t,"length",14)),c={rsi:W(s),bull:n,hiddenBull:r,bear:a,hiddenBear:i};if(0===o)return c;const u=Wo(t,"lbR",5),y=Wo(t,"lbL",5),f=Ko(t,"rangeLower",5),d=Ko(t,"rangeUpper",60),m=!1!==t.plotBull,b=!0===t.plotHiddenBull,h=!1!==t.plotBear,g=!0===t.plotHiddenBear,k=J(s,y,u).map(e=>Number.isFinite(e)),w=X(s,y,u).map(e=>Number.isFinite(e)),C=Uo(s,u),v=Uo(l.map(e=>e.low),u),M=Uo(l.map(e=>e.high),u),A=Q(To(k,1)),N=Q(To(w,1)),x=ee(k,C,1),S=ee(k,v,1),L=ee(w,C,1),B=ee(w,M,1);for(let e=0;e<o;e++){const l=e-u;if(!(l<0)){if(k[e]){const t=f<=A[e]&&A[e]<=d,o=C[e]>x[e]&&t,a=C[e]<x[e]&&t;m&&o&&v[e]<S[e]&&(n[l]=C[e]),b&&a&&v[e]>S[e]&&(r[l]=C[e])}if(w[e]){const t=f<=N[e]&&N[e]<=d,o=C[e]<L[e]&&t,n=C[e]>L[e]&&t;h&&o&&M[e]>B[e]&&(a[l]=C[e]),g&&n&&M[e]<B[e]&&(i[l]=C[e])}}}return c},markers:({bars:e,values:l,settings:t})=>{const o=Do(t,"bullColor","#4caf50"),n=Do(t,"bearColor","#ff5252"),r=[{col:l.bull,shape:"labelUp",text:"Bull",color:o},{col:l.hiddenBull,shape:"labelUp",text:"H Bull",color:o},{col:l.bear,shape:"labelDown",text:"Bear",color:n},{col:l.hiddenBear,shape:"labelDown",text:"H Bear",color:n}],a=[];for(let l=0;l<e.length;l++)for(const t of r){const o=t.col?.[l];null!=o&&a.push({time:e[l].time,position:"atPrice",price:o,shape:t.shape,size:"small",color:t.color,text:t.text})}return a},levels:()=>[{price:70,color:"#787b86",title:"Overbought",dashed:!0},{price:50,color:"#787b86",title:"Middle Line",dashed:!0},{price:30,color:"#787b86",title:"Oversold",dashed:!0}],range:()=>({min:0,max:100})},$o={id:"consolidation-breakout",name:"Consolidation and Breakout",category:"Trend",placement:"onchart",inputs:[{key:"markbreakout",type:"boolean",label:"Mark Breakouts",default:!0},{key:"colorinside",type:"boolean",label:"Tint Inside Bars",default:!0},{key:"bullBreakColor",type:"color",label:"Break Up",default:"#00c853"},{key:"bearBreakColor",type:"color",label:"Break Down",default:"#ff5252"},{key:"insideColor",type:"color",label:"Inside Bar",default:"#000000"},{key:"highlowColor",type:"color",label:"Range",default:"#e91e63"}],plots:[{key:"rangeHigh",type:"line",title:"Range High",colorKey:"highlowColor",style:{lineWidth:2}},{key:"rangeLow",type:"line",title:"Range Low",colorKey:"highlowColor",style:{lineWidth:2}}],calc:e=>{const l=e.length,t=new Array(l).fill(NaN),o=new Array(l).fill(NaN),n=new Array(l).fill(NaN),r=new Array(l).fill(NaN),a=new Array(l).fill(NaN);let i=0;for(let s=0;s<l;s++){const l=e[s],c=Math.max(l.open,l.close),p=Math.min(l.open,l.close),u=e[i].high,y=e[i].low,f=s-i,d=f>1&&f<=250;d&&c>u&&(n[s]=u),d&&p<y&&(r[s]=y);const m=i;i=s>1&&p>=y&&p<=u&&c>=y&&c<=u?i:s,i===m&&(t[s]=e[i].high,o[s]=e[i].low);const b=s-i;b>0&&(a[s]=b)}return{rangeHigh:W(t),rangeLow:W(o),breakUp:W(n),breakDown:W(r),insideAge:W(a)}},markers:({bars:e,values:l,settings:t})=>{const o=[];if(!Ro(t,"markbreakout"))return o;const n=l.breakUp??[],r=l.breakDown??[],a=Do(t,"bullBreakColor","#00c853"),i=Do(t,"bearBreakColor","#ff5252");for(let l=0;l<e.length;l++)null!==n[l]&&void 0!==n[l]&&o.push({time:e[l].time,position:"belowBar",shape:"triangleUp",size:"small",color:a}),null!==r[l]&&void 0!==r[l]&&o.push({time:e[l].time,position:"aboveBar",shape:"triangleDown",size:"small",color:i});return o},barColors:({bars:e,values:l,settings:t})=>{const o=l.insideAge??[],n=Do(t,"insideColor","#000000"),r=Ro(t,"colorinside");return e.map((e,l)=>r&&null!==o[l]&&void 0!==o[l]?n:null)}},qo=[Po,Oo,Io,Ho,Eo,$o],zo=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Zo=(e,l,t)=>"string"==typeof e[l]?e[l]:t,Yo=(e,l,t)=>"boolean"==typeof e[l]?e[l]:t,jo=e=>new Array(e).fill(NaN),Go=86400,Xo=e=>Math.floor(((e=>Math.floor((e+c)/Go))(e)-4)/7);function Jo(e,l,t){const a=e.map(e=>e.time);return"daily"===l?o(a,t):n(a,function(e,l){return l!==r?"weekly"===e?(e,t)=>f(e,t,l):(e,t)=>d(e,t,l):"weekly"===e?(e,l)=>Xo(e)!==Xo(l):(e,l)=>{const t=s(e),o=s(l);return t.year!==o.year||t.month!==o.month}}(l,t))}function _o(e){const l=function(e){if(e.length<2)return 0;const l=[];for(let t=1;t<e.length;t++){const o=e[t].time-e[t-1].time;o>0&&l.push(o)}return 0===l.length?0:(l.sort((e,l)=>e-l),l[Math.floor(l.length/2)])}(e);return l<=0||l<Go?"daily":l<604800?"weekly":"monthly"}const Qo={daily:"d",weekly:"w",monthly:"m"},en={daily:"Daily",weekly:"Weekly",monthly:"Monthly"},ln=(e,l,t,o)=>({key:e,type:"line",title:l,colorKey:t,style:{markersOnly:!0,markerRadius:o}});function tn(e){const l=Qo[e],t=en[e],o=`${l}SupportColor`,n=`${l}ResistanceColor`,r=`${l}CprColor`;return[{key:`${l}Pivot`,type:"line",title:`${t} Pivot`,colorKey:`${l}PivotColor`,style:{lineWidth:2}},ln(`${l}S1`,`${t} S1`,o,1),ln(`${l}S2`,`${t} S2`,o,1),ln(`${l}S3`,`${t} S3`,o,1),ln(`${l}R1`,`${t} R1`,n,1),ln(`${l}R2`,`${t} R2`,n,1),ln(`${l}R3`,`${t} R3`,n,1),ln(`${l}Bc`,`${t} Bottom Pivot`,r,2),ln(`${l}Tc`,`${t} Top Pivot`,r,2)]}function on(e){const l=Qo[e],t=en[e];return[{key:`${l}PivotColor`,type:"color",label:"Pivot",default:"#ffeb3b",group:t},{key:`${l}SupportColor`,type:"color",label:"Support",default:"#4caf50",group:t},{key:`${l}ResistanceColor`,type:"color",label:"Resistance",default:"#ff5252",group:t},{key:`${l}CprColor`,type:"color",label:"CPR",default:"#ff9800",group:t},{key:`${l}FillColor`,type:"color",label:"CPR Fill",default:"#f47676",group:t}]}function nn(e,l,t,o,n){const r=e.length,a=jo(r),i=jo(r),s=jo(r),c=jo(r),p=jo(r),u=jo(r),y=jo(r),f=jo(r),d=jo(r);if(t){const t=Jo(e,l,n);let m=NaN,b=NaN,h=NaN,g=NaN,k=NaN,w=NaN;for(let l=0;l<r;l++){t[l]&&(m=g,b=k,h=w,g=NaN,k=NaN);const n=e[l];if(g=Number.isFinite(g)?Math.max(g,n.high):n.high,k=Number.isFinite(k)?Math.min(k,n.low):n.low,w=n.close,!Number.isFinite(m)||!Number.isFinite(b)||!Number.isFinite(h))continue;const r=(m+b+h)/3,C=m-b,v=2*r-m,M=2*r-b,A=(m+b)/2;o.pivot&&(a[l]=r),o.support&&(o.s1r1&&(i[l]=v),s[l]=r-C,c[l]=v-C),o.resistance&&(o.s1r1&&(p[l]=M),u[l]=r+C,y[l]=M+C),o.cpr&&(f[l]=A,d[l]=2*r-A)}}const m=Qo[l];return{[`${m}Pivot`]:W(a),[`${m}S1`]:W(i),[`${m}S2`]:W(s),[`${m}S3`]:W(c),[`${m}R1`]:W(p),[`${m}R2`]:W(u),[`${m}R3`]:W(y),[`${m}Bc`]:W(f),[`${m}Tc`]:W(d)}}const rn={id:"cpr",name:"CPR with Floor Pivot",category:"Trend",placement:"onchart",inputs:[{key:"pivotMode",type:"select",label:"Select Pivot Mode",default:"auto",options:[{label:"Auto",value:"auto"},{label:"Manual",value:"manual"}]},{key:"showDaily",type:"boolean",label:"Show Daily CPR (Manual)",default:!0},{key:"showWeekly",type:"boolean",label:"Show Weekly CPR (Manual)",default:!1},{key:"showMonthly",type:"boolean",label:"Show Monthly CPR (Manual)",default:!1},{key:"displaypivots",type:"boolean",label:"Plot Pivot",default:!0},{key:"displaysupport",type:"boolean",label:"Plot Support",default:!0},{key:"displayresistance",type:"boolean",label:"Plot Resistance",default:!0},{key:"displaycpr",type:"boolean",label:"Plot CPR",default:!0},{key:"displayS1R1",type:"boolean",label:"Plot S1 / R1",default:!1},...on("daily"),...on("weekly"),...on("monthly")],plots:[...tn("daily"),...tn("weekly"),...tn("monthly")],fills:["daily","weekly","monthly"].map(e=>{const l=Qo[e];return{between:[`${l}Tc`,`${l}Bc`],colorUpKey:`${l}FillColor`,colorDownKey:`${l}FillColor`,opacity:.48}}),calc:(e,l)=>{const t="manual"===l.pivotMode,o=_o(e),n={pivot:Yo(l,"displaypivots",!0),support:Yo(l,"displaysupport",!0),resistance:Yo(l,"displayresistance",!0),cpr:Yo(l,"displaycpr",!0),s1r1:Yo(l,"displayS1R1",!1)},i=t?{daily:Yo(l,"showDaily",!0),weekly:Yo(l,"showWeekly",!1),monthly:Yo(l,"showMonthly",!1)}:{daily:"daily"===o,weekly:"weekly"===o,monthly:"monthly"===o},s=(e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===r?r:a(l)?l:r})(l);return{...nn(e,"daily",i.daily,n,s),...nn(e,"weekly",i.weekly,n,s),...nn(e,"monthly",i.monthly,n,s)}}};const an={id:"alphatrend",name:"AlphaTrend",category:"Trend",placement:"onchart",inputs:[{key:"coeff",type:"number",label:"Multiplier",default:1,min:0,max:20,step:.1},{key:"AP",type:"number",label:"Common Period",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"showsignalsk",type:"boolean",label:"Show Signals",default:!0},{key:"novolumedata",type:"boolean",label:"Change calculation (no volume data)",default:!1},{key:"color",type:"color",label:"AlphaTrend",default:"#0022fc"},{key:"lagColor",type:"color",label:"AlphaTrend Lag",default:"#fc0400"},{key:"risingFillColor",type:"color",label:"Rising Fill",default:"#00e60f"},{key:"fallingFillColor",type:"color",label:"Falling Fill",default:"#80000b"},{key:"buyColor",type:"color",label:"Buy",default:"#0022fc"},{key:"sellColor",type:"color",label:"Sell",default:"#880e4f"}],plots:[{key:"alphatrend",type:"line",title:"AlphaTrend",colorKey:"color",style:{lineWidth:3}},{key:"lagged",type:"line",title:"AlphaTrend Lag",colorKey:"lagColor",style:{lineWidth:3}}],fills:[{between:["alphatrend","lagged"],colorUpKey:"risingFillColor",colorDownKey:"fallingFillColor",opacity:1}],markers:({bars:e,values:l,settings:t})=>{if(!1===t.showsignalsk)return[];const o=l.buySignal??[],n=l.sellSignal??[],r=[];for(let l=0;l<e.length;l++){const a=o[l];if(null!=a){r.push({time:e[l].time,position:"atPrice",price:a,shape:"labelUp",size:"tiny",color:Zo(t,"buyColor","#0022fc"),text:"BUY"});continue}const i=n[l];null!=i&&r.push({time:e[l].time,position:"atPrice",price:i,shape:"labelDown",size:"tiny",color:Zo(t,"sellColor","#880e4f"),text:"SELL"})}return r},calc:(l,t)=>{const o=l.length,n=jo(o),r=jo(o),a=jo(o),i=jo(o);if(0===o)return{alphatrend:[],lagged:[],buySignal:[],sellSignal:[]};const s=Math.max(1,Math.round(zo(t,"AP",14))),c=zo(t,"coeff",1),y=!0===t.novolumedata,f=!1!==t.showsignalsk,d=l.map(e=>e.high),m=l.map(e=>e.low),b=l.map(e=>e.close),h=N(u(d,m,b),s),g=y?p(e(l,((e,l="source")=>e[l]??"close")(t)),s):function(e,l,t){const o=e.length,n=jo(o);if(t<=0||0===o)return n;const r=new Array(o).fill(0),a=new Array(o).fill(0);for(let t=1;t<o;t++){const o=e[t]*l[t];e[t]>e[t-1]?r[t]=o:e[t]<e[t-1]&&(a[t]=o)}const i=E(r,t),s=E(a,t);for(let e=t;e<o;e++)n[e]=0===s[e]?100:100-100/(1+i[e]/s[e]);return n}(l.map(e=>(e.high+e.low+e.close)/3),l.map(e=>e.volume??0),s);for(let e=0;e<o;e++){const t=e>0&&Number.isFinite(n[e-1])?n[e-1]:0;if(!Number.isFinite(h[e])||!Number.isFinite(g[e]))continue;const o=h[e]*c;n[e]=g[e]>=50?Math.max(l[e].low-o,t):Math.min(l[e].high+o,t)}for(let e=2;e<o;e++)r[e]=n[e-2];const k=new Array(o).fill(!1),w=new Array(o).fill(!1);for(let e=1;e<o;e++){const l=n[e],t=r[e],o=n[e-1],a=r[e-1];Number.isFinite(l)&&Number.isFinite(t)&&Number.isFinite(o)&&Number.isFinite(a)&&(l>t&&o<=a?k[e]=!0:l<t&&o>=a&&(w[e]=!0))}if(f){const e=k.map((e,l)=>l>0&&k[l-1]),l=w.map((e,l)=>l>0&&w[l-1]),t=Q(k),n=Q(w),s=Q(e),c=Q(l);for(let e=0;e<o;e++)k[e]&&s[e]>n[e]?a[e]=.9999*r[e]:w[e]&&c[e]>t[e]&&(i[e]=1.0001*r[e])}return{alphatrend:W(n),lagged:W(r),buySignal:W(a),sellSignal:W(i)}}},sn={id:"range-analysis",name:"Range Analysis",category:"Volatility",placement:"pane",inputs:[{key:"showAverage",type:"boolean",label:"Show Average Range",default:!1},{key:"avgLength",type:"number",label:"Average Length",default:3,min:1,max:500,step:1},{key:"color",type:"color",label:"Range",default:"#ff5252"},{key:"avgColor",type:"color",label:"Average Range",default:"#2196f3"}],plots:[{key:"range",type:"histogram",title:"Range",colorKey:"color",style:{lineWidth:3,base:0}},{key:"avgRange",type:"line",title:"Average Range",colorKey:"avgColor",style:{lineWidth:2}}],calc:(e,l)=>{const t=e.map(e=>e.high-e.low);return!0!==l.showAverage?{range:W(t),avgRange:new Array(e.length).fill(null)}:{range:W(t),avgRange:W(N(t,Math.max(1,Math.round(zo(l,"avgLength",3)))))}}},cn=[rn,an,sn],pn=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},un=(e,l,t)=>Math.max(1,Math.floor(pn(e,l,t))),yn=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},fn=(e,l)=>new Array(e).fill(l),dn=e=>/^#[0-9a-f]{6}$/i.test(e)?`${e}99`:e;function mn(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=l(e.slice(n));for(let e=0;e<r.length&&n+e<t;e++)o[n+e]=r[e];return o}function bn(e,l){const t=new Array(e.length).fill(NaN);for(let o=l;o<e.length;o++)t[o]=e[o-l];return t}function hn(e,l){const t=new Array(e.length).fill(!1);for(let o=l;o<e.length;o++)t[o]=e[o-l];return t}const gn={id:"wavetrend",name:"WaveTrend Pro",category:"Momentum",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"hlc3",group:"WaveTrend"},{key:"n1",type:"number",label:"Channel Length",default:10,min:1,max:500,step:1,group:"WaveTrend"},{key:"n2",type:"number",label:"Average Length",default:21,min:1,max:500,step:1,group:"WaveTrend"},{key:"sigLen",type:"number",label:"Signal Smoothing",default:4,min:1,max:100,step:1,group:"WaveTrend"},{key:"wt1Color",type:"color",label:"WT1",default:"#2962ff",group:"WaveTrend"},{key:"wt2Color",type:"color",label:"WT2",default:"#ff6d00",group:"WaveTrend"},{key:"fillUpColor",type:"color",label:"WT Fill Up",default:"#4caf50",group:"WaveTrend"},{key:"fillDownColor",type:"color",label:"WT Fill Down",default:"#ff5252",group:"WaveTrend"},{key:"obLevel1",type:"number",label:"Overbought 1",default:60,min:-200,max:200,step:1,group:"Levels"},{key:"obLevel2",type:"number",label:"Overbought 2",default:53,min:-200,max:200,step:1,group:"Levels"},{key:"osLevel1",type:"number",label:"Oversold 1",default:-60,min:-200,max:200,step:1,group:"Levels"},{key:"osLevel2",type:"number",label:"Oversold 2",default:-53,min:-200,max:200,step:1,group:"Levels"},{key:"obBandColor",type:"color",label:"OB Band",default:"#ff5252",group:"Levels"},{key:"osBandColor",type:"color",label:"OS Band",default:"#4caf50",group:"Levels"},{key:"filterZone",type:"boolean",label:"Only show crosses inside OB/OS zones",default:!0,group:"Signals"},{key:"useInner",type:"boolean",label:"Use inner levels (53) as the zone gate",default:!0,group:"Signals"},{key:"showMom",type:"boolean",label:"Show momentum histogram (wt1 - wt2)",default:!0,group:"Signals"},{key:"momUpColor",type:"color",label:"Momentum Up",default:"#008080",group:"Signals"},{key:"momDownColor",type:"color",label:"Momentum Down",default:"#880e4f",group:"Signals"},{key:"buyColor",type:"color",label:"Bullish Cross",default:"#00e676",group:"Signals"},{key:"sellColor",type:"color",label:"Bearish Cross",default:"#ff5252",group:"Signals"},{key:"showRegDiv",type:"boolean",label:"Regular divergence",default:!0,group:"Divergence"},{key:"showHidDiv",type:"boolean",label:"Hidden divergence",default:!1,group:"Divergence"},{key:"lbL",type:"number",label:"Pivot Lookback Left",default:3,min:1,max:100,step:1,group:"Divergence"},{key:"lbR",type:"number",label:"Pivot Lookback Right",default:3,min:1,max:100,step:1,group:"Divergence"},{key:"rangeUpper",type:"number",label:"Max Bars Between Pivots",default:60,min:1,max:1e3,step:1,group:"Divergence"},{key:"rangeLower",type:"number",label:"Min Bars Between Pivots",default:5,min:1,max:1e3,step:1,group:"Divergence"},{key:"bullColor",type:"color",label:"Bullish Divergence",default:"#4caf50",group:"Divergence"},{key:"bearColor",type:"color",label:"Bearish Divergence",default:"#ff5252",group:"Divergence"}],plots:[{key:"mom",type:"histogram",title:"Momentum",colorKey:"momUpColor",style:{base:0},colorBy:({value:e,settings:l})=>{const t=(e,t)=>{const o=l[e];return"string"==typeof o&&""!==o?o:t};return e>=0?t("momUpColor","#008080"):t("momDownColor","#880e4f")}},{key:"wt1",type:"line",title:"WT1",colorKey:"wt1Color",style:{lineWidth:2}},{key:"wt2",type:"line",title:"WT2",colorKey:"wt2Color",style:{lineWidth:1}}],fills:[{between:["wt1","wt2"],colorUp:"#4caf50",colorDown:"#ff5252",colorUpKey:"fillUpColor",colorDownKey:"fillDownColor",opacity:.15},{between:["obUpper","obLower"],colorUp:"#ff5252",colorDown:"#ff5252",colorUpKey:"obBandColor",colorDownKey:"obBandColor",opacity:.08},{between:["osUpper","osLower"],colorUp:"#4caf50",colorDown:"#4caf50",colorUpKey:"osBandColor",colorDownKey:"osBandColor",opacity:.08}],calc:(l,t)=>{const o=l.length,n=un(t,"n1",10),r=un(t,"n2",21),a=un(t,"sigLen",4),i=pn(t,"obLevel1",60),s=pn(t,"obLevel2",53),c=pn(t,"osLevel1",-60),p=pn(t,"osLevel2",-53),u=new Array(o).fill(null),y=new Array(o).fill(null),f=new Array(o).fill(null),d=new Array(o).fill(null),m=new Array(o).fill(null),b=new Array(o).fill(null),h=e(l,(e=>e.source??"hlc3")(t)),g=mn(h,e=>D(e,n)),k=mn(h.map((e,l)=>Math.abs(e-g[l])),e=>D(e,n)),w=mn(h.map((e,l)=>{const t=k[l];return Number.isFinite(t)?0===t?0:(e-g[l])/(.015*t):NaN}),e=>D(e,r)),C=mn(w,e=>N(e,a)),v=w.map((e,l)=>e-C[l]),M={wt1:W(w),wt2:W(C),mom:!1===t.showMom?new Array(o).fill(null):W(v),obUpper:fn(o,i),obLower:fn(o,s),osUpper:fn(o,p),osLower:fn(o,c),buy:u,sell:y,bull:f,bear:d,hiddenBull:m,hiddenBear:b},A=!1!==t.filterZone,x=!1!==t.useInner,S=x?s:i,L=x?p:c;for(let e=1;e<o;e++){const l=w[e-1],t=C[e-1],o=w[e],n=C[e];Number.isFinite(l)&&Number.isFinite(t)&&(Number.isFinite(o)&&Number.isFinite(n)&&(o>n&&l<=t&&(!A||n<=L)&&(u[e]=n),o<n&&l>=t&&(!A||n>=S)&&(y[e]=n)))}const B=un(t,"lbL",3),K=un(t,"lbR",3),F=pn(t,"rangeLower",5),R=pn(t,"rangeUpper",60),U=!1!==t.showRegDiv,T=!0===t.showHidDiv,P=J(C,B,K).map(e=>Number.isFinite(e)),O=X(C,B,K).map(e=>Number.isFinite(e)),I=bn(C,K),V=bn(l.map(e=>e.low),K),H=bn(l.map(e=>e.high),K),E=Q(hn(P,1)),$=Q(hn(O,1)),q=ee(P,I,1),z=ee(P,V,1),Z=ee(O,I,1),Y=ee(O,H,1);for(let e=0;e<o;e++){const l=e-K;if(!(l<0)){if(P[e]){const t=F<=E[e]&&E[e]<=R;U&&t&&I[e]>q[e]&&V[e]<z[e]&&(f[l]=I[e]),T&&t&&I[e]<q[e]&&V[e]>z[e]&&(m[l]=I[e])}if(O[e]){const t=F<=$[e]&&$[e]<=R;U&&t&&I[e]<Z[e]&&H[e]>Y[e]&&(d[l]=I[e]),T&&t&&I[e]>Z[e]&&H[e]<Y[e]&&(b[l]=I[e])}}}return M},markers:({bars:e,values:l,settings:t})=>{const o=yn(t,"bullColor","#4caf50"),n=yn(t,"bearColor","#ff5252"),r=[{col:l.buy,shape:"circle",size:"tiny",color:yn(t,"buyColor","#00e676"),text:void 0},{col:l.sell,shape:"circle",size:"tiny",color:yn(t,"sellColor","#ff5252"),text:void 0},{col:l.bull,shape:"labelUp",size:"small",color:o,text:"R"},{col:l.bear,shape:"labelDown",size:"small",color:n,text:"R"},{col:l.hiddenBull,shape:"labelUp",size:"small",color:dn(o),text:"H"},{col:l.hiddenBear,shape:"labelDown",size:"small",color:dn(n),text:"H"}],a=[];for(let l=0;l<e.length;l++)for(const t of r){const o=t.col?.[l];if(null==o)continue;const n={time:e[l].time,position:"atPrice",price:o,shape:t.shape,size:t.size,color:t.color};void 0!==t.text&&(n.text=t.text),a.push(n)}return a},levels:e=>[{price:pn(e,"obLevel1",60),color:yn(e,"obBandColor","#ff5252"),title:"Overbought 1",dashed:!0},{price:pn(e,"obLevel2",53),color:yn(e,"obBandColor","#ff5252"),title:"Overbought 2",dashed:!0},{price:0,color:"#787b86",title:"Zero",dashed:!0},{price:pn(e,"osLevel2",-53),color:yn(e,"osBandColor","#4caf50"),title:"Oversold 2",dashed:!0},{price:pn(e,"osLevel1",-60),color:yn(e,"osBandColor","#4caf50"),title:"Oversold 1",dashed:!0}]},kn=[gn],wn=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Cn=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},vn=(e,l)=>!1!==e[l],Mn="#089981",An="#F23745",Nn="#787b86",xn=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Sn(e,l){let t=e;if(/^#[0-9a-f]{3}$/i.test(t))t=`#${t[1]}${t[1]}${t[2]}${t[2]}${t[3]}${t[3]}`;else if(/^#[0-9a-f]{8}$/i.test(t))t=t.slice(0,7);else if(!/^#[0-9a-f]{6}$/i.test(t))return e;return`${t}${Math.round(255*Math.min(1,Math.max(0,l))).toString(16).padStart(2,"0")}`}const Ln=Sn(Nn,.2),Bn=Sn(Nn,.5);function Kn(e,l,t,o){if(null===e||!Number.isFinite(e))return;return Sn(e>=0?t:o,.1+.4*(l>0?Math.min(1,Math.abs(e)/l):1))}const Wn=e=>`${e.toFixed(2)}%`;const Dn=(e,l)=>100*e+l;function Fn(e,l){const t=function(e,l){const t=[];let o=null,n=0,r=0;for(const a of e)if(null===o||a.time<n||a.time>=r){const e=m(a.time,l);o={year:e.year,month:e.month,last:a.close},t.push(o),n=b(e.year,e.month,1,0,0,0,l),r=b(e.year,e.month+1,1,0,0,0,l)}else o.last=a.close;return t}(e,(e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===r?r:a(l)?l:r})(l)),o=Math.round(wn(l,"startYear",2015)),n=function(e){const l=new Set;for(const t of e.split(",")){const e=t.replace(/[\s-]/g,"");if(!/^\d{6}$/.test(e))continue;const o=Number(e),n=o%100;n>=1&&n<=12&&l.add(o)}return l}(Cn(l,"ignoredMonths","")),i=t.length>0?t[t.length-1]:null;null!==i&&n.add(Dn(i.year,i.month));const s=[],c=new Map;for(let e=1;e<t.length;e++){const l=t[e],r=t[e-1];if(l.year<o||n.has(Dn(l.year,l.month)))continue;if(!Number.isFinite(r.last)||!Number.isFinite(l.last)||0===r.last)continue;let a=c.get(l.year);void 0===a&&(a=new Array(12).fill(null),c.set(l.year,a),s.push(l.year)),a[l.month-1]=100*(l.last-r.last)/Math.abs(r.last)}return{years:s,byYear:c,skipped:n}}function Rn(e,l){const t=[];for(const o of e.years){const n=e.byYear.get(o)?.[l];null!=n&&t.push(n)}return t}const Un=e=>{if(0===e.length)return null;let l=0;for(const t of e)l+=t;return l/e.length};function Tn(e){if(e.length<2)return null;const l=Un(e);if(null===l)return null;let t=0;for(const o of e)t+=(o-l)*(o-l);return Math.sqrt(t/(e.length-1))}const Pn=e=>{if(0===e.length)return null;let l=0;for(const t of e)t>=0&&(l+=1);return 100*l/e.length},On={Left:"bottom-left",Center:"bottom-center",Right:"bottom-right"},In=[52,...new Array(12).fill(46)],Vn=e=>({text:e,bgColor:Ln}),Hn={id:"seasonality",name:"Seasonality",category:"Trend",placement:"pane",inputs:[{key:"startYear",type:"number",label:"Starting year",default:2015,min:1800,max:2999,step:1},{key:"posColor",type:"color",label:"Positive Color",default:Mn,group:"Color settings"},{key:"negColor",type:"color",label:"Negative Color",default:An,group:"Color settings"},{key:"cutoffPercent",type:"number",label:"Color intensity cutoff (%)",default:10,min:0,max:100,step:1,group:"Color settings"},{key:"tablePosition",type:"select",label:"Table Position",default:"Center",options:[{label:"Left",value:"Left"},{label:"Center",value:"Center"},{label:"Right",value:"Right"}],group:"Heatmap settings"},{key:"tableWidth",type:"number",label:"Table Width (%)",default:100,min:0,max:100,step:1,group:"Heatmap settings"},{key:"tableHeight",type:"number",label:"Table Height (%)",default:95,min:0,max:100,step:1,group:"Heatmap settings"},{key:"showAvg",type:"boolean",label:"Show Averages",default:!0,group:"Heatmap settings"},{key:"showStDev",type:"boolean",label:"Show Standard Deviation",default:!0,group:"Heatmap settings"},{key:"showPos",type:"boolean",label:"Show Percent Positive",default:!0,group:"Heatmap settings"},{key:"ignoredMonths",type:"text",label:"Ignored months",default:"YYYY-MM, YYYY-MM",group:"Additional settings"}],plots:[{key:"seasonality",type:"line",title:"Seasonality"}],calc:e=>({seasonality:new Array(e.length).fill(null)}),table:({bars:e,settings:l})=>{const t=Fn(e,l);if(0===t.years.length)return null;const o=wn(l,"cutoffPercent",10),n=Cn(l,"posColor",Mn),r=Cn(l,"negColor",An),a=[[Vn("Year"),...xn.map(Vn)]],i=[1];for(const e of t.years){const l=t.byYear.get(e)??[],s=[Vn(String(e))];for(let a=0;a<12;a++){if(t.skipped.has(Dn(e,a+1))){s.push({text:"SKIP",bgColor:Bn});continue}const i=l[a]??null;s.push(null===i?{text:""}:{text:Wn(i),bgColor:Kn(i,o,n,r)})}a.push(s),i.push(1)}const s=vn(l,"showAvg"),c=vn(l,"showStDev"),p=vn(l,"showPos");if(s||c||p){if(a.push(Array.from({length:13},()=>({text:"",bgColor:Ln}))),i.push(.3),s){const e=[Vn("Avgs:")];for(let l=0;l<12;l++){const a=Un(Rn(t,l));e.push(null===a?{text:""}:{text:Wn(a),bgColor:Kn(a,o,n,r)})}a.push(e),i.push(1)}if(c){const e=[Vn("StDev:")];for(let l=0;l<12;l++){const o=Tn(Rn(t,l));e.push({text:null===o?"":o.toFixed(2),bgColor:Ln})}a.push(e),i.push(1)}if(p){const e=[Vn("Pos%:")];for(let l=0;l<12;l++){const o=Pn(Rn(t,l));e.push(null===o?{text:""}:{text:`${Math.round(o)}%`,bgColor:Kn(o-50,50,n,r)})}a.push(e),i.push(1)}}return{rows:a,options:{position:On[Cn(l,"tablePosition","Center")]??"bottom-center",cellWidth:In,cellHeight:18,rowWeights:i,widthPercent:wn(l,"tableWidth",100),heightPercent:wn(l,"tableHeight",95),fontSize:10,margin:8}}}},En=[Hn],$n="__tier2",qn=e=>e[$n];function zn(e,l){return(e.refetchOn??[]).map(e=>`${e}=${String(l[e])}`).join("&")}function Zn(e,l){const t=e[e.length-1];if(void 0===t||l.time>t.time)return void e.push(l);if(l.time===t.time)return void(e[e.length-1]=l);let o=0,n=e.length;for(;o<n;){const t=o+n>>1;e[t].time<l.time?o=t+1:n=t}e[o]?.time===l.time?e[o]=l:e.splice(o,0,l)}function Yn(e){return{id:e.id,name:e.name,category:e.category,placement:e.placement,inputs:e.inputs,plots:e.plots,levels:e.levels,range:e.range,calc:(l,t,o,n)=>{const r=qn(o),a=function(e,l,t){const o={};for(const l of t)o[l]=new Array(e.length).fill(null);if(0===l.length)return o;let n=-1;for(let r=0;r<e.length;r++){for(;n+1<l.length&&l[n+1].time<=e[r].time;)n+=1;if(n<0)continue;const a=l[n].values;for(const e of t){const l=a[e];o[e][r]="number"==typeof l&&Number.isFinite(l)?l:null}}return o}(l,r?.points??[],function(e){const l=e.plots.map(e=>e.key);for(const t of e.series??[])l.includes(t)||l.push(t);return l}(e));return void 0===e.calc?a:e.calc(l,a,t,o,n)},attach:l=>{const t=qn(l.store)??{key:null,points:[],live:[],loaded:!1,from:0,to:0,status:{state:"empty"},request:null,unsubscribe:null,generation:0};l.store[$n]=t;let o=++t.generation,n=!0,r=null,a=()=>{};t.unsubscribe?.(),t.unsubscribe=null;const i=()=>n&&t.generation===o&&!l.signal?.aborted,s=e=>{t.status=e,i()&&l.setDataStatus?.(e)},c=()=>{t.request?.controller.abort(),t.request=null,r=null},p=()=>{t.unsubscribe?.(),t.unsubscribe=null},u=e=>{r!==e&&(r=e,e.promise.then(o=>{if(!i()||t.request!==e||e.controller.signal.aborted)return;t.request=null,r=null;const n=e.extend&&e.from<t.from,a=e.extend&&!n?t.points.slice():[];for(const e of o.slice().sort((e,l)=>e.time-l.time))Number.isFinite(e.time)&&Zn(a,e);if(n)for(const e of t.points)Zn(a,e);for(const e of t.live)Zn(a,e);t.points=a,t.from=t.loaded?Math.min(t.from,e.from):e.from,t.to=t.loaded?Math.max(t.to,e.to):e.to,t.loaded=!0,s({state:a.length>0?"ready":"empty"}),l.requestRecompute(),f()},l=>{i()&&t.request===e&&!e.controller.signal.aborted&&(t.request=null,r=null,s({state:"error",error:l}))}))},y=(l,o,n,r)=>{const a=new AbortController;let i;s({state:"loading"});try{i=e.fetch({...l,from:o,to:n,signal:a.signal})}catch(e){return void s({state:"error",error:e})}const c={promise:i,controller:a,from:o,to:n,extend:r};t.request=c,u(c)},f=(n=!1)=>{if(!i())return;const r=(()=>{const e=l.bars(),t=l.dataContext?.()??{symbol:l.symbol?.(),interval:l.interval?.()};return{settings:l.settings(),bars:e,dataContext:{...t},from:e[0]?.time??0,to:e[e.length-1]?.time??0,requestBars:l.requestBars}})(),a=r.dataContext,f=JSON.stringify([zn(e,r.settings),a?.symbol,a?.exchange,a?.interval]),d=f!==t.key;let m;d&&(o=++t.generation,p(),c(),t.key=f,t.loaded=!1,t.live=[],t.status={state:"empty"},t.points.length>0&&(t.points=[],l.requestRecompute()));try{m=e.supports?.(r)??!0}catch(e){return void s({state:"error",error:e})}if(!m)return o=++t.generation,p(),c(),t.loaded=!1,t.live=[],t.points.length>0&&(t.points=[],l.requestRecompute()),void s({state:"unsupported"});if(0!==r.bars.length){if(null!==t.request?u(t.request):(n||d||"error"!==t.status.state)&&(!t.loaded||n?y(r,r.from,r.to,!1):r.from<t.from?y(r,r.from,t.from,!0):void 0===e.subscribe&&r.to>t.to?y(r,t.to,r.to,!0):s({state:t.points.length>0?"ready":"empty"})),null===t.unsubscribe&&void 0!==e.subscribe){const n=o;try{t.unsubscribe=e.subscribe(r,e=>{i()&&o===n&&Number.isFinite(e.time)&&(Zn(t.live,e),Zn(t.points,e),null===t.request&&"error"!==t.status.state&&s({state:"ready"}),l.requestRecompute())})}catch(e){s({state:"error",error:e})}}}else null===t.request&&s({state:"empty"})},d=()=>{if(!i()&&!n)return;if(n=!1,a(),l.signal?.removeEventListener("abort",m),t.generation!==o)return;t.generation+=1,p(),l.setDataRetry?.(null);const e=t.generation;queueMicrotask(()=>{t.generation===e&&c()})},m=()=>{c(),d()};return l.signal?.addEventListener("abort",m,{once:!0}),a=l.subscribeDataChanges?.(()=>f())??(()=>{}),l.setDataRetry?.(()=>f(!0)),l.setDataStatus?.(t.status),f("error"===t.status.state),d}}}const jn=604800;function Gn(e,l,t,o){if("calendar"===e.mode)return w(e,l,t);if("interval"!==e.mode)return l;const n=e.seconds;if(n%jn===0)return Math.floor(C(l,t)/(n/jn));if(n%86400==0)return Math.floor(v(l,t)/(n/86400));if(null===o)return w(e,l);const r=M(l,t)+60*o;return 1e6*v(l,t)+Math.floor((l-r)/n)}const Xn=e=>Number.isFinite(e);function Jn(e,l,t={}){const o=t.timezone??r,n=Math.floor(t.offset??0);if(!Number.isFinite(n)||n<0)throw new h("securitySeries: offset must be zero or a positive count of buckets");const a=!0===t.lookahead,{bucketing:i}=g(l);if("ticks"===i.mode||"volume"===i.mode)throw new h(`securitySeries: "${l}" closes on trade flow rather than the clock and cannot be folded from time bars`);let s=null;if(void 0!==t.session){const e=k(t.session);if(null===e)throw new h(`securitySeries: cannot read session "${t.session}"`);s=e.start}const c=e.length,p=new Array(c).fill(null),u=new Array(c).fill(null),y=new Array(c).fill(null),f=new Array(c).fill(null),d=new Array(c).fill(null),m=new Array(c).fill(null),b=new Array(c).fill(null),w=new Array(c).fill(!1);if(0===c)return{open:p,high:u,low:y,close:f,volume:d,oi:m,bucketStart:b,isNew:w};const C=[],v=new Array(c);let M=NaN;for(let l=0;l<c;l++){const t=e[l],n=Gn(i,t.time,o,s);if(0===l||n!==M)C.push({start:t.time,open:t.open,high:t.high,low:t.low,close:t.close,volume:void 0===t.volume?null:t.volume,oi:void 0===t.oi?null:t.oi}),w[l]=!0;else{const e=C[C.length-1];!Xn(e.open)&&Xn(t.open)&&(e.open=t.open),Xn(t.high)&&(!Xn(e.high)||t.high>e.high)&&(e.high=t.high),Xn(t.low)&&(!Xn(e.low)||t.low<e.low)&&(e.low=t.low),Xn(t.close)&&(e.close=t.close),void 0!==t.volume&&(e.volume=(e.volume??0)+t.volume),void 0!==t.oi&&(e.oi=t.oi)}v[l]=C.length-1,M=n}let A=NaN,N=NaN,x=null,S=null;for(let l=0;l<c;l++){const t=e[l],o=v[l];if(n>0){const e=o-n;if(e<0)continue;const t=C[e];p[l]=t.open,u[l]=t.high,y[l]=t.low,f[l]=t.close,d[l]=t.volume,m[l]=t.oi,b[l]=t.start;continue}const r=C[o];b[l]=r.start,a?(p[l]=r.open,u[l]=r.high,y[l]=r.low,f[l]=r.close,d[l]=r.volume,m[l]=r.oi):(w[l]?(A=t.high,N=t.low,x=void 0===t.volume?null:t.volume,S=void 0===t.oi?null:t.oi):(Xn(t.high)&&(!Xn(A)||t.high>A)&&(A=t.high),Xn(t.low)&&(!Xn(N)||t.low<N)&&(N=t.low),void 0!==t.volume&&(x=(x??0)+t.volume),void 0!==t.oi&&(S=t.oi)),p[l]=r.open,u[l]=Xn(A)?A:null,y[l]=Xn(N)?N:null,f[l]=Xn(t.close)?t.close:null,d[l]=x,m[l]=S)}return{open:p,high:u,low:y,close:f,volume:d,oi:m,bucketStart:b,isNew:w}}const _n="indicators",Qn=[re,ie,ae,ye,se,fe,he,de,be,ve,Me,Ae,Ne,xe,Se,Le,Be,Fe,Re,Ue,Oe,Ie,He,...ml,...Ll,...Zl,...tt,...ft,...Pt,..._t,...uo,...Bo,...qo,...cn,...kn,...En];let er=!1;function lr(){if(!er){er=!0;for(const e of Qn)A(e)}}lr();export{ft as ADAPTIVE_INDICATORS,Ue as ADL,Ne as ADX,Ft as ALLIGATOR,_e as ALMA,an as ALPHATREND,gl as AROON,kl as AROON_OSCILLATOR,Le as ATR,Vl as AVERAGE_DAILY_RANGE,Pt as AVERAGE_INDICATORS,wl as AWESOME_OSCILLATOR,Cl as BALANCE_OF_POWER,Pl as BB_TREND,se as BOLLINGER,Tl as BOLLINGER_BANDWIDTH,Ul as BOLLINGER_PERCENT_B,Qn as BUILTIN_INDICATORS,xe as CCI,Jl as CHAIKIN_MONEY_FLOW,_l as CHAIKIN_OSCILLATOR,$l as CHAIKIN_VOLATILITY,nl as CHANDELIER_EXIT,ol as CHANDE_KROLL_STOP,vl as CHANDE_MOMENTUM,Ol as CHOPPINESS_INDEX,El as CHOP_ZONE,Sl as CONNORS_RSI,$o as CONSOLIDATION_BREAKOUT,Ml as COPPOCK_CURVE,rn as CPR,Qe as DEMA,tl as DONCHIAN,Al as DPO,Ql as EASE_OF_MOVEMENT,et as ELDER_FORCE_INDEX,ie as EMA,ll as ENVELOPE,Nl as FISHER_TRANSFORM,tt as FLOW_INDICATORS,he as HALFTREND,Il as HISTORICAL_VOLATILITY,el as HMA,dl as HULL_SUITE,be as ICHIMOKU,uo as INDEX_INDICATORS,_n as INDICATORS_TIER,it as KAMA,st as KELTNER_CHANNEL,pt as KLINGER_OSCILLATOR,ut as KNOW_SURE_THING,yt as LINREG_SLOPE,ct as LSMA,Me as MACD,co as MASS_INDEX,al as MA_CHANNEL,Mt as MA_CROSS,Bt as MA_RIBBON,At as MCGINLEY_DYNAMIC,Nt as MEDIAN,Se as MFI,$t as MOMENTUM,lt as NET_VOLUME,ro as NVI,Re as OBV,Oe as OPEN_INTEREST,He as OPEN_INTEREST_BUILDUP,Ie as OPEN_INTEREST_CHANGE,Ll as OSCILLATOR_INDICATORS,ml as OVERLAY_INDICATORS,de as PARABOLIC_SAR,Zt as PPO,ao as PVI,so as PVO,io as PVT,sn as RANGE_ANALYSIS,Bo as RANGE_INDICATORS,Ao as RELATIVE_VIGOR_INDEX,No as RELATIVE_VOLATILITY_INDEX,qt as ROC,ve as RSI,Eo as RSI_DIVERGENCE,Hn as SEASONALITY,En as SEASONALITY_INDICATORS,qo as SIGNAL_INDICATORS,re as SMA,Jt as SMI,Gt as SMI_ERGODIC_INDICATOR,Xt as SMI_ERGODIC_OSCILLATOR,Rt as SMMA,Lo as SPECIAL_K,ql as STANDARD_DEVIATION,zl as STANDARD_ERROR,rl as STANDARD_ERROR_BANDS,Ae as STOCHASTIC,Co as STOCHASTIC_RSI,_t as STRENGTH_INDICATORS,cn as STUDY_INDICATORS,fe as SUPERTREND,Tt as T3,Kt as TEMA,Io as TREND_STRENGTH_INDEX,Yt as TRIX,jt as TSI,Wt as TWAP,po as ULCER_INDEX,Mo as ULTIMATE_OSCILLATOR,Zl as VOLATILITY_INDICATORS,Oo as VOLATILITY_STOP,Fe as VOLUME,Po as VORTEX,ye as VWAP,Dt as VWMA,gn as WAVETREND,kn as WAVETREND_INDICATORS,Ho as WILLIAMS_FRACTALS,vo as WILLIAMS_PERCENT_R,Be as WILLIAMS_VIX_FIX,ae as WMA,xo as WOODIES_CCI,P as alma,Q as barsSince,G as cci,F as change,xl as connorsStreak,j as correlation,Yn as createTier2Indicator,$ as cumulative,U as dev,B as highest,I as highestBars,q as linreg,K as lowest,V as lowestBars,W as nulls,T as percentRank,Y as percentileNearestRank,X as pivotHigh,J as pivotLow,lr as registerBuiltinIndicators,S as rma,R as roc,E as rollingSum,Jn as securitySeries,N as sma,D as smaSeededEma,L as stdev,Z as stoch,z as swma,ee as valueWhen,O as vwma,x as wma};
1
+ import{sourceValues as e,supertrend as l,atr as t,sessionStartFlags as o,calendarPeriodFlags as n,DEFAULT_TIMEZONE as r,isValidTimezone as a,isNewZonedPeriod as i,utcSecondsToIstParts as s,IST_OFFSET_SECONDS as c,rsi as u,trueRange as p,withAlpha as y,isNewZonedWeek as f,isNewZonedMonth as m,utcSecondsToZonedParts as d,zonedWallClockToUtcSeconds as b,IndicatorInputError as h,resolveInterval as g,parseSessionSpec as k,bucketStartOf as w,zonedWeekIndex as v,zonedDayIndex as C,registerIndicator as N}from"./openalgo-charts.mjs";function M(e,l){const t=new Array(e.length).fill(NaN);if(e.length<l)return t;if(1===l){for(let l=0;l<e.length;l++){const o=e[l];Number.isFinite(o)&&(t[l]=0===o?0:o)}return t}let o=0;for(let n=0;n<e.length;n++){if(Number.isFinite(e[n])||o++,n>=l&&!Number.isFinite(e[n-l])&&o--,n<l-1||0!==o)continue;let r=0;for(let t=n-l+1;t<=n;t++)r+=e[t];Number.isFinite(r)&&(t[n]=r)}return t}function A(e,l){const t=M(e,l);if(1!==l)for(let e=0;e<t.length;e++)t[e]/=l;return t}function x(e,l){if(!Number.isSafeInteger(e)||e<=0)throw new RangeError("Missing-value period must be a positive safe integer");if(null===l||"object"!=typeof l||Array.isArray(l))throw new TypeError("Missing-value options must be an object");const t=void 0===l.missing?"propagate":l.missing;if("skip"!==t&&"propagate"!==t)throw new TypeError("Missing-value policy must be skip or propagate");return t}function S(e,l,t,o,n=!1){const r=x(l,t),a=new Array(e.length).fill(NaN),i=[];let s=0;for(let t=0;t<e.length;t++){const c=e[t],u=Number.isFinite(c);n&&u&&i.length===l&&0===s&&(a[t]=o(i,t)),("propagate"===r||u)&&(i.push({value:c,index:t}),u||s++,i.length>l&&!Number.isFinite(i.shift().value)&&s--),n||i.length!==l||0!==s||(a[t]=o(i,t))}return a}function L(e,l,t,o){if("number"!=typeof e)throw new TypeError(`${t} must contain numbers`);if(!(o&&Number.isNaN(e)||Number.isSafeInteger(e)&&!(e<l)))throw new RangeError(`${t} must be a safe integer greater than or equal to ${l}`)}function B(e,l,t,o){if(!Array.isArray(e))throw new TypeError(`${o} must be an array`);if(e.length!==l)throw new RangeError(`${o} array length must match the source`);for(let l=0;l<e.length;l++)L(e[l],t,o,!0)}function K(e,l,t,o,n=!1){B(l,e.length,1,"Window length");const r=x(1,void 0===t?{}:t),a=new Array(e.length).fill(NaN),i=[];let s=0;const c=(e,l)=>{const t=Number.isFinite(e);s=t?s+1:0,("propagate"===r||t)&&i.push({value:e,index:l})};for(let t=0;t<e.length;t++){const u=e[t];n||c(u,t);const p=l[t];!Number.isNaN(p)&&p<=i.length&&("skip"===r||p<=s)&&(!n||Number.isFinite(u))&&(a[t]=o(i.slice(i.length-p),t)),n&&c(u,t)}return a}function F(e,l){const t=new DataView(new ArrayBuffer(8)),o=(1n<<52n)-1n;let n=0n,r=0n;for(let a=0;a<e.length;a++){const i=BigInt(l?.[a]??1);if(0n===i)continue;t.setFloat64(0,e[a]);const s=t.getBigUint64(0),c=Number(s>>52n&0x7ffn),u=s&o,p=0===c?u:(1n<<52n|u)<<BigInt(c-1);n+=(s>>63n?-p:p)*i,r+=i}return function(e,l){const t=e<0n,o=t?-e:e,n=o/l,r=Math.max(0,n.toString(2).length-53),a=l<<BigInt(r);let i=o/a;const s=o%a;(2n*s>a||2n*s===a&&0n!=(1n&i))&&i++;const c=Number(i)*2**(r-1074);return t?-c:c}(n,r)}function W(e,l){let t=0,o=0,n=0,r=1/0,a=-1/0;for(let i=0;i<e.length;i++){const s=l?.[i]??1;if(0===s)continue;r=Math.min(r,e[i]),a=Math.max(a,e[i]),n+=s;const c=e[i]*s,u=t+c;o+=Math.abs(t)>=Math.abs(c)?t-u+c:c-u+t,t=u}if(r===a)return r;const i=t+o,s=Number.isFinite(i)&&Number.isSafeInteger(n)?i/n:F(e,l);return Math.max(r,Math.min(a,s))}function D(e){return W(e.map(e=>e.value))}function R(e,l){const t=e[0].value;let o=0,n=0,r=e.map(({value:e})=>{o=Math.max(o,Math.abs(e));const l=e-t;return n=Math.max(n,Math.abs(l)),l});if(0===n)return 0;const a=2**Math.min(1023,Math.floor(Math.log2(Number.isFinite(n)?n:o)));r=Number.isFinite(n)?r.map(e=>e/a):e.map(({value:e})=>e/a-t/a);const i=W(r),s=W(r.map(e=>{const t=Math.abs(e-i);return l?t*t:t}));return Math.min(o,(l?Math.sqrt(s):s)*a)}function O(e,l){let t=e[0];for(let o=1;o<e.length;o++){const n=e[o];(l?n.value>=t.value:n.value<=t.value)&&(t=n)}return t}function T(e,l,t,o){const n=x(l,t),r=new Array(e.length).fill(NaN);let a=0;const i=[];let s=NaN;for(let t=0;t<e.length;t++){const c=e[t];if(Number.isFinite(c)){if(a<l){if(i.push(c),++a<l)continue;s=W(i),i.length=0}else s=W([s,c],[l-1,o]);r[t]=s}else"propagate"===n?(a=0,i.length=0,s=NaN):a===l&&(r[t]=s)}return r}function U(e,l,t){if("number"!=typeof l)return K(e,l,t,D);if(void 0!==t)return S(e,l,t,D);if(Number.isSafeInteger(l)&&l>0)return A(e,l);const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;let r=0,a=0;for(let t=0;t<o;t++){const o=e[t];if(Number.isFinite(o)?r+=o:a+=1,t>=l){const o=e[t-l];Number.isFinite(o)?r-=o:a-=1}t>=l-1&&(n[t]=0===a?r/l:NaN)}return n}function P(e,l,t){if("number"!=typeof l)return K(e,l,t,e=>W(e.map(e=>e.value),e.map((e,l)=>l+1)));if(void 0!==t)return S(e,l,t,e=>W(e.map(e=>e.value),e.map((e,l)=>l+1)));const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;const r=l*(l+1)/2,a=Number.isSafeInteger(l);for(let t=l-1;t<o;t++){let o=0;for(let n=0;n<l;n++){const r=a?l-1-n:n;o+=e[t-r]*(l-r)}const i=o/r;a&&!Number.isFinite(i)||(n[t]=i)}return n}function I(e,l,t){const o=new Array(e.length).fill(NaN);if(e.length<l)return o;const n=2/(l+1);let r=0,a=NaN,i=!1;for(let s=0;s<e.length;s++){const c=e[s];if(Number.isFinite(c)){if(i)a=t?c*n+a*(1-n):(a*(l-1)+c)/l;else{if(++r<l)continue;let t=0;for(let o=s+1-l;o<=s;o++)t+=e[o];const o=t/l;if(!Number.isFinite(o))continue;a=0===o?0:o,i=!0}Number.isFinite(a)&&(o[s]=0===a?0:a)}else r=0}return o}function V(e,l,t){if(void 0!==t)return T(e,l,t,1);if(Number.isSafeInteger(l)&&l>0)return I(e,l,!1);const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;let r=0;for(let t=0;t<l;t++)r+=e[t];let a=r/l;n[l-1]=a;for(let t=l;t<o;t++)a=(a*(l-1)+e[t])/l,n[t]=a;return n}function E(e,l,t){if("number"!=typeof l)return K(e,l,t,e=>R(e,!0));if(void 0!==t)return S(e,l,t,e=>R(e,!0));const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;const r=U(e,l),a=Number.isSafeInteger(l);for(let t=l-1;t<o;t++){let o=0;const i=r[t];for(let n=0;n<l;n++){const r=e[t-(a?l-1-n:n)]-i;o+=r*r}const s=Math.sqrt(o/l);a&&!Number.isFinite(s)||(n[t]=s)}return n}function q(e,l,t){if("number"!=typeof l)return K(e,l,t,e=>O(e,!0).value);if(void 0!==t)return S(e,l,t,e=>O(e,!0).value);const o=e.length,n=new Array(o).fill(NaN);if(l<=0)return n;for(let t=l-1;t<o;t++){let o=-1/0;for(let n=0;n<l;n++)e[t-n]>o&&(o=e[t-n]);n[t]=o}return n}function H(e,l,t){if("number"!=typeof l)return K(e,l,t,e=>O(e,!1).value);if(void 0!==t)return S(e,l,t,e=>O(e,!1).value);const o=e.length,n=new Array(o).fill(NaN);if(l<=0)return n;for(let t=l-1;t<o;t++){let o=1/0;for(let n=0;n<l;n++)e[t-n]<o&&(o=e[t-n]);n[t]=o}return n}function $(e){const l=new Array(e.length);for(let t=0;t<e.length;t++){const o=e[t];l[t]=Number.isFinite(o)?o:null}return l}function z(e,l,t){if(void 0!==t)return T(e,l,t,2);if(Number.isSafeInteger(l)&&l>0)return I(e,l,!0);const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;let r=0;for(let t=0;t<l;t++)r+=e[t];let a=r/l;n[l-1]=a;const i=2/(l+1);for(let t=l;t<o;t++)a=e[t]*i+a*(1-i),n[t]=a;return n}function j(e,l=1){const t=e.length,o=new Array(t).fill(NaN);for(let n=l;n<t;n++)o[n]=e[n]-e[n-l];return o}function Z(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0)return o;for(let n=l;n<t;n++){const t=e[n-l];o[n]=0===t?NaN:100*(e[n]-t)/t}return o}function Y(e,l,t){if("number"!=typeof l)return K(e,l,t,e=>R(e,!1));if(void 0!==t)return S(e,l,t,e=>R(e,!1));const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;const r=U(e,l),a=Number.isSafeInteger(l);for(let t=l-1;t<o;t++){let o=0;for(let n=0;n<l;n++)o+=Math.abs(e[t-(a?l-1-n:n)]-r[t]);const i=o/l;a&&!Number.isFinite(i)||(n[t]=i)}return n}function J(e,l,t){if("number"!=typeof l)return K(e,l,t,(l,t)=>{let o=0;for(const n of l)n.value<=e[t]&&o++;return 100*o/l.length},!0);if(void 0!==t)return S(e,l,t,(t,o)=>{let n=0;for(const l of t)l.value<=e[o]&&n++;return 100*n/l},!0);const o=e.length,n=new Array(o).fill(NaN);if(l<=0)return n;for(let t=l;t<o;t++){let o=0;for(let n=1;n<=l;n++)e[t-n]<=e[t]&&(o+=1);n[t]=100*o/l}return n}function G(e,l,t,o){const n=e.length,r=new Array(n).fill(NaN);if(l<=0||o<=0||n<l)return r;const a=t*(l-1),i=l/o,s=new Array(l);let c=0;for(let e=0;e<l;e++){const l=Math.exp(-(e-a)*(e-a)/(2*i*i));s[e]=l,c+=l}if(0===c)return r;for(let t=l-1;t<n;t++){let o=0;for(let n=0;n<l;n++)o+=e[t-(l-1-n)]*s[n];r[t]=o/c}return r}function X(e,l,t){const o=e.length,n=new Array(o);for(let t=0;t<o;t++)n[t]=e[t]*(l[t]??0);const r=U(n,t),a=U(l,t),i=new Array(o).fill(NaN);for(let e=0;e<o;e++)i[e]=0===a[e]?NaN:r[e]/a[e];return i}function _(e,l,t){return"number"!=typeof l?K(e,l,t,(e,l)=>O(e,!0).index-l):void 0!==t?S(e,l,t,(e,l)=>O(e,!0).index-l):ee(e,l,!0)}function Q(e,l,t){return"number"!=typeof l?K(e,l,t,(e,l)=>O(e,!1).index-l):void 0!==t?S(e,l,t,(e,l)=>O(e,!1).index-l):ee(e,l,!1)}function ee(e,l,t){const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;for(let r=l-1;r<o;r++){let o=e[r],a=0;for(let n=1;n<l;n++){const l=e[r-n];(t?l>o:l<o)&&(o=l,a=n)}n[r]=0===a?0:-a}return n}function le(e,l){if(Number.isSafeInteger(l)&&l>0)return M(e,l);const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;let n=0;for(let r=0;r<t;r++)n+=e[r],r>=l&&(n-=e[r-l]),r>=l-1&&(o[r]=n);return o}function te(e){const l=e.length,t=new Array(l);let o=0;for(let n=0;n<l;n++){const l=e[n];Number.isFinite(l)&&(o+=l),t[n]=o}return t}function oe(e,l,t=0){const o=e.length,n=new Array(o).fill(NaN);if(l<=1||o<l)return n;const r=(l-1)*l/2,a=l*((l-1)*l*(2*l-1)/6)-r*r;if(0===a)return n;for(let i=l-1;i<o;i++){let o=0,s=0;for(let t=0;t<l;t++){const n=e[i-(l-1-t)];o+=n,s+=n*t}const c=(l*s-r*o)/a,u=(o-c*r)/l;n[i]=u+c*(l-1-t)}return n}function ne(e){const l=e.length,t=new Array(l).fill(NaN);for(let o=3;o<l;o++)t[o]=(e[o-3]+2*e[o-2]+2*e[o-1]+e[o])/6;return t}function re(e,l,t,o){const n=e.length,r=new Array(n).fill(NaN),a=q(l,o),i=H(t,o);for(let l=0;l<n;l++){const t=a[l]-i[l];r[l]=0===t?NaN:100*(e[l]-i[l])/t}return r}function ae(e,l,t){const o=e.length,n=new Array(o).fill(NaN);if(l<=0||o<l)return n;for(let r=l-1;r<o;r++){const o=e.slice(r-l+1,r+1);if(o.some(e=>!Number.isFinite(e)))continue;o.sort((e,l)=>e-l);const a=Math.max(1,Math.ceil(t/100*l));n[r]=o[a-1]}return n}function ie(e,l,t){const o=e.length,n=new Array(o).fill(NaN);if(t<=1||o<t)return n;for(let r=t-1;r<o;r++){let o=0,a=0,i=0,s=0,c=0;for(let n=0;n<t;n++){const t=e[r-n],u=l[r-n];o+=t,a+=u,i+=t*t,s+=u*u,c+=t*u}const u=t*c-o*a,p=Math.sqrt(t*i-o*o)*Math.sqrt(t*s-a*a);n[r]=0===p?NaN:u/p}return n}function se(e,l){const t=e.length,o=new Array(t).fill(NaN),n=U(e,l),r=Y(e,l);for(let l=0;l<t;l++)o[l]=0===r[l]?NaN:(e[l]-n[l])/(.015*r[l]);return o}function ce(e,l,t){return"number"!=typeof l||"number"!=typeof t?pe(e,l,t,!0):ye(e,l,t,!0)}function ue(e,l,t){return"number"!=typeof l||"number"!=typeof t?pe(e,l,t,!1):ye(e,l,t,!1)}function pe(e,l,t,o){for(const[o,n]of[["Left pivot width",l],["Right pivot width",t]])"number"==typeof n?L(n,0,o,!1):B(n,e.length,0,o);const n=new Array(e.length).fill(NaN);for(let r=0;r<e.length;r++){const a="number"==typeof l?l:l[r],i="number"==typeof t?t:t[r];if(Number.isNaN(a)||Number.isNaN(i)||i>r||a>r-i)continue;const s=r-i,c=e[s];if(!Number.isFinite(c))continue;let u=!0;for(let l=s-a;l<=r&&u;l++){if(l===s)continue;const t=e[l];Number.isFinite(t)&&!(o?t>=c:t<=c)||(u=!1)}u&&(n[r]=c)}return n}function ye(e,l,t,o){const n=e.length,r=new Array(n).fill(NaN);for(let a=l+t;a<n;a++){const n=a-t,i=e[n];if(!Number.isFinite(i))continue;let s=!0;for(let t=1;t<=l&&s;t++){const l=e[n-t];Number.isFinite(l)&&!(o?l>=i:l<=i)||(s=!1)}for(let l=1;l<=t&&s;l++){const t=e[n+l];Number.isFinite(t)&&!(o?t>=i:t<=i)||(s=!1)}s&&(r[a]=i)}return r}function fe(e){const l=e.length,t=new Array(l).fill(NaN);let o=-1;for(let n=0;n<l;n++)e[n]&&(o=n),o>=0&&(t[n]=n-o);return t}function me(e,l,t){const o=e.length,n=new Array(o).fill(NaN),r=[];for(let a=0;a<o;a++){e[a]&&r.push(a);const o=r.length-1-t;o>=0&&(n[a]=l[r[o]])}return n}const de=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},be=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},he=(e,l="source")=>e[l]??"close";function ge(l,t,o,n){return{id:l,name:t,category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close",allowStudyOutputs:!0},{key:"color",type:"color",label:"Color",default:o}],plots:[{key:"ma",type:"line",title:t,colorKey:"color",style:{color:o,lineWidth:1.5}}],calc:(l,t,o,r)=>{const a=he(t),i="string"==typeof a?e(l,a):e(l,a,r).map(e=>e??NaN);return{ma:$(n(i,de(t,"length",9),"string"==typeof a?void 0:{missing:"propagate"}))}}}}const ke=ge("sma","SMA","#4f8cff",U),we=ge("wma","WMA","#ab47bc",P),ve=ge("ema","EMA","#f5a623",z),Ce={id:"bollinger",name:"Bollinger Bands",category:"Volatility",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:2,max:1e3,step:1},{key:"stdDev",type:"number",label:"StdDev",default:2,min:.1,max:10,step:.1},{key:"source",type:"source",label:"Source",default:"close"},{key:"basisColor",type:"color",label:"Basis",default:"#f5a623"},{key:"bandColor",type:"color",label:"Bands",default:"#4f8cff"}],plots:[{key:"upper",type:"line",title:"BB Upper",colorKey:"bandColor",style:{lineWidth:1}},{key:"basis",type:"line",title:"BB Basis",colorKey:"basisColor",style:{lineWidth:1.5}},{key:"lower",type:"line",title:"BB Lower",colorKey:"bandColor",style:{lineWidth:1}}],calc:(l,t)=>{const o=e(l,he(t)),n=de(t,"length",20),r=de(t,"stdDev",2),a=U(o,n),i=E(o,n),s=a.map((e,l)=>e+r*i[l]),c=a.map((e,l)=>e-r*i[l]);return{upper:$(s),basis:$(a),lower:$(c)}}},Ne=e=>Math.floor(((e=>Math.floor((e+c)/86400))(e)-4)/7);function Me(e,l){return l===r?(l,t)=>function(e,l,t){if("week"===e)return Ne(l)!==Ne(t);const o=s(l),n=s(t);return o.year!==n.year||"year"!==e&&("quarter"===e?Math.floor((o.month-1)/3)!==Math.floor((n.month-1)/3):o.month!==n.month)}(e,l,t):(t,o)=>i(t,o,e,l)}function Ae(e,l){if(0===l)return e.slice();const t=new Array(e.length).fill(NaN);for(let o=0;o<e.length;o++){const n=o+l;n>=0&&n<e.length&&(t[n]=e[o])}return t}const xe={id:"vwap",name:"VWAP",category:"Volume",placement:"onchart",inputs:[{key:"anchor",type:"select",label:"Anchor Period",default:"session",options:[{label:"Session",value:"session"},{label:"Week",value:"week"},{label:"Month",value:"month"},{label:"Quarter",value:"quarter"},{label:"Year",value:"year"},{label:"Continuous",value:"continuous"}]},{key:"source",type:"source",label:"Source",default:"hlc3"},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"calcMode",type:"select",label:"Bands Calculation Mode",default:"stdev",options:[{label:"Standard Deviation",value:"stdev"},{label:"Percentage",value:"percent"}],group:"Bands"},{key:"showBand1",type:"boolean",label:"Band #1",default:!0,group:"Bands"},{key:"bandMult1",type:"number",label:"Bands Multiplier #1",default:1,min:0,step:.5,group:"Bands"},{key:"showBand2",type:"boolean",label:"Band #2",default:!1,group:"Bands"},{key:"bandMult2",type:"number",label:"Bands Multiplier #2",default:2,min:0,step:.5,group:"Bands"},{key:"showBand3",type:"boolean",label:"Band #3",default:!1,group:"Bands"},{key:"bandMult3",type:"number",label:"Bands Multiplier #3",default:3,min:0,step:.5,group:"Bands"},{key:"color",type:"color",label:"VWAP",default:"#2962ff"},{key:"band1Color",type:"color",label:"Band #1",default:"#4caf50",group:"Bands"},{key:"band2Color",type:"color",label:"Band #2",default:"#808000",group:"Bands"},{key:"band3Color",type:"color",label:"Band #3",default:"#00bcd4",group:"Bands"}],plots:[{key:"vwap",type:"line",title:"VWAP",colorKey:"color",style:{lineWidth:1.5}},{key:"upper1",type:"line",title:"Upper Band #1",colorKey:"band1Color",style:{lineWidth:1}},{key:"lower1",type:"line",title:"Lower Band #1",colorKey:"band1Color",style:{lineWidth:1}},{key:"upper2",type:"line",title:"Upper Band #2",colorKey:"band2Color",style:{lineWidth:1}},{key:"lower2",type:"line",title:"Lower Band #2",colorKey:"band2Color",style:{lineWidth:1}},{key:"upper3",type:"line",title:"Upper Band #3",colorKey:"band3Color",style:{lineWidth:1}},{key:"lower3",type:"line",title:"Lower Band #3",colorKey:"band3Color",style:{lineWidth:1}}],fills:[{between:["upper1","lower1"],colorUpKey:"band1Color",colorDownKey:"band1Color",opacity:.05},{between:["upper2","lower2"],colorUpKey:"band2Color",colorDownKey:"band2Color",opacity:.05},{between:["upper3","lower3"],colorUpKey:"band3Color",colorDownKey:"band3Color",opacity:.05}],calc:(l,t)=>{const i=l.length,s=e(l,he(t)),c="string"==typeof t.anchor?t.anchor:"session",u="percent"===t.calcMode,p=Math.round(de(t,"offset",0)),y=new Array(i).fill(NaN),f=new Array(i).fill(NaN),m=function(e,l,t){if("continuous"===l)return new Array(e.length).fill(!1);const r=e.map(e=>e.time);return"session"===l?o(r,t):n(r,Me(l,t))}(l,c,(e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===r?r:a(l)?l:r})(t));let d=0,b=0,h=0;for(let e=0;e<i;e++){m[e]&&(d=0,b=0,h=0);const t=l[e].volume??0,o=s[e];if(d+=o*t,h+=o*o*t,b+=t,b<=0)continue;const n=d/b;y[e]=n;const r=Math.max(0,h/b-n*n);f[e]=u?.01*n:Math.sqrt(r)}const g=(e,l,t)=>{const o=new Array(i).fill(NaN);if(!e)return o;for(let e=0;e<i;e++)Number.isFinite(y[e])&&Number.isFinite(f[e])&&(o[e]=y[e]+t*f[e]*l);return o},k=!1!==t.showBand1,w=!0===t.showBand2,v=!0===t.showBand3,C=de(t,"bandMult1",1),N=de(t,"bandMult2",2),M=de(t,"bandMult3",3);return{vwap:$(Ae(y,p)),upper1:$(Ae(g(k,C,1),p)),lower1:$(Ae(g(k,C,-1),p)),upper2:$(Ae(g(w,N,1),p)),lower2:$(Ae(g(w,N,-1),p)),upper3:$(Ae(g(v,M,1),p)),lower3:$(Ae(g(v,M,-1),p))}}},Se={id:"supertrend",name:"Supertrend",category:"Trend",placement:"onchart",inputs:[{key:"period",type:"number",label:"ATR Period",default:10,min:1,max:200,step:1},{key:"multiplier",type:"number",label:"Multiplier",default:3,min:.1,max:20,step:.1},{key:"upColor",type:"color",label:"Uptrend",default:"#26a69a"},{key:"downColor",type:"color",label:"Downtrend",default:"#ef5350"}],plots:[{key:"up",type:"line",title:"Supertrend Up",colorKey:"upColor",style:{lineWidth:2}},{key:"down",type:"line",title:"Supertrend Down",colorKey:"downColor",style:{lineWidth:2}}],fills:[{between:["bodyMid","up"],colorUpKey:"upColor",colorDownKey:"upColor",opacity:.1},{between:["bodyMid","down"],colorUpKey:"downColor",colorDownKey:"downColor",opacity:.1}],calc:(e,t)=>{const o=l(e,de(t,"period",10),de(t,"multiplier",3)),n=[],r=[],a=[];for(let l=0;l<o.length;l++){const t=o[l],i=Number.isFinite(t.value);n.push(i&&-1===t.direction?t.value:null),r.push(i&&1===t.direction?t.value:null);const s=e[l];a.push(i&&void 0!==s?(s.open+s.close)/2:null)}return{up:n,down:r,bodyMid:a}}},Le={id:"parabolic-sar",name:"Parabolic SAR",category:"Trend",placement:"onchart",inputs:[{key:"start",type:"number",label:"Start",default:.02,min:.001,max:1,step:.001},{key:"increment",type:"number",label:"Increment",default:.02,min:.001,max:1,step:.001},{key:"maximum",type:"number",label:"Maximum",default:.2,min:.01,max:1,step:.01},{key:"color",type:"color",label:"Color",default:"#e0b020"}],plots:[{key:"sar",type:"line",title:"SAR",colorKey:"color",style:{markersOnly:!0,markerRadius:1.5}}],calc:(e,l)=>{const t=e.length,o=new Array(t).fill(NaN);if(t<2)return{sar:$(o)};const n=de(l,"start",.02),r=de(l,"increment",.02),a=de(l,"maximum",.2);let i=e[1].close>=e[0].close,s=i?e[0].low:e[0].high,c=i?e[1].high:e[1].low,u=n;o[1]=s;for(let l=2;l<t;l++){s+=u*(c-s),i&&e[l].low<s?(i=!1,s=Math.max(c,e[l].high),c=e[l].low,u=n):!i&&e[l].high>s?(i=!0,s=Math.min(c,e[l].low),c=e[l].high,u=n):i&&e[l].high>c?(c=e[l].high,u=Math.min(a,u+r)):!i&&e[l].low<c&&(c=e[l].low,u=Math.min(a,u+r));const t=e[l-1].low,p=e[l-1].high,y=e[l-2].low,f=e[l-2].high;s=i?Math.min(s,t,y):Math.max(s,p,f),o[l]=s}return{sar:$(o)}}};function Be(e,l){const t=e.length,o=new Array(t).fill(NaN);for(let n=0;n<t;n++){const r=n-l;r>=0&&r<t&&(o[n]=e[r])}return o}const Ke={id:"ichimoku",name:"Ichimoku Cloud",category:"Trend",placement:"onchart",inputs:[{key:"conversionPeriod",type:"number",label:"Conversion",default:9,min:1,max:200,step:1},{key:"basePeriod",type:"number",label:"Base",default:26,min:1,max:200,step:1},{key:"laggingSpanPeriod",type:"number",label:"Lagging Span",default:52,min:1,max:400,step:1},{key:"displacement",type:"number",label:"Displacement",default:26,min:0,max:200,step:1},{key:"conversionColor",type:"color",label:"Conversion",default:"#4f8cff"},{key:"baseColor",type:"color",label:"Base",default:"#ef5350"},{key:"spanAColor",type:"color",label:"Span A",default:"#26a69a"},{key:"spanBColor",type:"color",label:"Span B",default:"#ab47bc"},{key:"laggingColor",type:"color",label:"Lagging",default:"#8892a6"},{key:"cloudUpColor",type:"color",label:"Cloud up",default:"#26a69a"},{key:"cloudDownColor",type:"color",label:"Cloud down",default:"#ef5350"}],plots:[{key:"conversion",type:"line",title:"Tenkan-sen",colorKey:"conversionColor",style:{lineWidth:1}},{key:"base",type:"line",title:"Kijun-sen",colorKey:"baseColor",style:{lineWidth:1}},{key:"spanA",type:"line",title:"Senkou Span A",colorKey:"spanAColor",style:{lineWidth:1}},{key:"spanB",type:"line",title:"Senkou Span B",colorKey:"spanBColor",style:{lineWidth:1}},{key:"lagging",type:"line",title:"Chikou Span",colorKey:"laggingColor",style:{lineWidth:1}}],fills:[{between:["spanA","spanB"],colorUpKey:"cloudUpColor",colorDownKey:"cloudDownColor",opacity:.14}],calc:(e,l)=>{const t=e.length,o=de(l,"conversionPeriod",9),n=de(l,"basePeriod",26),r=de(l,"laggingSpanPeriod",52),a=de(l,"displacement",26),i=l=>{const o=new Array(t).fill(NaN);for(let n=l-1;n<t;n++){let t=-1/0,r=1/0;for(let o=0;o<l;o++)e[n-o].high>t&&(t=e[n-o].high),e[n-o].low<r&&(r=e[n-o].low);o[n]=(t+r)/2}return o},s=i(o),c=i(n),u=s.map((e,l)=>(e+c[l])/2),p=i(r),y=e.map(e=>e.close);return{conversion:$(s),base:$(c),spanA:$(Be(u,a)),spanB:$(Be(p,a)),lagging:$(Be(y,-a))}}},Fe={id:"halftrend",name:"HalfTrend",category:"Trend",placement:"onchart",inputs:[{key:"amplitude",type:"number",label:"Amplitude",default:2,min:1,max:100,step:1},{key:"channelDeviation",type:"number",label:"Channel Deviation",default:2,min:0,max:20,step:.1},{key:"atrPeriod",type:"number",label:"ATR Period",default:100,min:1,max:500,step:1},{key:"showChannels",type:"boolean",label:"Show Channels",default:!0},{key:"showSignals",type:"boolean",label:"Show Signals",default:!0},{key:"showLabels",type:"boolean",label:"Show Buy/Sell Labels",default:!0},{key:"upColor",type:"color",label:"Uptrend",default:"#2962ff"},{key:"downColor",type:"color",label:"Downtrend",default:"#ef5350"}],plots:[{key:"up",type:"line",title:"HalfTrend Up",colorKey:"upColor",style:{lineWidth:2}},{key:"down",type:"line",title:"HalfTrend Down",colorKey:"downColor",style:{lineWidth:2}},{key:"atrHigh",type:"line",title:"Channel High",colorKey:"downColor",style:{markersOnly:!0,markerRadius:1}},{key:"atrLow",type:"line",title:"Channel Low",colorKey:"upColor",style:{markersOnly:!0,markerRadius:1}},{key:"buySignal",type:"line",title:"Buy",colorKey:"upColor",style:{markersOnly:!0,markerRadius:3.5}},{key:"sellSignal",type:"line",title:"Sell",colorKey:"downColor",style:{markersOnly:!0,markerRadius:3.5}}],fills:[{between:["up","atrLow"],colorUpKey:"upColor",colorDownKey:"upColor",opacity:.15},{between:["down","atrHigh"],colorUpKey:"downColor",colorDownKey:"downColor",opacity:.15}],markers:({bars:e,values:l,settings:t})=>{if(!1===t.showLabels)return[];const o=l.buySignal??[],n=l.sellSignal??[],r=[];for(let l=0;l<e.length;l++){const a=o[l];if(null!=a){r.push({time:e[l].time,position:"atPrice",price:a,shape:"labelUp",size:"small",color:be(t,"upColor","#2962ff"),text:"Buy"});continue}const i=n[l];null!=i&&r.push({time:e[l].time,position:"atPrice",price:i,shape:"labelDown",size:"small",color:be(t,"downColor","#ef5350"),text:"Sell"})}return r},calc:(e,l)=>{const o=e.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=new Array(o).fill(null),c=new Array(o).fill(null),u={up:n,down:r,atrHigh:a,atrLow:i,buySignal:s,sellSignal:c};if(0===o)return u;const p=Math.max(1,Math.round(de(l,"amplitude",2))),y=de(l,"channelDeviation",2),f=!1!==l.showChannels,m=!1!==l.showSignals,d=e.map(e=>e.high),b=e.map(e=>e.low),h=t(d,b,e.map(e=>e.close),Math.max(1,Math.round(de(l,"atrPeriod",100)))),g=U(d,p),k=U(b,p),w=q(d,p),v=H(b,p);let C=0,N=0,M=b[0],A=d[0],x=0,S=0,L=!1;for(let l=0;l<o;l++){const t=h[l]/2,o=y*t,u=w[l],p=v[l],B=l>0?d[l-1]:d[0],K=l>0?b[l-1]:b[0],F=L?C:-1;let W;1===N?(Number.isFinite(p)&&(M=Math.max(p,M)),Number.isFinite(g[l])&&g[l]<M&&e[l].close<K&&(C=1,N=0,A=u)):(Number.isFinite(u)&&(A=Math.min(u,A)),Number.isFinite(k[l])&&k[l]>A&&e[l].close>B&&(C=0,N=1,M=p)),0===C?(1===F?(x=S,m&&Number.isFinite(t)&&(s[l]=x-t)):x=-1===F?M:Math.max(M,x),W=x):(0===F?(S=x,m&&Number.isFinite(t)&&(c[l]=S+t)):S=-1===F?A:Math.min(A,S),W=S),L=!0,Number.isFinite(W)&&(0===C?n[l]=W:r[l]=W,f&&Number.isFinite(o)&&(a[l]=W+o,i[l]=W-o))}return u}},We=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},De=e=>e.source??"close",Re=(e,l)=>new Array(e).fill(l);function Oe(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=l(e.slice(n),n);for(let e=0;e<r.length&&n+e<t;e++)o[n+e]=r[e];return o}const Te={id:"rsi",name:"RSI",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"Color",default:"#e0b020"},{key:"overbought",type:"number",label:"Overbought",default:70,min:50,max:100,step:1},{key:"oversold",type:"number",label:"Oversold",default:30,min:0,max:50,step:1},{key:"bandColor",type:"color",label:"Background",default:"#7e57c2"}],plots:[{key:"rsi",type:"line",title:"RSI",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["upperLevel","lowerLevel"],colorUpKey:"bandColor",colorDownKey:"bandColor",opacity:.1}],calc:(l,t)=>({rsi:$(u(e(l,De(t)),We(t,"length",14))),upperLevel:Re(l.length,We(t,"overbought",70)),lowerLevel:Re(l.length,We(t,"oversold",30))}),levels:e=>[{price:We(e,"overbought",70),color:"#ef5350",title:"OB",dashed:!0},{price:50,color:"#5a6b8c",title:"",dashed:!0},{price:We(e,"oversold",30),color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},Ue={id:"macd",name:"MACD",category:"Momentum",placement:"pane",inputs:[{key:"fastPeriod",type:"number",label:"Fast",default:12,min:1,max:500,step:1},{key:"slowPeriod",type:"number",label:"Slow",default:26,min:1,max:500,step:1},{key:"signalPeriod",type:"number",label:"Signal",default:9,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"macdColor",type:"color",label:"MACD",default:"#2962ff"},{key:"histUpColor",type:"color",label:"Histogram up",default:"#26a69a"},{key:"histUpFadeColor",type:"color",label:"Histogram up (weakening)",default:"#a7d8d2"},{key:"histDownColor",type:"color",label:"Histogram down",default:"#ef5350"},{key:"histDownFadeColor",type:"color",label:"Histogram down (weakening)",default:"#f5b0ae"},{key:"signalColor",type:"color",label:"Signal",default:"#ff6d00"}],plots:[{key:"histogram",type:"histogram",title:"Histogram",style:{color:"#3a4666",base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.histogram?.[l-1],r=null==n||!Number.isFinite(n)||e>=n,a=(e,l)=>{const t=o[e];return"string"==typeof t?t:l};return e>=0?r?a("histUpColor","#26a69a"):a("histUpFadeColor","#a7d8d2"):r?a("histDownFadeColor","#f5b0ae"):a("histDownColor","#ef5350")}},{key:"macd",type:"line",title:"MACD",colorKey:"macdColor",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,De(t)),n=z(o,We(t,"fastPeriod",12)),r=z(o,We(t,"slowPeriod",26)),a=n.map((e,l)=>e-r[l]),i=Oe(a,e=>z(e,We(t,"signalPeriod",9))),s=a.map((e,l)=>e-i[l]);return{macd:$(a),signal:$(i),histogram:$(s)}},levels:()=>[{price:0,color:"#5a6b8c",dashed:!0}]},Pe={id:"stochastic",name:"Stochastic",category:"Momentum",placement:"pane",inputs:[{key:"kPeriod",type:"number",label:"%K Length",default:14,min:1,max:500,step:1},{key:"kSmoothing",type:"number",label:"%K Smoothing",default:1,min:1,max:100,step:1},{key:"dPeriod",type:"number",label:"%D Smoothing",default:3,min:1,max:100,step:1},{key:"kColor",type:"color",label:"%K",default:"#4f8cff"},{key:"dColor",type:"color",label:"%D",default:"#f5a623"},{key:"bandColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"k",type:"line",title:"%K",colorKey:"kColor",style:{lineWidth:1.5}},{key:"d",type:"line",title:"%D",colorKey:"dColor",style:{lineWidth:1.5}}],fills:[{between:["upperLevel","lowerLevel"],colorUpKey:"bandColor",colorDownKey:"bandColor",opacity:.1}],calc:(e,l)=>{const t=q(e.map(e=>e.high),We(l,"kPeriod",14)),o=H(e.map(e=>e.low),We(l,"kPeriod",14)),n=e.map((e,l)=>{const n=t[l]-o[l];return n>0?(e.close-o[l])/n*100:NaN}),r=U(n,We(l,"kSmoothing",1)),a=U(r,We(l,"dPeriod",3));return{k:$(r),d:$(a),upperLevel:Re(e.length,80),lowerLevel:Re(e.length,20)}},levels:()=>[{price:80,color:"#ef5350",title:"OB",dashed:!0},{price:20,color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},Ie={id:"adx",name:"ADX / DMI",category:"Trend",placement:"pane",inputs:[{key:"period",type:"number",label:"DI Length",default:14,min:1,max:500,step:1},{key:"adxPeriod",type:"number",label:"ADX Smoothing",default:14,min:1,max:500,step:1},{key:"adxColor",type:"color",label:"ADX",default:"#e0e3ea"},{key:"plusColor",type:"color",label:"+DI",default:"#26a69a"},{key:"minusColor",type:"color",label:"-DI",default:"#ef5350"}],plots:[{key:"plusDi",type:"line",title:"+DI",colorKey:"plusColor",style:{lineWidth:1}},{key:"minusDi",type:"line",title:"-DI",colorKey:"minusColor",style:{lineWidth:1}},{key:"adx",type:"line",title:"ADX",colorKey:"adxColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=We(l,"period",14),n=e.map(e=>e.high),r=e.map(e=>e.low),a=e.map(e=>e.close),i=p(n,r,a);t>0&&(i[0]=NaN);const s=new Array(t).fill(NaN),c=new Array(t).fill(NaN);for(let e=1;e<t;e++){if(!(Number.isFinite(n[e])&&Number.isFinite(r[e])&&Number.isFinite(n[e-1])&&Number.isFinite(r[e-1])))continue;const l=n[e]-n[e-1],t=r[e-1]-r[e];s[e]=l>t&&l>0?l:0,c[e]=t>l&&t>0?t:0}const u=V(i,o),y=V(s,o),f=V(c,o),m=new Array(t).fill(NaN),d=new Array(t).fill(NaN),b=new Array(t).fill(NaN);for(let e=0;e<t;e++){const l=u[e];if(!Number.isFinite(l)||0===l)continue;const t=y[e]/l*100,o=f[e]/l*100;if(Number.isFinite(t)&&(m[e]=t),Number.isFinite(o)&&(d[e]=o),!Number.isFinite(m[e])||!Number.isFinite(d[e]))continue;const n=m[e]+d[e];b[e]=n>0?Math.abs(m[e]-d[e])/n*100:0}const h=b.findIndex(e=>Number.isFinite(e)),g=new Array(t).fill(NaN);if(h>=0){const e=V(b.slice(h),We(l,"adxPeriod",14));for(let l=0;l<e.length;l++)g[h+l]=e[l]}return{plusDi:$(m),minusDi:$(d),adx:$(g)}},levels:()=>[{price:25,color:"#5a6b8c",title:"25",dashed:!0}]},Ve={id:"cci",name:"CCI",category:"Momentum",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:20,min:1,max:500,step:1},{key:"constant",type:"number",label:"Constant",default:.015,min:.001,max:1,step:.001},{key:"color",type:"color",label:"Color",default:"#26c6da"},{key:"bandColor",type:"color",label:"Background",default:"#2196f3"},{key:"maType",type:"select",label:"Type",default:"SMA",options:[{label:"None",value:"None"},{label:"SMA",value:"SMA"},{label:"SMA + Bollinger Bands",value:"SMA + Bollinger Bands"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}],group:"Smoothing"},{key:"maLength",type:"number",label:"Length",default:20,min:1,max:500,step:1,group:"Smoothing"},{key:"bbMult",type:"number",label:"BB StdDev",default:2,min:.001,max:50,step:.5,group:"Smoothing"},{key:"maColor",type:"color",label:"CCI-based MA",default:"#ffeb3b",group:"Smoothing"},{key:"bbUpperColor",type:"color",label:"Upper Bollinger Band",default:"#4caf50",group:"Smoothing"},{key:"bbLowerColor",type:"color",label:"Lower Bollinger Band",default:"#4caf50",group:"Smoothing"}],plots:[{key:"cci",type:"line",title:"CCI",colorKey:"color",style:{lineWidth:1.5}},{key:"ma",type:"line",title:"CCI-based MA",colorKey:"maColor",style:{lineWidth:1.5}},{key:"bbUpper",type:"line",title:"Upper Bollinger Band",colorKey:"bbUpperColor",style:{lineWidth:1}},{key:"bbLower",type:"line",title:"Lower Bollinger Band",colorKey:"bbLowerColor",style:{lineWidth:1}}],fills:[{between:["upperLevel","lowerLevel"],colorUpKey:"bandColor",colorDownKey:"bandColor",opacity:.1},{between:["bbUpper","bbLower"],colorUpKey:"bbUpperColor",colorDownKey:"bbUpperColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=We(l,"period",20),n=We(l,"constant",.015),r=e.map(e=>(e.high+e.low+e.close)/3),a=U(r,o),i=new Array(t).fill(NaN);for(let e=o-1;e<t;e++){let l=0;for(let t=0;t<o;t++)l+=Math.abs(r[e-t]-a[e]);const t=l/o;i[e]=t>0?(r[e]-a[e])/(n*t):0}const s=((e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t})(l,"maType","SMA"),c=((e,l,t,o=1)=>Math.max(o,Math.round(We(e,l,t))))(l,"maLength",20),u=We(l,"bbMult",2),p="None"===s?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return Oe(l,e=>z(e,o));case"SMMA (RMA)":return Oe(l,e=>V(e,o));case"WMA":return Oe(l,e=>P(e,o));case"VWMA":return Oe(l,(e,l)=>X(e,t.slice(l),o));default:return Oe(l,e=>U(e,o))}}(s,i,e.map(e=>e.volume??0),c),y="SMA + Bollinger Bands"===s?Oe(i,e=>E(e,c)).map(e=>e*u):new Array(t).fill(NaN);return{cci:$(i),ma:$(p),bbUpper:$(p.map((e,l)=>e+y[l])),bbLower:$(p.map((e,l)=>e-y[l])),upperLevel:Re(t,100),lowerLevel:Re(t,-100)}},levels:()=>[{price:100,color:"#ef5350",dashed:!0},{price:0,color:"#5a6b8c",dashed:!0},{price:-100,color:"#26a69a",dashed:!0}]},Ee={id:"mfi",name:"Money Flow Index",category:"Momentum",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#ab47bc"},{key:"bandColor",type:"color",label:"Background",default:"#7e57c2"}],plots:[{key:"mfi",type:"line",title:"MFI",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["upperLevel","lowerLevel"],colorUpKey:"bandColor",colorDownKey:"bandColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=We(l,"period",14),n=e.map(e=>(e.high+e.low+e.close)/3),r=new Array(t).fill(0),a=new Array(t).fill(0);for(let l=1;l<t;l++){const t=e[l].volume??0;if(!Number.isFinite(n[l])||!Number.isFinite(n[l-1])||!Number.isFinite(t)){r[l]=NaN,a[l]=NaN;continue}const o=n[l]*t,i=Number.isFinite(o)?o:NaN;n[l]>n[l-1]?r[l]=i:n[l]<n[l-1]&&(a[l]=i)}const i=new Array(t).fill(NaN);for(let e=o;e<t;e++){let l=0,t=0;for(let n=e-o+1;n<=e;n++)l+=r[n],t+=a[n];Number.isFinite(l)&&Number.isFinite(t)&&(i[e]=0===t?100:100-100/(1+l/t))}return{mfi:$(i),upperLevel:Re(t,80),lowerLevel:Re(t,20)}},levels:()=>[{price:80,color:"#ef5350",title:"OB",dashed:!0},{price:20,color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},qe={id:"atr",name:"ATR",category:"Volatility",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#f5a623"}],plots:[{key:"atr",type:"line",title:"ATR",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>({atr:$(t(e.map(e=>e.high),e.map(e=>e.low),e.map(e=>e.close),We(l,"period",14)))})},He={id:"williams-vix-fix",name:"William VIX FIX",category:"Volatility",placement:"pane",inputs:[{key:"pd",type:"number",label:"LookBack Period Standard Deviation High",default:22,min:1,max:500,step:1},{key:"bbl",type:"number",label:"Bollinger Band Length",default:20,min:1,max:500,step:1},{key:"mult",type:"number",label:"Bollinger Band Standard Deviation Up",default:2,min:1,max:5,step:.1},{key:"lb",type:"number",label:"Look Back Period Percentile High",default:50,min:1,max:500,step:1},{key:"ph",type:"number",label:"Highest Percentile",default:.85,min:0,max:1,step:.01},{key:"pl",type:"number",label:"Lowest Percentile",default:1.01,min:1,max:2,step:.01},{key:"hp",type:"boolean",label:"Show High Range",default:!1},{key:"sd",type:"boolean",label:"Show Standard Deviation Line",default:!1},{key:"highColor",type:"color",label:"Alert",default:"#00ff00"},{key:"normalColor",type:"color",label:"Normal",default:"#808080"},{key:"rangeColor",type:"color",label:"Range",default:"#ffa500"},{key:"bandColor",type:"color",label:"Band",default:"#00ffff"}],plots:[{key:"wvf",type:"histogram",title:"Williams Vix Fix",style:{lineWidth:4,base:0},colorBy:({index:e,values:l,settings:t})=>{const o=l.wvf?.[e],n=l.alertUpper?.[e],r=l.alertHigh?.[e],a=(e,l)=>"string"==typeof t[e]?t[e]:l;if(null==o)return;return null!=n&&o>=n||null!=r&&o>=r?a("highColor","#00ff00"):a("normalColor","#808080")}},{key:"rangeHigh",type:"line",title:"Range High Percentile",colorKey:"rangeColor",style:{lineWidth:4}},{key:"rangeLow",type:"line",title:"Range Low Percentile",colorKey:"rangeColor",style:{lineWidth:4}},{key:"upperBand",type:"line",title:"Upper Band",colorKey:"bandColor",style:{lineWidth:3}}],calc:(e,l)=>{const t=e.length,o=e.map(e=>e.close),n=e.map(e=>e.low),r=We(l,"pd",22),a=We(l,"bbl",20),i=We(l,"mult",2),s=We(l,"lb",50),c=We(l,"ph",.85),u=We(l,"pl",1.01),p=!0===l.hp,y=!0===l.sd,f=q(o,r),m=new Array(t);for(let e=0;e<t;e++){const l=f[e];m[e]=Number.isFinite(l)&&0!==l?(l-n[e])/l*100:NaN}const d=E(m,a),b=U(m,a),h=q(m,s),g=H(m,s),k=new Array(t),w=new Array(t),v=new Array(t),C=new Array(t),N=new Array(t);for(let e=0;e<t;e++){const l=b[e]+i*d[e],t=h[e]*c,o=g[e]*u;k[e]=Number.isFinite(l)?l:null,w[e]=Number.isFinite(t)?t:null,v[e]=y?k[e]:null,C[e]=p?w[e]:null,N[e]=p&&Number.isFinite(o)?o:null}return{wvf:$(m),rangeHigh:C,rangeLow:N,upperBand:v,alertUpper:k,alertHigh:w}}},$e=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},ze=(e,l,t,o=1)=>Math.max(o,Math.round($e(e,l,t))),je=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t};const Ze={id:"volume",name:"Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#3a4666"},{key:"colorByDirection",type:"boolean",label:"Match candle direction",default:!1},{key:"upColor",type:"color",label:"Up candle",default:"#26a69a"},{key:"downColor",type:"color",label:"Down candle",default:"#ef5350"},{key:"showMA",type:"boolean",label:"Show moving average",default:!1,group:"Moving average"},{key:"maPeriod",type:"number",label:"Period",default:20,min:1,max:500,step:1,group:"Moving average"},{key:"maColor",type:"color",label:"Color",default:"#e6b53c",group:"Moving average"}],plots:[{key:"volume",type:"histogram",title:"Volume",colorKey:"color",style:{base:0},colorBy:({index:e,values:l,settings:t})=>!0===t.colorByDirection?-1===l.direction[e]?je(t,"downColor","#ef5350"):je(t,"upColor","#26a69a"):void 0},{key:"ma",type:"line",title:"Volume average",colorKey:"maColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.map(e=>e.volume??0);return{volume:$(t),direction:e.map(e=>e.close>=e.open?1:-1),ma:!0===l.showMA?$(U(t,ze(l,"maPeriod",20))):t.map(()=>null)}}},Ye={id:"obv",name:"On-Balance Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#26c6da"},{key:"maType",type:"select",label:"Type",default:"None",options:[{label:"None",value:"None"},{label:"SMA",value:"SMA"},{label:"SMA + Bollinger Bands",value:"SMA + Bollinger Bands"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}],group:"Smoothing"},{key:"maLength",type:"number",label:"Length",default:9,min:1,max:500,step:1,group:"Smoothing"},{key:"bbMult",type:"number",label:"BB StdDev",default:2,min:.001,max:50,step:.5,group:"Smoothing"},{key:"maColor",type:"color",label:"OBV-based MA",default:"#ffeb3b",group:"Smoothing"},{key:"bbUpperColor",type:"color",label:"Upper Bollinger Band",default:"#4caf50",group:"Smoothing"},{key:"bbLowerColor",type:"color",label:"Lower Bollinger Band",default:"#4caf50",group:"Smoothing"}],plots:[{key:"obv",type:"line",title:"OBV",colorKey:"color",style:{lineWidth:1.5}},{key:"ma",type:"line",title:"OBV-based MA",colorKey:"maColor",style:{lineWidth:1.5}},{key:"bbUpper",type:"line",title:"Upper Bollinger Band",colorKey:"bbUpperColor",style:{lineWidth:1}},{key:"bbLower",type:"line",title:"Lower Bollinger Band",colorKey:"bbLowerColor",style:{lineWidth:1}}],fills:[{between:["bbUpper","bbLower"],colorUpKey:"bbUpperColor",colorDownKey:"bbUpperColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=new Array(t).fill(NaN);let n=0;for(let l=0;l<t;l++){if(l>0){const t=e[l].volume??0;e[l].close>e[l-1].close?n+=t:e[l].close<e[l-1].close&&(n-=t)}o[l]=n}const r=je(l,"maType","None"),a=ze(l,"maLength",9),i=$e(l,"bbMult",2),s="None"===r?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return z(l,o);case"SMMA (RMA)":return V(l,o);case"WMA":return P(l,o);case"VWMA":return X(l,t,o);default:return U(l,o)}}(r,o,e.map(e=>e.volume??0),a),c="SMA + Bollinger Bands"===r?E(o,a).map(e=>e*i):new Array(t).fill(NaN);return{obv:$(o),ma:$(s),bbUpper:$(s.map((e,l)=>e+c[l])),bbLower:$(s.map((e,l)=>e-c[l]))}}},Je={id:"adl",name:"Accumulation/Distribution",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#4f8cff"}],plots:[{key:"adl",type:"line",title:"A/D Line",colorKey:"color",style:{lineWidth:1.5}}],calc:e=>{const l=new Array(e.length).fill(NaN);let t=0;for(let o=0;o<e.length;o++){const n=e[o],r=n.high-n.low;r>0&&(t+=(n.close-n.low-(n.high-n.close))/r*(n.volume??0)),l[o]=t}return{adl:$(l)}}},Ge=e=>void 0!==e&&Number.isFinite(e)?e:null,Xe=(e,l,t)=>"string"==typeof e[l]&&""!==e[l]?e[l]:t,_e={id:"open-interest",name:"Open Interest",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Open interest",default:"#26c6da"}],plots:[{key:"oi",type:"line",title:"Open interest",colorKey:"color",priceFormat:{type:"volume"},style:{lineWidth:1.5}}],calc:e=>({oi:e.map(e=>Ge(e.oi))})},Qe={id:"open-interest-change",name:"Open Interest Change",category:"Volume",placement:"pane",inputs:[{key:"upColor",type:"color",label:"Increase",default:"#26a69a"},{key:"downColor",type:"color",label:"Decrease",default:"#ef5350"}],plots:[{key:"change",type:"histogram",title:"OI change",colorKey:"upColor",style:{base:0},priceFormat:{type:"volume"},colorBy:({value:e,settings:l})=>{const t=e<0?Xe(l,"downColor","#ef5350"):Xe(l,"upColor","#26a69a"),o=l["change:opacity"];return"number"==typeof o&&Number.isFinite(o)&&o<100?y(t,Math.max(0,o)/100):t}}],calc:e=>({change:e.map((l,t)=>{const o=Ge(l.oi),n=Ge(e[t-1]?.oi);return null===o||null===n?null:o-n})})},el=[["longBuildupColor","#26a69a"],["shortBuildupColor","#ef5350"],["shortCoveringColor","#42a5f5"],["longUnwindingColor","#ffb74d"]],ll={id:"open-interest-buildup",name:"Open Interest Buildup",category:"Volume",placement:"onchart",inputs:[{key:"longBuildupColor",type:"color",label:"Long buildup",default:"#26a69a"},{key:"shortBuildupColor",type:"color",label:"Short buildup",default:"#ef5350"},{key:"shortCoveringColor",type:"color",label:"Short covering",default:"#42a5f5"},{key:"longUnwindingColor",type:"color",label:"Long unwinding",default:"#ffb74d"},{key:"unchanged",type:"select",label:"Unchanged reading",default:"neutral",options:[{value:"neutral",label:"Neutral"},{value:"up",label:"Treat as up"}]}],plots:[],calc:(e,l)=>({state:e.map((t,o)=>{const n=e[o-1],r=Ge(t.oi),a=Ge(n?.oi);if(void 0===n||null===r||null===a)return null;const i=t.close-n.close,s=r-a;return Number.isFinite(i)&&("up"===l.unchanged||0!==i&&0!==s)?s>=0?i>=0?1:2:i>=0?3:4:null})}),barColors:({values:e,settings:l})=>e.state.map(e=>{if(null===e)return null;const[t,o]=el[e-1];return Xe(l,t,o)})},tl=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},ol=(e,l,t,o=1)=>Math.max(o,Math.round(tl(e,l,t))),nl=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},rl=(e,l="source")=>e[l]??"close",al=e=>e.map(e=>e.high),il=e=>e.map(e=>e.low);function sl(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=z(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}function cl(e,l,t){const o=e.length,n=new Array(o).fill(NaN);if(l<=0)return n;for(let r=l-1;r<o;r++){let o=t?-1/0:1/0,a=!0;for(let n=0;n<l;n++){const l=e[r-n];if(!Number.isFinite(l)){a=!1;break}(t?l>o:l<o)&&(o=l)}a&&(n[r]=o)}return n}function ul(e,l){const t=e.length,o=new Array(t).fill(NaN);for(let n=0;n<t;n++){const r=n-l;r>=0&&r<t&&(o[n]=e[r])}return o}const pl=.05,yl={id:"alma",name:"Arnaud Legoux Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"offset",type:"number",label:"Offset",default:.85,min:0,max:1,step:.01},{key:"sigma",type:"number",label:"Sigma",default:6,min:.1,max:100,step:.1},{key:"color",type:"color",label:"ALMA",default:"#2962ff"}],plots:[{key:"alma",type:"line",title:"ALMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>({alma:$(G(e(l,"close"),ol(t,"length",9),tl(t,"offset",.85),tl(t,"sigma",6)))})},fl={id:"dema",name:"Double EMA",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"DEMA",default:"#43a047"}],plots:[{key:"dema",type:"line",title:"DEMA",colorKey:"color",style:{color:"#43a047",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,rl(t)),n=ol(t,"length",9),r=z(o,n),a=sl(r,n);return{dema:$(r.map((e,l)=>2*e-a[l]))}}},ml={id:"hma",name:"Hull Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"HMA",default:"#2962ff"}],plots:[{key:"hma",type:"line",title:"HMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>({hma:$(xl(e(l,rl(t)),ol(t,"length",9)))})},dl={id:"envelope",name:"Envelope",category:"Volatility",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:1e3,step:1},{key:"percent",type:"number",label:"Percent",default:10,min:0,max:100,step:.1},{key:"source",type:"source",label:"Source",default:"close"},{key:"exponential",type:"boolean",label:"Exponential",default:!1},{key:"basisColor",type:"color",label:"Basis",default:"#ff6d00"},{key:"bandColor",type:"color",label:"Bands",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"Env Upper",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}},{key:"basis",type:"line",title:"Env Basis",colorKey:"basisColor",style:{color:"#ff6d00",lineWidth:1.5}},{key:"lower",type:"line",title:"Env Lower",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:pl}],calc:(l,t)=>{const o=e(l,rl(t)),n=ol(t,"length",20),r=tl(t,"percent",10)/100,a=!0===t.exponential?z(o,n):U(o,n);return{upper:$(a.map(e=>e*(1+r))),basis:$(a),lower:$(a.map(e=>e*(1-r)))}}},bl={id:"donchian",name:"Donchian Channels",category:"Volatility",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:1e3,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"basisColor",type:"color",label:"Basis",default:"#ff6d00"},{key:"bandColor",type:"color",label:"Bands",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"DC Upper",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}},{key:"basis",type:"line",title:"DC Basis",colorKey:"basisColor",style:{color:"#ff6d00",lineWidth:1.5}},{key:"lower",type:"line",title:"DC Lower",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:pl}],calc:(e,l)=>{const t=ol(l,"length",20),o=Math.round(tl(l,"offset",0)),n=q(al(e),t),r=H(il(e),t),a=n.map((e,l)=>(e+r[l])/2);return{upper:$(ul(n,o)),basis:$(ul(a,o)),lower:$(ul(r,o))}}},hl={id:"chande-kroll-stop",name:"Chande Kroll Stop",category:"Trend",placement:"onchart",inputs:[{key:"p",type:"number",label:"ATR Length (p)",default:10,min:1,max:500,step:1},{key:"x",type:"number",label:"ATR Coefficient (x)",default:1,min:1,max:100,step:1},{key:"q",type:"number",label:"Stop Length (q)",default:9,min:1,max:500,step:1},{key:"longColor",type:"color",label:"Stop Long",default:"#2962ff"},{key:"shortColor",type:"color",label:"Stop Short",default:"#ff6d00"}],plots:[{key:"stopLong",type:"line",title:"Stop Long",colorKey:"longColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"stopShort",type:"line",title:"Stop Short",colorKey:"shortColor",style:{color:"#ff6d00",lineWidth:1.5}}],calc:(e,l)=>{const o=ol(l,"p",10),n=ol(l,"x",1),r=ol(l,"q",9),a=al(e),i=il(e),s=t(a,i,e.map(e=>e.close),o),c=q(a,o).map((e,l)=>e-n*s[l]);return{stopLong:$(cl(H(i,o).map((e,l)=>e+n*s[l]),r,!1)),stopShort:$(cl(c,r,!0))}}},gl={id:"chandelier-exit",name:"Chandelier Exit",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:22,min:1,max:500,step:1},{key:"atrLength",type:"number",label:"ATR length",default:22,min:1,max:500,step:1},{key:"atrMultiplier",type:"number",label:"ATR multiplier",default:3,min:0,max:50,step:.01},{key:"longColor",type:"color",label:"Long exit",default:"#2962ff"},{key:"shortColor",type:"color",label:"Short exit",default:"#ff6d00"}],plots:[{key:"longExit",type:"line",title:"Long Exit",colorKey:"longColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"shortExit",type:"line",title:"Short Exit",colorKey:"shortColor",style:{color:"#ff6d00",lineWidth:1.5}}],calc:(e,l)=>{const o=ol(l,"length",22),n=tl(l,"atrMultiplier",3),r=al(e),a=il(e),i=t(r,a,e.map(e=>e.close),ol(l,"atrLength",22));return{longExit:$(q(r,o).map((e,l)=>e-n*i[l])),shortExit:$(H(a,o).map((e,l)=>e+n*i[l]))}}};const kl={id:"standard-error-bands",name:"Standard Error Bands",category:"Volatility",placement:"onchart",inputs:[{key:"periods",type:"number",label:"Periods",default:21,min:3,max:1e3,step:1},{key:"errors",type:"number",label:"Standard Errors",default:2,min:0,max:100,step:.1},{key:"method",type:"select",label:"Method",default:"Simple",options:[{label:"Simple",value:"Simple"},{label:"Exponential",value:"Exponential"},{label:"Weighted",value:"Weighted"}]},{key:"averagePeriods",type:"number",label:"Averaging Periods",default:3,min:1,max:1e3,step:1},{key:"basisColor",type:"color",label:"Basis",default:"#ff6d00"},{key:"bandColor",type:"color",label:"Bands",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"SEB Upper",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}},{key:"basis",type:"line",title:"SEB Basis",colorKey:"basisColor",style:{color:"#ff6d00",lineWidth:1.5}},{key:"lower",type:"line",title:"SEB Lower",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:pl}],calc:(l,t)=>{const o=e(l,"close"),n=ol(t,"periods",21,3),r=tl(t,"errors",2),a=ol(t,"averagePeriods",3),i=function(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<3||t<l)return o;const n=(l+1)/2;for(let r=l-1;r<t;r++){let t=0;for(let o=0;o<l;o++)t+=e[r-o];const a=t/l;let i=0,s=0,c=0;for(let t=0;t<l;t++){const l=a-e[r-t],o=n-t-1;i+=l*l,s+=o*l,c+=o*o}o[r]=Math.sqrt((i-s*s/c)/(l-2))}return o}(o,n),s=oe(o,n,0),c=e=>$("Exponential"===t.method?sl(e,a):"Weighted"===t.method?P(e,a):U(e,a));return{upper:c(s.map((e,l)=>e+r*i[l])),basis:c(s),lower:c(s.map((e,l)=>e-r*i[l]))}}},wl={id:"ma-channel",name:"Moving Average Channel",category:"Volatility",placement:"onchart",inputs:[{key:"upperLength",type:"number",label:"Upper Length",default:20,min:1,max:1e3,step:1},{key:"lowerLength",type:"number",label:"Lower Length",default:20,min:1,max:1e3,step:1},{key:"upperOffset",type:"number",label:"Upper Offset",default:0,min:-500,max:500,step:1},{key:"lowerOffset",type:"number",label:"Lower Offset",default:0,min:-500,max:500,step:1},{key:"upperColor",type:"color",label:"Upper",default:"#2962ff"},{key:"lowerColor",type:"color",label:"Lower",default:"#ff6d00"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"MAC Upper",colorKey:"upperColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"lower",type:"line",title:"MAC Lower",colorKey:"lowerColor",style:{color:"#ff6d00",lineWidth:1.5}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:pl}],calc:(e,l)=>({upper:$(ul(U(al(e),ol(l,"upperLength",20)),Math.round(tl(l,"upperOffset",0)))),lower:$(ul(U(il(e),ol(l,"lowerLength",20)),Math.round(tl(l,"lowerOffset",0))))})},vl="#00ff00",Cl="#ff0000",Nl="#ff9800",Ml=e=>Math.max(1,Math.floor(e)),Al=e=>Math.max(1,Math.round(Math.sqrt(e)));function xl(e,l){const t=P(e,Ml(l/2)),o=P(e,l);return P(t.map((e,l)=>2*e-o[l]),Al(l))}function Sl(e,l,t){return"Ehma"===l?function(e,l){const t=z(e,Ml(l/2)),o=z(e,l);return sl(t.map((e,l)=>2*e-o[l]),Al(l))}(e,t):"Thma"===l?function(e,l){const t=P(e,Ml(l/3)),o=P(e,Ml(l/2)),n=P(e,l);return P(t.map((e,l)=>3*e-o[l]-n[l]),l)}(e,Ml(t/2)):xl(e,t)}const Ll=(e,l,t)=>{if(!1===t.switchColor)return nl(t,"neutralColor",Nl);const o=e?.[l],n=e?.[l-2];return"number"==typeof o&&"number"==typeof n&&o>n?nl(t,"bullishColor",vl):nl(t,"bearishColor",Cl)},Bl={id:"hull-suite",name:"Hull Suite",category:"Trend",placement:"onchart",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"mode",type:"select",label:"Variation",default:"Hma",options:[{label:"HMA",value:"Hma"},{label:"THMA",value:"Thma"},{label:"EHMA",value:"Ehma"}]},{key:"length",type:"number",label:"Length",default:55,min:1,max:1e3,step:1},{key:"lengthMult",type:"number",label:"Length Multiplier",default:1,min:.1,max:10,step:.1},{key:"switchColor",type:"boolean",label:"Color Hull By Trend",default:!0},{key:"candleCol",type:"boolean",label:"Color Candles By Trend",default:!1},{key:"visualSwitch",type:"boolean",label:"Show Band",default:!0},{key:"bullishColor",type:"color",label:"Bullish Color",default:vl},{key:"bearishColor",type:"color",label:"Bearish Color",default:Cl},{key:"neutralColor",type:"color",label:"Neutral Color",default:Nl}],plots:[{key:"mhull",type:"line",title:"Hull",colorKey:"neutralColor",style:{color:Nl,lineWidth:2},colorBy:({index:e,values:l,settings:t})=>Ll(l.mhull,e,t)},{key:"shull",type:"line",title:"Hull Displaced",colorKey:"neutralColor",style:{color:Nl,lineWidth:2},colorBy:({index:e,values:l,settings:t})=>Ll(l.mhull,e,t)}],fills:[{between:["mhull","shull"],colorUp:vl,colorDown:Cl,colorUpKey:"bullishColor",colorDownKey:"bearishColor",opacity:.6}],calc:(l,t)=>{const o=e(l,rl(t)),n=Ml(ol(t,"length",55)*tl(t,"lengthMult",1)),r=Sl(o,nl(t,"mode","Hma"),n),a=!1!==t.visualSwitch;return{mhull:$(r),shull:$(a?ul(r,2):new Array(r.length).fill(NaN))}},barColors:({bars:e,values:l,settings:t})=>!0===t.candleCol?e.map((e,o)=>Ll(l.mhull,o,t)):e.map(()=>null)},Kl=[yl,fl,ml,dl,bl,hl,gl,kl,wl,Bl],Fl=(e,l,t)=>Math.max(1,Math.floor(((e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t})(e,l,t))),Wl=l=>e(l,"hl2"),Dl={id:"aroon",name:"Aroon",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"upColor",type:"color",label:"Aroon Up",default:"#fb8c00"},{key:"downColor",type:"color",label:"Aroon Down",default:"#2962ff"}],plots:[{key:"up",type:"line",title:"Aroon Up",colorKey:"upColor",style:{lineWidth:1.5}},{key:"down",type:"line",title:"Aroon Down",colorKey:"downColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Fl(l,"length",14),o=_(e.map(e=>e.high),t+1),n=Q(e.map(e=>e.low),t+1),r=e=>e.map(e=>100*(e+t)/t);return{up:$(r(o)),down:$(r(n))}},levels:()=>[{price:50,color:"#5a6b8c",dashed:!0}],range:()=>({min:0,max:100})},Rl={id:"aroon-oscillator",name:"Aroon Oscillator",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"upColor",type:"color",label:"Positive",default:"#4caf50"},{key:"downColor",type:"color",label:"Negative",default:"#ff5252"}],plots:[{key:"osc",type:"line",title:"Oscillator",colorKey:"upColor",style:{lineWidth:1.5}}],fills:[{between:["osc","zero"],colorUpKey:"upColor",colorDownKey:"downColor",opacity:.1}],calc:(e,l)=>{const t=Fl(l,"length",14),o=_(e.map(e=>e.high),t+1),n=Q(e.map(e=>e.low),t+1),r=o.map((e,l)=>100*(e-n[l])/t);return{osc:$(r),zero:r.map(e=>Number.isFinite(e)?0:null)}},levels:()=>[{price:90,color:"#5a6b8c",title:"Upper level",dashed:!0},{price:0,color:"#787b86"},{price:-90,color:"#5a6b8c",title:"Lower level",dashed:!0}],range:()=>({min:-100,max:100})},Ol={id:"awesome-oscillator",name:"Awesome Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"upColor",type:"color",label:"Rising",default:"#009688"},{key:"downColor",type:"color",label:"Falling",default:"#f44336"}],plots:[{key:"ao",type:"column",title:"AO",colorKey:"upColor",style:{base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.ao?.[l-1],r=(e,l)=>"string"==typeof o[e]?o[e]:l;return null==n||!Number.isFinite(n)||e-n>0?r("upColor","#009688"):r("downColor","#f44336")}}],calc:e=>{const l=Wl(e),t=U(l,5),o=U(l,34);return{ao:$(t.map((e,l)=>e-o[l]))}},levels:()=>[{price:0,color:"#787b86"}]},Tl={id:"balance-of-power",name:"Balance of Power",category:"Momentum",placement:"pane",inputs:[{key:"color",type:"color",label:"BOP",default:"#ff5252"}],plots:[{key:"bop",type:"line",title:"BOP",colorKey:"color",style:{lineWidth:1.5}}],calc:e=>({bop:e.map(e=>{const l=e.high-e.low,t=e.close-e.open;if(0===l||!Number.isFinite(l)||!Number.isFinite(t))return null;const o=t/l;return Number.isFinite(o)?o:null})}),levels:()=>[{price:0,color:"#787b86"}]},Ul={id:"chande-momentum",name:"Chande Momentum Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"Chande MO",default:"#2962ff"}],plots:[{key:"cmo",type:"line",title:"Chande MO",colorKey:"color",style:{lineWidth:1.5}}],calc:(l,t)=>{const o=l.length,n=Fl(t,"length",9),r=j(e(l,(e=>e.source??"close")(t))),a=new Array(Math.max(0,o-1)),i=new Array(Math.max(0,o-1));for(let e=1;e<o;e++){const l=r[e];a[e-1]=l>=0?l:0,i[e-1]=l>=0?0:-l}const s=le(a,n),c=le(i,n),u=new Array(o).fill(NaN);for(let e=0;e<s.length;e++){const l=s[e]+c[e];u[e+1]=0===l?NaN:100*(s[e]-c[e])/l}return{cmo:$(u)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]},Pl={id:"coppock-curve",name:"Coppock Curve",category:"Momentum",placement:"pane",inputs:[{key:"wmaLength",type:"number",label:"WMA Length",default:10,min:1,max:500,step:1},{key:"longRoCLength",type:"number",label:"Long RoC Length",default:14,min:1,max:500,step:1},{key:"shortRoCLength",type:"number",label:"Short RoC Length",default:11,min:1,max:500,step:1},{key:"color",type:"color",label:"Coppock Curve",default:"#2962ff"}],plots:[{key:"curve",type:"line",title:"Coppock Curve",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.map(e=>e.close),o=Z(t,Fl(l,"longRoCLength",14)),n=Z(t,Fl(l,"shortRoCLength",11));return{curve:$(P(o.map((e,l)=>e+n[l]),Fl(l,"wmaLength",10)))}}},Il={id:"dpo",name:"Detrended Price Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:21,min:1,max:500,step:1},{key:"isCentered",type:"boolean",label:"Centered",default:!1},{key:"color",type:"color",label:"DPO",default:"#43a047"}],plots:[{key:"dpo",type:"line",title:"DPO",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=Fl(l,"period",21),n=Math.floor(o/2)+1,r=e.map(e=>e.close),a=U(r,o),i=new Array(t).fill(NaN);if(!0===l.isCentered)for(let e=0;e+n<t;e++)i[e]=r[e]-a[e+n];else for(let e=n;e<t;e++)i[e]=r[e]-a[e-n];return{dpo:$(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line"}]},Vl={id:"fisher-transform",name:"Fisher Transform",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:500,step:1},{key:"fisherColor",type:"color",label:"Fisher",default:"#2962ff"},{key:"triggerColor",type:"color",label:"Trigger",default:"#ff6d00"}],plots:[{key:"fisher",type:"line",title:"Fisher",colorKey:"fisherColor",style:{lineWidth:1.5}},{key:"trigger",type:"line",title:"Trigger",colorKey:"triggerColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=Fl(l,"length",9),n=Wl(e),r=q(n,o),a=H(n,o),i=new Array(t).fill(NaN);let s=0,c=0;for(let e=0;e<t;e++){const l=r[e]-a[e];if(!Number.isFinite(l)){s=0,c=0;continue}const t=.66*((n[e]-a[e])/Math.max(l,.001)-.5)+.67*s,o=t>.99?.999:t<-.99?-.999:t,u=.5*Math.log((1+o)/(1-o))+.5*c;i[e]=u,s=o,c=u}const u=new Array(t).fill(NaN);for(let e=1;e<t;e++)u[e]=i[e-1];return{fisher:$(i),trigger:$(u)}},levels:()=>[{price:1.5,color:"#e91e63",title:"1.5"},{price:.75,color:"#787b86",title:"0.75"},{price:0,color:"#e91e63",title:"0"},{price:-.75,color:"#787b86",title:"-0.75"},{price:-1.5,color:"#e91e63",title:"-1.5"}]};function El(e){const l=e.length,t=new Array(l).fill(0);for(let o=0;o<l;o++){const l=o>0?t[o-1]:0;o>0&&e[o]===e[o-1]?t[o]=0:o>0&&e[o]>e[o-1]?t[o]=l<=0?1:l+1:t[o]=l>=0?-1:l-1}return t}const ql={id:"connors-rsi",name:"Connors RSI",category:"Momentum",placement:"pane",inputs:[{key:"lenrsi",type:"number",label:"RSI Length",default:3,min:1,max:500,step:1},{key:"lenupdown",type:"number",label:"UpDown Length",default:2,min:1,max:500,step:1},{key:"lenroc",type:"number",label:"ROC Length",default:100,min:1,max:1e3,step:1},{key:"color",type:"color",label:"CRSI",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"crsi",type:"line",title:"CRSI",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=e.map(e=>e.close),n=u(o,Fl(l,"lenrsi",3)),r=u(El(o),Fl(l,"lenupdown",2)),a=J(Z(o,1).slice(1),Fl(l,"lenroc",100)),i=new Array(t).fill(NaN);for(let e=0;e<a.length;e++)i[e+1]=a[e];const s=new Array(t);for(let e=0;e<t;e++)s[e]=(n[e]+r[e]+i[e])/3;return{crsi:$(s),bandHigh:new Array(t).fill(70),bandLow:new Array(t).fill(30)}},levels:()=>[{price:70,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band",dashed:!0},{price:30,color:"#787b86",title:"Lower Band"}],range:()=>({min:0,max:100})},Hl=[Dl,Rl,Ol,Tl,Ul,Pl,Il,Vl,ql];function $l(e,l){return`${e}${Math.round(255*(1-l/100)).toString(16).padStart(2,"0")}`}const zl=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},jl=e=>e.source??"close",Zl=(e,l,t)=>"string"==typeof e[l]?e[l]:t;function Yl(e,l,t){const o=e.length,n=U(e,l),r=E(e,l),a=new Array(o),i=new Array(o);for(let e=0;e<o;e++){const l=t*r[e];a[e]=n[e]+l,i[e]=n[e]-l}return{middle:n,upper:a,lower:i}}function Jl(e,l){const t=e.length;if(0===l)return e.slice();const o=new Array(t).fill(NaN);for(let n=0;n<t;n++){const r=n+l;r>=0&&r<t&&(o[r]=e[n])}return o}const Gl={id:"bollinger-percent-b",name:"Bollinger Bands %b",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:2e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"mult",type:"number",label:"StdDev",default:2,min:.001,max:50,step:.1},{key:"color",type:"color",label:"Bollinger Bands %b",default:"#2962ff"},{key:"fillColor",type:"color",label:"Middle Background",default:"#2962ff"}],plots:[{key:"percentB",type:"line",title:"Bollinger Bands %b",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(l,t)=>{const o=e(l,jl(t)),{upper:n,lower:r}=Yl(o,zl(t,"length",20),zl(t,"mult",2)),a=new Array(o.length);for(let e=0;e<o.length;e++){const l=n[e]-r[e];a[e]=l>0?(o[e]-r[e])/l:NaN}return{percentB:$(a),bandHigh:new Array(l.length).fill(1),bandLow:new Array(l.length).fill(0)}},levels:()=>[{price:1,color:"#f23645",title:"Overbought",dashed:!0},{price:.5,color:"#2962ff",title:"Middle Band"},{price:0,color:"#089981",title:"Oversold",dashed:!0}]},Xl={id:"bollinger-bandwidth",name:"Bollinger BandWidth",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:2e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"mult",type:"number",label:"StdDev",default:2,min:.001,max:50,step:.1},{key:"expansionLength",type:"number",label:"Highest Expansion Length",default:125,min:1,max:5e3,step:1,tooltip:"Bars searched for the widest bandwidth reading, drawn as the upper reference line."},{key:"contractionLength",type:"number",label:"Lowest Contraction Length",default:125,min:1,max:5e3,step:1,tooltip:"Bars searched for the narrowest bandwidth reading, drawn as the lower reference line. A squeeze is price sitting on it."},{key:"color",type:"color",label:"Bollinger BandWidth",default:"#2962ff"},{key:"expansionColor",type:"color",label:"Highest Expansion",default:"#f23645"},{key:"contractionColor",type:"color",label:"Lowest Contraction",default:"#089981"}],plots:[{key:"bandwidth",type:"line",title:"Bollinger BandWidth",colorKey:"color",style:{lineWidth:1.5},priceFormat:{type:"percent"}},{key:"expansion",type:"line",title:"Highest Expansion",colorKey:"expansionColor",style:{lineWidth:1}},{key:"contraction",type:"line",title:"Lowest Contraction",colorKey:"contractionColor",style:{lineWidth:1}}],calc:(l,t)=>{const o=e(l,jl(t)),{middle:n,upper:r,lower:a}=Yl(o,zl(t,"length",20),zl(t,"mult",2)),i=new Array(o.length);for(let e=0;e<o.length;e++)i[e]=0===n[e]?NaN:(r[e]-a[e])/n[e]*100;return{bandwidth:$(i),expansion:$(q(i,zl(t,"expansionLength",125))),contraction:$(H(i,zl(t,"contractionLength",125)))}}},_l={id:"bb-trend",name:"BBTrend",category:"Volatility",placement:"pane",inputs:[{key:"shortLength",type:"number",label:"Short BB Length",default:20,min:1,max:2e3,step:1},{key:"longLength",type:"number",label:"Long BB Length",default:50,min:1,max:2e3,step:1},{key:"stdDevMult",type:"number",label:"StdDev",default:2,min:.001,max:50,step:.1},{key:"posColor",type:"color",label:"Above zero",default:"#089981"},{key:"negColor",type:"color",label:"Below zero",default:"#f23645"}],plots:[{key:"bbtrend",type:"column",title:"BBTrend",colorKey:"posColor",style:{base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.bbtrend?.[l-1],r="number"==typeof n&&Number.isFinite(n);return r&&e>0?$l(Zl(o,"posColor","#089981"),e>=n?25:50):r&&e<0?$l(Zl(o,"negColor","#f23645"),e>n?50:25):$l(Zl(o,"posColor","#089981"),50)}}],calc:(e,l)=>{const t=e.map(e=>e.close),o=zl(l,"stdDevMult",2),n=Yl(t,zl(l,"shortLength",20),o),r=Yl(t,zl(l,"longLength",50),o),a=new Array(t.length);for(let e=0;e<t.length;e++){const l=Math.abs(n.lower[e]-r.lower[e])-Math.abs(n.upper[e]-r.upper[e]);a[e]=0===n.middle[e]?NaN:l/n.middle[e]*100}return{bbtrend:$(a)}},levels:()=>[{price:0,color:"#5a6b8c",title:"Zero line",dashed:!0}]},Ql={id:"choppiness-index",name:"Choppiness Index",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:2e3,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"CHOP",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"chop",type:"line",title:"CHOP",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const t=zl(l,"length",14),o=e.map(e=>e.high),n=e.map(e=>e.low),r=le(p(o,n,e.map(e=>e.close)),t),a=q(o,t),i=H(n,t),s=Math.log10(t),c=new Array(e.length).fill(NaN);if(0!==s)for(let l=0;l<e.length;l++){const e=a[l]-i[l];if(!(e>0))continue;const t=r[l]/e;t>0&&(c[l]=100*Math.log10(t)/s)}return{chop:$(Jl(c,zl(l,"offset",0))),bandHigh:new Array(e.length).fill(61.8),bandLow:new Array(e.length).fill(38.2)}},levels:()=>[{price:61.8,color:"#787b86",title:"Upper Band",dashed:!0},{price:50,color:"#787b86",title:"Middle Band"},{price:38.2,color:"#787b86",title:"Lower Band",dashed:!0}],range:()=>({min:0,max:100})},et={id:"historical-volatility",name:"Historical Volatility",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:2e3,step:1},{key:"per",type:"number",label:"Days per bar unit",default:1,min:1,max:365,step:1,tooltip:"Calendar days each bar covers, used to annualise: 1 for intraday and daily, 7 for weekly and above."},{key:"color",type:"color",label:"HV",default:"#2962ff"}],plots:[{key:"hv",type:"line",title:"HV",colorKey:"color",style:{lineWidth:1.5},priceFormat:{type:"percent"}}],calc:(e,l)=>{const t=e.length,o=zl(l,"per",1),n=new Array(t).fill(NaN);for(let l=1;l<t;l++){const t=e[l-1].close,o=e[l].close;n[l]=t>0&&o>0?Math.log(o/t):NaN}const r=E(n,zl(l,"length",10)),a=o>0?Math.sqrt(365/o):NaN;return{hv:$(r.map(e=>100*e*a))}}},lt={id:"average-daily-range",name:"Average Daily Range",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:2e3,step:1},{key:"color",type:"color",label:"ADR",default:"#2962ff"}],plots:[{key:"adr",type:"line",title:"ADR",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>({adr:$(U(e.map(e=>e.high-e.low),zl(l,"length",14)))})},tt=4*Math.atan(1),ot={id:"chop-zone",name:"Chop Zone",category:"Volatility",placement:"pane",inputs:[{key:"turquoiseColor",type:"color",label:"Steep up",default:"#26c6da"},{key:"darkGreenColor",type:"color",label:"Up",default:"#43a047"},{key:"paleGreenColor",type:"color",label:"Mild up",default:"#a5d6a7"},{key:"limeColor",type:"color",label:"Slight up",default:"#009688"},{key:"yellowColor",type:"color",label:"Flat",default:"#fdd835"},{key:"lightOrangeColor",type:"color",label:"Slight down",default:"#ffb74d"},{key:"orangeColor",type:"color",label:"Mild down",default:"#ff6d00"},{key:"redColor",type:"color",label:"Down",default:"#e91e63"},{key:"darkRedColor",type:"color",label:"Steep down",default:"#d50000"}],plots:[{key:"chopZone",type:"column",title:"Chop Zone",colorKey:"yellowColor",style:{base:0},colorBy:({index:e,values:l,settings:t})=>{const o=l.angle?.[e],n=(e,l)=>Zl(t,e,l);return null!=o&&Number.isFinite(o)?o>=5?n("turquoiseColor","#26c6da"):o>=3.57?n("darkGreenColor","#43a047"):o>=2.14?n("paleGreenColor","#a5d6a7"):o>=.71?n("limeColor","#009688"):o<=-5?n("darkRedColor","#d50000"):o<=-3.57?n("redColor","#e91e63"):o<=-2.14?n("orangeColor","#ff6d00"):o<=-.71?n("lightOrangeColor","#ffb74d"):n("yellowColor","#fdd835"):n("yellowColor","#fdd835")}}],calc:e=>{const l=e.length,t=q(e.map(e=>e.high),30),o=H(e.map(e=>e.high),30),n=z(e.map(e=>e.close),34),r=new Array(l).fill(NaN);for(let a=1;a<l;a++){const l=t[a]-o[a],i=(e[a].high+e[a].low+e[a].close)/3;if(!(l>0)||0===i)continue;const s=25/l*o[a],c=(n[a-1]-n[a])/i*s;if(!Number.isFinite(c))continue;const u=Math.sqrt(1+c*c),p=Math.round(180*Math.acos(1/u)/tt);r[a]=c>0?-p:p}return{chopZone:new Array(l).fill(1),angle:$(r)}},range:()=>({min:0,max:1})},nt={id:"chaikin-volatility",name:"Chaikin Volatility",category:"Volatility",placement:"pane",inputs:[{key:"periods",type:"number",label:"Periods",default:10,min:1,max:2e3,step:1},{key:"rocLookback",type:"number",label:"Rate of Change Lookback",default:10,min:1,max:2e3,step:1},{key:"color",type:"color",label:"Chaikin Volatility",default:"#ab47bc"}],plots:[{key:"chaikinVolatility",type:"line",title:"Chaikin Volatility",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>({chaikinVolatility:$(Z(z(e.map(e=>e.high-e.low),zl(l,"periods",10)),zl(l,"rocLookback",10)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},rt={id:"standard-deviation",name:"Standard Deviation",category:"Volatility",placement:"pane",inputs:[{key:"periods",type:"number",label:"Periods",default:5,min:1,max:2e3,step:1},{key:"deviations",type:"number",label:"Deviations",default:1,min:.001,max:50,step:.1},{key:"color",type:"color",label:"Standard Deviation",default:"#089981"}],plots:[{key:"stdDev",type:"line",title:"Standard Deviation",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=zl(l,"deviations",1);return{stdDev:$(E(e.map(e=>e.close),zl(l,"periods",5)).map(e=>e*t))}}},at={id:"standard-error",name:"Standard Error",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:3,max:2e3,step:1},{key:"color",type:"color",label:"Standard Error",default:"#ff6d00"}],plots:[{key:"stdErr",type:"line",title:"Standard Error",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Math.max(3,Math.trunc(zl(l,"length",14))),o=e.map(e=>e.close),n=(t+1)/2;let r=0;for(let e=0;e<t;e++)r+=(n-e-1)**2;const a=new Array(o.length).fill(NaN);for(let e=t-1;e<o.length;e++){let l=0;for(let n=0;n<t;n++)l+=o[e-n];const i=l/t;let s=0,c=0;for(let l=0;l<t;l++){const t=i-o[e-l];s+=t*t,c+=(n-l-1)*t}a[e]=Math.sqrt((s-c*c/r)/(t-2))}return{stdErr:$(a)}}},it=[Gl,Xl,_l,Ql,et,lt,ot,nt,rt,at],st=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},ct=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function ut(e){const l=new Array(e.length);for(let t=0;t<e.length;t++){const o=e[t],n=o.close===o.high&&o.close===o.low||o.high===o.low;l[t]=n?0:(2*o.close-o.low-o.high)/(o.high-o.low)*ct(o)}return l}function pt(e,l){const t=new Array(e.length).fill(NaN),o=e.findIndex(e=>Number.isFinite(e));if(o<0)return t;const n=z(e.slice(o),l);for(let e=0;e<n.length;e++)t[o+e]=n[e];return t}const yt={id:"chaikin-money-flow",name:"Chaikin Money Flow",category:"Volume",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#43a047"}],plots:[{key:"cmf",type:"line",title:"CMF",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=st(l,"length",20),o=le(ut(e),t),n=le(e.map(ct),t),r=new Array(e.length).fill(NaN);for(let l=0;l<e.length;l++)n[l]>0&&(r[l]=o[l]/n[l]);return{cmf:$(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},ft={id:"chaikin-oscillator",name:"Chaikin Oscillator",category:"Volume",placement:"pane",inputs:[{key:"short",type:"number",label:"Fast Length",default:3,min:1,max:500,step:1},{key:"long",type:"number",label:"Slow Length",default:10,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#ec407a"}],plots:[{key:"osc",type:"line",title:"Chaikin Oscillator",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=te(ut(e)),o=pt(t,st(l,"short",3)),n=pt(t,st(l,"long",10)),r=new Array(e.length);for(let l=0;l<e.length;l++)r[l]=o[l]-n[l];return{osc:$(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},mt={id:"ease-of-movement",name:"Ease of Movement",category:"Volume",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"divisor",type:"number",label:"Divisor",default:1e4,min:1,max:1e6,step:1},{key:"color",type:"color",label:"Color",default:"#43a047"}],plots:[{key:"eom",type:"line",title:"EOM",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=st(l,"divisor",1e4),o=j(e.map(e=>(e.high+e.low)/2)),n=new Array(e.length);for(let l=0;l<e.length;l++){const r=e[l],a=ct(r);n[l]=0===a?NaN:t*o[l]*(r.high-r.low)/a}return{eom:$(U(n,st(l,"length",14)))}}},dt={id:"elder-force-index",name:"Elder Force Index",category:"Volume",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:13,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#f44336"}],plots:[{key:"efi",type:"line",title:"Elder Force Index",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=j(e.map(e=>e.close)),o=new Array(e.length);for(let l=0;l<e.length;l++)o[l]=t[l]*ct(e[l]);return{efi:$(pt(o,st(l,"length",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},bt={id:"net-volume",name:"Net Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#2196f3"}],plots:[{key:"net",type:"histogram",title:"Net Volume",colorKey:"color",style:{base:0}}],calc:e=>{const l=new Array(e.length).fill(0);for(let t=1;t<e.length;t++){const o=e[t].close-e[t-1].close;l[t]=o>0?ct(e[t]):o<0?-ct(e[t]):0}return{net:$(l)}}},ht=[yt,ft,mt,dt,bt],gt=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},kt=(e,l,t,o=1)=>Math.max(o,Math.round(gt(e,l,t))),wt=(e,l="source")=>e[l]??"close";function vt(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=z(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}const Ct={id:"kama",name:"Kaufman's Adaptive Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"erLength",type:"number",label:"ER Length",default:10,min:1,max:1e3,step:1},{key:"fastLength",type:"number",label:"Fast Length",default:2,min:1,max:1e3,step:1},{key:"slowLength",type:"number",label:"Slow Length",default:30,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"KAMA",default:"#2962ff"}],plots:[{key:"kama",type:"line",title:"KAMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,wt(t)),n=o.length,r=kt(t,"erLength",10),a=new Array(n).fill(NaN);if(n<=r)return{kama:$(a)};const i=j(o,1);for(let e=0;e<n;e++)i[e]=Number.isFinite(i[e])?Math.abs(i[e]):0;const s=le(i,r),c=j(o,r),u=2/(kt(t,"fastLength",2)+1),p=2/(kt(t,"slowLength",30)+1);let y=o[r];a[r]=y;for(let e=r+1;e<n;e++){const l=s[e],t=(Number.isFinite(l)&&0!==l?Math.abs(c[e])/l:0)*(u-p)+p;y+=t*t*(o[e]-y),a[e]=y}return{kama:$(a)}}},Nt={id:"keltner-channel",name:"Keltner Channels",category:"Volatility",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:1e3,step:1},{key:"mult",type:"number",label:"Multiplier",default:2,min:.1,max:50,step:.1},{key:"source",type:"source",label:"Source",default:"close"},{key:"exp",type:"boolean",label:"Use Exponential MA",default:!0},{key:"bandsStyle",type:"select",label:"Bands Style",default:"Average True Range",options:[{label:"Average True Range",value:"Average True Range"},{label:"True Range",value:"True Range"},{label:"Range",value:"Range"}]},{key:"atrlength",type:"number",label:"ATR Length",default:10,min:1,max:1e3,step:1},{key:"basisColor",type:"color",label:"Basis",default:"#2962ff"},{key:"bandColor",type:"color",label:"Bands",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"upper",type:"line",title:"Upper",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}},{key:"basis",type:"line",title:"Basis",colorKey:"basisColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"lower",type:"line",title:"Lower",colorKey:"bandColor",style:{color:"#2962ff",lineWidth:1}}],fills:[{between:["upper","lower"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.05}],calc:(l,o)=>{const n=l.length,r=kt(o,"length",20),a=gt(o,"mult",2),i=e(l,wt(o)),s=((e,l,t)=>{const o=e[l];return"boolean"==typeof o?o:t})(o,"exp",!0)?z(i,r):U(i,r),c=l.map(e=>e.high),u=l.map(e=>e.low),y=l.map(e=>e.close),f=((e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t})(o,"bandsStyle","Average True Range");let m;m="True Range"===f?p(c,u,y):"Range"===f?V(c.map((e,l)=>e-u[l]),r):t(c,u,y,kt(o,"atrlength",10));const d=new Array(n).fill(NaN),b=new Array(n).fill(NaN);for(let e=0;e<n;e++){const l=m[e]*a;d[e]=s[e]+l,b[e]=s[e]-l}return{upper:$(d),basis:$(s),lower:$(b)}}},Mt={id:"lsma",name:"Least Squares Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:25,min:2,max:1e3,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"LSMA",default:"#2962ff"}],plots:[{key:"lsma",type:"line",title:"LSMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>({lsma:$(oe(e(l,wt(t)),kt(t,"length",25,2),Math.round(gt(t,"offset",0))))})},At={id:"klinger-oscillator",name:"Klinger Oscillator",category:"Volume",placement:"pane",inputs:[{key:"kvoColor",type:"color",label:"Klinger Oscillator",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#43a047"}],plots:[{key:"kvo",type:"line",title:"Klinger Oscillator",colorKey:"kvoColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{color:"#43a047",lineWidth:1.5}}],calc:l=>{const t=l.length,o=j(e(l,"hlc3"),1),n=new Array(t);for(let e=0;e<t;e++){const t=l[e].volume??0;n[e]=o[e]>=0?t:-t}const r=z(n,34),a=z(n,55),i=new Array(t).fill(NaN);for(let e=0;e<t;e++)i[e]=r[e]-a[e];return{kvo:$(i),signal:$(vt(i,13))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},xt={id:"know-sure-thing",name:"Know Sure Thing",category:"Momentum",placement:"pane",inputs:[{key:"roclen1",type:"number",label:"ROC Length #1",default:10,min:1,max:1e3,step:1},{key:"roclen2",type:"number",label:"ROC Length #2",default:15,min:1,max:1e3,step:1},{key:"roclen3",type:"number",label:"ROC Length #3",default:20,min:1,max:1e3,step:1},{key:"roclen4",type:"number",label:"ROC Length #4",default:30,min:1,max:1e3,step:1},{key:"smalen1",type:"number",label:"SMA Length #1",default:10,min:1,max:1e3,step:1},{key:"smalen2",type:"number",label:"SMA Length #2",default:10,min:1,max:1e3,step:1},{key:"smalen3",type:"number",label:"SMA Length #3",default:10,min:1,max:1e3,step:1},{key:"smalen4",type:"number",label:"SMA Length #4",default:15,min:1,max:1e3,step:1},{key:"siglen",type:"number",label:"Signal Line Length",default:9,min:1,max:1e3,step:1},{key:"kstColor",type:"color",label:"KST",default:"#009688"},{key:"signalColor",type:"color",label:"Signal",default:"#f44336"}],plots:[{key:"kst",type:"line",title:"KST",colorKey:"kstColor",style:{color:"#009688",lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{color:"#f44336",lineWidth:1.5}}],calc:(l,t)=>{const o=l.length,n=e(l,"close"),r=(e,l,o,r)=>U(Z(n,kt(t,e,l)),kt(t,o,r)),a=r("roclen1",10,"smalen1",10),i=r("roclen2",15,"smalen2",10),s=r("roclen3",20,"smalen3",10),c=r("roclen4",30,"smalen4",15),u=new Array(o).fill(NaN);for(let e=0;e<o;e++)u[e]=a[e]+2*i[e]+3*s[e]+4*c[e];return{kst:$(u),signal:$(U(u,kt(t,"siglen",9)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},St={id:"linreg-slope",name:"Linear Regression Slope",category:"Trend",placement:"pane",inputs:[{key:"periods",type:"number",label:"Periods",default:14,min:2,max:1e3,step:1},{key:"color",type:"color",label:"Slope",default:"#ff5252"}],plots:[{key:"slope",type:"line",title:"Slope",colorKey:"color",style:{color:"#ff5252",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,"close"),n=o.length,r=kt(t,"periods",14,2),a=new Array(n).fill(NaN),i=r*(r+1)/2,s=r*r*(r*r-1)/12;for(let e=r-1;e<n;e++){let l=0,t=0;for(let n=0;n<r;n++){const a=o[e-n];l+=a,t+=a*(r-n)}a[e]=(r*t-i*l)/s}return{slope:$(a)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Lt=[Ct,Nt,Mt,At,xt,St],Bt=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Kt=(e,l,t,o=1)=>Math.max(o,Math.round(Bt(e,l,t))),Ft=(e,l,t)=>Math.round(Bt(e,l,t)),Wt=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},Dt=(e,l,t)=>{const o=e[l];return"boolean"==typeof o?o:t},Rt=(e,l="source")=>e[l]??"close",Ot=e=>e.map(e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0);function Tt(e,l){const t=e.length,o=new Array(t).fill(NaN);for(let n=0;n<t;n++){const r=n-l;r>=0&&r<t&&(o[n]=e[r])}return o}function Ut(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=z(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}const Pt={id:"ma-cross",name:"MA Cross",category:"Trend",placement:"onchart",inputs:[{key:"shortLength",type:"number",label:"Short MA Length",default:9,min:1,max:1e3,step:1},{key:"longLength",type:"number",label:"Long MA Length",default:26,min:1,max:1e3,step:1},{key:"shortColor",type:"color",label:"Short MA",default:"#ff6d00"},{key:"longColor",type:"color",label:"Long MA",default:"#43a047"},{key:"crossColor",type:"color",label:"Cross",default:"#2962ff"}],plots:[{key:"short",type:"line",title:"Short MA",colorKey:"shortColor",style:{color:"#ff6d00",lineWidth:1.5}},{key:"long",type:"line",title:"Long MA",colorKey:"longColor",style:{color:"#43a047",lineWidth:1.5}},{key:"cross",type:"line",title:"Cross",colorKey:"crossColor",style:{markersOnly:!0,markerRadius:3}}],calc:(l,t)=>{const o=e(l,"close"),n=U(o,Kt(t,"shortLength",9)),r=U(o,Kt(t,"longLength",21)),a=function(e,l){const t=e.length,o=new Array(t).fill(!1);for(let n=1;n<t;n++){const t=e[n-1],r=l[n-1],a=e[n],i=l[n];Number.isFinite(t)&&Number.isFinite(r)&&Number.isFinite(a)&&Number.isFinite(i)&&(o[n]=a>i&&t<=r||a<i&&t>=r)}return o}(n,r);return{short:$(n),long:$(r),cross:n.map((e,l)=>a[l]?e:null)}}},It={id:"mcginley-dynamic",name:"McGinley Dynamic",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:1e3,step:1},{key:"color",type:"color",label:"McGinley Dynamic",default:"#2962ff"}],plots:[{key:"mg",type:"line",title:"McGinley Dynamic",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,"close"),n=Kt(t,"length",14),r=z(o,n),a=new Array(o.length).fill(NaN);let i=NaN;for(let e=0;e<o.length;e++){if(Number.isFinite(i)&&0!==i){const l=n*Math.pow(o[e]/i,4),t=i+(o[e]-i)/l;a[e]=Number.isFinite(t)?t:r[e]}else a[e]=r[e];i=a[e]}return{mg:$(a)}}},Vt={id:"median",name:"Median",category:"Trend",placement:"onchart",inputs:[{key:"source",type:"source",label:"Median Source",default:"hl2"},{key:"length",type:"number",label:"Median Length",default:3,min:1,max:1e3,step:1},{key:"atrLength",type:"number",label:"ATR Length",default:14,min:1,max:1e3,step:1},{key:"atrMult",type:"number",label:"ATR Multiplier",default:2,min:0,max:50,step:.1},{key:"medianColor",type:"color",label:"Median",default:"#ff5252"},{key:"upperColor",type:"color",label:"Upper Band",default:"#00e676"},{key:"lowerColor",type:"color",label:"Lower Band",default:"#e040fb"},{key:"emaColor",type:"color",label:"Median EMA",default:"#2196f3"}],plots:[{key:"median",type:"line",title:"Median",colorKey:"medianColor",style:{color:"#ff5252",lineWidth:3}},{key:"upper",type:"line",title:"Upper Band",colorKey:"upperColor",style:{color:"#00e676",lineWidth:1}},{key:"lower",type:"line",title:"Lower Band",colorKey:"lowerColor",style:{color:"#e040fb",lineWidth:1}},{key:"medianEma",type:"line",title:"Median EMA",colorKey:"emaColor",style:{color:"#2196f3",lineWidth:1}}],fills:[{between:["median","medianEma"],colorUpKey:"upperColor",colorDownKey:"lowerColor",opacity:.9}],calc:(l,o)=>{const n=e(l,Rt(o)),r=Kt(o,"length",3),a=Bt(o,"atrMult",2),i=ae(n,r,50),s=t(l.map(e=>e.high),l.map(e=>e.low),l.map(e=>e.close),Kt(o,"atrLength",14));return{median:$(i),upper:$(i.map((e,l)=>e+a*s[l])),lower:$(i.map((e,l)=>e-a*s[l])),medianEma:$(Ut(i,r))}}},Et=[{label:"SMA",value:"SMA"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}];function qt(e,l,t,o){switch(e){case"EMA":return z(l,o);case"SMMA (RMA)":return V(l,o);case"WMA":return P(l,o);case"VWMA":return X(l,t,o);default:return U(l,o)}}const Ht=[{lane:1,length:20,color:"#f6c309"},{lane:2,length:50,color:"#fb9800"},{lane:3,length:100,color:"#fb6500"},{lane:4,length:200,color:"#f60c0c"}],$t={id:"ma-ribbon",name:"Moving Average Ribbon",category:"Trend",placement:"onchart",inputs:Ht.flatMap(e=>function(e,l,t){const o=`MA #${e}`;return[{key:`showMa${e}`,type:"boolean",label:o,default:!0,group:o},{key:`ma${e}Type`,type:"select",label:"Type",default:"SMA",options:Et,group:o},{key:`ma${e}Source`,type:"source",label:"Source",default:"close",group:o},{key:`ma${e}Length`,type:"number",label:"Length",default:l,min:1,max:1e3,step:1,group:o},{key:`ma${e}Color`,type:"color",label:"Color",default:t,group:o}]}(e.lane,e.length,e.color)),plots:Ht.map(e=>({key:`ma${e.lane}`,type:"line",title:`MA #${e.lane}`,colorKey:`ma${e.lane}Color`,style:{color:e.color,lineWidth:1.5}})),calc:(l,t)=>{const o=Ot(l),n={};for(const{lane:r,length:a}of Ht){if(!Dt(t,`showMa${r}`,!0)){n[`ma${r}`]=new Array(l.length).fill(null);continue}const i=e(l,Rt(t,`ma${r}Source`));n[`ma${r}`]=$(qt(Wt(t,`ma${r}Type`,"SMA"),i,o,Kt(t,`ma${r}Length`,a)))}return n}},zt={id:"tema",name:"Triple EMA",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"color",type:"color",label:"TEMA",default:"#2962ff"}],plots:[{key:"tema",type:"line",title:"TEMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,"close"),n=Kt(t,"length",9),r=z(o,n),a=Ut(r,n),i=Ut(a,n);return{tema:$(r.map((e,l)=>3*(e-a[l])+i[l]))}}},jt={id:"twap",name:"Time Weighted Average Price",category:"Trend",placement:"onchart",inputs:[{key:"anchor",type:"select",label:"Anchor Period",default:"session",options:[{label:"Session",value:"session"},{label:"Continuous",value:"continuous"}]},{key:"source",type:"source",label:"Source",default:"ohlc4"},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"TWAP",default:"#dd7a28"}],plots:[{key:"twap",type:"line",title:"TWAP",colorKey:"color",style:{color:"#dd7a28",lineWidth:1.5}}],calc:(l,t)=>{const n=e(l,Rt(t)),i="continuous"!==t.anchor?o(l.map(e=>e.time),(e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===r?r:a(l)?l:r})(t)):null,s=new Array(l.length).fill(NaN);let c=0,u=0;for(let e=0;e<l.length;e++)null!==i&&i[e]&&(c=0,u=0),c+=n[e],u+=1,s[e]=c/u;return{twap:$(Tt(s,Ft(t,"offset",0)))}}},Zt={id:"vwma",name:"Volume Weighted Moving Average",category:"Volume",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"VWMA",default:"#2962ff"}],plots:[{key:"vwma",type:"line",title:"VWMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(l,t)=>({vwma:$(Tt(X(e(l,Rt(t)),Ot(l),Kt(t,"length",20)),Ft(t,"offset",0)))})},Yt={id:"alligator",name:"Williams Alligator",category:"Trend",placement:"onchart",inputs:[{key:"jawLength",type:"number",label:"Jaw Length",default:21,min:1,max:1e3,step:1},{key:"teethLength",type:"number",label:"Teeth Length",default:13,min:1,max:1e3,step:1},{key:"lipsLength",type:"number",label:"Lips Length",default:8,min:1,max:1e3,step:1},{key:"jawOffset",type:"number",label:"Jaw Offset",default:8,min:-500,max:500,step:1},{key:"teethOffset",type:"number",label:"Teeth Offset",default:5,min:-500,max:500,step:1},{key:"lipsOffset",type:"number",label:"Lips Offset",default:3,min:-500,max:500,step:1},{key:"jawColor",type:"color",label:"Jaw",default:"#2962ff"},{key:"teethColor",type:"color",label:"Teeth",default:"#e91e63"},{key:"lipsColor",type:"color",label:"Lips",default:"#66bb6a"}],plots:[{key:"jaw",type:"line",title:"Jaw",colorKey:"jawColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"teeth",type:"line",title:"Teeth",colorKey:"teethColor",style:{color:"#e91e63",lineWidth:1.5}},{key:"lips",type:"line",title:"Lips",colorKey:"lipsColor",style:{color:"#66bb6a",lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,"hl2");return{jaw:$(Tt(V(o,Kt(t,"jawLength",13)),Ft(t,"jawOffset",8))),teeth:$(Tt(V(o,Kt(t,"teethLength",8)),Ft(t,"teethOffset",5))),lips:$(Tt(V(o,Kt(t,"lipsLength",5)),Ft(t,"lipsOffset",3)))}}},Jt={id:"smma",name:"Smoothed Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:7,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"SMMA",default:"#673ab7"}],plots:[{key:"smma",type:"line",title:"SMMA",colorKey:"color",style:{color:"#673ab7",lineWidth:1.5}}],calc:(l,t)=>({smma:$(V(e(l,Rt(t)),Kt(t,"length",7)))})};function Gt(e,l,t){const o=Ut(e,l);if(0===t)return o;const n=Ut(o,l);return o.map((e,l)=>e*(1+t)-n[l]*t)}const Xt={id:"t3",name:"T3 Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:5,min:1,max:1e3,step:1},{key:"factor",type:"number",label:"Factor",default:.7,min:0,max:1,step:.1},{key:"highlightMovements",type:"boolean",label:"Highlight Movements",default:!0},{key:"source",type:"source",label:"Source",default:"close"},{key:"upColor",type:"color",label:"Rising",default:"#26a69a"},{key:"downColor",type:"color",label:"Falling",default:"#ff5252"},{key:"neutralColor",type:"color",label:"T3",default:"#6d1e7f"}],plots:[{key:"t3",type:"line",title:"T3",colorKey:"neutralColor",style:{color:"#6d1e7f",lineWidth:2},colorBy:({value:e,index:l,values:t,settings:o})=>{if(!Dt(o,"highlightMovements",!0))return Wt(o,"neutralColor","#6d1e7f");const n=t.t3?.[l-1];return"number"==typeof n&&Number.isFinite(n)&&e>n?Wt(o,"upColor","#26a69a"):Wt(o,"downColor","#ff5252")}}],calc:(l,t)=>{const o=e(l,Rt(t)),n=Kt(t,"length",5),r=Bt(t,"factor",.7),a=Gt(o,n,r),i=Gt(a,n,r);return{t3:$(Gt(i,n,r))}}},_t=[Pt,It,Vt,$t,zt,jt,Zt,Yt,Jt,Xt],Qt=(e,l,t)=>Math.max(1,Math.floor(((e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t})(e,l,t))),eo=e=>e.source??"close",lo=(e,l,t)=>"string"==typeof e[l]?e[l]:t;function to(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=z(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}function oo(e,l,t){const o=j(e),n=e=>to(to(e,t),l),r=n(o),a=n(o.map(e=>Math.abs(e)));return r.map((e,l)=>e/a[l]*100)}const no={id:"momentum",name:"Momentum",category:"Momentum",placement:"pane",inputs:[{key:"len",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"MOM",default:"#2962ff"}],plots:[{key:"mom",type:"line",title:"MOM",colorKey:"color",style:{lineWidth:1.5}}],calc:(l,t)=>({mom:$(j(e(l,eo(t)),Qt(t,"len",10)))})},ro={id:"roc",name:"Rate Of Change",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"ROC",default:"#2962ff"}],plots:[{key:"roc",type:"line",title:"ROC",colorKey:"color",style:{lineWidth:1.5}}],calc:(l,t)=>({roc:$(Z(e(l,eo(t)),Qt(t,"length",9)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]};function ao(e,l,t){return"SMA"===t?U(e,l):to(e,l)}const io={id:"ppo",name:"Percentage Price Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"fastLength",type:"number",label:"Fast length",default:12,min:1,max:500,step:1},{key:"slowLength",type:"number",label:"Slow length",default:26,min:1,max:500,step:1},{key:"signalLength",type:"number",label:"Signal length",default:9,min:1,max:500,step:1},{key:"oscType",type:"select",label:"Oscillator MA type",default:"EMA",options:[{label:"EMA",value:"EMA"},{label:"SMA",value:"SMA"}]},{key:"sigType",type:"select",label:"Signal MA type",default:"EMA",options:[{label:"EMA",value:"EMA"},{label:"SMA",value:"SMA"}]},{key:"histUpColor",type:"color",label:"Histogram up",default:"#26a69a"},{key:"histUpFadeColor",type:"color",label:"Histogram up (weakening)",default:"#b2dfdb"},{key:"histDownFadeColor",type:"color",label:"Histogram down (weakening)",default:"#ffcdd2"},{key:"histDownColor",type:"color",label:"Histogram down",default:"#ff5252"},{key:"ppoColor",type:"color",label:"PPO",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal line",default:"#ff6d00"}],plots:[{key:"hist",type:"column",title:"Histogram",colorKey:"histUpColor",style:{base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.hist?.[l-1],r=(e,l)=>"string"==typeof o[e]?o[e]:l,a="number"==typeof n&&Number.isFinite(n)&&e>n;return e>=0?a?r("histUpColor","#26a69a"):r("histUpFadeColor","#b2dfdb"):a?r("histDownFadeColor","#ffcdd2"):r("histDownColor","#ff5252")}},{key:"ppo",type:"line",title:"PPO",colorKey:"ppoColor",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal line",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(l,t)=>{const o=e(l,eo(t)),n=lo(t,"oscType","EMA"),r=ao(o,Qt(t,"fastLength",12),n),a=ao(o,Qt(t,"slowLength",26),n),i=r.map((e,l)=>0===a[l]?NaN:100*(e-a[l])/a[l]),s=ao(i,Qt(t,"signalLength",9),lo(t,"sigType","EMA"));return{hist:$(i.map((e,l)=>e-s[l])),ppo:$(i),signal:$(s)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},so={id:"trix",name:"TRIX",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:18,min:1,max:500,step:1},{key:"color",type:"color",label:"TRIX",default:"#f44336"}],plots:[{key:"trix",type:"line",title:"TRIX",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Qt(l,"length",18);return{trix:$(j(to(to(to(e.map(e=>e.close>0?Math.log(e.close):NaN),t),t),t)).map(e=>1e4*e))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},co={id:"tsi",name:"True Strength Index",category:"Momentum",placement:"pane",inputs:[{key:"long",type:"number",label:"Long Length",default:25,min:1,max:500,step:1},{key:"short",type:"number",label:"Short Length",default:13,min:1,max:500,step:1},{key:"signal",type:"number",label:"Signal Length",default:13,min:1,max:500,step:1},{key:"color",type:"color",label:"True Strength Index",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#e91e63"}],plots:[{key:"tsi",type:"line",title:"True Strength Index",colorKey:"color",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=oo(e.map(e=>e.close),Qt(l,"short",13),Qt(l,"long",25));return{tsi:$(t),signal:$(to(t,Qt(l,"signal",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},uo={id:"smi-ergodic-indicator",name:"SMI Ergodic Indicator",category:"Momentum",placement:"pane",inputs:[{key:"longlen",type:"number",label:"Long Length",default:20,min:1,max:500,step:1},{key:"shortlen",type:"number",label:"Short Length",default:5,min:1,max:500,step:1},{key:"siglen",type:"number",label:"Signal Line Length",default:5,min:1,max:500,step:1},{key:"color",type:"color",label:"SMI",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#ff6d00"}],plots:[{key:"erg",type:"line",title:"SMI",colorKey:"color",style:{lineWidth:1.5}},{key:"sig",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=oo(e.map(e=>e.close),Qt(l,"shortlen",5),Qt(l,"longlen",20));return{erg:$(t),sig:$(to(t,Qt(l,"siglen",5)))}}},po={id:"smi-ergodic-oscillator",name:"SMI Ergodic Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"longlen",type:"number",label:"Long Length",default:20,min:1,max:500,step:1},{key:"shortlen",type:"number",label:"Short Length",default:5,min:1,max:500,step:1},{key:"siglen",type:"number",label:"Signal Line Length",default:5,min:1,max:500,step:1},{key:"color",type:"color",label:"SMI Ergodic Oscillator",default:"#ff5252"}],plots:[{key:"osc",type:"histogram",title:"SMI Ergodic Oscillator",colorKey:"color",style:{base:0}}],calc:(e,l)=>{const t=oo(e.map(e=>e.close),Qt(l,"shortlen",5),Qt(l,"longlen",20)),o=to(t,Qt(l,"siglen",5));return{osc:$(t.map((e,l)=>e-o[l]))}}},yo={id:"smi",name:"Stochastic Momentum Index",category:"Momentum",placement:"pane",inputs:[{key:"lengthK",type:"number",label:"%K Length",default:10,min:1,max:15e3,step:1},{key:"lengthD",type:"number",label:"%D Length",default:3,min:1,max:4999,step:1},{key:"lengthEMA",type:"number",label:"EMA Length",default:3,min:1,max:4999,step:1},{key:"color",type:"color",label:"SMI",default:"#2196f3"},{key:"emaColor",type:"color",label:"SMI-based EMA",default:"#ff9800"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"smi",type:"line",title:"SMI",colorKey:"color",style:{lineWidth:1.5}},{key:"ema",type:"line",title:"SMI-based EMA",colorKey:"emaColor",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const t=Qt(l,"lengthK",10),o=Qt(l,"lengthD",3),n=q(e.map(e=>e.high),t),r=H(e.map(e=>e.low),t),a=n.map((e,l)=>e-r[l]),i=e=>to(to(e,o),o),s=i(e.map((e,l)=>e.close-(n[l]+r[l])/2)),c=i(a),u=s.map((e,l)=>0===c[l]?NaN:e/c[l]*200);return{smi:$(u),ema:$(to(u,Qt(l,"lengthEMA",3))),bandHigh:new Array(e.length).fill(40),bandLow:new Array(e.length).fill(-40)}},levels:()=>[{price:40,color:"#787b86",title:"Overbought Line",dashed:!0},{price:0,color:"#787b86",title:"Middle Line",dashed:!0},{price:-40,color:"#787b86",title:"Oversold Line",dashed:!0}]},fo=[no,ro,io,so,co,uo,po,yo],mo=(e,l,t)=>Math.max(1,Math.floor(((e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t})(e,l,t))),bo=(e,l,t)=>"string"==typeof e[l]?e[l]:t,ho=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function go(e,l,t){const o=new Array(e.length).fill(NaN);let n=0;for(;n<e.length;){if(!Number.isFinite(e[n])){n+=1;continue}let r=n;for(;r<e.length&&Number.isFinite(e[r]);)r+=1;const a=t(e.slice(n,r),l);for(let e=0;e<a.length;e++)o[n+e]=a[e];n=r}return o}const ko=e=>"SMA"===e?U:z;function wo(e,l,t,o){return{id:e,name:l,category:"Volume",placement:"pane",inputs:[{key:"maLength",type:"number",label:"EMA length",default:255,min:1,max:5e3,step:1},{key:"color",type:"color",label:t,default:"#2962ff"},{key:"emaColor",type:"color",label:`${t}-based EMA`,default:"#ff9800"}],plots:[{key:e,type:"line",title:t,colorKey:"color",style:{lineWidth:1.5}},{key:"ema",type:"line",title:`${t}-based EMA`,colorKey:"emaColor",style:{lineWidth:1.5}}],calc:(l,t)=>{const n=function(e,l){const t=new Array(e.length);let o=1;for(let n=0;n<e.length;n++){if(n>0){const t=e[n-1].close;("falling"===l?ho(e[n])<ho(e[n-1]):ho(e[n])>ho(e[n-1]))&&0!==t&&Number.isFinite(t)&&(o*=e[n].close/t)}t[n]=1e3*o}return t}(l,o);return{[e]:$(n),ema:$(go(n,mo(t,"maLength",255),z))}}}}const vo=wo("nvi","Negative Volume Index","NVI","falling"),Co=wo("pvi","Positive Volume Index","PVI","rising"),No={id:"pvt",name:"Price Volume Trend",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"PVT",default:"#2962ff"}],plots:[{key:"pvt",type:"line",title:"PVT",colorKey:"color",style:{lineWidth:1.5}}],calc:e=>{const l=new Array(e.length).fill(NaN);for(let t=1;t<e.length;t++){const o=e[t-1].close;0!==o&&Number.isFinite(o)&&(l[t]=(e[t].close-o)/o*ho(e[t]))}return{pvt:$(te(l))}}},Mo={id:"pvo",name:"Percentage Volume Oscillator",category:"Volume",placement:"pane",inputs:[{key:"fastLength",type:"number",label:"Fast length",default:12,min:1,max:500,step:1},{key:"slowLength",type:"number",label:"Slow length",default:26,min:1,max:500,step:1},{key:"signalLength",type:"number",label:"Signal length",default:9,min:1,max:500,step:1},{key:"oscType",type:"select",label:"Oscillator MA type",default:"EMA",options:[{label:"EMA",value:"EMA"},{label:"SMA",value:"SMA"}]},{key:"sigType",type:"select",label:"Signal MA type",default:"EMA",options:[{label:"EMA",value:"EMA"},{label:"SMA",value:"SMA"}]},{key:"histUpColor",type:"color",label:"Histogram up",default:"#26a69a"},{key:"histUpFadeColor",type:"color",label:"Histogram up (weakening)",default:"#b2dfdb"},{key:"histDownFadeColor",type:"color",label:"Histogram down (weakening)",default:"#ffcdd2"},{key:"histDownColor",type:"color",label:"Histogram down",default:"#ff5252"},{key:"color",type:"color",label:"PVO",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal line",default:"#ff6d00"}],plots:[{key:"hist",type:"column",title:"Histogram",colorKey:"histUpColor",style:{base:0},colorBy:({value:e,index:l,values:t,settings:o})=>{const n=t.hist?.[l-1],r=null!=n&&Number.isFinite(n)&&e>n,a=(e,l)=>"string"==typeof o[e]?o[e]:l;return e>=0?r?a("histUpColor","#26a69a"):a("histUpFadeColor","#b2dfdb"):r?a("histDownFadeColor","#ffcdd2"):a("histDownColor","#ff5252")}},{key:"pvo",type:"line",title:"PVO",colorKey:"color",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal line",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=e.map(ho),n=ko(bo(l,"oscType","EMA")),r=n(o,mo(l,"fastLength",12)),a=n(o,mo(l,"slowLength",26)),i=new Array(t).fill(NaN);for(let e=0;e<t;e++)0!==a[e]&&(i[e]=100*(r[e]-a[e])/a[e]);const s=go(i,mo(l,"signalLength",9),ko(bo(l,"sigType","EMA"))),c=new Array(t);for(let e=0;e<t;e++)c[e]=i[e]-s[e];return{hist:$(c),pvo:$(i),signal:$(s)}},levels:()=>[{price:0,color:"#787b8680",title:"Zero"}]},Ao={id:"mass-index",name:"Mass Index",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"color",type:"color",label:"Mass Index",default:"#2962ff"}],plots:[{key:"mi",type:"line",title:"Mass Index",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=z(e.map(e=>e.high-e.low),9),n=go(o,9,z),r=new Array(t).fill(NaN);for(let e=0;e<t;e++)0!==n[e]&&(r[e]=o[e]/n[e]);return{mi:$(go(r,mo(l,"length",10),le))}}},xo={id:"ulcer-index",name:"Ulcer Index",category:"Volatility",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"color",type:"color",label:"Ulcer Index",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"ui",type:"line",title:"Ulcer Index",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["ui","zero"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(l,t)=>{const o=l.length,n=mo(t,"length",14),r=e(l,(e=>e.source??"close")(t)),a=q(r,n),i=new Array(o).fill(NaN);for(let e=0;e<o;e++){const l=a[e];if(!Number.isFinite(l)||0===l)continue;const t=100*(r[e]-l)/l;i[e]=t*t}const s=U(i,n),c=new Array(o);for(let e=0;e<o;e++)c[e]=Math.sqrt(s[e]);return{ui:$(c),zero:c.map(e=>Number.isFinite(e)?0:null)}},levels:()=>[{price:0,color:"#2196f3",title:"Zero"}]},So=[vo,Co,No,Mo,Ao,xo],Lo=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Bo=(e,l,t,o=1)=>Math.max(o,Math.round(Lo(e,l,t))),Ko=(e,l,t)=>Math.round(Lo(e,l,t)),Fo=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},Wo=(e,l="source")=>e[l]??"close";function Do(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=l(e.slice(n),n);for(let e=0;e<r.length&&n+e<t;e++)o[n+e]=r[e];return o}function Ro(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0)return o;const n=U(e,l),r=2/(l+1);let a=NaN;for(let l=0;l<t;l++){if(Number.isFinite(a)){const t=e[l];a=Number.isFinite(t)?t*r+a*(1-r):NaN}else a=n[l];o[l]=a}return o}function Oo(e,l){if(0===l)return e.slice();const t=e.length,o=new Array(t).fill(null);for(let n=0;n<t;n++){const r=n+l;r>=0&&r<t&&(o[r]=e[n])}return o}const To={id:"stochastic-rsi",name:"Stochastic RSI",category:"Momentum",placement:"pane",inputs:[{key:"smoothK",type:"number",label:"K",default:3,min:1,max:100,step:1},{key:"smoothD",type:"number",label:"D",default:3,min:1,max:100,step:1},{key:"lengthRSI",type:"number",label:"RSI Length",default:14,min:1,max:500,step:1},{key:"lengthStoch",type:"number",label:"Stochastic Length",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"RSI Source",default:"close"},{key:"kColor",type:"color",label:"K",default:"#2962ff"},{key:"dColor",type:"color",label:"D",default:"#ff6d00"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"k",type:"line",title:"K",colorKey:"kColor",style:{lineWidth:1.5}},{key:"d",type:"line",title:"D",colorKey:"dColor",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(l,t)=>{const o=Bo(t,"lengthStoch",14),n=Do(u(e(l,Wo(t)),Bo(t,"lengthRSI",14)),e=>re(e,e,e,o)),r=Do(n,e=>U(e,Bo(t,"smoothK",3))),a=Do(r,e=>U(e,Bo(t,"smoothD",3)));return{k:$(r),d:$(a),bandHigh:new Array(l.length).fill(80),bandLow:new Array(l.length).fill(20)}},levels:()=>[{price:80,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band"},{price:20,color:"#787b86",title:"Lower Band"}],range:()=>({min:0,max:100})},Uo={id:"williams-percent-r",name:"Williams Percent Range",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"%R",default:"#7e57c2"},{key:"fillColor",type:"color",label:"Background",default:"#7e57c2"}],plots:[{key:"percentR",type:"line",title:"%R",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(l,t)=>{const o=Bo(t,"length",14),n=e(l,Wo(t)),r=q(l.map(e=>e.high),o),a=H(l.map(e=>e.low),o),i=n.map((e,l)=>{const t=r[l]-a[l];return 0===t?NaN:100*(e-r[l])/t});return{percentR:$(i),bandHigh:new Array(l.length).fill(-20),bandLow:new Array(l.length).fill(-80)}},levels:()=>[{price:-20,color:"#787b86",title:"Upper Band"},{price:-50,color:"#787b86",title:"Middle Level",dashed:!0},{price:-80,color:"#787b86",title:"Lower Band"}],range:()=>({min:-100,max:0})},Po={id:"ultimate-oscillator",name:"Ultimate Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"length1",type:"number",label:"Fast Length",default:7,min:1,max:500,step:1},{key:"length2",type:"number",label:"Middle Length",default:14,min:1,max:500,step:1},{key:"length3",type:"number",label:"Slow Length",default:28,min:1,max:500,step:1},{key:"color",type:"color",label:"Oscillator",default:"#f44336"}],plots:[{key:"uo",type:"line",title:"Oscillator",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=Math.max(0,t-1),n=new Array(o),r=new Array(o);for(let l=1;l<t;l++){const t=e[l-1].close,o=Math.max(e[l].high,t),a=Math.min(e[l].low,t);n[l-1]=e[l].close-a,r[l-1]=o-a}const a=e=>{const l=le(n,e),t=le(r,e);return l.map((e,l)=>0===t[l]?NaN:e/t[l])},i=a(Bo(l,"length1",7)),s=a(Bo(l,"length2",14)),c=a(Bo(l,"length3",28)),u=new Array(t).fill(NaN);for(let e=0;e<o;e++)u[e+1]=100*(4*i[e]+2*s[e]+c[e])/7;return{uo:$(u)}}},Io={id:"relative-vigor-index",name:"Relative Vigor Index",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"rvgiColor",type:"color",label:"RVGI",default:"#008000"},{key:"signalColor",type:"color",label:"Signal",default:"#ff0000"}],plots:[{key:"rvgi",type:"line",title:"RVGI",colorKey:"rvgiColor",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=Bo(l,"length",10),o=ne(e.map(e=>e.close-e.open)),n=ne(e.map(e=>e.high-e.low)),r=Do(o,e=>le(e,t)),a=Do(n,e=>le(e,t)),i=r.map((e,l)=>0===a[l]?NaN:e/a[l]),s=Do(i,e=>ne(e)),c=Ko(l,"offset",0);return{rvgi:Oo($(i),c),signal:Oo($(s),c)}}};const Vo={id:"relative-volatility-index",name:"Relative Volatility Index",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"RVI",default:"#7e57c2"},{key:"fillColor",type:"color",label:"Background",default:"#7e57c2"},{key:"maType",type:"select",label:"Type",default:"SMA",options:[{label:"None",value:"None"},{label:"SMA",value:"SMA"},{label:"SMA + Bollinger Bands",value:"SMA + Bollinger Bands"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}],group:"Smoothing"},{key:"maLength",type:"number",label:"Length",default:14,min:1,max:500,step:1,group:"Smoothing"},{key:"bbMult",type:"number",label:"BB StdDev",default:2,min:.001,max:50,step:.5,group:"Smoothing"},{key:"maColor",type:"color",label:"RVI-based MA",default:"#ffeb3b",group:"Smoothing"},{key:"bbUpperColor",type:"color",label:"Upper Bollinger Band",default:"#4caf50",group:"Smoothing"},{key:"bbLowerColor",type:"color",label:"Lower Bollinger Band",default:"#4caf50",group:"Smoothing"}],plots:[{key:"rvi",type:"line",title:"RVI",colorKey:"color",style:{lineWidth:1.5}},{key:"ma",type:"line",title:"RVI-based MA",colorKey:"maColor",style:{lineWidth:1.5}},{key:"bbUpper",type:"line",title:"Upper Bollinger Band",colorKey:"bbUpperColor",style:{lineWidth:1}},{key:"bbLower",type:"line",title:"Lower Bollinger Band",colorKey:"bbLowerColor",style:{lineWidth:1}}],fills:[{between:["bbUpper","bbLower"],colorUpKey:"bbUpperColor",colorDownKey:"bbUpperColor",opacity:.1},{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const t=e.length,o=e.map(e=>e.close),n=E(o,Bo(l,"length",10)),r=j(o),a=new Array(t),i=new Array(t);for(let e=0;e<t;e++){const l=r[e];a[e]=Number.isFinite(l)&&l<=0?0:n[e],i[e]=Number.isFinite(l)&&l>0?0:n[e]}const s=Ro(a,14),c=Ro(i,14),u=new Array(t).fill(NaN);for(let e=0;e<t;e++){const l=s[e]+c[e];u[e]=0===l?NaN:s[e]/l*100}const p=Fo(l,"maType","SMA"),y=Bo(l,"maLength",14),f=Lo(l,"bbMult",2),m="SMA + Bollinger Bands"===p,d="None"===p?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return Ro(l,o);case"SMMA (RMA)":return Do(l,e=>V(e,o));case"WMA":return Do(l,e=>P(e,o));case"VWMA":return Do(l,(e,l)=>X(e,t.slice(l),o));default:return Do(l,e=>U(e,o))}}(p,u,e.map(e=>e.volume??0),y),b=m?Do(u,e=>E(e,y)).map(e=>e*f):new Array(t).fill(NaN),h=Ko(l,"offset",0);return{rvi:Oo($(u),h),ma:$(d),bbUpper:$(d.map((e,l)=>e+b[l])),bbLower:$(d.map((e,l)=>e-b[l])),bandHigh:new Array(t).fill(80),bandLow:new Array(t).fill(20)}},levels:()=>[{price:80,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band"},{price:20,color:"#787b86",title:"Lower Band"}]},Eo={id:"woodies-cci",name:"Woodies CCI",category:"Momentum",placement:"pane",inputs:[{key:"cciTurboLength",type:"number",label:"CCI Turbo Length",default:6,min:3,max:14,step:1},{key:"cci14Length",type:"number",label:"CCI 14 Length",default:14,min:7,max:20,step:1},{key:"upColor",type:"color",label:"Five bars up",default:"#009688"},{key:"downColor",type:"color",label:"Five bars down",default:"#f44336"},{key:"turboColor",type:"color",label:"CCI Turbo",default:"#009688"},{key:"cciColor",type:"color",label:"CCI 14",default:"#f44336"}],plots:[{key:"hist",type:"histogram",title:"CCI Turbo Histogram",colorKey:"upColor",style:{base:0},colorBy:({index:e,values:l,settings:t})=>{const o=Fo(t,"upColor","#009688"),n=Fo(t,"downColor","#f44336"),r=t=>{const o=l.hist?.[e-t];return"number"==typeof o&&Number.isFinite(o)?o:null};let a=!0,i=!0;for(let e=1;e<=5;e+=1){const l=r(e);(null===l||l<=0)&&(a=!1),(null===l||l>=0)&&(i=!1)}if(a)return o;if(i)return n;const s=r(0);return null!==s&&s<0?o:n}},{key:"turbo",type:"line",title:"CCI Turbo",colorKey:"turboColor",style:{lineWidth:1.5}},{key:"cci14",type:"line",title:"CCI 14",colorKey:"cciColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.map(e=>e.close),o=se(t,Bo(l,"cciTurboLength",6)),n=se(t,Bo(l,"cci14Length",14));return{hist:$(n),turbo:$(o),cci14:$(n)}},levels:()=>[{price:100,color:"#787b86",title:"Hundred Line",dashed:!0},{price:0,color:"#787b86",title:"Zero Line"},{price:-100,color:"#787b86",title:"Minus Line",dashed:!0}]},qo=[{weight:1,roc:10,smooth:10},{weight:2,roc:15,smooth:10},{weight:3,roc:20,smooth:10},{weight:4,roc:30,smooth:15},{weight:1,roc:40,smooth:50},{weight:2,roc:65,smooth:65},{weight:3,roc:75,smooth:75},{weight:4,roc:100,smooth:100},{weight:1,roc:195,smooth:130},{weight:2,roc:265,smooth:130},{weight:3,roc:390,smooth:130},{weight:4,roc:530,smooth:195}],Ho={id:"special-k",name:"Pring's Special K",category:"Momentum",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"length1",type:"number",label:"Signal length 1",default:100,min:1,max:1e3,step:1},{key:"length2",type:"number",label:"Signal length 2",default:100,min:1,max:1e3,step:1},{key:"color",type:"color",label:"Special K",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#ff6d00"}],plots:[{key:"specialK",type:"line",title:"Special K",colorKey:"color",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(l,t)=>{const o=l.length,n=e(l,Wo(t)),r=new Array(o).fill(0);for(const e of qo){const l=Do(Z(n,e.roc),l=>U(l,e.smooth));for(let t=0;t<o;t++)r[t]+=e.weight*l[t]}const a=Do(r,e=>U(e,Bo(t,"length1",100))),i=Do(a,e=>U(e,Bo(t,"length2",100)));return{specialK:$(r),signal:$(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero"}]},$o=[To,Uo,Po,Io,Vo,Eo,Ho],zo=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},jo=(e,l,t)=>Math.max(1,Math.floor(zo(e,l,t))),Zo=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},Yo=(e,l="source")=>e[l]??"close",Jo=(e,l)=>!1!==e[l];function Go(e,l){const t=new Array(e.length).fill(NaN);for(let o=l;o<e.length;o++)t[o]=e[o-l];return t}function Xo(e,l){const t=new Array(e.length).fill(!1);for(let o=l;o<e.length;o++)t[o]=e[o-l];return t}const _o={id:"vortex",name:"Vortex Indicator",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:2,max:500,step:1},{key:"upColor",type:"color",label:"VI +",default:"#2962ff"},{key:"downColor",type:"color",label:"VI -",default:"#e91e63"}],plots:[{key:"vip",type:"line",title:"VI +",colorKey:"upColor",style:{lineWidth:1.5}},{key:"vim",type:"line",title:"VI -",colorKey:"downColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.length,o=jo(l,"length",14),n=new Array(t).fill(NaN),r=new Array(t).fill(NaN);if(0===t)return{vip:$(n),vim:$(r)};const a=e.map(e=>e.high),i=e.map(e=>e.low),s=e.map(e=>e.close),c=new Array(t-1),u=new Array(t-1);for(let e=1;e<t;e++)c[e-1]=Math.abs(a[e]-i[e-1]),u[e-1]=Math.abs(i[e]-a[e-1]);const y=le(c,o),f=le(u,o),m=le(p(a,i,s),o);for(let e=1;e<t;e++)n[e]=y[e-1]/m[e],r[e]=f[e-1]/m[e];return{vip:$(n),vim:$(r)}}},Qo={id:"volatility-stop",name:"Volatility Stop",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:2,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"factor",type:"number",label:"Multiplier",default:2,min:.25,max:20,step:.25},{key:"upColor",type:"color",label:"Uptrend",default:"#009688"},{key:"downColor",type:"color",label:"Downtrend",default:"#f44336"}],plots:[{key:"up",type:"line",title:"Volatility Stop Up",colorKey:"upColor",style:{markersOnly:!0,markerRadius:1.5}},{key:"down",type:"line",title:"Volatility Stop Down",colorKey:"downColor",style:{markersOnly:!0,markerRadius:1.5}}],calc:(l,o)=>{const n=l.length,r=new Array(n).fill(null),a=new Array(n).fill(null);if(0===n)return{up:r,down:a};const i=e(l,Yo(o)),s=zo(o,"factor",2),c=l.map(e=>e.high),u=l.map(e=>e.low),y=l.map(e=>e.close),f=t(c,u,y,jo(o,"length",20)),m=p(c,u,y);let d=i[0],b=i[0],h=!0,g=NaN;for(let e=0;e<n;e++){const l=i[e],t=Number.isFinite(f[e])?f[e]*s:m[e];d=Math.max(d,l),b=Math.min(b,l);let o=h?Math.max(g,d-t):Math.min(g,b+t);Number.isFinite(o)||(o=l);const n=l-o>=0;e>0&&n!==h&&(d=l,b=l,o=n?d-t:b+t),h=n,g=o,Number.isFinite(o)&&(n?r[e]=o:a[e]=o)}return{up:r,down:a}}},en={id:"trend-strength-index",name:"Trend Strength Index",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:2,max:500,step:1},{key:"color",type:"color",label:"Trend Strength Index",default:"#7e57c2"},{key:"bullishColor",type:"color",label:"Bullish Color",default:"#089981"},{key:"bearishColor",type:"color",label:"Bearish Color",default:"#f23645"}],plots:[{key:"tsi",type:"line",title:"Trend Strength Index",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>{const t=e.map((e,l)=>l);return{tsi:$(ie(e.map(e=>e.close),t,jo(l,"length",14)))}},levels:e=>[{price:1,color:Zo(e,"bullishColor","#089981"),title:"TSI Bullish Band"},{price:0,color:"#787b86",title:"TSI Middle Band",dashed:!0},{price:-1,color:Zo(e,"bearishColor","#f23645"),title:"TSI Bearish Band"}],range:()=>({min:-1,max:1})};function ln(e,l,t,o){const n=e[l];if(!Number.isFinite(n))return!1;const r=l=>l>=0&&l<e.length&&Number.isFinite(e[l])&&(o?e[l]<n:e[l]>n),a=l=>l>=0&&l<e.length&&Number.isFinite(e[l])&&(o?e[l]<=n:e[l]>=n);for(let e=1;e<=t;e++)if(!r(l+e))return!1;for(let e=0;e<=4;e++){let o=!0;for(let t=1;t<=e&&o;t++)a(l-t)||(o=!1);for(let n=1;n<=t&&o;n++)r(l-e-n)||(o=!1);if(o)return!0}return!1}const tn={id:"williams-fractals",name:"Williams Fractals",category:"Trend",placement:"onchart",inputs:[{key:"periods",type:"number",label:"Periods",default:2,min:2,max:100,step:1},{key:"showUp",type:"boolean",label:"Show Up Fractals",default:!0},{key:"showDown",type:"boolean",label:"Show Down Fractals",default:!0},{key:"upColor",type:"color",label:"Up Fractal",default:"#009688"},{key:"downColor",type:"color",label:"Down Fractal",default:"#f44336"}],plots:[{key:"fractals",type:"line",title:"Fractals",colorKey:"upColor"}],calc:(e,l)=>{const t=e.length,o=new Array(t).fill(null),n=new Array(t).fill(null),r=new Array(t).fill(null),a={fractals:o,upFractal:n,downFractal:r};if(0===t)return a;const i=Math.max(2,jo(l,"periods",2)),s=e.map(e=>e.high),c=e.map(e=>e.low),u=Jo(l,"showUp"),p=Jo(l,"showDown");for(let e=0;e<t;e++)u&&ln(s,e,i,!0)&&(n[e]=s[e]),p&&ln(c,e,i,!1)&&(r[e]=c[e]);return a},markers:({bars:e,values:l,settings:t})=>{const o=l.upFractal??[],n=l.downFractal??[],r=Zo(t,"upColor","#009688"),a=Zo(t,"downColor","#f44336"),i=[];for(let l=0;l<e.length;l++){const t=o[l];null!=t&&i.push({time:e[l].time,position:"atPrice",price:t,shape:"triangleUp",size:"small",color:r});const s=n[l];null!=s&&i.push({time:e[l].time,position:"atPrice",price:s,shape:"triangleDown",size:"small",color:a})}return i}},on={id:"rsi-divergence",name:"RSI Divergence Indicator",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"RSI Period",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"RSI Source",default:"close"},{key:"lbR",type:"number",label:"Pivot Lookback Right",default:5,min:1,max:100,step:1},{key:"lbL",type:"number",label:"Pivot Lookback Left",default:5,min:1,max:100,step:1},{key:"rangeUpper",type:"number",label:"Max of Lookback Range",default:60,min:1,max:1e3,step:1},{key:"rangeLower",type:"number",label:"Min of Lookback Range",default:5,min:1,max:1e3,step:1},{key:"plotBull",type:"boolean",label:"Plot Bullish",default:!0},{key:"plotHiddenBull",type:"boolean",label:"Plot Hidden Bullish",default:!1},{key:"plotBear",type:"boolean",label:"Plot Bearish",default:!0},{key:"plotHiddenBear",type:"boolean",label:"Plot Hidden Bearish",default:!1},{key:"color",type:"color",label:"RSI",default:"#2962ff"},{key:"bullColor",type:"color",label:"Bullish",default:"#4caf50"},{key:"bearColor",type:"color",label:"Bearish",default:"#ff5252"}],plots:[{key:"rsi",type:"line",title:"RSI",colorKey:"color",style:{lineWidth:2}}],calc:(l,t)=>{const o=l.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=u(e(l,Yo(t)),jo(t,"length",14)),c={rsi:$(s),bull:n,hiddenBull:r,bear:a,hiddenBear:i};if(0===o)return c;const p=jo(t,"lbR",5),y=jo(t,"lbL",5),f=zo(t,"rangeLower",5),m=zo(t,"rangeUpper",60),d=!1!==t.plotBull,b=!0===t.plotHiddenBull,h=!1!==t.plotBear,g=!0===t.plotHiddenBear,k=ue(s,y,p).map(e=>Number.isFinite(e)),w=ce(s,y,p).map(e=>Number.isFinite(e)),v=Go(s,p),C=Go(l.map(e=>e.low),p),N=Go(l.map(e=>e.high),p),M=fe(Xo(k,1)),A=fe(Xo(w,1)),x=me(k,v,1),S=me(k,C,1),L=me(w,v,1),B=me(w,N,1);for(let e=0;e<o;e++){const l=e-p;if(!(l<0)){if(k[e]){const t=f<=M[e]&&M[e]<=m,o=v[e]>x[e]&&t,a=v[e]<x[e]&&t;d&&o&&C[e]<S[e]&&(n[l]=v[e]),b&&a&&C[e]>S[e]&&(r[l]=v[e])}if(w[e]){const t=f<=A[e]&&A[e]<=m,o=v[e]<L[e]&&t,n=v[e]>L[e]&&t;h&&o&&N[e]>B[e]&&(a[l]=v[e]),g&&n&&N[e]<B[e]&&(i[l]=v[e])}}}return c},markers:({bars:e,values:l,settings:t})=>{const o=Zo(t,"bullColor","#4caf50"),n=Zo(t,"bearColor","#ff5252"),r=[{col:l.bull,shape:"labelUp",text:"Bull",color:o},{col:l.hiddenBull,shape:"labelUp",text:"H Bull",color:o},{col:l.bear,shape:"labelDown",text:"Bear",color:n},{col:l.hiddenBear,shape:"labelDown",text:"H Bear",color:n}],a=[];for(let l=0;l<e.length;l++)for(const t of r){const o=t.col?.[l];null!=o&&a.push({time:e[l].time,position:"atPrice",price:o,shape:t.shape,size:"small",color:t.color,text:t.text})}return a},levels:()=>[{price:70,color:"#787b86",title:"Overbought",dashed:!0},{price:50,color:"#787b86",title:"Middle Line",dashed:!0},{price:30,color:"#787b86",title:"Oversold",dashed:!0}],range:()=>({min:0,max:100})},nn={id:"consolidation-breakout",name:"Consolidation and Breakout",category:"Trend",placement:"onchart",inputs:[{key:"markbreakout",type:"boolean",label:"Mark Breakouts",default:!0},{key:"colorinside",type:"boolean",label:"Tint Inside Bars",default:!0},{key:"bullBreakColor",type:"color",label:"Break Up",default:"#00c853"},{key:"bearBreakColor",type:"color",label:"Break Down",default:"#ff5252"},{key:"insideColor",type:"color",label:"Inside Bar",default:"#000000"},{key:"highlowColor",type:"color",label:"Range",default:"#e91e63"}],plots:[{key:"rangeHigh",type:"line",title:"Range High",colorKey:"highlowColor",style:{lineWidth:2}},{key:"rangeLow",type:"line",title:"Range Low",colorKey:"highlowColor",style:{lineWidth:2}}],calc:e=>{const l=e.length,t=new Array(l).fill(NaN),o=new Array(l).fill(NaN),n=new Array(l).fill(NaN),r=new Array(l).fill(NaN),a=new Array(l).fill(NaN);let i=0;for(let s=0;s<l;s++){const l=e[s],c=Math.max(l.open,l.close),u=Math.min(l.open,l.close),p=e[i].high,y=e[i].low,f=s-i,m=f>1&&f<=250;m&&c>p&&(n[s]=p),m&&u<y&&(r[s]=y);const d=i;i=s>1&&u>=y&&u<=p&&c>=y&&c<=p?i:s,i===d&&(t[s]=e[i].high,o[s]=e[i].low);const b=s-i;b>0&&(a[s]=b)}return{rangeHigh:$(t),rangeLow:$(o),breakUp:$(n),breakDown:$(r),insideAge:$(a)}},markers:({bars:e,values:l,settings:t})=>{const o=[];if(!Jo(t,"markbreakout"))return o;const n=l.breakUp??[],r=l.breakDown??[],a=Zo(t,"bullBreakColor","#00c853"),i=Zo(t,"bearBreakColor","#ff5252");for(let l=0;l<e.length;l++)null!==n[l]&&void 0!==n[l]&&o.push({time:e[l].time,position:"belowBar",shape:"triangleUp",size:"small",color:a}),null!==r[l]&&void 0!==r[l]&&o.push({time:e[l].time,position:"aboveBar",shape:"triangleDown",size:"small",color:i});return o},barColors:({bars:e,values:l,settings:t})=>{const o=l.insideAge??[],n=Zo(t,"insideColor","#000000"),r=Jo(t,"colorinside");return e.map((e,l)=>r&&null!==o[l]&&void 0!==o[l]?n:null)}},rn=[_o,Qo,en,tn,on,nn],an=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},sn=(e,l,t)=>"string"==typeof e[l]?e[l]:t,cn=(e,l,t)=>"boolean"==typeof e[l]?e[l]:t,un=e=>new Array(e).fill(NaN),pn=86400,yn=e=>Math.floor(((e=>Math.floor((e+c)/pn))(e)-4)/7);function fn(e,l,t){const a=e.map(e=>e.time);return"daily"===l?o(a,t):n(a,function(e,l){return l!==r?"weekly"===e?(e,t)=>f(e,t,l):(e,t)=>m(e,t,l):"weekly"===e?(e,l)=>yn(e)!==yn(l):(e,l)=>{const t=s(e),o=s(l);return t.year!==o.year||t.month!==o.month}}(l,t))}function mn(e){const l=function(e){if(e.length<2)return 0;const l=[];for(let t=1;t<e.length;t++){const o=e[t].time-e[t-1].time;o>0&&l.push(o)}return 0===l.length?0:(l.sort((e,l)=>e-l),l[Math.floor(l.length/2)])}(e);return l<=0||l<pn?"daily":l<604800?"weekly":"monthly"}const dn={daily:"d",weekly:"w",monthly:"m"},bn={daily:"Daily",weekly:"Weekly",monthly:"Monthly"},hn=(e,l,t,o)=>({key:e,type:"line",title:l,colorKey:t,style:{markersOnly:!0,markerRadius:o}});function gn(e){const l=dn[e],t=bn[e],o=`${l}SupportColor`,n=`${l}ResistanceColor`,r=`${l}CprColor`;return[{key:`${l}Pivot`,type:"line",title:`${t} Pivot`,colorKey:`${l}PivotColor`,style:{lineWidth:2}},hn(`${l}S1`,`${t} S1`,o,1),hn(`${l}S2`,`${t} S2`,o,1),hn(`${l}S3`,`${t} S3`,o,1),hn(`${l}R1`,`${t} R1`,n,1),hn(`${l}R2`,`${t} R2`,n,1),hn(`${l}R3`,`${t} R3`,n,1),hn(`${l}Bc`,`${t} Bottom Pivot`,r,2),hn(`${l}Tc`,`${t} Top Pivot`,r,2)]}function kn(e){const l=dn[e],t=bn[e];return[{key:`${l}PivotColor`,type:"color",label:"Pivot",default:"#ffeb3b",group:t},{key:`${l}SupportColor`,type:"color",label:"Support",default:"#4caf50",group:t},{key:`${l}ResistanceColor`,type:"color",label:"Resistance",default:"#ff5252",group:t},{key:`${l}CprColor`,type:"color",label:"CPR",default:"#ff9800",group:t},{key:`${l}FillColor`,type:"color",label:"CPR Fill",default:"#f47676",group:t}]}function wn(e,l,t,o,n){const r=e.length,a=un(r),i=un(r),s=un(r),c=un(r),u=un(r),p=un(r),y=un(r),f=un(r),m=un(r);if(t){const t=fn(e,l,n);let d=NaN,b=NaN,h=NaN,g=NaN,k=NaN,w=NaN;for(let l=0;l<r;l++){t[l]&&(d=g,b=k,h=w);const n=e[l],r=Number.isFinite(n.high)?n.high:NaN,v=Number.isFinite(n.low)?n.low:NaN,C=0===l||t[l];if(g=C?r:Math.max(g,r),k=C?v:Math.min(k,v),w=n.close,!Number.isFinite(d)||!Number.isFinite(b)||!Number.isFinite(h))continue;const N=(d+b+h)/3,M=d-b,A=2*N-d,x=2*N-b,S=(d+b)/2;o.pivot&&(a[l]=N),o.support&&(o.s1r1&&(i[l]=A),s[l]=N-M,c[l]=A-M),o.resistance&&(o.s1r1&&(u[l]=x),p[l]=N+M,y[l]=x+M),o.cpr&&(f[l]=S,m[l]=2*N-S)}}const d=dn[l];return{[`${d}Pivot`]:$(a),[`${d}S1`]:$(i),[`${d}S2`]:$(s),[`${d}S3`]:$(c),[`${d}R1`]:$(u),[`${d}R2`]:$(p),[`${d}R3`]:$(y),[`${d}Bc`]:$(f),[`${d}Tc`]:$(m)}}const vn={id:"cpr",name:"CPR with Floor Pivot",category:"Trend",placement:"onchart",inputs:[{key:"pivotMode",type:"select",label:"Select Pivot Mode",default:"auto",options:[{label:"Auto",value:"auto"},{label:"Manual",value:"manual"}]},{key:"showDaily",type:"boolean",label:"Show Daily CPR (Manual)",default:!0},{key:"showWeekly",type:"boolean",label:"Show Weekly CPR (Manual)",default:!1},{key:"showMonthly",type:"boolean",label:"Show Monthly CPR (Manual)",default:!1},{key:"displaypivots",type:"boolean",label:"Plot Pivot",default:!0},{key:"displaysupport",type:"boolean",label:"Plot Support",default:!0},{key:"displayresistance",type:"boolean",label:"Plot Resistance",default:!0},{key:"displaycpr",type:"boolean",label:"Plot CPR",default:!0},{key:"displayS1R1",type:"boolean",label:"Plot S1 / R1",default:!1},...kn("daily"),...kn("weekly"),...kn("monthly")],plots:[...gn("daily"),...gn("weekly"),...gn("monthly")],fills:["daily","weekly","monthly"].map(e=>{const l=dn[e];return{between:[`${l}Tc`,`${l}Bc`],colorUpKey:`${l}FillColor`,colorDownKey:`${l}FillColor`,opacity:.48}}),calc:(e,l)=>{const t="manual"===l.pivotMode,o=mn(e),n={pivot:cn(l,"displaypivots",!0),support:cn(l,"displaysupport",!0),resistance:cn(l,"displayresistance",!0),cpr:cn(l,"displaycpr",!0),s1r1:cn(l,"displayS1R1",!1)},i=t?{daily:cn(l,"showDaily",!0),weekly:cn(l,"showWeekly",!1),monthly:cn(l,"showMonthly",!1)}:{daily:"daily"===o,weekly:"weekly"===o,monthly:"monthly"===o},s=(e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===r?r:a(l)?l:r})(l);return{...wn(e,"daily",i.daily,n,s),...wn(e,"weekly",i.weekly,n,s),...wn(e,"monthly",i.monthly,n,s)}}};const Cn={id:"alphatrend",name:"AlphaTrend",category:"Trend",placement:"onchart",inputs:[{key:"coeff",type:"number",label:"Multiplier",default:1,min:0,max:20,step:.1},{key:"AP",type:"number",label:"Common Period",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"showsignalsk",type:"boolean",label:"Show Signals",default:!0},{key:"novolumedata",type:"boolean",label:"Change calculation (no volume data)",default:!1},{key:"color",type:"color",label:"AlphaTrend",default:"#0022fc"},{key:"lagColor",type:"color",label:"AlphaTrend Lag",default:"#fc0400"},{key:"risingFillColor",type:"color",label:"Rising Fill",default:"#00e60f"},{key:"fallingFillColor",type:"color",label:"Falling Fill",default:"#80000b"},{key:"buyColor",type:"color",label:"Buy",default:"#0022fc"},{key:"sellColor",type:"color",label:"Sell",default:"#880e4f"}],plots:[{key:"alphatrend",type:"line",title:"AlphaTrend",colorKey:"color",style:{lineWidth:3}},{key:"lagged",type:"line",title:"AlphaTrend Lag",colorKey:"lagColor",style:{lineWidth:3}}],fills:[{between:["alphatrend","lagged"],colorUpKey:"risingFillColor",colorDownKey:"fallingFillColor",opacity:1}],markers:({bars:e,values:l,settings:t})=>{if(!1===t.showsignalsk)return[];const o=l.buySignal??[],n=l.sellSignal??[],r=[];for(let l=0;l<e.length;l++){const a=o[l];if(null!=a){r.push({time:e[l].time,position:"atPrice",price:a,shape:"labelUp",size:"tiny",color:sn(t,"buyColor","#0022fc"),text:"BUY"});continue}const i=n[l];null!=i&&r.push({time:e[l].time,position:"atPrice",price:i,shape:"labelDown",size:"tiny",color:sn(t,"sellColor","#880e4f"),text:"SELL"})}return r},calc:(l,t)=>{const o=l.length,n=un(o),r=un(o),a=un(o),i=un(o);if(0===o)return{alphatrend:[],lagged:[],buySignal:[],sellSignal:[]};const s=Math.max(1,Math.round(an(t,"AP",14))),c=an(t,"coeff",1),y=!0===t.novolumedata,f=!1!==t.showsignalsk,m=l.map(e=>e.high),d=l.map(e=>e.low),b=l.map(e=>e.close),h=A(p(m,d,b),s),g=y?u(e(l,((e,l="source")=>e[l]??"close")(t)),s):function(e,l,t){const o=e.length,n=un(o);if(t<=0||0===o)return n;const r=new Array(o).fill(0),a=new Array(o).fill(0);for(let t=1;t<o;t++){const o=e[t]*l[t];e[t]>e[t-1]?r[t]=o:e[t]<e[t-1]&&(a[t]=o)}const i=M(r,t),s=M(a,t);for(let e=t;e<o;e++)Number.isFinite(i[e])&&Number.isFinite(s[e])&&(n[e]=0===s[e]?100:100-100/(1+i[e]/s[e]));return n}(l.map(e=>(e.high+e.low+e.close)/3),l.map(e=>e.volume??0),s);for(let e=0;e<o;e++){const t=e>0&&Number.isFinite(n[e-1])?n[e-1]:0;if(!Number.isFinite(h[e])||!Number.isFinite(g[e]))continue;const o=h[e]*c;n[e]=g[e]>=50?Math.max(l[e].low-o,t):Math.min(l[e].high+o,t)}for(let e=2;e<o;e++)r[e]=n[e-2];const k=new Array(o).fill(!1),w=new Array(o).fill(!1);for(let e=1;e<o;e++){const l=n[e],t=r[e],o=n[e-1],a=r[e-1];Number.isFinite(l)&&Number.isFinite(t)&&Number.isFinite(o)&&Number.isFinite(a)&&(l>t&&o<=a?k[e]=!0:l<t&&o>=a&&(w[e]=!0))}if(f){const e=k.map((e,l)=>l>0&&k[l-1]),l=w.map((e,l)=>l>0&&w[l-1]),t=fe(k),n=fe(w),s=fe(e),c=fe(l);for(let e=0;e<o;e++)k[e]&&s[e]>n[e]?a[e]=.9999*r[e]:w[e]&&c[e]>t[e]&&(i[e]=1.0001*r[e])}return{alphatrend:$(n),lagged:$(r),buySignal:$(a),sellSignal:$(i)}}},Nn={id:"range-analysis",name:"Range Analysis",category:"Volatility",placement:"pane",inputs:[{key:"showAverage",type:"boolean",label:"Show Average Range",default:!1},{key:"avgLength",type:"number",label:"Average Length",default:3,min:1,max:500,step:1},{key:"color",type:"color",label:"Range",default:"#ff5252"},{key:"avgColor",type:"color",label:"Average Range",default:"#2196f3"}],plots:[{key:"range",type:"histogram",title:"Range",colorKey:"color",style:{lineWidth:3,base:0}},{key:"avgRange",type:"line",title:"Average Range",colorKey:"avgColor",style:{lineWidth:2}}],calc:(e,l)=>{const t=e.map(e=>e.high-e.low);return!0!==l.showAverage?{range:$(t),avgRange:new Array(e.length).fill(null)}:{range:$(t),avgRange:$(U(t,Math.max(1,Math.round(an(l,"avgLength",3)))))}}},Mn=[vn,Cn,Nn],An=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},xn=(e,l,t)=>Math.max(1,Math.floor(An(e,l,t))),Sn=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},Ln=(e,l)=>new Array(e).fill(l),Bn=e=>/^#[0-9a-f]{6}$/i.test(e)?`${e}99`:e;function Kn(e,l){const t=e.length,o=new Array(t).fill(NaN);let n=0;for(;n<t&&!Number.isFinite(e[n]);)n+=1;if(n>=t)return o;const r=l(e.slice(n));for(let e=0;e<r.length&&n+e<t;e++)o[n+e]=r[e];return o}function Fn(e,l){const t=new Array(e.length).fill(NaN);for(let o=l;o<e.length;o++)t[o]=e[o-l];return t}function Wn(e,l){const t=new Array(e.length).fill(!1);for(let o=l;o<e.length;o++)t[o]=e[o-l];return t}const Dn={id:"wavetrend",name:"WaveTrend Pro",category:"Momentum",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"hlc3",group:"WaveTrend"},{key:"n1",type:"number",label:"Channel Length",default:10,min:1,max:500,step:1,group:"WaveTrend"},{key:"n2",type:"number",label:"Average Length",default:21,min:1,max:500,step:1,group:"WaveTrend"},{key:"sigLen",type:"number",label:"Signal Smoothing",default:4,min:1,max:100,step:1,group:"WaveTrend"},{key:"wt1Color",type:"color",label:"WT1",default:"#2962ff",group:"WaveTrend"},{key:"wt2Color",type:"color",label:"WT2",default:"#ff6d00",group:"WaveTrend"},{key:"fillUpColor",type:"color",label:"WT Fill Up",default:"#4caf50",group:"WaveTrend"},{key:"fillDownColor",type:"color",label:"WT Fill Down",default:"#ff5252",group:"WaveTrend"},{key:"obLevel1",type:"number",label:"Overbought 1",default:60,min:-200,max:200,step:1,group:"Levels"},{key:"obLevel2",type:"number",label:"Overbought 2",default:53,min:-200,max:200,step:1,group:"Levels"},{key:"osLevel1",type:"number",label:"Oversold 1",default:-60,min:-200,max:200,step:1,group:"Levels"},{key:"osLevel2",type:"number",label:"Oversold 2",default:-53,min:-200,max:200,step:1,group:"Levels"},{key:"obBandColor",type:"color",label:"OB Band",default:"#ff5252",group:"Levels"},{key:"osBandColor",type:"color",label:"OS Band",default:"#4caf50",group:"Levels"},{key:"filterZone",type:"boolean",label:"Only show crosses inside OB/OS zones",default:!0,group:"Signals"},{key:"useInner",type:"boolean",label:"Use inner levels (53) as the zone gate",default:!0,group:"Signals"},{key:"showMom",type:"boolean",label:"Show momentum histogram (wt1 - wt2)",default:!0,group:"Signals"},{key:"momUpColor",type:"color",label:"Momentum Up",default:"#008080",group:"Signals"},{key:"momDownColor",type:"color",label:"Momentum Down",default:"#880e4f",group:"Signals"},{key:"buyColor",type:"color",label:"Bullish Cross",default:"#00e676",group:"Signals"},{key:"sellColor",type:"color",label:"Bearish Cross",default:"#ff5252",group:"Signals"},{key:"showRegDiv",type:"boolean",label:"Regular divergence",default:!0,group:"Divergence"},{key:"showHidDiv",type:"boolean",label:"Hidden divergence",default:!1,group:"Divergence"},{key:"lbL",type:"number",label:"Pivot Lookback Left",default:3,min:1,max:100,step:1,group:"Divergence"},{key:"lbR",type:"number",label:"Pivot Lookback Right",default:3,min:1,max:100,step:1,group:"Divergence"},{key:"rangeUpper",type:"number",label:"Max Bars Between Pivots",default:60,min:1,max:1e3,step:1,group:"Divergence"},{key:"rangeLower",type:"number",label:"Min Bars Between Pivots",default:5,min:1,max:1e3,step:1,group:"Divergence"},{key:"bullColor",type:"color",label:"Bullish Divergence",default:"#4caf50",group:"Divergence"},{key:"bearColor",type:"color",label:"Bearish Divergence",default:"#ff5252",group:"Divergence"}],plots:[{key:"mom",type:"histogram",title:"Momentum",colorKey:"momUpColor",style:{base:0},colorBy:({value:e,settings:l})=>{const t=(e,t)=>{const o=l[e];return"string"==typeof o&&""!==o?o:t};return e>=0?t("momUpColor","#008080"):t("momDownColor","#880e4f")}},{key:"wt1",type:"line",title:"WT1",colorKey:"wt1Color",style:{lineWidth:2}},{key:"wt2",type:"line",title:"WT2",colorKey:"wt2Color",style:{lineWidth:1}}],fills:[{between:["wt1","wt2"],colorUp:"#4caf50",colorDown:"#ff5252",colorUpKey:"fillUpColor",colorDownKey:"fillDownColor",opacity:.15},{between:["obUpper","obLower"],colorUp:"#ff5252",colorDown:"#ff5252",colorUpKey:"obBandColor",colorDownKey:"obBandColor",opacity:.08},{between:["osUpper","osLower"],colorUp:"#4caf50",colorDown:"#4caf50",colorUpKey:"osBandColor",colorDownKey:"osBandColor",opacity:.08}],calc:(l,t)=>{const o=l.length,n=xn(t,"n1",10),r=xn(t,"n2",21),a=xn(t,"sigLen",4),i=An(t,"obLevel1",60),s=An(t,"obLevel2",53),c=An(t,"osLevel1",-60),u=An(t,"osLevel2",-53),p=new Array(o).fill(null),y=new Array(o).fill(null),f=new Array(o).fill(null),m=new Array(o).fill(null),d=new Array(o).fill(null),b=new Array(o).fill(null),h=e(l,(e=>e.source??"hlc3")(t)),g=Kn(h,e=>z(e,n)),k=Kn(h.map((e,l)=>Math.abs(e-g[l])),e=>z(e,n)),w=Kn(h.map((e,l)=>{const t=k[l];return Number.isFinite(t)?0===t?0:(e-g[l])/(.015*t):NaN}),e=>z(e,r)),v=Kn(w,e=>A(e,a)),C=w.map((e,l)=>e-v[l]),N={wt1:$(w),wt2:$(v),mom:!1===t.showMom?new Array(o).fill(null):$(C),obUpper:Ln(o,i),obLower:Ln(o,s),osUpper:Ln(o,u),osLower:Ln(o,c),buy:p,sell:y,bull:f,bear:m,hiddenBull:d,hiddenBear:b},M=!1!==t.filterZone,x=!1!==t.useInner,S=x?s:i,L=x?u:c;for(let e=1;e<o;e++){const l=w[e-1],t=v[e-1],o=w[e],n=v[e];Number.isFinite(l)&&Number.isFinite(t)&&(Number.isFinite(o)&&Number.isFinite(n)&&(o>n&&l<=t&&(!M||n<=L)&&(p[e]=n),o<n&&l>=t&&(!M||n>=S)&&(y[e]=n)))}const B=xn(t,"lbL",3),K=xn(t,"lbR",3),F=An(t,"rangeLower",5),W=An(t,"rangeUpper",60),D=!1!==t.showRegDiv,R=!0===t.showHidDiv,O=ue(v,B,K).map(e=>Number.isFinite(e)),T=ce(v,B,K).map(e=>Number.isFinite(e)),U=Fn(v,K),P=Fn(l.map(e=>e.low),K),I=Fn(l.map(e=>e.high),K),V=fe(Wn(O,1)),E=fe(Wn(T,1)),q=me(O,U,1),H=me(O,P,1),j=me(T,U,1),Z=me(T,I,1);for(let e=0;e<o;e++){const l=e-K;if(!(l<0)){if(O[e]){const t=F<=V[e]&&V[e]<=W;D&&t&&U[e]>q[e]&&P[e]<H[e]&&(f[l]=U[e]),R&&t&&U[e]<q[e]&&P[e]>H[e]&&(d[l]=U[e])}if(T[e]){const t=F<=E[e]&&E[e]<=W;D&&t&&U[e]<j[e]&&I[e]>Z[e]&&(m[l]=U[e]),R&&t&&U[e]>j[e]&&I[e]<Z[e]&&(b[l]=U[e])}}}return N},markers:({bars:e,values:l,settings:t})=>{const o=Sn(t,"bullColor","#4caf50"),n=Sn(t,"bearColor","#ff5252"),r=[{col:l.buy,shape:"circle",size:"tiny",color:Sn(t,"buyColor","#00e676"),text:void 0},{col:l.sell,shape:"circle",size:"tiny",color:Sn(t,"sellColor","#ff5252"),text:void 0},{col:l.bull,shape:"labelUp",size:"small",color:o,text:"R"},{col:l.bear,shape:"labelDown",size:"small",color:n,text:"R"},{col:l.hiddenBull,shape:"labelUp",size:"small",color:Bn(o),text:"H"},{col:l.hiddenBear,shape:"labelDown",size:"small",color:Bn(n),text:"H"}],a=[];for(let l=0;l<e.length;l++)for(const t of r){const o=t.col?.[l];if(null==o)continue;const n={time:e[l].time,position:"atPrice",price:o,shape:t.shape,size:t.size,color:t.color};void 0!==t.text&&(n.text=t.text),a.push(n)}return a},levels:e=>[{price:An(e,"obLevel1",60),color:Sn(e,"obBandColor","#ff5252"),title:"Overbought 1",dashed:!0},{price:An(e,"obLevel2",53),color:Sn(e,"obBandColor","#ff5252"),title:"Overbought 2",dashed:!0},{price:0,color:"#787b86",title:"Zero",dashed:!0},{price:An(e,"osLevel2",-53),color:Sn(e,"osBandColor","#4caf50"),title:"Oversold 2",dashed:!0},{price:An(e,"osLevel1",-60),color:Sn(e,"osBandColor","#4caf50"),title:"Oversold 1",dashed:!0}]},Rn=[Dn],On=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Tn=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},Un=(e,l)=>!1!==e[l],Pn="#089981",In="#F23745",Vn="#787b86",En=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function qn(e,l){let t=e;if(/^#[0-9a-f]{3}$/i.test(t))t=`#${t[1]}${t[1]}${t[2]}${t[2]}${t[3]}${t[3]}`;else if(/^#[0-9a-f]{8}$/i.test(t))t=t.slice(0,7);else if(!/^#[0-9a-f]{6}$/i.test(t))return e;return`${t}${Math.round(255*Math.min(1,Math.max(0,l))).toString(16).padStart(2,"0")}`}const Hn=qn(Vn,.2),$n=qn(Vn,.5);function zn(e,l,t,o){if(null===e||!Number.isFinite(e))return;return qn(e>=0?t:o,.1+.4*(l>0?Math.min(1,Math.abs(e)/l):1))}const jn=e=>`${e.toFixed(2)}%`;const Zn=(e,l)=>100*e+l;function Yn(e,l){const t=function(e,l){const t=[];let o=null,n=0,r=0;for(const a of e)if(null===o||a.time<n||a.time>=r){const e=d(a.time,l);o={year:e.year,month:e.month,last:a.close},t.push(o),n=b(e.year,e.month,1,0,0,0,l),r=b(e.year,e.month+1,1,0,0,0,l)}else o.last=a.close;return t}(e,(e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===r?r:a(l)?l:r})(l)),o=Math.round(On(l,"startYear",2015)),n=function(e){const l=new Set;for(const t of e.split(",")){const e=t.replace(/[\s-]/g,"");if(!/^\d{6}$/.test(e))continue;const o=Number(e),n=o%100;n>=1&&n<=12&&l.add(o)}return l}(Tn(l,"ignoredMonths","")),i=t.length>0?t[t.length-1]:null;null!==i&&n.add(Zn(i.year,i.month));const s=[],c=new Map;for(let e=1;e<t.length;e++){const l=t[e],r=t[e-1];if(l.year<o||n.has(Zn(l.year,l.month)))continue;if(!Number.isFinite(r.last)||!Number.isFinite(l.last)||0===r.last)continue;const a=100*(l.last-r.last)/Math.abs(r.last);if(!Number.isFinite(a))continue;let i=c.get(l.year);void 0===i&&(i=new Array(12).fill(null),c.set(l.year,i),s.push(l.year)),i[l.month-1]=a}return{years:s,byYear:c,skipped:n}}function Jn(e,l){const t=[];for(const o of e.years){const n=e.byYear.get(o)?.[l];null!=n&&t.push(n)}return t}const Gn=e=>{if(0===e.length)return null;let l=0;for(const t of e)l+=t;const t=l/e.length;return Number.isFinite(t)?t:null};function Xn(e){if(e.length<2)return null;const l=Gn(e);if(null===l)return null;let t=0;for(const o of e)t+=(o-l)*(o-l);const o=Math.sqrt(t/(e.length-1));return Number.isFinite(o)?o:null}const _n=e=>{if(0===e.length)return null;let l=0;for(const t of e)t>=0&&(l+=1);return 100*l/e.length},Qn={Left:"bottom-left",Center:"bottom-center",Right:"bottom-right"},er=[52,...new Array(12).fill(46)],lr=e=>({text:e,bgColor:Hn}),tr={id:"seasonality",name:"Seasonality",category:"Trend",placement:"pane",inputs:[{key:"startYear",type:"number",label:"Starting year",default:2015,min:1800,max:2999,step:1},{key:"posColor",type:"color",label:"Positive Color",default:Pn,group:"Color settings"},{key:"negColor",type:"color",label:"Negative Color",default:In,group:"Color settings"},{key:"cutoffPercent",type:"number",label:"Color intensity cutoff (%)",default:10,min:0,max:100,step:1,group:"Color settings"},{key:"tablePosition",type:"select",label:"Table Position",default:"Center",options:[{label:"Left",value:"Left"},{label:"Center",value:"Center"},{label:"Right",value:"Right"}],group:"Heatmap settings"},{key:"tableWidth",type:"number",label:"Table Width (%)",default:100,min:0,max:100,step:1,group:"Heatmap settings"},{key:"tableHeight",type:"number",label:"Table Height (%)",default:95,min:0,max:100,step:1,group:"Heatmap settings"},{key:"showAvg",type:"boolean",label:"Show Averages",default:!0,group:"Heatmap settings"},{key:"showStDev",type:"boolean",label:"Show Standard Deviation",default:!0,group:"Heatmap settings"},{key:"showPos",type:"boolean",label:"Show Percent Positive",default:!0,group:"Heatmap settings"},{key:"ignoredMonths",type:"text",label:"Ignored months",default:"YYYY-MM, YYYY-MM",group:"Additional settings"}],plots:[{key:"seasonality",type:"line",title:"Seasonality"}],calc:e=>({seasonality:new Array(e.length).fill(null)}),table:({bars:e,settings:l})=>{const t=Yn(e,l);if(0===t.years.length)return null;const o=On(l,"cutoffPercent",10),n=Tn(l,"posColor",Pn),r=Tn(l,"negColor",In),a=[[lr("Year"),...En.map(lr)]],i=[1];for(const e of t.years){const l=t.byYear.get(e)??[],s=[lr(String(e))];for(let a=0;a<12;a++){if(t.skipped.has(Zn(e,a+1))){s.push({text:"SKIP",bgColor:$n});continue}const i=l[a]??null;s.push(null===i?{text:""}:{text:jn(i),bgColor:zn(i,o,n,r)})}a.push(s),i.push(1)}const s=Un(l,"showAvg"),c=Un(l,"showStDev"),u=Un(l,"showPos");if(s||c||u){if(a.push(Array.from({length:13},()=>({text:"",bgColor:Hn}))),i.push(.3),s){const e=[lr("Avgs:")];for(let l=0;l<12;l++){const a=Gn(Jn(t,l));e.push(null===a?{text:""}:{text:jn(a),bgColor:zn(a,o,n,r)})}a.push(e),i.push(1)}if(c){const e=[lr("StDev:")];for(let l=0;l<12;l++){const o=Xn(Jn(t,l));e.push({text:null===o?"":o.toFixed(2),bgColor:Hn})}a.push(e),i.push(1)}if(u){const e=[lr("Pos%:")];for(let l=0;l<12;l++){const o=_n(Jn(t,l));e.push(null===o?{text:""}:{text:`${Math.round(o)}%`,bgColor:zn(o-50,50,n,r)})}a.push(e),i.push(1)}}return{rows:a,options:{position:Qn[Tn(l,"tablePosition","Center")]??"bottom-center",cellWidth:er,cellHeight:18,rowWeights:i,widthPercent:On(l,"tableWidth",100),heightPercent:On(l,"tableHeight",95),fontSize:10,margin:8}}}},or=[tr],nr="__tier2",rr=e=>e[nr];function ar(e,l){return(e.refetchOn??[]).map(e=>`${e}=${String(l[e])}`).join("&")}function ir(e,l){const t=e[e.length-1];if(void 0===t||l.time>t.time)return void e.push(l);if(l.time===t.time)return void(e[e.length-1]=l);let o=0,n=e.length;for(;o<n;){const t=o+n>>1;e[t].time<l.time?o=t+1:n=t}e[o]?.time===l.time?e[o]=l:e.splice(o,0,l)}function sr(e){const l=new WeakMap;return{id:e.id,name:e.name,category:e.category,placement:e.placement,inputs:e.inputs,plots:e.plots,levels:e.levels,range:e.range,calc:(t,o,n,r)=>{const a=rr(n);try{const i=function(e,l,t){const o={};for(const l of t)o[l]=new Array(e.length).fill(null);if(0===l.length)return o;let n=-1;for(let r=0;r<e.length;r++){for(;n+1<l.length&&l[n+1].time<=e[r].time;)n+=1;if(n<0)continue;const a=l[n].values;for(const e of t){const l=a[e];o[e][r]="number"==typeof l&&Number.isFinite(l)?l:null}}return o}(t,a?.points??[],function(e){const l=e.plots.map(e=>e.key);for(const t of e.series??[])l.includes(t)||l.push(t);return l}(e)),s=void 0===e.calc?i:e.calc(t,i,o,n,r);return l.delete(n),s}catch(e){throw l.set(n,{points:a?.points,error:e}),e}},attach:t=>{const o=rr(t.store)??{key:null,points:[],live:[],loaded:!1,from:0,to:0,status:{state:"empty"},request:null,subscription:null,generation:0,completedVersion:null,liveRevision:0,liveVersions:new Map};t.store[nr]=o;let n=++o.generation,r=!0,a=0,i=()=>{};const s=()=>r&&o.generation===n&&!t.signal?.aborted,c=e=>{o.status=e;const n=l.get(t.store);s()&&t.setDataStatus?.("ready"!==e.state&&"empty"!==e.state||n?.points!==o.points?e:{state:"error",error:n.error})},u=()=>{const e=o.request;o.request=null,e?.controller.abort()},p=()=>{const e=o.subscription;o.subscription=null,e?.dispose?.()},y=()=>{n=++o.generation,o.loaded=!1,o.completedVersion=null,o.completedContext=void 0,o.baseDataRevision=o.lastContext?.requestState?.dataRevision,o.live=[],o.liveVersions.clear(),o.errorKind=void 0;const e=o.points.length>0;o.points=[],o.status={state:"empty"};const l=o.request,r=o.subscription;o.request=null,o.subscription=null,l?.controller.abort(),r?.dispose?.(),e&&t.requestRecompute()},f=e=>{e.receive=n=>{if(!s()||o.request!==e||e.controller.signal.aborted)return;if(o.request=null,o.completedVersion=e.version,!n.ok)return o.errorKind="fetch",c({state:"error",error:n.error}),void(void 0!==e.context.requestState&&b());const r="tail"===e.mode?o.points.slice():[];try{for(const l of n.points.slice().sort((e,l)=>e.time-l.time))Number.isFinite(l.time)&&(void 0===e.context.asOf||l.time<=e.context.asOf)&&ir(r,l)}catch(l){return o.errorKind="fetch",c({state:"error",error:l}),void(void 0!==e.context.requestState&&b())}if("prepend"===e.mode)for(const e of o.points)ir(r,e);if(void 0===e.context.asOf)for(const l of o.live)(null===e.liveAfter||(o.liveVersions.get(l.time)??0)>e.liveAfter)&&ir(r,l);const a=o.points;o.points=r;try{t.requestRecompute();const e=l.get(t.store);if(e?.points===r)throw e.error}catch(l){return void(s()&&o.points===r&&(o.points=a,o.errorKind="calc",c({state:"error",error:l}),void 0!==e.context.requestState&&b()))}if(s()&&o.points===r){if(null!==e.liveAfter){o.live=o.live.filter(l=>(o.liveVersions.get(l.time)??0)>e.liveAfter);for(const[l,t]of o.liveVersions)t<=e.liveAfter&&o.liveVersions.delete(l)}o.from=o.loaded&&"replace"!==e.mode?Math.min(o.from,e.from):e.from,o.to=o.loaded&&"replace"!==e.mode?Math.max(o.to,e.to):e.to,o.loaded=!0,o.completedContext=e.context,o.errorKind=void 0,c({state:r.length>0?"ready":"empty"}),b()}},void 0!==e.outcome&&e.receive(e.outcome)},m=l=>{if(!s()||o.request!==l||l.started||l.controller.signal.aborted)return;l.started=!0;const t=e=>{l.outcome=e,l.receive(e)};let n;try{n=e.fetch({...l.context,from:l.from,to:l.to,signal:l.controller.signal})}catch(e){return void t({ok:!1,error:e})}Promise.resolve(n).then(e=>t({ok:!0,points:e}),e=>t({ok:!1,error:e}))},d=(e,l,t,n,r,a=!1)=>{const i={controller:new AbortController,context:e,from:l,to:t,mode:n,version:r,liveAfter:a?o.liveRevision:null,started:!1,receive:()=>{}};o.request=i,f(i),c({state:"loading"}),m(i)},b=(l=!1)=>{if(!s())return;const r=++a,i=()=>s()&&a===r,u=(()=>{const e=t.bars(),l=t.dataContext?.()??{symbol:t.symbol?.(),interval:t.interval?.()},o=t.requestState?.();return{settings:t.settings(),bars:e,dataContext:{...l},requestState:o,asOf:o?.replay?.asOf,from:e[0]?.time??0,to:e[e.length-1]?.time??0,requestBars:t.requestBars}})(),p=o.lastContext;o.lastContext=u;const b=u.dataContext,h=u.requestState,g=h?.replay,k=h?.source,w=p?.requestState?.source,v=p?.requestState?.replay,C=JSON.stringify([ar(e,u.settings),b?.symbol,b?.exchange,b?.interval,h?.providerRevision,k?.sourceId,void 0!==g]),N=u.bars.length-(p?.bars.length??0),M=void 0!==p&&void 0!==w&&void 0!==k&&"prepend"===k.change&&k.revision===w.revision+1&&k.historyRevision===w.historyRevision+1&&u.bars!==p.bars&&N>0&&p.bars.every((e,l)=>u.bars[N+l]===e),A=void 0===g&&void 0!==k&&void 0!==w&&k.historyRevision!==w.historyRevision&&!M,x=void 0!==u.asOf&&void 0!==v?.asOf&&u.asOf<v.asOf,S=C!==o.key||A||x;if(S){if(y(),!i())return;o.key=C}let L;try{L=(void 0===g||!0===e.supportsReplay&&Number.isFinite(u.asOf))&&(e.supports?.(u)??!0)}catch(e){return void(i()&&c({state:"error",error:e}))}if(!i())return;if(!L)return y(),void(i()&&c({state:"unsupported"}));if(0===u.bars.length)return void(void 0!==h?(y(),i()&&c({state:"empty"})):null===o.request&&c({state:"empty"}));const B=JSON.stringify([C,u.from,void 0===e.subscribe||void 0!==g?u.to:null,void 0===g&&void 0===e.subscribe?k?.revision:null,h?.dataRevision,u.asOf]),K=u.from<o.from||void 0===e.subscribe&&u.to>o.to;if(null!==o.request){const e=o.request;f(e),m(e)}else if(l||S||(void 0!==h?o.completedVersion!==B||K&&"error"!==o.status.state:"error"!==o.status.state)){const t=void 0!==h&&(o.completedContext?.requestState?.dataRevision??o.baseDataRevision)!==h.dataRevision;!o.loaded||l||void 0!==g||t?d(u,u.from,u.to,"replace",B,t):u.from<o.from?d(u,u.from,o.from,"prepend",B):void 0===e.subscribe&&(u.to>o.to||void 0!==h)?d(u,o.to,u.to,"tail",B):c({state:o.points.length>0?"ready":"empty"})}if(i()&&null===o.subscription&&void 0!==e.subscribe&&void 0===g){const l=n,r={};o.subscription=r;try{const a=e.subscribe(u,e=>{s()&&n===l&&o.subscription===r&&Number.isFinite(e.time)&&(ir(o.live,e),o.liveVersions.set(e.time,++o.liveRevision),ir(o.points,e),t.requestRecompute(),s()&&n===l&&o.subscription===r&&null===o.request&&"error"!==o.status.state&&c({state:"ready"}))});s()&&n===l&&o.subscription===r?r.dispose=a:a()}catch(e){s()&&o.subscription===r&&(o.subscription=null,c({state:"error",error:e}))}}},h=()=>{if(!s()&&!r)return;if(r=!1,i(),t.signal?.removeEventListener("abort",g),o.generation!==n)return;o.generation+=1;const e=o.generation;t.setDataRetry?.(null),p(),queueMicrotask(()=>{o.generation===e&&u()})},g=()=>{o.generation===n&&u(),h()};p(),t.signal?.addEventListener("abort",g,{once:!0}),i=void 0!==t.requestState&&void 0!==t.subscribeRequestChanges?t.subscribeRequestChanges(()=>b()):t.subscribeDataChanges?.(()=>b())??(()=>{}),t.setDataRetry?.(()=>b(!0));const k=l.get(t.store);return"calc"===o.errorKind&&void 0===k&&(o.errorKind=void 0,o.status={state:o.points.length?"ready":"empty"}),t.setDataStatus?.(k?.points===o.points?{state:"error",error:k.error}:o.status),b("error"===o.status.state&&"calc"!==o.errorKind),h}}}const cr=604800;function ur(e,l,t,o){if("calendar"===e.mode)return w(e,l,t);if("interval"!==e.mode)return l;const n=e.seconds;if(n%cr===0)return Math.floor(v(l,t)/(n/cr));if(n%86400==0)return Math.floor(C(l,t)/(n/86400));if(null===o)return w(e,l);const r=d(l,t),a=b(r.year,r.month,r.day,Math.floor(o/60),o%60,0,t);return 1e6*C(l,t)+Math.floor((l-a)/n)}const pr=e=>Number.isFinite(e);function yr(e,l,t={}){const o=t.timezone??r,n=Math.floor(t.offset??0);if(!Number.isFinite(n)||n<0)throw new h("securitySeries: offset must be zero or a positive count of buckets");const a=!0===t.lookahead,{bucketing:i}=g(l);if("ticks"===i.mode||"volume"===i.mode)throw new h(`securitySeries: "${l}" closes on trade flow rather than the clock and cannot be folded from time bars`);let s=null;if(void 0!==t.session){const e=k(t.session);if(null===e)throw new h(`securitySeries: cannot read session "${t.session}"`);s=e.start}const c=e.length,u=new Array(c).fill(null),p=new Array(c).fill(null),y=new Array(c).fill(null),f=new Array(c).fill(null),m=new Array(c).fill(null),d=new Array(c).fill(null),b=new Array(c).fill(null),w=new Array(c).fill(!1);if(0===c)return{open:u,high:p,low:y,close:f,volume:m,oi:d,bucketStart:b,isNew:w};const v=[],C=new Array(c);let N=NaN;for(let l=0;l<c;l++){const t=e[l],n=ur(i,t.time,o,s);if(0===l||n!==N)v.push({start:t.time,open:t.open,high:t.high,low:t.low,close:t.close,volume:void 0===t.volume?null:t.volume,oi:void 0===t.oi?null:t.oi}),w[l]=!0;else{const e=v[v.length-1];!pr(e.open)&&pr(t.open)&&(e.open=t.open),pr(t.high)&&(!pr(e.high)||t.high>e.high)&&(e.high=t.high),pr(t.low)&&(!pr(e.low)||t.low<e.low)&&(e.low=t.low),pr(t.close)&&(e.close=t.close),void 0!==t.volume&&(e.volume=(e.volume??0)+t.volume),void 0!==t.oi&&(e.oi=t.oi)}C[l]=v.length-1,N=n}let M=NaN,A=NaN,x=null,S=null;for(let l=0;l<c;l++){const t=e[l],o=C[l];if(n>0){const e=o-n;if(e<0)continue;const t=v[e];u[l]=t.open,p[l]=t.high,y[l]=t.low,f[l]=t.close,m[l]=t.volume,d[l]=t.oi,b[l]=t.start;continue}const r=v[o];b[l]=r.start,a?(u[l]=r.open,p[l]=r.high,y[l]=r.low,f[l]=r.close,m[l]=r.volume,d[l]=r.oi):(w[l]?(M=t.high,A=t.low,x=void 0===t.volume?null:t.volume,S=void 0===t.oi?null:t.oi):(pr(t.high)&&(!pr(M)||t.high>M)&&(M=t.high),pr(t.low)&&(!pr(A)||t.low<A)&&(A=t.low),void 0!==t.volume&&(x=(x??0)+t.volume),void 0!==t.oi&&(S=t.oi)),u[l]=r.open,p[l]=pr(M)?M:null,y[l]=pr(A)?A:null,f[l]=pr(t.close)?t.close:null,m[l]=x,d[l]=S)}return{open:u,high:p,low:y,close:f,volume:m,oi:d,bucketStart:b,isNew:w}}function fr(e,l,t,o={}){const n=o.mode??"confirmed";if(!["confirmed","developing","lookahead"].includes(n))throw new h("securityExpression: invalid mode");const a=o.timezone??r,{bucketing:i}=g(l);if("interval"!==i.mode&&"calendar"!==i.mode)throw new h("securityExpression: requested interval must close on the clock");const s=void 0===o.session?void 0:k(o.session);if(null===s)throw new h("securityExpression: invalid session");if(0===e.length)return{};const c=[],u=[],p={};let y,f,m=-1/0;const d=()=>{const l=t(Object.freeze(c.slice()));if(null===l||"object"!=typeof l||Array.isArray(l))throw new h("securityExpression: expression must return named columns");const o=Object.keys(l);if(y&&(o.length!==y.length||y.some(e=>!Object.prototype.hasOwnProperty.call(l,e))))throw new h("securityExpression: expression column keys must remain stable");for(const t of o){if(!Array.isArray(l[t])||l[t].length!==c.length)throw new h("securityExpression: expression column length must match requested bars");Object.prototype.hasOwnProperty.call(p,t)||Object.defineProperty(p,t,{value:new Array(e.length).fill(null),enumerable:!0})}return y=o,l},b=(e,l,t)=>{for(const o of y??[]){const n=e[o][t];p[o][l]="number"==typeof n&&Number.isFinite(n)?n:null}};for(let l=0;l<e.length;l++){const t=e[l];if(!Number.isFinite(t.time)||t.time<=m)throw new h("securityExpression: source times must be finite and strictly increasing");m=t.time;const o=ur(i,t.time,a,s?.start??null);if(o!==f)c.push(Object.freeze({...t}));else{const e=c[c.length-1],l={...e};!pr(e.open)&&pr(t.open)&&(l.open=t.open),pr(t.high)&&(!pr(e.high)||t.high>e.high)&&(l.high=t.high),pr(t.low)&&(!pr(e.low)||t.low<e.low)&&(l.low=t.low),pr(t.close)&&(l.close=t.close),void 0!==t.volume&&(l.volume=(e.volume??0)+t.volume),void 0!==t.oi&&(l.oi=t.oi),c[c.length-1]=Object.freeze(l)}f=o,u.push(c.length-1),"developing"===n&&b(d(),l,c.length-1)}if("developing"!==n){const l=d();for(let t=0;t<e.length;t++)b(l,t,u[t]-("confirmed"===n?1:0))}return p}function mr(e){const l=e.missing??"propagate";if("propagate"!==l&&"skip"!==l)throw new TypeError("Numerical missing policy must be propagate or skip");return l}function dr(e){if(!Number.isSafeInteger(e)||e<=0)throw new RangeError("Numerical period must be a positive safe integer")}function br(e,l,t,o){dr(l);const n=mr(t),r=new Array(e.length).fill(NaN),a=[];for(let t=0;t<e.length;t++){const i=e[t];"skip"!==n||Number.isFinite(i)?(a.push(i),a.length>l&&a.shift(),a.length===l&&a.every(Number.isFinite)&&(r[t]=o(a))):t>0&&(r[t]=r[t-1])}return r}function hr(e,l,t={}){return br(e,l,t,e=>{const t=e.slice().sort((e,l)=>e-l),o=Math.floor(l/2);if(l%2!=0)return t[o];const n=t[o-1],r=t[o];return n===r?n:n/2+r/2})}function gr(e,l,t={}){return br(e,l,t,e=>{const l=new Map;let t=1/0,o=0;for(const n of e){const e=(l.get(n)??0)+1;l.set(n,e),(e>o||e===o&&n<t)&&(t=n,o=e)}return t})}function kr(e,l,t={}){if(void 0!==t.sample&&"boolean"!=typeof t.sample)throw new TypeError("Numerical sample option must be boolean");return br(e,l,t,e=>{if(t.sample&&1===l)return NaN;const o=e[0];let n=0;for(const t of e){const e=t-o;if(!Number.isFinite(e))return 1/0;n+=e/l}const r=t.sample?l-1:l;let a=0;for(const l of e){const e=l-o-n;a+=e/r*e}return a})}function wr(e,l,t={}){return br(e,l,t,e=>{let l=1/0,t=-1/0;for(const o of e)l=Math.min(l,o),t=Math.max(t,o);return t-l})}function vr(e,l,t,o={}){if(!Number.isFinite(t)||t<0||t>100)throw new RangeError("Numerical percentage must be finite and between 0 and 100");return br(e,l,o,e=>{const o=e.slice().sort((e,l)=>e-l),n=t/100*(l-1),r=Math.floor(n),a=Math.ceil(n),i=n-r;return o[r]===o[a]?o[r]:o[r]*(1-i)+o[a]*i})}function Cr(e,l,t={}){return br(e,l,t,e=>{const t=e.map((e,l)=>({value:e,index:l})).sort((e,l)=>e.value-l.value),o=new Array(l);for(let e=0;e<l;){let n=e+1;for(;n<l&&t[n].value===t[e].value;)n++;const r=(e+n-1)/2;for(let l=e;l<n;l++)o[t[l].index]=r;e=n}const n=(l-1)/2;let r=0,a=0,i=0;for(let e=0;e<l;e++){const l=o[e]-n,t=e-n;r+=l*t,a+=l*l,i+=t*t}const s=Math.sqrt(a)*Math.sqrt(i);return 0===s?NaN:Math.max(-100,Math.min(100,100*r/s))})}function Nr(e,l,t){let o=0,n=0;for(let r=0;r<e.length;r++){const a=e[r]/l*(t?e.length-r:1),i=o+a;n+=Math.abs(o)>=Math.abs(a)?o-i+a:a-i+o,o=i}return o+n}function Mr(e,l,t={}){return br(e,l,t,e=>{const l=Nr(e,1,!1);if(0===l)return NaN;const t=Nr(e,1,!0);if(Number.isFinite(l)&&Number.isFinite(t))return-t/l;let o=0;for(const l of e)o=Math.max(o,Math.abs(l));const n=2**Math.min(1023,Math.floor(Math.log2(o))),r=Number.isFinite(l)?l/n:Nr(e,n,!1),a=Nr(e,n,!0);return 0===r?Number.isFinite(l)?-a/l*n:NaN:-a/r})}function Ar(e,l,t){const o=mr(l),n=new Array(e.length).fill(NaN);let r=NaN,a=!1;for(let l=0;l<e.length;l++){const i=e[l];Number.isFinite(i)?a||(Number.isNaN(r)||(t?i>r:i<r))&&(r=i):"propagate"===o&&(a=!0),a||(n[l]=r)}return n}function xr(e,l={}){return Ar(e,l,!1)}function Sr(e,l={}){return Ar(e,l,!0)}function Lr(e,l,t,o){if(e.length!==l.length)throw new RangeError("Numerical crossing arrays must have equal lengths");const n=mr(t),r=new Array(e.length).fill(!1);let a=NaN,i=NaN;for(let t=0;t<e.length;t++){if(!Number.isFinite(e[t])||!Number.isFinite(l[t])){"propagate"===n&&(a=NaN,i=NaN);continue}const s=e[t]>l[t]&&a<=i,c=e[t]<l[t]&&a>=i;r[t]="above"===o?s:"below"===o?c:s||c,a=e[t],i=l[t]}return r}function Br(e,l,t={}){return Lr(e,l,t,"above")}function Kr(e,l,t={}){return Lr(e,l,t,"below")}function Fr(e,l,t={}){return Lr(e,l,t,"either")}function Wr(e,l,t,o){dr(l);const n=mr(t),r=new Array(e.length).fill(!1),a=[];for(let t=0;t<e.length;t++){const i=e[t];Number.isFinite(i)&&a.length===l&&(r[t]=a.every(e=>Number.isFinite(e)&&(o?i>e:i<e))),("propagate"===n||Number.isFinite(i))&&(a.push(i),a.length>l&&a.shift())}return r}function Dr(e,l,t={}){return Wr(e,l,t,!0)}function Rr(e,l,t={}){return Wr(e,l,t,!1)}function Or(e){throw new h(`Requested context: ${e}`)}function Tr(e){if(null===e||"object"!=typeof e||Array.isArray(e))return!1;const l=Object.getPrototypeOf(e);return l===Object.prototype||null===l}function Ur(e,l,t){Object.defineProperty(e,l,{value:t,enumerable:!0,writable:!0,configurable:!0})}function Pr(e,l){Tr(e)&&Array.isArray(e.bars)&&Array.isArray(e.availableAt)&&Array.isArray(e.confirmed)||Or("snapshot must contain bars, availableAt and confirmed arrays");const t=e.bars.length;e.availableAt.length===t&&e.confirmed.length===t||Or("snapshot arrays must have equal lengths"),"function"!=typeof l&&Or("expression must be a function");const o=[],n=[];let r=-1/0,a=-1/0,i=!1;for(let l=0;l<t;l++){const t=e.bars[l];(!Tr(t)||!Number.isFinite(t.time)||t.time<=r)&&Or("bar times must be finite and strictly increasing"),(["open","high","low","close"].some(e=>"number"!=typeof t[e])||void 0!==t.volume&&"number"!=typeof t.volume||void 0!==t.oi&&"number"!=typeof t.oi)&&Or("bar readings must be numbers");const s=e.availableAt[l];null!==s&&(!Number.isFinite(s)||s<t.time)&&Or("availability must be null or finite and at or after bar opening"),"boolean"!=typeof e.confirmed[l]&&Or("confirmation must be boolean"),r=t.time,o.push(Object.freeze({...t})),e.confirmed[l]&&null!==s||(i=!0),i||null===s||(a=Math.max(a,s),n.push(a))}const s={},c=Object.freeze(o);if(0===t)return{bars:c,eligibleAt:n,values:s};const u=l(c);Tr(u)||Or("expression must return named columns");for(const e of Object.keys(u)){const l=u[e];Array.isArray(l)&&l.length===t||Or("expression columns must match requested bar count");const o=[];for(let e=0;e<t;e++){const t=l[e];null!==t&&"number"!=typeof t&&Or("expression values must be numbers or null"),o.push(null!==t&&Number.isFinite(t)?t:null)}Ur(s,e,o)}return{bars:c,eligibleAt:n,values:s}}function Ir(e,l,t,o={}){Array.isArray(e)||Or("target times must be an array");let n=-1/0;for(const l of e)(!Number.isFinite(l)||l<=n)&&Or("target times must be finite and strictly increasing"),n=l;(!Tr(o)||void 0!==o.gaps&&"carry"!==o.gaps&&"missing"!==o.gaps)&&Or("gaps must be carry or missing");const{eligibleAt:r,values:a}=Pr(l,t),i=Object.keys(a),s={};for(const l of i)Ur(s,l,new Array(e.length).fill(null));let c=-1,u=-1;for(let l=0;l<e.length;l++){for(;c+1<r.length&&r[c+1]<=e[l];)c++;if(c>=0&&("missing"!==o.gaps||c!==u))for(const e of i)s[e][l]=a[e][c];u=c}return s}function Vr(e,l,t,o={}){Array.isArray(e)||Or("target windows must be an array");let n=-1/0;for(const l of e)(!Tr(l)||!Number.isFinite(l.start)||!Number.isFinite(l.end)||l.start>=l.end||l.start<n)&&Or("windows must be finite, ordered and nonoverlapping with start < end"),n=l.end;Tr(o)&&(void 0===o.asOf||Number.isFinite(o.asOf))||Or("asOf must be finite");const{bars:r,eligibleAt:a,values:i}=Pr(l,t),s=Object.keys(i),c={times:e.map(()=>[]),values:{}};for(const l of s)Ur(c.values,l,e.map(()=>[]));let u=0;for(let l=0;l<e.length;l++){const{start:t,end:n}=e[l],p=Math.min(n,o.asOf??1/0);for(;u<a.length&&r[u].time<t;)u++;for(;u<a.length&&r[u].time<n;){if(a[u]<=p){c.times[l].push(r[u].time);for(const e of s)c.values[e][l].push(i[e][u])}u++}}return c}const Er="__requestedIndicator",qr={bars:[],availableAt:[],confirmed:[]},Hr=e=>e[Er],$r=e=>{throw new h(`Requested indicator: ${e}`)};function zr(e){"function"==typeof e.request&&"function"==typeof e.expression||$r("request and expression must be functions"),void 0!==e.gaps&&"carry"!==e.gaps&&"missing"!==e.gaps&&$r("gaps must be carry or missing"),void 0!==e.targetTimes&&"function"!=typeof e.targetTimes&&$r("targetTimes must be a function");const l=[...new Set(e.plots.flatMap(e=>void 0===e.ohlc?[e.key]:[e.ohlc.open,e.ohlc.high,e.ohlc.low,e.ohlc.close]))],t=new WeakMap;return{id:e.id,name:e.name,category:e.category,placement:e.placement,inputs:e.inputs,plots:e.plots,levels:e.levels,range:e.range,calc:(o,n,r,a)=>{const i=Hr(r);try{const s={...i?.context,bars:o,settings:n,calculation:a},c=e.targetTimes?.(s)??o.map(e=>e.time);Array.isArray(c)&&c.length===o.length||$r("target times must match source length");const u=Ir(c,i?.snapshot??qr,l=>e.expression(l,n,s),{gaps:e.gaps});for(const e of l)i?.snapshot?.bars.length&&!Object.prototype.hasOwnProperty.call(u,e)&&$r(`expression is missing plot column ${e}`),Object.prototype.hasOwnProperty.call(u,e)||Object.defineProperty(u,e,{value:new Array(o.length).fill(null),enumerable:!0,writable:!0,configurable:!0});return t.delete(r),u}catch(e){throw t.set(r,{snapshot:i?.snapshot??null,error:e}),e}},attach:l=>{const o=Hr(l.store)??{owner:0,key:null,completed:null,wanted:null,request:null,snapshot:null,context:null,status:{state:"empty"}};l.store[Er]=o;const n=++o.owner;let r=!0,a=0,i=0,s=null,c=()=>{};const u=()=>r&&o.owner===n&&!l.signal?.aborted,p=e=>{o.status=e,u()&&l.setDataStatus?.(e)},y=()=>{const e=o.request;o.request=null,s=null,e?.controller.abort(),e?.reject(e.controller.signal.reason)},f=()=>{o.completed=null,o.wanted=null;const e=null!==o.snapshot;o.snapshot=null,y(),e&&l.requestRecompute()},m=e=>{s!==e&&(s=e,e.promise.then(n=>{if(!u()||o.request!==e||e.controller.signal.aborted)return;let r;try{r=function(e,l){let t=[];Ir([],e,e=>(t=e,{}));let o=t.length;if(void 0!==l)for(o=0;o<t.length&&e.confirmed[o]&&null!==e.availableAt[o]&&e.availableAt[o]<=l;)o++;return Object.freeze({bars:Object.freeze(t.slice(0,o)),availableAt:Object.freeze(e.availableAt.slice(0,o)),confirmed:Object.freeze(e.confirmed.slice(0,o))})}(n,e.selection.request.asOf)}catch(l){return void d(e,l)}o.request=null,s=null;const a=o.snapshot;o.snapshot=r,o.completed=e.selection.version;try{l.requestRecompute();const e=t.get(l.store);if(e?.snapshot===r)throw e.error}catch(l){return void(u()&&o.snapshot===r&&o.key===e.selection.key&&(o.snapshot=a,p({state:"error",error:l}),o.wanted?.version!==e.selection.version&&h()))}u()&&o.snapshot===r&&(null===o.request&&p({state:r.bars.length?"ready":"empty"}),h())},l=>d(e,l)))},d=(e,l)=>{u()&&o.request===e&&!e.controller.signal.aborted&&(o.request=null,s=null,o.completed=e.selection.version,p({state:"error",error:l}),o.wanted?.version!==e.selection.version&&h())},b=e=>{if(u()&&o.request===e&&!e.controller.signal.aborted&&!e.started){e.started=!0;try{e.resolve(l.requestSnapshot({...e.selection.request,signal:e.controller.signal}))}catch(l){e.reject(l)}}},h=(t=!1)=>{if(!u())return;const n=++i,r=()=>u()&&i===n,s=o.context?.requestState?.replay,c=l.requestState?.(),y=c?.replay,d={bars:l.bars(),settings:l.settings(),dataContext:l.dataContext?.(),requestState:c};let h;o.context=d;try{const l=e.request(d);h=null===l?null:function(e){return(null===e||"object"!=typeof e||"string"!=typeof e.symbol||""===e.symbol.trim()||"string"!=typeof e.interval||""===e.interval.trim()||void 0!==e.exchange&&"string"!=typeof e.exchange||!Number.isFinite(e.from)||!Number.isFinite(e.to)||e.from>e.to||void 0!==e.asOf&&!Number.isFinite(e.asOf))&&$r("request requires an instrument and a finite ordered time window"),{symbol:e.symbol,exchange:e.exchange,interval:e.interval,from:e.from,to:e.to,asOf:e.asOf}}(l)}catch(e){return void(r()&&(f(),r()&&p({state:"error",error:e})))}if(!r())return;if(null===h||void 0===l.requestSnapshot||!1===c?.supportsSnapshots||void 0!==y&&void 0===y.asOf)return f(),void(r()&&(o.key=null,p({state:"unsupported"})));if(0===d.bars.length)return f(),void(r()&&p({state:"empty"}));const g=c?.source,k=d.dataContext,w=JSON.stringify([h.symbol,h.exchange,h.interval,h.asOf,k?.symbol,k?.exchange,k?.interval,c?.providerRevision,g?.sourceId,void 0===y?g?.historyRevision:null,void 0!==y]),v=void 0!==y?.asOf&&void 0!==s?.asOf&&y.asOf<s.asOf;if(o.key!==w||v){if(f(),!r())return;o.key=w}void 0!==y?.asOf&&(h.asOf=void 0===h.asOf?y.asOf:Math.min(h.asOf,y.asOf));const C=JSON.stringify([w,h.from,h.to,h.asOf,void 0===y?g?.revision:null,c?.dataRevision,y?.time,y?.forming,a]),N={key:w,version:C,request:h};o.wanted=N,null!==o.request?(m(o.request),b(o.request)):(t||o.completed!==C)&&(e=>{let l,t;const n={selection:e,controller:new AbortController,started:!1,promise:new Promise((e,o)=>{l=e,t=o}),resolve:l,reject:t};o.request=n,m(n),p({state:"loading"}),b(n)})(N)},g=()=>{r&&(r=!1,c(),l.signal?.removeEventListener("abort",k),o.owner===n&&(l.setDataRetry?.(null),queueMicrotask(()=>{o.owner===n&&y()})))},k=()=>{o.owner===n&&y(),g()};l.signal?.addEventListener("abort",k,{once:!0}),c=void 0!==l.subscribeRequestChanges?l.subscribeRequestChanges(()=>h()):l.subscribeDataChanges?.(()=>{a++,h()})??(()=>{}),l.setDataRetry?.(()=>h(!0));const w=t.get(l.store);return l.setDataStatus?.(w?.snapshot===o.snapshot?{state:"error",error:w.error}:o.status),h(),g}}}const jr="indicators",Zr=[ke,ve,we,xe,Ce,Se,Fe,Le,Ke,Te,Ue,Pe,Ie,Ve,Ee,qe,He,Ze,Ye,Je,_e,Qe,ll,...Kl,...Hl,...it,...ht,...Lt,..._t,...fo,...So,...$o,...rn,...Mn,...Rn,...or];let Yr=!1;function Jr(){if(!Yr){Yr=!0;for(const e of Zr)N(e)}}Jr();export{Lt as ADAPTIVE_INDICATORS,Je as ADL,Ie as ADX,Yt as ALLIGATOR,yl as ALMA,Cn as ALPHATREND,Dl as AROON,Rl as AROON_OSCILLATOR,qe as ATR,lt as AVERAGE_DAILY_RANGE,_t as AVERAGE_INDICATORS,Ol as AWESOME_OSCILLATOR,Tl as BALANCE_OF_POWER,_l as BB_TREND,Ce as BOLLINGER,Xl as BOLLINGER_BANDWIDTH,Gl as BOLLINGER_PERCENT_B,Zr as BUILTIN_INDICATORS,Ve as CCI,yt as CHAIKIN_MONEY_FLOW,ft as CHAIKIN_OSCILLATOR,nt as CHAIKIN_VOLATILITY,gl as CHANDELIER_EXIT,hl as CHANDE_KROLL_STOP,Ul as CHANDE_MOMENTUM,Ql as CHOPPINESS_INDEX,ot as CHOP_ZONE,ql as CONNORS_RSI,nn as CONSOLIDATION_BREAKOUT,Pl as COPPOCK_CURVE,vn as CPR,fl as DEMA,bl as DONCHIAN,Il as DPO,mt as EASE_OF_MOVEMENT,dt as ELDER_FORCE_INDEX,ve as EMA,dl as ENVELOPE,Vl as FISHER_TRANSFORM,ht as FLOW_INDICATORS,Fe as HALFTREND,et as HISTORICAL_VOLATILITY,ml as HMA,Bl as HULL_SUITE,Ke as ICHIMOKU,So as INDEX_INDICATORS,jr as INDICATORS_TIER,Ct as KAMA,Nt as KELTNER_CHANNEL,At as KLINGER_OSCILLATOR,xt as KNOW_SURE_THING,St as LINREG_SLOPE,Mt as LSMA,Ue as MACD,Ao as MASS_INDEX,wl as MA_CHANNEL,Pt as MA_CROSS,$t as MA_RIBBON,It as MCGINLEY_DYNAMIC,Vt as MEDIAN,Ee as MFI,no as MOMENTUM,bt as NET_VOLUME,vo as NVI,Ye as OBV,_e as OPEN_INTEREST,ll as OPEN_INTEREST_BUILDUP,Qe as OPEN_INTEREST_CHANGE,Hl as OSCILLATOR_INDICATORS,Kl as OVERLAY_INDICATORS,Le as PARABOLIC_SAR,io as PPO,Co as PVI,Mo as PVO,No as PVT,Nn as RANGE_ANALYSIS,$o as RANGE_INDICATORS,Io as RELATIVE_VIGOR_INDEX,Vo as RELATIVE_VOLATILITY_INDEX,ro as ROC,Te as RSI,on as RSI_DIVERGENCE,tr as SEASONALITY,or as SEASONALITY_INDICATORS,rn as SIGNAL_INDICATORS,ke as SMA,yo as SMI,uo as SMI_ERGODIC_INDICATOR,po as SMI_ERGODIC_OSCILLATOR,Jt as SMMA,Ho as SPECIAL_K,rt as STANDARD_DEVIATION,at as STANDARD_ERROR,kl as STANDARD_ERROR_BANDS,Pe as STOCHASTIC,To as STOCHASTIC_RSI,fo as STRENGTH_INDICATORS,Mn as STUDY_INDICATORS,Se as SUPERTREND,Xt as T3,zt as TEMA,en as TREND_STRENGTH_INDEX,so as TRIX,co as TSI,jt as TWAP,xo as ULCER_INDEX,Po as ULTIMATE_OSCILLATOR,it as VOLATILITY_INDICATORS,Qo as VOLATILITY_STOP,Ze as VOLUME,_o as VORTEX,xe as VWAP,Zt as VWMA,Dn as WAVETREND,Rn as WAVETREND_INDICATORS,tn as WILLIAMS_FRACTALS,Uo as WILLIAMS_PERCENT_R,He as WILLIAMS_VIX_FIX,we as WMA,Eo as WOODIES_CCI,Ir as alignRequestedExpression,G as alma,fe as barsSince,se as cci,Mr as centerOfGravity,j as change,El as connorsStreak,ie as correlation,zr as createRequestedIndicator,sr as createTier2Indicator,Fr as crosses,Br as crossesAbove,Kr as crossesBelow,te as cumulative,Y as dev,Rr as falling,q as highest,_ as highestBars,oe as linreg,H as lowest,Q as lowestBars,$ as nulls,J as percentRank,vr as percentileLinear,ae as percentileNearestRank,ce as pivotHigh,ue as pivotLow,Cr as rankCorrelation,Jr as registerBuiltinIndicators,Vr as requestedIntrabars,Dr as rising,V as rma,Z as roc,hr as rollingMedian,gr as rollingMode,wr as rollingRange,le as rollingSum,kr as rollingVariance,Sr as runningMax,xr as runningMin,fr as securityExpression,yr as securitySeries,U as sma,z as smaSeededEma,E as stdev,re as stoch,ne as swma,me as valueWhen,X as vwma,P as wma};
2
2
  //# sourceMappingURL=openalgo-charts.indicators.mjs.map