openalgo-charts
Version:
From-scratch, dependency-free canvas charting engine for OpenAlgo: professional-grade interactive rendering, advanced on-chart trading, and a one-call widget tier that adds the toolbar, drawing rail, dialogs and shortcuts.
3 lines • 144 kB
JavaScript
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 y,isNewZonedWeek as u,isNewZonedMonth as f,utcSecondsToZonedParts as d,zonedWallClockToUtcSeconds as m,registerIndicator as b}from"./openalgo-charts.mjs";function h(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 g(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 k(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 w(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;const n=h(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 C(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 M(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 v(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 A(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 N(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 x(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 S(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0||t<l)return o;const n=h(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 L(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 B(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 K(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=h(n,t),a=h(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 W(e,l){return F(e,l,!0)}function D(e,l){return F(e,l,!1)}function F(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 R(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 U(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 T(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 P(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 O(e,l,t,o){const n=e.length,r=new Array(n).fill(NaN),a=C(l,o),i=M(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 I(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 V(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,y=Math.sqrt(t*i-o*o)*Math.sqrt(t*s-a*a);n[r]=0===y?NaN:p/y}return n}function H(e,l){const t=e.length,o=new Array(t).fill(NaN),n=h(e,l),r=S(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 E(e,l,t){return q(e,l,t,!0)}function $(e,l,t){return q(e,l,t,!1)}function q(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 z(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 Z(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 Y=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},j=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},G=(e,l="source")=>e[l]??"close";function X(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:v(n(e(l,G(t)),Y(t,"length",9)))})}}const J=X("sma","SMA","#4f8cff",h),_=X("wma","WMA","#ab47bc",g),Q=X("ema","EMA","#f5a623",A),ee={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,G(t)),n=Y(t,"length",20),r=Y(t,"stdDev",2),a=h(o,n),i=w(o,n),s=a.map((e,l)=>e+r*i[l]),c=a.map((e,l)=>e-r*i[l]);return{upper:v(s),basis:v(a),lower:v(c)}}},le=e=>Math.floor(((e=>Math.floor((e+c)/86400))(e)-4)/7);function te(e,l){return l===r?(l,t)=>function(e,l,t){if("week"===e)return le(l)!==le(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 oe(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 ne={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,G(t)),c="string"==typeof t.anchor?t.anchor:"session",p="percent"===t.calcMode,y=Math.round(Y(t,"offset",0)),u=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,te(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;u[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(u[e])&&Number.isFinite(f[e])&&(o[e]=u[e]+t*f[e]*l);return o},k=!1!==t.showBand1,w=!0===t.showBand2,C=!0===t.showBand3,M=Y(t,"bandMult1",1),A=Y(t,"bandMult2",2),N=Y(t,"bandMult3",3);return{vwap:v(oe(u,y)),upper1:v(oe(g(k,M,1),y)),lower1:v(oe(g(k,M,-1),y)),upper2:v(oe(g(w,A,1),y)),lower2:v(oe(g(w,A,-1),y)),upper3:v(oe(g(C,N,1),y)),lower3:v(oe(g(C,N,-1),y))}}},re={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,Y(t,"period",10),Y(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}}},ae={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:v(o)};const n=Y(l,"start",.02),r=Y(l,"increment",.02),a=Y(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,y=e[l-1].high,u=e[l-2].low,f=e[l-2].high;s=i?Math.min(s,t,u):Math.max(s,y,f),o[l]=s}return{sar:v(o)}}};function ie(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 se={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=Y(l,"conversionPeriod",9),n=Y(l,"basePeriod",26),r=Y(l,"laggingSpanPeriod",52),a=Y(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),y=i(r),u=e.map(e=>e.close);return{conversion:v(s),base:v(c),spanA:v(ie(p,a)),spanB:v(ie(y,a)),lagging:v(ie(u,-a))}}},ce={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:j(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:j(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 y=Math.max(1,Math.round(Y(l,"amplitude",2))),u=Y(l,"channelDeviation",2),f=!1!==l.showChannels,d=!1!==l.showSignals,m=e.map(e=>e.high),b=e.map(e=>e.low),g=t(m,b,e.map(e=>e.close),Math.max(1,Math.round(Y(l,"atrPeriod",100)))),k=h(m,y),w=h(b,y),v=C(m,y),A=M(b,y);let N=0,x=0,S=b[0],L=m[0],B=0,K=0,W=!1;for(let l=0;l<o;l++){const t=g[l]/2,o=u*t,p=v[l],y=A[l],h=l>0?m[l-1]:m[0],C=l>0?b[l-1]:b[0],M=W?N:-1;let D;1===x?(Number.isFinite(y)&&(S=Math.max(y,S)),Number.isFinite(k[l])&&k[l]<S&&e[l].close<C&&(N=1,x=0,L=p)):(Number.isFinite(p)&&(L=Math.min(p,L)),Number.isFinite(w[l])&&w[l]>L&&e[l].close>h&&(N=0,x=1,S=y)),0===N?(1===M?(B=K,d&&Number.isFinite(t)&&(s[l]=B-t)):B=-1===M?S:Math.max(S,B),D=B):(0===M?(K=B,d&&Number.isFinite(t)&&(c[l]=K+t)):K=-1===M?L:Math.min(L,K),D=K),W=!0,Number.isFinite(D)&&(0===N?n[l]=D:r[l]=D,f&&Number.isFinite(o)&&(a[l]=D+o,i[l]=D-o))}return p}},pe=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},ye=e=>e.source??"close",ue=(e,l)=>new Array(e).fill(l);function fe(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 de={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:v(p(e(l,ye(t)),pe(t,"length",14))),upperLevel:ue(l.length,pe(t,"overbought",70)),lowerLevel:ue(l.length,pe(t,"oversold",30))}),levels:e=>[{price:pe(e,"overbought",70),color:"#ef5350",title:"OB",dashed:!0},{price:50,color:"#5a6b8c",title:"",dashed:!0},{price:pe(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,ye(t)),n=A(o,pe(t,"fastPeriod",12)),r=A(o,pe(t,"slowPeriod",26)),a=n.map((e,l)=>e-r[l]),i=fe(a,e=>A(e,pe(t,"signalPeriod",9))),s=a.map((e,l)=>e-i[l]);return{macd:v(a),signal:v(i),histogram:v(s)}},levels:()=>[{price:0,color:"#5a6b8c",dashed:!0}]},be={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=C(e.map(e=>e.high),pe(l,"kPeriod",14)),o=M(e.map(e=>e.low),pe(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=h(n,pe(l,"kSmoothing",1)),a=h(r,pe(l,"dPeriod",3));return{k:v(r),d:v(a),upperLevel:ue(e.length,80),lowerLevel:ue(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})},he={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=pe(l,"period",14),n=e.map(e=>e.high),r=e.map(e=>e.low),a=e.map(e=>e.close),i=y(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)),u=new Array(t).fill(NaN);if(p>=0){const e=k(i.slice(p),o);for(let l=0;l<e.length&&p+l<t;l++)u[p+l]=e[l]}const f=k(s,o),d=k(c,o),m=new Array(t).fill(NaN),b=new Array(t).fill(NaN),h=new Array(t).fill(NaN);let g=NaN,w=NaN;for(let e=0;e<t;e++){const l=u[e];if(Number.isFinite(l)&&0!==l&&(g=f[e]/l*100,w=d[e]/l*100),!Number.isFinite(g)||!Number.isFinite(w))continue;m[e]=g,b[e]=w;const t=g+w;h[e]=t>0?Math.abs(g-w)/t*100:0}const C=h.findIndex(e=>Number.isFinite(e)),M=new Array(t).fill(NaN);if(C>=0){const e=k(h.slice(C),pe(l,"adxPeriod",14));for(let l=0;l<e.length;l++)M[C+l]=e[l]}return{plusDi:v(m),minusDi:v(b),adx:v(M)}},levels:()=>[{price:25,color:"#5a6b8c",title:"25",dashed:!0}]},ge={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=pe(l,"period",20),n=pe(l,"constant",.015),r=e.map(e=>(e.high+e.low+e.close)/3),a=h(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(pe(e,l,t))))(l,"maLength",20),p=pe(l,"bbMult",2),y="None"===s?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return fe(l,e=>A(e,o));case"SMMA (RMA)":return fe(l,e=>k(e,o));case"WMA":return fe(l,e=>g(e,o));case"VWMA":return fe(l,(e,l)=>K(e,t.slice(l),o));default:return fe(l,e=>h(e,o))}}(s,i,e.map(e=>e.volume??0),c),u="SMA + Bollinger Bands"===s?fe(i,e=>w(e,c)).map(e=>e*p):new Array(t).fill(NaN);return{cci:v(i),ma:v(y),bbUpper:v(y.map((e,l)=>e+u[l])),bbLower:v(y.map((e,l)=>e-u[l])),upperLevel:ue(t,100),lowerLevel:ue(t,-100)}},levels:()=>[{price:100,color:"#ef5350",dashed:!0},{price:0,color:"#5a6b8c",dashed:!0},{price:-100,color:"#26a69a",dashed:!0}]},ke={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=pe(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:v(i),upperLevel:ue(t,80),lowerLevel:ue(t,20)}},levels:()=>[{price:80,color:"#ef5350",title:"OB",dashed:!0},{price:20,color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},we={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:v(t(e.map(e=>e.high),e.map(e=>e.low),e.map(e=>e.close),pe(l,"period",14)))})},Ce={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=pe(l,"pd",22),a=pe(l,"bbl",20),i=pe(l,"mult",2),s=pe(l,"lb",50),c=pe(l,"ph",.85),p=pe(l,"pl",1.01),y=!0===l.hp,u=!0===l.sd,f=C(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=w(d,a),b=h(d,a),g=C(d,s),k=M(d,s),A=new Array(t),N=new Array(t),x=new Array(t),S=new Array(t),L=new Array(t);for(let e=0;e<t;e++){const l=b[e]+i*m[e],t=g[e]*c,o=k[e]*p;A[e]=Number.isFinite(l)?l:null,N[e]=Number.isFinite(t)?t:null,x[e]=u?A[e]:null,S[e]=y?N[e]:null,L[e]=y&&Number.isFinite(o)?o:null}return{wvf:v(d),rangeHigh:S,rangeLow:L,upperBand:x,alertUpper:A,alertHigh:N}}},Me=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t};const ve={id:"volume",name:"Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#3a4666"}],plots:[{key:"volume",type:"histogram",title:"Volume",colorKey:"color",style:{base:0}}],calc:e=>({volume:v(e.map(e=>e.volume??0))})},Ae={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=((e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t})(l,"maType","None"),a=((e,l,t,o=1)=>Math.max(o,Math.round(Me(e,l,t))))(l,"maLength",9),i=Me(l,"bbMult",2),s="None"===r?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return A(l,o);case"SMMA (RMA)":return k(l,o);case"WMA":return g(l,o);case"VWMA":return K(l,t,o);default:return h(l,o)}}(r,o,e.map(e=>e.volume??0),a),c="SMA + Bollinger Bands"===r?w(o,a).map(e=>e*i):new Array(t).fill(NaN);return{obv:v(o),ma:v(s),bbUpper:v(s.map((e,l)=>e+c[l])),bbLower:v(s.map((e,l)=>e-c[l]))}}},Ne={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:v(l)}}},xe=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Se=(e,l,t,o=1)=>Math.max(o,Math.round(xe(e,l,t))),Le=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},Be=(e,l="source")=>e[l]??"close",Ke=e=>e.map(e=>e.high),We=e=>e.map(e=>e.low);function De(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=A(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}function Fe(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 Re(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 Ue=.05,Te={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:v(B(e(l,"close"),Se(t,"length",9),xe(t,"offset",.85),xe(t,"sigma",6)))})},Pe={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,Be(t)),n=Se(t,"length",9),r=A(o,n),a=De(r,n);return{dema:v(r.map((e,l)=>2*e-a[l]))}}};const Oe={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,Be(t)),n=Se(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=g(o,n);return{hma:v(g(i.map((e,l)=>2*e-s[l]),a))}}},Ie={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:Ue}],calc:(l,t)=>{const o=e(l,Be(t)),n=Se(t,"length",20),r=xe(t,"percent",10)/100,a=!0===t.exponential?A(o,n):h(o,n);return{upper:v(a.map(e=>e*(1+r))),basis:v(a),lower:v(a.map(e=>e*(1-r)))}}},Ve={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:Ue}],calc:(e,l)=>{const t=Se(l,"length",20),o=Math.round(xe(l,"offset",0)),n=C(Ke(e),t),r=M(We(e),t),a=n.map((e,l)=>(e+r[l])/2);return{upper:v(Re(n,o)),basis:v(Re(a,o)),lower:v(Re(r,o))}}},He={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=Se(l,"p",10),n=Se(l,"x",1),r=Se(l,"q",9),a=Ke(e),i=We(e),s=t(a,i,e.map(e=>e.close),o),c=C(a,o).map((e,l)=>e-n*s[l]);return{stopLong:v(Fe(M(i,o).map((e,l)=>e+n*s[l]),r,!1)),stopShort:v(Fe(c,r,!0))}}},Ee={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=Se(l,"length",22),n=xe(l,"atrMultiplier",3),r=Ke(e),a=We(e),i=t(r,a,e.map(e=>e.close),Se(l,"atrLength",22));return{longExit:v(C(r,o).map((e,l)=>e-n*i[l])),shortExit:v(M(a,o).map((e,l)=>e+n*i[l]))}}};const $e={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:Ue}],calc:(l,t)=>{const o=e(l,"close"),n=Se(t,"periods",21,3),r=xe(t,"errors",2),a=Se(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=T(o,n,0),c=e=>v("Exponential"===t.method?De(e,a):"Weighted"===t.method?g(e,a):h(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]))}}},qe={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:Ue}],calc:(e,l)=>({upper:v(Re(h(Ke(e),Se(l,"upperLength",20)),Math.round(xe(l,"upperOffset",0)))),lower:v(Re(h(We(e),Se(l,"lowerLength",20)),Math.round(xe(l,"lowerOffset",0))))})},ze="#00ff00",Ze="#ff0000",Ye="#ff9800",je=e=>Math.max(1,Math.floor(e)),Ge=e=>Math.max(1,Math.round(Math.sqrt(e)));function Xe(e,l,t){return"Ehma"===l?function(e,l){const t=A(e,je(l/2)),o=A(e,l);return De(t.map((e,l)=>2*e-o[l]),Ge(l))}(e,t):"Thma"===l?function(e,l){const t=g(e,je(l/3)),o=g(e,je(l/2)),n=g(e,l);return g(t.map((e,l)=>3*e-o[l]-n[l]),l)}(e,je(t/2)):function(e,l){const t=g(e,je(l/2)),o=g(e,l);return g(t.map((e,l)=>2*e-o[l]),Ge(l))}(e,t)}const Je=(e,l,t)=>{if(!1===t.switchColor)return Le(t,"neutralColor",Ye);const o=e?.[l],n=e?.[l-2];return"number"==typeof o&&"number"==typeof n&&o>n?Le(t,"bullishColor",ze):Le(t,"bearishColor",Ze)},_e={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:ze},{key:"bearishColor",type:"color",label:"Bearish Color",default:Ze},{key:"neutralColor",type:"color",label:"Neutral Color",default:Ye}],plots:[{key:"mhull",type:"line",title:"Hull",colorKey:"neutralColor",style:{color:Ye,lineWidth:2},colorBy:({index:e,values:l,settings:t})=>Je(l.mhull,e,t)},{key:"shull",type:"line",title:"Hull Displaced",colorKey:"neutralColor",style:{color:Ye,lineWidth:2},colorBy:({index:e,values:l,settings:t})=>Je(l.mhull,e,t)}],fills:[{between:["mhull","shull"],colorUp:ze,colorDown:Ze,colorUpKey:"bullishColor",colorDownKey:"bearishColor",opacity:.6}],calc:(l,t)=>{const o=e(l,Be(t)),n=je(Se(t,"length",55)*xe(t,"lengthMult",1)),r=Xe(o,Le(t,"mode","Hma"),n),a=!1!==t.visualSwitch;return{mhull:v(r),shull:v(a?Re(r,2):new Array(r.length).fill(NaN))}},barColors:({bars:e,values:l,settings:t})=>!0===t.candleCol?e.map((e,o)=>Je(l.mhull,o,t)):e.map(()=>null)},Qe=[Te,Pe,Oe,Ie,Ve,He,Ee,$e,qe,_e],el=(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))),ll=l=>e(l,"hl2"),tl={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=el(l,"length",14),o=W(e.map(e=>e.high),t+1),n=D(e.map(e=>e.low),t+1),r=e=>e.map(e=>100*(e+t)/t);return{up:v(r(o)),down:v(r(n))}},levels:()=>[{price:50,color:"#5a6b8c",dashed:!0}],range:()=>({min:0,max:100})},ol={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=el(l,"length",14),o=W(e.map(e=>e.high),t+1),n=D(e.map(e=>e.low),t+1),r=o.map((e,l)=>100*(e-n[l])/t);return{osc:v(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})},nl={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=ll(e),t=h(l,5),o=h(l,34);return{ao:v(t.map((e,l)=>e-o[l]))}},levels:()=>[{price:0,color:"#787b86"}]},rl={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"}]},al={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=el(t,"length",9),r=N(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=R(a,n),c=R(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:v(p)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]},il={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=x(t,el(l,"longRoCLength",14)),n=x(t,el(l,"shortRoCLength",11));return{curve:v(g(o.map((e,l)=>e+n[l]),el(l,"wmaLength",10)))}}},sl={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=el(l,"period",21),n=Math.floor(o/2)+1,r=e.map(e=>e.close),a=h(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:v(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line"}]},cl={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=el(l,"length",9),n=ll(e),r=C(n,o),a=M(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:v(i),trigger:v(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 pl(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 yl={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,el(l,"lenrsi",3)),r=p(pl(o),el(l,"lenupdown",2)),a=L(x(o,1).slice(1),el(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:v(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})},ul=[tl,ol,nl,rl,al,il,sl,cl,yl];function fl(e,l){return`${e}${Math.round(255*(1-l/100)).toString(16).padStart(2,"0")}`}const dl=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},ml=e=>e.source??"close",bl=(e,l,t)=>"string"==typeof e[l]?e[l]:t;function hl(e,l,t){const o=e.length,n=h(e,l),r=w(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 gl(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 kl={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,ml(t)),{upper:n,lower:r}=hl(o,dl(t,"length",20),dl(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:v(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}]},wl={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,ml(t)),{middle:n,upper:r,lower:a}=hl(o,dl(t,"length",20),dl(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:v(i),expansion:v(C(i,dl(t,"expansionLength",125))),contraction:v(M(i,dl(t,"contractionLength",125)))}}},Cl={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?fl(bl(o,"posColor","#089981"),e>=n?25:50):r&&e<0?fl(bl(o,"negColor","#f23645"),e>n?50:25):fl(bl(o,"posColor","#089981"),50)}}],calc:(e,l)=>{const t=e.map(e=>e.close),o=dl(l,"stdDevMult",2),n=hl(t,dl(l,"shortLength",20),o),r=hl(t,dl(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:v(a)}},levels:()=>[{price:0,color:"#5a6b8c",title:"Zero line",dashed:!0}]},Ml={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=dl(l,"length",14),o=e.map(e=>e.high),n=e.map(e=>e.low),r=R(y(o,n,e.map(e=>e.close)),t),a=C(o,t),i=M(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:v(gl(c,dl(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})},vl={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=dl(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=w(n,dl(l,"length",10)),a=o>0?Math.sqrt(365/o):NaN;return{hv:v(r.map(e=>100*e*a))}}},Al={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:v(h(e.map(e=>e.high-e.low),dl(l,"length",14)))})},Nl=4*Math.atan(1),xl={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)=>bl(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=C(e.map(e=>e.high),30),o=M(e.map(e=>e.high),30),n=A(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),y=Math.round(180*Math.acos(1/p)/Nl);r[a]=c>0?-y:y}return{chopZone:new Array(l).fill(1),angle:v(r)}},range:()=>({min:0,max:1})},Sl={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:v(x(A(e.map(e=>e.high-e.low),dl(l,"periods",10)),dl(l,"rocLookback",10)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Ll={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=dl(l,"deviations",1);return{stdDev:v(w(e.map(e=>e.close),dl(l,"periods",5)).map(e=>e*t))}}},Bl={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(dl(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:v(a)}}},Kl=[kl,wl,Cl,Ml,vl,Al,xl,Sl,Ll,Bl],Wl=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Dl=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function Fl(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)*Dl(o)}return l}function Rl(e,l){const t=new Array(e.length).fill(NaN),o=e.findIndex(e=>Number.isFinite(e));if(o<0)return t;const n=A(e.slice(o),l);for(let e=0;e<n.length;e++)t[o+e]=n[e];return t}const Ul={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=Wl(l,"length",20),o=R(Fl(e),t),n=R(e.map(Dl),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:v(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Tl={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=U(Fl(e)),o=Rl(t,Wl(l,"short",3)),n=Rl(t,Wl(l,"long",10)),r=new Array(e.length);for(let l=0;l<e.length;l++)r[l]=o[l]-n[l];return{osc:v(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Pl={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=Wl(l,"divisor",1e4),o=N(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=Dl(r);n[l]=0===a?NaN:t*o[l]*(r.high-r.low)/a}return{eom:v(h(n,Wl(l,"length",14)))}}},Ol={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=N(e.map(e=>e.close)),o=new Array(e.length);for(let l=0;l<e.length;l++)o[l]=t[l]*Dl(e[l]);return{efi:v(Rl(o,Wl(l,"length",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Il={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?Dl(e[t]):o<0?-Dl(e[t]):0}return{net:v(l)}}},Vl=[Ul,Tl,Pl,Ol,Il],Hl=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},El=(e,l,t,o=1)=>Math.max(o,Math.round(Hl(e,l,t))),$l=(e,l="source")=>e[l]??"close";function ql(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=A(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}const zl={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,$l(t)),n=o.length,r=El(t,"erLength",10),a=new Array(n).fill(NaN);if(n<=r)return{kama:v(a)};const i=N(o,1);for(let e=0;e<n;e++)i[e]=Number.isFinite(i[e])?Math.abs(i[e]):0;const s=R(i,r),c=N(o,r),p=2/(El(t,"fastLength",2)+1),y=2/(El(t,"slowLength",30)+1);let u=o[r];a[r]=u;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-y)+y;u+=t*t*(o[e]-u),a[e]=u}return{kama:v(a)}}},Zl={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=El(o,"length",20),a=Hl(o,"mult",2),i=e(l,$l(o)),s=((e,l,t)=>{const o=e[l];return"boolean"==typeof o?o:t})(o,"exp",!0)?A(i,r):h(i,r),c=l.map(e=>e.high),p=l.map(e=>e.low),u=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?y(c,p,u):"Range"===f?k(c.map((e,l)=>e-p[l]),r):t(c,p,u,El(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:v(m),basis:v(s),lower:v(b)}}},Yl={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:v(T(e(l,$l(t)),El(t,"length",25,2),Math.round(Hl(t,"offset",0))))})},jl={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=N(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=A(n,34),a=A(n,55),i=new Array(t).fill(NaN);for(let e=0;e<t;e++)i[e]=r[e]-a[e];return{kvo:v(i),signal:v(ql(i,13))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Gl={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)=>h(x(n,El(t,e,l)),El(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:v(p),signal:v(h(p,El(t,"siglen",9)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Xl={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=El(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:v(a)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Jl=[zl,Zl,Yl,jl,Gl,Xl],_l=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Ql=(e,l,t,o=1)=>Math.max(o,Math.round(_l(e,l,t))),et=(e,l,t)=>Math.round(_l(e,l,t)),lt=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},tt=(e,l,t)=>{const o=e[l];return"boolean"==typeof o?o:t},ot=(e,l="source")=>e[l]??"close",nt=e=>e.map(e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0);function rt(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 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=A(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}const it={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=h(o,Ql(t,"shortLength",9)),r=h(o,Ql(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:v(n),long:v(r),cross:n.map((e,l)=>a[l]?e:null)}}},st={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=Ql(t,"length",14),r=A(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:v(a)}}},ct={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,ot(o)),r=Ql(o,"length",3),a=_l(o,"atrMult",2),i=I(n,r,50),s=t(l.map(e=>e.high),l.map(e=>e.low),l.map(e=>e.close),Ql(o,"atrLength",14));return{median:v(i),upper:v(i.map((e,l)=>e+a*s[l])),lower:v(i.map((e,l)=>e-a*s[l])),medianEma:v(at(i,r))}}},pt=[{label:"SMA",value:"SMA"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}];function yt(e,l,t,o){switch(e){case"EMA":return A(l,o);case"SMMA (RMA)":return k(l,o);case"WMA":return g(l,o);case"VWMA":return K(l,t,o);default:return h(l,o)}}const ut=[{lane:1,length:20,color:"#f6c309"},{lane:2,length:50,color:"#fb9800"},{lane:3,length:100,color:"#fb6500"},{lane:4,length:200,color:"#f60c0c"}],ft={id:"ma-ribbon",name:"Moving Average Ribbon",category:"Trend",placement:"onchart",inputs:ut.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:pt,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:ut.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=nt(l),n={};for(const{lane:r,length:a}of ut){if(!tt(t,`showMa${r}`,!0)){n[`ma${r}`]=new Array(l.length).fill(null);continue}const i=e(l,ot(t,`ma${r}Source`));n[`ma${r}`]=v(yt(lt(t,`ma${r}Type`,"SMA"),i,o,Ql(t,`ma${r}Length`,a)))}return n}},dt={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=Ql(t,"length",9),r=A(o,n),a=at(r,n),i=at(a,n);return{tema:v(r.map((e,l)=>3*(e-a[l])+i[l]))}}},mt={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,ot(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:v(rt(s,et(t,"offset",0)))}}},bt={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:v(rt(K(e(l,ot(t)),nt(l),Ql(t,"length",20)),et(t,"offset",0)))})},ht={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:v(rt(k(o,Ql(t,"jawLength",13)),et(t,"jawOffset",8))),teeth:v(rt(k(o,Ql(t,"teethLength",8)),et(t,"teethOffset",5))),lips:v(rt(k(o,Ql(t,"lipsLength",5)),et(t,"lipsOffset",3)))}}},gt={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(k(e(l,ot(t)),Ql(t,"length",7)))})};function kt(e,l,t){const o=at(e,l);if(0===t)return o;const n=at(o,l);return o.map((e,l)=>e*(1+t)-n[l]*t)}const wt={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(!tt(o,"highlightMovements",!0))return lt(o,"neutralColor","#6d1e7f");const n=t.t3?.[l-1];return"number"==typeof n&&Number.isFinite(n)&&e>n?lt(o,"upColor","#26a69a"):lt(o,"downColor","#ff5252")}}],calc:(l,t)=>{const o=e(l,ot(t)),n=Ql(t,"length",5),r=_l(t,"factor",.7),a=kt(o,n,r),i=kt(a,n,r);return{t3:v(kt(i,n,r))}}},Ct=[it,st,ct,ft,dt,mt,bt,ht,gt,wt],Mt=(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))),vt=e=>e.source??"close",At=(e,l,t)=>"string"==typeof e[l]?e[l]:t;function Nt(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=A(e.slice(n),l);for(let e=0;e<r.length;e++)o[n+e]=r[e];return o}function xt(e,l,t){const o=N(e),n=e=>Nt(Nt(e,t),l),r=n(o),a=n(o.map(e=>Math.abs(e)));return r.map((e,l)=>e/a[l]*100)}const St={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:v(N(e(l,vt(t)),Mt(t,"len",10)))})},Lt={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:v(x(e(l,vt(t)),Mt(t,"length",9)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]};function Bt(e,l,t){return"SMA"===t?h(e,l):Nt(e,l)}const Kt={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,vt(t)),n=At(t,"oscType","EMA"),r=Bt(o,Mt(t,"fastLength",12),n),a=Bt(o,Mt(t,"slowLength",26),n),i=r.map((e,l)=>0===a[l]?NaN:100*(e-a[l])/a[l]),s=Bt(i,Mt(t,"signalLength",9),At(t,"sigType","EMA"));return{hist:v(i.map((e,l)=>e-s[l])),ppo:v(i),signal:v(s)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Wt={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=Mt(l,"length",18);return{trix:v(N(Nt(Nt(Nt(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}]},Dt={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=xt(e.map(e=>e.close),Mt(l,"short",13),Mt(l,"long",25));return{tsi:v(t),signal:v(Nt(t,Mt(l,"signal",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Ft={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=xt(e.map(e=>e.close),Mt(l,"shortlen",5),Mt(l,"longlen",20));return{erg:v(t),sig:v(Nt(t,Mt(l,"siglen",5)))}}},Rt={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=xt(e.map(e=>e.close),Mt(l,"shortlen",5),Mt(l,"longlen",20)),o=Nt(t,Mt(l,"siglen",5));return{osc:v(t.map((e,l)=>e-o[l]))}}},Ut={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=Mt(l,"lengthK",10),o=Mt(l,"lengthD",3),n=C(e.map(e=>e.high),t),r=M(e.map(e=>e.low),t),a=n.map((e,l)=>e-r[l]),i=e=>Nt(Nt(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:v(p),ema:v(Nt(p,Mt(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}]},Tt=[St,Lt,Kt,Wt,Dt,Ft,Rt,Ut],Pt=(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))),Ot=(e,l,t)=>"string"==typeof e[l]?e[l]:t,It=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function Vt(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 Ht=e=>"SMA"===e?h:A;function Et(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?It(e[n])<It(e[n-1]):It(e[n])>It(e[n-1]))&&0!==t&&Number.isFinite(t)&&(o*=e[n].close/t)}t[n]=1e3*o}return t}(l,o);return{[e]:v(n),ema:v(Vt(n,Pt(t,"maLength",255),A))}}}}const $t=Et("nvi","Negative Volume Index","NVI","falling"),qt=Et("pvi","Positive Volume Index","PVI","rising"),zt={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*It(e[t]))}return{pvt:v(U(l))}}},Zt={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(It),n=Ht(Ot(l,"oscType","EMA")),r=n(o,Pt(l,"fastLength",12)),a=n(o,Pt(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=Vt(i,Pt(l,"signalLength",9),Ht(Ot(l,"sigType","EMA"))),c=new Array(t);for(let e=0;e<t;e++)c[e]=i[e]-s[e];return{hist:v(c),pvo:v(i),signal:v(s)}},levels:()=>[{price:0,color:"#787b8680",title:"Zero"}]},Yt={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=A(e.map(e=>e.high-e.low),9),n=Vt(o,9,A),r=new Array(t).fill(NaN);for(let e=0;e<t;e++)0!==n[e]&&(r[e]=o[e]/n[e]);return{mi:v(Vt(r,Pt(l,"length",10),R))}}},jt={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=Pt(t,"length",14),r=e(l,(e=>e.source??"close")(t)),a=C(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=h(i,n),c=new Array(o);for(let e=0;e<o;e++)c[e]=Math.sqrt(s[e]);return{ui:v(c),zero:c.map(e=>Number.isFinite(e)?0:null)}},levels:()=>[{price:0,color:"#2196f3",title:"Zero"}]},Gt=[$t,qt,zt,Zt,Yt,jt],Xt=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Jt=(e,l,t,o=1)=>Math.max(o,Math.round(Xt(e,l,t))),_t=(e,l,t)=>Math.round(Xt(e,l,t)),Qt=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},eo=(e,l="source")=>e[l]??"close";function lo(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 to(e,l){const t=e.length,o=new Array(t).fill(NaN);if(l<=0)return o;const n=h(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 no={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=Jt(t,"lengthStoch",14),n=lo(p(e(l,eo(t)),Jt(t,"lengthRSI",14)),e=>O(e,e,e,o)),r=lo(n,e=>h(e,Jt(t,"smoothK",3))),a=lo(r,e=>h(e,Jt(t,"smoothD",3)));return{k:v(r),d:v(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})},ro={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=Jt(t,"length",14),n=e(l,eo(t)),r=C(l.map(e=>e.high),o),a=M(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:v(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})},ao={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=R(n,e),t=R(r,e);return l.map((e,l)=>0===t[l]?NaN:e/t[l])},i=a(Jt(l,"length1",7)),s=a(Jt(l,"length2",14)),c=a(Jt(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:v(p)}}},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=Jt(l,"length",10),o=P(e.map(e=>e.close-e.open)),n=P(e.map(e=>e.high-e.low)),r=lo(o,e=>R(e,t)),a=lo(n,e=>R(e,t)),i=r.map((e,l)=>0===a[l]?NaN:e/a[l]),s=lo(i,e=>P(e)),c=_t(l,"offset",0);return{rvgi:oo(v(i),c),signal:oo(v(s),c)}}};const so={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=w(o,Jt(l,"length",10)),r=N(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=to(a,14),c=to(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 y=Qt(l,"maType","SMA"),u=Jt(l,"maLength",14),f=Xt(l,"bbMult",2),d="SMA + Bollinger Bands"===y,m="None"===y?new Array(t).fill(NaN):function(e,l,t,o){switch(e){case"EMA":return to(l,o);case"SMMA (RMA)":return lo(l,e=>k(e,o));case"WMA":return lo(l,e=>g(e,o));case"VWMA":return lo(l,(e,l)=>K(e,t.slice(l),o));default:return lo(l,e=>h(e,o))}}(y,p,e.map(e=>e.volume??0),u),b=d?lo(p,e=>w(e,u)).map(e=>e*f):new Array(t).fill(NaN),C=_t(l,"offset",0);return{rvi:oo(v(p),C),ma:v(m),bbUpper:v(m.map((e,l)=>e+b[l])),bbLower:v(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"}]},co={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=Qt(t,"upColor","#009688"),n=Qt(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=H(t,Jt(l,"cciTurboLength",6)),n=H(t,Jt(l,"cci14Length",14));return{hist:v(n),turbo:v(o),cci14:v(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}]},po=[{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}],yo={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,eo(t)),r=new Array(o).fill(0);for(const e of po){const l=lo(x(n,e.roc),l=>h(l,e.smooth));for(let t=0;t<o;t++)r[t]+=e.weight*l[t]}const a=lo(r,e=>h(e,Jt(t,"length1",100))),i=lo(a,e=>h(e,Jt(t,"length2",100)));return{specialK:v(r),signal:v(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero"}]},uo=[no,ro,ao,io,so,co,yo],fo=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},mo=(e,l,t)=>Math.max(1,Math.floor(fo(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",go=(e,l)=>!1!==e[l];function ko(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 wo(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 Co={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=mo(l,"length",14),n=new Array(t).fill(NaN),r=new Array(t).fill(NaN);if(0===t)return{vip:v(n),vim:v(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 u=R(c,o),f=R(p,o),d=R(y(a,i,s),o);for(let e=1;e<t;e++)n[e]=u[e-1]/d[e],r[e]=f[e-1]/d[e];return{vip:v(n),vim:v(r)}}},Mo={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,ho(o)),s=fo(o,"factor",2),c=l.map(e=>e.high),p=l.map(e=>e.low),u=l.map(e=>e.close),f=t(c,p,u,mo(o,"length",20)),d=y(c,p,u);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}}},vo={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:v(V(e.map(e=>e.close),t,mo(l,"length",14)))}},levels:e=>[{price:1,color:bo(e,"bullishColor","#089981"),title:"TSI Bullish Band"},{price:0,color:"#787b86",title:"TSI Middle Band",dashed:!0},{price:-1,color:bo(e,"bearishColor","#f23645"),title:"TSI Bearish Band"}],range:()=>({min:-1,max:1})};function Ao(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 No={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,mo(l,"periods",2)),s=e.map(e=>e.high),c=e.map(e=>e.low),p=go(l,"showUp"),y=go(l,"showDown");for(let e=0;e<t;e++)p&&Ao(s,e,i,!0)&&(n[e]=s[e]),y&&Ao(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=bo(t,"upColor","#009688"),a=bo(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}},xo={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,ho(t)),mo(t,"length",14)),c={rsi:v(s),bull:n,hiddenBull:r,bear:a,hiddenBear:i};if(0===o)return c;const y=mo(t,"lbR",5),u=mo(t,"lbL",5),f=fo(t,"rangeLower",5),d=fo(t,"rangeUpper",60),m=!1!==t.plotBull,b=!0===t.plotHiddenBull,h=!1!==t.plotBear,g=!0===t.plotHiddenBear,k=$(s,u,y).map(e=>Number.isFinite(e)),w=E(s,u,y).map(e=>Number.isFinite(e)),C=ko(s,y),M=ko(l.map(e=>e.low),y),A=ko(l.map(e=>e.high),y),N=z(wo(k,1)),x=z(wo(w,1)),S=Z(k,C,1),L=Z(k,M,1),B=Z(w,C,1),K=Z(w,A,1);for(let e=0;e<o;e++){const l=e-y;if(!(l<0)){if(k[e]){const t=f<=N[e]&&N[e]<=d,o=C[e]>S[e]&&t,a=C[e]<S[e]&&t;m&&o&&M[e]<L[e]&&(n[l]=C[e]),b&&a&&M[e]>L[e]&&(r[l]=C[e])}if(w[e]){const t=f<=x[e]&&x[e]<=d,o=C[e]<B[e]&&t,n=C[e]>B[e]&&t;h&&o&&A[e]>K[e]&&(a[l]=C[e]),g&&n&&A[e]<K[e]&&(i[l]=C[e])}}}return c},markers:({bars:e,values:l,settings:t})=>{const o=bo(t,"bullColor","#4caf50"),n=bo(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})},So={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),y=e[i].high,u=e[i].low,f=s-i,d=f>1&&f<=250;d&&c>y&&(n[s]=y),d&&p<u&&(r[s]=u);const m=i;i=s>1&&p>=u&&p<=y&&c>=u&&c<=y?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:v(t),rangeLow:v(o),breakUp:v(n),breakDown:v(r),insideAge:v(a)}},markers:({bars:e,values:l,settings:t})=>{const o=[];if(!go(t,"markbreakout"))return o;const n=l.breakUp??[],r=l.breakDown??[],a=bo(t,"bullBreakColor","#00c853"),i=bo(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=bo(t,"insideColor","#000000"),r=go(t,"colorinside");return e.map((e,l)=>r&&null!==o[l]&&void 0!==o[l]?n:null)}},Lo=[Co,Mo,vo,No,xo,So],Bo=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},Ko=(e,l,t)=>"string"==typeof e[l]?e[l]:t,Wo=(e,l,t)=>"boolean"==typeof e[l]?e[l]:t,Do=e=>new Array(e).fill(NaN),Fo=86400,Ro=e=>Math.floor(((e=>Math.floor((e+c)/Fo))(e)-4)/7);function Uo(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)=>u(e,t,l):(e,t)=>f(e,t,l):"weekly"===e?(e,l)=>Ro(e)!==Ro(l):(e,l)=>{const t=s(e),o=s(l);return t.year!==o.year||t.month!==o.month}}(l,t))}function To(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<Fo?"daily":l<604800?"weekly":"monthly"}const Po={daily:"d",weekly:"w",monthly:"m"},Oo={daily:"Daily",weekly:"Weekly",monthly:"Monthly"},Io=(e,l,t,o)=>({key:e,type:"line",title:l,colorKey:t,style:{markersOnly:!0,markerRadius:o}});function Vo(e){const l=Po[e],t=Oo[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}},Io(`${l}S1`,`${t} S1`,o,1),Io(`${l}S2`,`${t} S2`,o,1),Io(`${l}S3`,`${t} S3`,o,1),Io(`${l}R1`,`${t} R1`,n,1),Io(`${l}R2`,`${t} R2`,n,1),Io(`${l}R3`,`${t} R3`,n,1),Io(`${l}Bc`,`${t} Bottom Pivot`,r,2),Io(`${l}Tc`,`${t} Top Pivot`,r,2)]}function Ho(e){const l=Po[e],t=Oo[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 Eo(e,l,t,o,n){const r=e.length,a=Do(r),i=Do(r),s=Do(r),c=Do(r),p=Do(r),y=Do(r),u=Do(r),f=Do(r),d=Do(r);if(t){const t=Uo(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,M=2*r-m,v=2*r-b,A=(m+b)/2;o.pivot&&(a[l]=r),o.support&&(o.s1r1&&(i[l]=M),s[l]=r-C,c[l]=M-C),o.resistance&&(o.s1r1&&(p[l]=v),y[l]=r+C,u[l]=v+C),o.cpr&&(f[l]=A,d[l]=2*r-A)}}const m=Po[l];return{[`${m}Pivot`]:v(a),[`${m}S1`]:v(i),[`${m}S2`]:v(s),[`${m}S3`]:v(c),[`${m}R1`]:v(p),[`${m}R2`]:v(y),[`${m}R3`]:v(u),[`${m}Bc`]:v(f),[`${m}Tc`]:v(d)}}const $o={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},...Ho("daily"),...Ho("weekly"),...Ho("monthly")],plots:[...Vo("daily"),...Vo("weekly"),...Vo("monthly")],fills:["daily","weekly","monthly"].map(e=>{const l=Po[e];return{between:[`${l}Tc`,`${l}Bc`],colorUpKey:`${l}FillColor`,colorDownKey:`${l}FillColor`,opacity:.48}}),calc:(e,l)=>{const t="manual"===l.pivotMode,o=To(e),n={pivot:Wo(l,"displaypivots",!0),support:Wo(l,"displaysupport",!0),resistance:Wo(l,"displayresistance",!0),cpr:Wo(l,"displaycpr",!0),s1r1:Wo(l,"displayS1R1",!1)},i=t?{daily:Wo(l,"showDaily",!0),weekly:Wo(l,"showWeekly",!1),monthly:Wo(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{...Eo(e,"daily",i.daily,n,s),...Eo(e,"weekly",i.weekly,n,s),...Eo(e,"monthly",i.monthly,n,s)}}};const qo={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:Ko(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:Ko(t,"sellColor","#880e4f"),text:"SELL"})}return r},calc:(l,t)=>{const o=l.length,n=Do(o),r=Do(o),a=Do(o),i=Do(o);if(0===o)return{alphatrend:[],lagged:[],buySignal:[],sellSignal:[]};const s=Math.max(1,Math.round(Bo(t,"AP",14))),c=Bo(t,"coeff",1),u=!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),g=h(y(d,m,b),s),k=u?p(e(l,((e,l="source")=>e[l]??"close")(t)),s):function(e,l,t){const o=e.length,n=Do(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=R(r,t),s=R(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(g[e])||!Number.isFinite(k[e]))continue;const o=g[e]*c;n[e]=k[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 w=new Array(o).fill(!1),C=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?w[e]=!0:l<t&&o>=a&&(C[e]=!0))}if(f){const e=w.map((e,l)=>l>0&&w[l-1]),l=C.map((e,l)=>l>0&&C[l-1]),t=z(w),n=z(C),s=z(e),c=z(l);for(let e=0;e<o;e++)w[e]&&s[e]>n[e]?a[e]=.9999*r[e]:C[e]&&c[e]>t[e]&&(i[e]=1.0001*r[e])}return{alphatrend:v(n),lagged:v(r),buySignal:v(a),sellSignal:v(i)}}},zo={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:v(t),avgRange:new Array(e.length).fill(null)}:{range:v(t),avgRange:v(h(t,Math.max(1,Math.round(Bo(l,"avgLength",3)))))}}},Zo=[$o,qo,zo],Yo=(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(Yo(e,l,t))),Go=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},Xo=(e,l)=>new Array(e).fill(l),Jo=e=>/^#[0-9a-f]{6}$/i.test(e)?`${e}99`:e;function _o(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 Qo(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 en(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 ln={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=jo(t,"n1",10),r=jo(t,"n2",21),a=jo(t,"sigLen",4),i=Yo(t,"obLevel1",60),s=Yo(t,"obLevel2",53),c=Yo(t,"osLevel1",-60),p=Yo(t,"osLevel2",-53),y=new Array(o).fill(null),u=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),g=e(l,(e=>e.source??"hlc3")(t)),k=_o(g,e=>A(e,n)),w=_o(g.map((e,l)=>Math.abs(e-k[l])),e=>A(e,n)),C=_o(g.map((e,l)=>{const t=w[l];return Number.isFinite(t)?0===t?0:(e-k[l])/(.015*t):NaN}),e=>A(e,r)),M=_o(C,e=>h(e,a)),N=C.map((e,l)=>e-M[l]),x={wt1:v(C),wt2:v(M),mom:!1===t.showMom?new Array(o).fill(null):v(N),obUpper:Xo(o,i),obLower:Xo(o,s),osUpper:Xo(o,p),osLower:Xo(o,c),buy:y,sell:u,bull:f,bear:d,hiddenBull:m,hiddenBear:b},S=!1!==t.filterZone,L=!1!==t.useInner,B=L?s:i,K=L?p:c;for(let e=1;e<o;e++){const l=C[e-1],t=M[e-1],o=C[e],n=M[e];Number.isFinite(l)&&Number.isFinite(t)&&(Number.isFinite(o)&&Number.isFinite(n)&&(o>n&&l<=t&&(!S||n<=K)&&(y[e]=n),o<n&&l>=t&&(!S||n>=B)&&(u[e]=n)))}const W=jo(t,"lbL",3),D=jo(t,"lbR",3),F=Yo(t,"rangeLower",5),R=Yo(t,"rangeUpper",60),U=!1!==t.showRegDiv,T=!0===t.showHidDiv,P=$(M,W,D).map(e=>Number.isFinite(e)),O=E(M,W,D).map(e=>Number.isFinite(e)),I=Qo(M,D),V=Qo(l.map(e=>e.low),D),H=Qo(l.map(e=>e.high),D),q=z(en(P,1)),Y=z(en(O,1)),j=Z(P,I,1),G=Z(P,V,1),X=Z(O,I,1),J=Z(O,H,1);for(let e=0;e<o;e++){const l=e-D;if(!(l<0)){if(P[e]){const t=F<=q[e]&&q[e]<=R;U&&t&&I[e]>j[e]&&V[e]<G[e]&&(f[l]=I[e]),T&&t&&I[e]<j[e]&&V[e]>G[e]&&(m[l]=I[e])}if(O[e]){const t=F<=Y[e]&&Y[e]<=R;U&&t&&I[e]<X[e]&&H[e]>J[e]&&(d[l]=I[e]),T&&t&&I[e]>X[e]&&H[e]<J[e]&&(b[l]=I[e])}}}return x},markers:({bars:e,values:l,settings:t})=>{const o=Go(t,"bullColor","#4caf50"),n=Go(t,"bearColor","#ff5252"),r=[{col:l.buy,shape:"circle",size:"tiny",color:Go(t,"buyColor","#00e676"),text:void 0},{col:l.sell,shape:"circle",size:"tiny",color:Go(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:Jo(o),text:"H"},{col:l.hiddenBear,shape:"labelDown",size:"small",color:Jo(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:Yo(e,"obLevel1",60),color:Go(e,"obBandColor","#ff5252"),title:"Overbought 1",dashed:!0},{price:Yo(e,"obLevel2",53),color:Go(e,"obBandColor","#ff5252"),title:"Overbought 2",dashed:!0},{price:0,color:"#787b86",title:"Zero",dashed:!0},{price:Yo(e,"osLevel2",-53),color:Go(e,"osBandColor","#4caf50"),title:"Oversold 2",dashed:!0},{price:Yo(e,"osLevel1",-60),color:Go(e,"osBandColor","#4caf50"),title:"Oversold 1",dashed:!0}]},tn=[ln],on=(e,l,t)=>{const o=e[l];return"number"==typeof o&&Number.isFinite(o)?o:t},nn=(e,l,t)=>{const o=e[l];return"string"==typeof o&&""!==o?o:t},rn=(e,l)=>!1!==e[l],an="#089981",sn="#F23745",cn="#787b86",pn=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function yn(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 un=yn(cn,.2),fn=yn(cn,.5);function dn(e,l,t,o){if(null===e||!Number.isFinite(e))return;return yn(e>=0?t:o,.1+.4*(l>0?Math.min(1,Math.abs(e)/l):1))}const mn=e=>`${e.toFixed(2)}%`;const bn=(e,l)=>100*e+l;function hn(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=m(e.year,e.month,1,0,0,0,l),r=m(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}(nn(l,"ignoredMonths","")),i=t.length>0?t[t.length-1]:null;null!==i&&n.add(bn(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(bn(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 gn(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 kn=e=>{if(0===e.length)return null;let l=0;for(const t of e)l+=t;return l/e.length};function wn(e){if(e.length<2)return null;const l=kn(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 Cn=e=>{if(0===e.length)return null;let l=0;for(const t of e)t>=0&&(l+=1);return 100*l/e.length},Mn={Left:"bottom-left",Center:"bottom-center",Right:"bottom-right"},vn=[52,...new Array(12).fill(46)],An=e=>({text:e,bgColor:un}),Nn={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:an,group:"Color settings"},{key:"negColor",type:"color",label:"Negative Color",default:sn,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=hn(e,l);if(0===t.years.length)return null;const o=on(l,"cutoffPercent",10),n=nn(l,"posColor",an),r=nn(l,"negColor",sn),a=[[An("Year"),...pn.map(An)]],i=[1];for(const e of t.years){const l=t.byYear.get(e)??[],s=[An(String(e))];for(let a=0;a<12;a++){if(t.skipped.has(bn(e,a+1))){s.push({text:"SKIP",bgColor:fn});continue}const i=l[a]??null;s.push(null===i?{text:""}:{text:mn(i),bgColor:dn(i,o,n,r)})}a.push(s),i.push(1)}const s=rn(l,"showAvg"),c=rn(l,"showStDev"),p=rn(l,"showPos");if(s||c||p){if(a.push(Array.from({length:13},()=>({text:"",bgColor:un}))),i.push(.3),s){const e=[An("Avgs:")];for(let l=0;l<12;l++){const a=kn(gn(t,l));e.push(null===a?{text:""}:{text:mn(a),bgColor:dn(a,o,n,r)})}a.push(e),i.push(1)}if(c){const e=[An("StDev:")];for(let l=0;l<12;l++){const o=wn(gn(t,l));e.push({text:null===o?"":o.toFixed(2),bgColor:un})}a.push(e),i.push(1)}if(p){const e=[An("Pos%:")];for(let l=0;l<12;l++){const o=Cn(gn(t,l));e.push(null===o?{text:""}:{text:`${Math.round(o)}%`,bgColor:dn(o-50,50,n,r)})}a.push(e),i.push(1)}}return{rows:a,options:{position:Mn[nn(l,"tablePosition","Center")]??"bottom-center",cellWidth:vn,cellHeight:18,rowWeights:i,widthPercent:on(l,"tableWidth",100),heightPercent:on(l,"tableHeight",95),fontSize:10,margin:8}}}},xn=[Nn],Sn="__tier2",Ln=e=>e[Sn];function Bn(e,l){return(e.refetchOn??[]).map(e=>`${e}=${String(l[e])}`).join("&")}function Kn(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 Wn(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)=>{const n=Ln(o);return function(e,l,t){const o={};for(const l of t)o[l.key]=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.key];o[e.key][r]="number"==typeof l&&Number.isFinite(l)?l:null}}return o}(l,n?.points??[],e.plots)},attach:l=>{const t=Ln(l.store)??{key:null,points:[],live:[],loaded:!1,from:0,to:0,status:{state:"empty"},request:null,unsubscribe:null,generation:0};l.store[Sn]=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},y=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)&&Kn(a,e);if(n)for(const e of t.points)Kn(a,e);for(const e of t.live)Kn(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}))}))},u=(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,y(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}})(),a=r.dataContext,f=JSON.stringify([Bn(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?y(t.request):(n||d||"error"!==t.status.state)&&(!t.loaded||n?u(r,r.from,r.to,!1):r.from<t.from?u(r,r.from,t.from,!0):void 0===e.subscribe&&r.to>t.to?u(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)&&(Kn(t.live,e),Kn(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 Dn="indicators",Fn=[J,Q,_,ne,ee,re,ce,ae,se,de,me,be,he,ge,ke,we,Ce,ve,Ae,Ne,...Qe,...ul,...Kl,...Vl,...Jl,...Ct,...Tt,...Gt,...uo,...Lo,...Zo,...tn,...xn];let Rn=!1;function Un(){if(!Rn){Rn=!0;for(const e of Fn)b(e)}}Un();export{Jl as ADAPTIVE_INDICATORS,Ne as ADL,he as ADX,ht as ALLIGATOR,Te as ALMA,qo as ALPHATREND,tl as AROON,ol as AROON_OSCILLATOR,we as ATR,Al as AVERAGE_DAILY_RANGE,Ct as AVERAGE_INDICATORS,nl as AWESOME_OSCILLATOR,rl as BALANCE_OF_POWER,Cl as BB_TREND,ee as BOLLINGER,wl as BOLLINGER_BANDWIDTH,kl as BOLLINGER_PERCENT_B,Fn as BUILTIN_INDICATORS,ge as CCI,Ul as CHAIKIN_MONEY_FLOW,Tl as CHAIKIN_OSCILLATOR,Sl as CHAIKIN_VOLATILITY,Ee as CHANDELIER_EXIT,He as CHANDE_KROLL_STOP,al as CHANDE_MOMENTUM,Ml as CHOPPINESS_INDEX,xl as CHOP_ZONE,yl as CONNORS_RSI,So as CONSOLIDATION_BREAKOUT,il as COPPOCK_CURVE,$o as CPR,Pe as DEMA,Ve as DONCHIAN,sl as DPO,Pl as EASE_OF_MOVEMENT,Ol as ELDER_FORCE_INDEX,Q as EMA,Ie as ENVELOPE,cl as FISHER_TRANSFORM,Vl as FLOW_INDICATORS,ce as HALFTREND,vl as HISTORICAL_VOLATILITY,Oe as HMA,_e as HULL_SUITE,se as ICHIMOKU,Gt as INDEX_INDICATORS,Dn as INDICATORS_TIER,zl as KAMA,Zl as KELTNER_CHANNEL,jl as KLINGER_OSCILLATOR,Gl as KNOW_SURE_THING,Xl as LINREG_SLOPE,Yl as LSMA,me as MACD,Yt as MASS_INDEX,qe as MA_CHANNEL,it as MA_CROSS,ft as MA_RIBBON,st as MCGINLEY_DYNAMIC,ct as MEDIAN,ke as MFI,St as MOMENTUM,Il as NET_VOLUME,$t as NVI,Ae as OBV,ul as OSCILLATOR_INDICATORS,Qe as OVERLAY_INDICATORS,ae as PARABOLIC_SAR,Kt as PPO,qt as PVI,Zt as PVO,zt as PVT,zo as RANGE_ANALYSIS,uo as RANGE_INDICATORS,io as RELATIVE_VIGOR_INDEX,so as RELATIVE_VOLATILITY_INDEX,Lt as ROC,de as RSI,xo as RSI_DIVERGENCE,Nn as SEASONALITY,xn as SEASONALITY_INDICATORS,Lo as SIGNAL_INDICATORS,J as SMA,Ut as SMI,Ft as SMI_ERGODIC_INDICATOR,Rt as SMI_ERGODIC_OSCILLATOR,gt as SMMA,yo as SPECIAL_K,Ll as STANDARD_DEVIATION,Bl as STANDARD_ERROR,$e as STANDARD_ERROR_BANDS,be as STOCHASTIC,no as STOCHASTIC_RSI,Tt as STRENGTH_INDICATORS,Zo as STUDY_INDICATORS,re as SUPERTREND,wt as T3,dt as TEMA,vo as TREND_STRENGTH_INDEX,Wt as TRIX,Dt as TSI,mt as TWAP,jt as ULCER_INDEX,ao as ULTIMATE_OSCILLATOR,Kl as VOLATILITY_INDICATORS,Mo as VOLATILITY_STOP,ve as VOLUME,Co as VORTEX,ne as VWAP,bt as VWMA,ln as WAVETREND,tn as WAVETREND_INDICATORS,No as WILLIAMS_FRACTALS,ro as WILLIAMS_PERCENT_R,Ce as WILLIAMS_VIX_FIX,_ as WMA,co as WOODIES_CCI,B as alma,z as barsSince,H as cci,N as change,pl as connorsStreak,V as correlation,Wn as createTier2Indicator,U as cumulative,S as dev,C as highest,W as highestBars,T as linreg,M as lowest,D as lowestBars,v as nulls,L as percentRank,I as percentileNearestRank,E as pivotHigh,$ as pivotLow,Un as registerBuiltinIndicators,k as rma,x as roc,R as rollingSum,h as sma,A as smaSeededEma,w as stdev,O as stoch,P as swma,Z as valueWhen,K as vwma,g as wma};
//# sourceMappingURL=openalgo-charts.indicators.mjs.map