openalgo-charts 2.5.7 → 2.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -16
- package/dist/index.d.ts +136 -22
- package/dist/openalgo-charts.indicators.mjs +1 -1
- package/dist/openalgo-charts.indicators.mjs.map +1 -1
- package/dist/openalgo-charts.mjs +1 -1
- package/dist/openalgo-charts.mjs.map +1 -1
- package/dist/openalgo-charts.standalone.js +1 -1
- package/dist/openalgo-charts.standalone.js.map +1 -1
- package/dist/openalgo-charts.webgl.mjs +1 -1
- package/dist/openalgo-charts.webgl.mjs.map +1 -1
- package/dist/webgl/index.d.ts +4 -0
- package/package.json +2 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{sourceValues as e,supertrend as t,atr as l,sessionStartFlags as o,calendarPeriodFlags as n,DEFAULT_TIMEZONE as r,isValidTimezone as a,isNewZonedPeriod as i,utcSecondsToIstParts as s,IST_OFFSET_SECONDS as c,rsi as u,trueRange as p,withAlpha as y,isNewZonedWeek as f,isNewZonedMonth as m,utcSecondsToZonedParts as d,zonedWallClockToUtcSeconds as b,normalizeDataVariant as h,IndicatorInputError as g,resolveInterval as k,parseSessionSpec as w,bucketStartOf as v,zonedWeekIndex as C,zonedDayIndex as N,dataVariantKey as M,registerIndicator as A}from"./openalgo-charts.mjs";function x(e,t){const l=new Array(e.length).fill(NaN);if(e.length<t)return l;if(1===t){for(let t=0;t<e.length;t++){const o=e[t];Number.isFinite(o)&&(l[t]=0===o?0:o)}return l}let o=0;for(let n=0;n<e.length;n++){if(Number.isFinite(e[n])||o++,n>=t&&!Number.isFinite(e[n-t])&&o--,n<t-1||0!==o)continue;let r=0;for(let l=n-t+1;l<=n;l++)r+=e[l];Number.isFinite(r)&&(l[n]=r)}return l}function S(e,t){const l=x(e,t);if(1!==t)for(let e=0;e<l.length;e++)l[e]/=t;return l}function L(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new RangeError("Missing-value period must be a positive safe integer");if(null===t||"object"!=typeof t||Array.isArray(t))throw new TypeError("Missing-value options must be an object");const l=void 0===t.missing?"propagate":t.missing;if("skip"!==l&&"propagate"!==l)throw new TypeError("Missing-value policy must be skip or propagate");return l}function B(e,t,l,o,n=!1){const r=L(t,l),a=new Array(e.length).fill(NaN),i=[];let s=0;for(let l=0;l<e.length;l++){const c=e[l],u=Number.isFinite(c);n&&u&&i.length===t&&0===s&&(a[l]=o(i,l)),("propagate"===r||u)&&(i.push({value:c,index:l}),u||s++,i.length>t&&!Number.isFinite(i.shift().value)&&s--),n||i.length!==t||0!==s||(a[l]=o(i,l))}return a}function K(e,t,l,o){if("number"!=typeof e)throw new TypeError(`${l} must contain numbers`);if(!(o&&Number.isNaN(e)||Number.isSafeInteger(e)&&!(e<t)))throw new RangeError(`${l} must be a safe integer greater than or equal to ${t}`)}function F(e,t,l,o){if(!Array.isArray(e))throw new TypeError(`${o} must be an array`);if(e.length!==t)throw new RangeError(`${o} array length must match the source`);for(let t=0;t<e.length;t++)K(e[t],l,o,!0)}function W(e,t,l,o,n=!1){F(t,e.length,1,"Window length");const r=L(1,void 0===l?{}:l),a=new Array(e.length).fill(NaN),i=[];let s=0;const c=(e,t)=>{const l=Number.isFinite(e);s=l?s+1:0,("propagate"===r||l)&&i.push({value:e,index:t})};for(let l=0;l<e.length;l++){const u=e[l];n||c(u,l);const p=t[l];!Number.isNaN(p)&&p<=i.length&&("skip"===r||p<=s)&&(!n||Number.isFinite(u))&&(a[l]=o(i.slice(i.length-p),l)),n&&c(u,l)}return a}function D(e,t){const l=new DataView(new ArrayBuffer(8)),o=(1n<<52n)-1n;let n=0n,r=0n;for(let a=0;a<e.length;a++){const i=BigInt(t?.[a]??1);if(0n===i)continue;l.setFloat64(0,e[a]);const s=l.getBigUint64(0),c=Number(s>>52n&0x7ffn),u=s&o,p=0===c?u:(1n<<52n|u)<<BigInt(c-1);n+=(s>>63n?-p:p)*i,r+=i}return function(e,t){const l=e<0n,o=l?-e:e,n=o/t,r=Math.max(0,n.toString(2).length-53),a=t<<BigInt(r);let i=o/a;const s=o%a;(2n*s>a||2n*s===a&&0n!=(1n&i))&&i++;const c=Number(i)*2**(r-1074);return l?-c:c}(n,r)}function R(e,t){let l=0,o=0,n=0,r=1/0,a=-1/0;for(let i=0;i<e.length;i++){const s=t?.[i]??1;if(0===s)continue;r=Math.min(r,e[i]),a=Math.max(a,e[i]),n+=s;const c=e[i]*s,u=l+c;o+=Math.abs(l)>=Math.abs(c)?l-u+c:c-u+l,l=u}if(r===a)return r;const i=l+o,s=Number.isFinite(i)&&Number.isSafeInteger(n)?i/n:D(e,t);return Math.max(r,Math.min(a,s))}function O(e){return R(e.map(e=>e.value))}function T(e,t){const l=e[0].value;let o=0,n=0,r=e.map(({value:e})=>{o=Math.max(o,Math.abs(e));const t=e-l;return n=Math.max(n,Math.abs(t)),t});if(0===n)return 0;const a=2**Math.min(1023,Math.floor(Math.log2(Number.isFinite(n)?n:o)));r=Number.isFinite(n)?r.map(e=>e/a):e.map(({value:e})=>e/a-l/a);const i=R(r),s=R(r.map(e=>{const l=Math.abs(e-i);return t?l*l:l}));return Math.min(o,(t?Math.sqrt(s):s)*a)}function U(e,t){let l=e[0];for(let o=1;o<e.length;o++){const n=e[o];(t?n.value>=l.value:n.value<=l.value)&&(l=n)}return l}function P(e,t,l,o){const n=L(t,l),r=new Array(e.length).fill(NaN);let a=0;const i=[];let s=NaN;for(let l=0;l<e.length;l++){const c=e[l];if(Number.isFinite(c)){if(a<t){if(i.push(c),++a<t)continue;s=R(i),i.length=0}else s=R([s,c],[t-1,o]);r[l]=s}else"propagate"===n?(a=0,i.length=0,s=NaN):a===t&&(r[l]=s)}return r}function I(e,t,l){if("number"!=typeof t)return W(e,t,l,O);if(void 0!==l)return B(e,t,l,O);if(Number.isSafeInteger(t)&&t>0)return S(e,t);const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;let r=0,a=0;for(let l=0;l<o;l++){const o=e[l];if(Number.isFinite(o)?r+=o:a+=1,l>=t){const o=e[l-t];Number.isFinite(o)?r-=o:a-=1}l>=t-1&&(n[l]=0===a?r/t:NaN)}return n}function V(e,t,l){if("number"!=typeof t)return W(e,t,l,e=>R(e.map(e=>e.value),e.map((e,t)=>t+1)));if(void 0!==l)return B(e,t,l,e=>R(e.map(e=>e.value),e.map((e,t)=>t+1)));const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;const r=t*(t+1)/2,a=Number.isSafeInteger(t);for(let l=t-1;l<o;l++){let o=0;for(let n=0;n<t;n++){const r=a?t-1-n:n;o+=e[l-r]*(t-r)}const i=o/r;a&&!Number.isFinite(i)||(n[l]=i)}return n}function E(e,t,l){const o=new Array(e.length).fill(NaN);if(e.length<t)return o;const n=2/(t+1);let r=0,a=NaN,i=!1;for(let s=0;s<e.length;s++){const c=e[s];if(Number.isFinite(c)){if(i)a=l?c*n+a*(1-n):(a*(t-1)+c)/t;else{if(++r<t)continue;let l=0;for(let o=s+1-t;o<=s;o++)l+=e[o];const o=l/t;if(!Number.isFinite(o))continue;a=0===o?0:o,i=!0}Number.isFinite(a)&&(o[s]=0===a?0:a)}else r=0}return o}function q(e,t,l){if(void 0!==l)return P(e,t,l,1);if(Number.isSafeInteger(t)&&t>0)return E(e,t,!1);const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;let r=0;for(let l=0;l<t;l++)r+=e[l];let a=r/t;n[t-1]=a;for(let l=t;l<o;l++)a=(a*(t-1)+e[l])/t,n[l]=a;return n}function H(e,t,l){if("number"!=typeof t)return W(e,t,l,e=>T(e,!0));if(void 0!==l)return B(e,t,l,e=>T(e,!0));const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;const r=I(e,t),a=Number.isSafeInteger(t);for(let l=t-1;l<o;l++){let o=0;const i=r[l];for(let n=0;n<t;n++){const r=e[l-(a?t-1-n:n)]-i;o+=r*r}const s=Math.sqrt(o/t);a&&!Number.isFinite(s)||(n[l]=s)}return n}function $(e,t,l){if("number"!=typeof t)return W(e,t,l,e=>U(e,!0).value);if(void 0!==l)return B(e,t,l,e=>U(e,!0).value);const o=e.length,n=new Array(o).fill(NaN);if(t<=0)return n;for(let l=t-1;l<o;l++){let o=-1/0;for(let n=0;n<t;n++)e[l-n]>o&&(o=e[l-n]);n[l]=o}return n}function z(e,t,l){if("number"!=typeof t)return W(e,t,l,e=>U(e,!1).value);if(void 0!==l)return B(e,t,l,e=>U(e,!1).value);const o=e.length,n=new Array(o).fill(NaN);if(t<=0)return n;for(let l=t-1;l<o;l++){let o=1/0;for(let n=0;n<t;n++)e[l-n]<o&&(o=e[l-n]);n[l]=o}return n}function j(e){const t=new Array(e.length);for(let l=0;l<e.length;l++){const o=e[l];t[l]=Number.isFinite(o)?o:null}return t}function Z(e,t,l){if(void 0!==l)return P(e,t,l,2);if(Number.isSafeInteger(t)&&t>0)return E(e,t,!0);const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;let r=0;for(let l=0;l<t;l++)r+=e[l];let a=r/t;n[t-1]=a;const i=2/(t+1);for(let l=t;l<o;l++)a=e[l]*i+a*(1-i),n[l]=a;return n}function Y(e,t=1){const l=e.length,o=new Array(l).fill(NaN);for(let n=t;n<l;n++)o[n]=e[n]-e[n-t];return o}function J(e,t){const l=e.length,o=new Array(l).fill(NaN);if(t<=0)return o;for(let n=t;n<l;n++){const l=e[n-t];o[n]=0===l?NaN:100*(e[n]-l)/l}return o}function G(e,t,l){if("number"!=typeof t)return W(e,t,l,e=>T(e,!1));if(void 0!==l)return B(e,t,l,e=>T(e,!1));const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;const r=I(e,t),a=Number.isSafeInteger(t);for(let l=t-1;l<o;l++){let o=0;for(let n=0;n<t;n++)o+=Math.abs(e[l-(a?t-1-n:n)]-r[l]);const i=o/t;a&&!Number.isFinite(i)||(n[l]=i)}return n}function X(e,t,l){if("number"!=typeof t)return W(e,t,l,(t,l)=>{let o=0;for(const n of t)n.value<=e[l]&&o++;return 100*o/t.length},!0);if(void 0!==l)return B(e,t,l,(l,o)=>{let n=0;for(const t of l)t.value<=e[o]&&n++;return 100*n/t},!0);const o=e.length,n=new Array(o).fill(NaN);if(t<=0)return n;for(let l=t;l<o;l++){let o=0;for(let n=1;n<=t;n++)e[l-n]<=e[l]&&(o+=1);n[l]=100*o/t}return n}function _(e,t,l,o){const n=e.length,r=new Array(n).fill(NaN);if(t<=0||o<=0||n<t)return r;const a=l*(t-1),i=t/o,s=new Array(t);let c=0;for(let e=0;e<t;e++){const t=Math.exp(-(e-a)*(e-a)/(2*i*i));s[e]=t,c+=t}if(0===c)return r;for(let l=t-1;l<n;l++){let o=0;for(let n=0;n<t;n++)o+=e[l-(t-1-n)]*s[n];r[l]=o/c}return r}function Q(e,t,l){const o=e.length,n=new Array(o);for(let l=0;l<o;l++)n[l]=e[l]*(t[l]??0);const r=I(n,l),a=I(t,l),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 ee(e,t,l){return"number"!=typeof t?W(e,t,l,(e,t)=>U(e,!0).index-t):void 0!==l?B(e,t,l,(e,t)=>U(e,!0).index-t):le(e,t,!0)}function te(e,t,l){return"number"!=typeof t?W(e,t,l,(e,t)=>U(e,!1).index-t):void 0!==l?B(e,t,l,(e,t)=>U(e,!1).index-t):le(e,t,!1)}function le(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;for(let r=t-1;r<o;r++){let o=e[r],a=0;for(let n=1;n<t;n++){const t=e[r-n];(l?t>o:t<o)&&(o=t,a=n)}n[r]=0===a?0:-a}return n}function oe(e,t){if(Number.isSafeInteger(t)&&t>0)return x(e,t);const l=e.length,o=new Array(l).fill(NaN);if(t<=0||l<t)return o;let n=0;for(let r=0;r<l;r++)n+=e[r],r>=t&&(n-=e[r-t]),r>=t-1&&(o[r]=n);return o}function ne(e){const t=e.length,l=new Array(t);let o=0;for(let n=0;n<t;n++){const t=e[n];Number.isFinite(t)&&(o+=t),l[n]=o}return l}function re(e,t,l=0){const o=e.length,n=new Array(o).fill(NaN);if(t<=1||o<t)return n;const r=(t-1)*t/2,a=t*((t-1)*t*(2*t-1)/6)-r*r;if(0===a)return n;for(let i=t-1;i<o;i++){let o=0,s=0;for(let l=0;l<t;l++){const n=e[i-(t-1-l)];o+=n,s+=n*l}const c=(t*s-r*o)/a,u=(o-c*r)/t;n[i]=u+c*(t-1-l)}return n}function ae(e){const t=e.length,l=new Array(t).fill(NaN);for(let o=3;o<t;o++)l[o]=(e[o-3]+2*e[o-2]+2*e[o-1]+e[o])/6;return l}function ie(e,t,l,o){const n=e.length,r=new Array(n).fill(NaN),a=$(t,o),i=z(l,o);for(let t=0;t<n;t++){const l=a[t]-i[t];r[t]=0===l?NaN:100*(e[t]-i[t])/l}return r}function se(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;for(let r=t-1;r<o;r++){const o=e.slice(r-t+1,r+1);if(o.some(e=>!Number.isFinite(e)))continue;o.sort((e,t)=>e-t);const a=Math.max(1,Math.ceil(l/100*t));n[r]=o[a-1]}return n}function ce(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(l<=1||o<l)return n;for(let r=l-1;r<o;r++){let o=0,a=0,i=0,s=0,c=0;for(let n=r-l+1;n<=r;n++)o+=e[n],a+=t[n];const u=o/l,p=a/l;for(let o=r-l+1;o<=r;o++){const l=e[o]-u,n=t[o]-p;i+=l*n,s+=l*l,c+=n*n}const y=i/l/(Math.sqrt(s/l)*Math.sqrt(c/l));Number.isFinite(y)&&(n[r]=y)}return n}function ue(e,t){const l=e.length,o=new Array(l).fill(NaN),n=I(e,t),r=G(e,t);for(let t=0;t<l;t++)o[t]=0===r[t]?NaN:(e[t]-n[t])/(.015*r[t]);return o}function pe(e,t,l){return"number"!=typeof t||"number"!=typeof l?fe(e,t,l,!0):me(e,t,l,!0)}function ye(e,t,l){return"number"!=typeof t||"number"!=typeof l?fe(e,t,l,!1):me(e,t,l,!1)}function fe(e,t,l,o){for(const[o,n]of[["Left pivot width",t],["Right pivot width",l]])"number"==typeof n?K(n,0,o,!1):F(n,e.length,0,o);const n=new Array(e.length).fill(NaN);for(let r=0;r<e.length;r++){const a="number"==typeof t?t:t[r],i="number"==typeof l?l:l[r];if(Number.isNaN(a)||Number.isNaN(i)||i>r||a>r-i)continue;const s=r-i,c=e[s];if(!Number.isFinite(c))continue;let u=!0;for(let t=s-a;t<=r&&u;t++){if(t===s)continue;const l=e[t];Number.isFinite(l)&&!(o?l>=c:l<=c)||(u=!1)}u&&(n[r]=c)}return n}function me(e,t,l,o){const n=e.length,r=new Array(n).fill(NaN);for(let a=t+l;a<n;a++){const n=a-l,i=e[n];if(!Number.isFinite(i))continue;let s=!0;for(let l=1;l<=t&&s;l++){const t=e[n-l];Number.isFinite(t)&&!(o?t>=i:t<=i)||(s=!1)}for(let t=1;t<=l&&s;t++){const l=e[n+t];Number.isFinite(l)&&!(o?l>=i:l<=i)||(s=!1)}s&&(r[a]=i)}return r}function de(e){const t=e.length,l=new Array(t).fill(NaN);let o=-1;for(let n=0;n<t;n++)e[n]&&(o=n),o>=0&&(l[n]=n-o);return l}function be(e,t,l){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-l;o>=0&&(n[a]=t[r[o]])}return n}const he=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},ge=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},ke=(e,t="source")=>e[t]??"close";function we(t,l,o,n){return{id:t,name:l,category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close",allowStudyOutputs:!0},{key:"color",type:"color",label:"Color",default:o}],plots:[{key:"ma",type:"line",title:l,colorKey:"color",style:{color:o,lineWidth:1.5}}],calc:(t,l,o,r)=>{const a=ke(l),i="string"==typeof a?e(t,a):e(t,a,r).map(e=>e??NaN);return{ma:j(n(i,he(l,"length",9),"string"==typeof a?void 0:{missing:"propagate"}))}}}}const ve=we("sma","SMA","#4f8cff",I),Ce=we("wma","WMA","#ab47bc",V),Ne=we("ema","EMA","#f5a623",Z),Me={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:(t,l)=>{const o=e(t,ke(l)),n=he(l,"length",20),r=he(l,"stdDev",2),a=I(o,n),i=H(o,n),s=a.map((e,t)=>e+r*i[t]),c=a.map((e,t)=>e-r*i[t]);return{upper:j(s),basis:j(a),lower:j(c)}}},Ae=e=>Math.floor(((e=>Math.floor((e+c)/86400))(e)-4)/7);function xe(e,t){return t===r?(t,l)=>function(e,t,l){if("week"===e)return Ae(t)!==Ae(l);const o=s(t),n=s(l);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,t,l):(l,o)=>i(l,o,e,t)}function Se(e,t){if(0===t)return e.slice();const l=new Array(e.length).fill(NaN);for(let o=0;o<e.length;o++){const n=o+t;n>=0&&n<e.length&&(l[n]=e[o])}return l}const Le={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:(t,l)=>{const i=t.length,s=e(t,ke(l)),c="string"==typeof l.anchor?l.anchor:"session",u="percent"===l.calcMode,p=Math.round(he(l,"offset",0)),y=new Array(i).fill(NaN),f=new Array(i).fill(NaN),m=function(e,t,l){if("continuous"===t)return new Array(e.length).fill(!1);const r=e.map(e=>e.time);return"session"===t?o(r,l):n(r,xe(t,l))}(t,c,(e=>{const t=e.timezone;return"string"!=typeof t||""===t||t===r?r:a(t)?t:r})(l));let d=0,b=0,h=0;for(let e=0;e<i;e++){m[e]&&(d=0,b=0,h=0);const l=t[e].volume??0,o=s[e];if(!Number.isFinite(o)||!Number.isFinite(l))continue;if(d+=o*l,h+=o*o*l,b+=l,b<=0)continue;const n=d/b;y[e]=n;const r=Math.max(0,h/b-n*n);f[e]=u?.01*n:Math.sqrt(r)}const g=(e,t,l)=>{const o=new Array(i).fill(NaN);if(!e)return o;for(let e=0;e<i;e++)Number.isFinite(y[e])&&Number.isFinite(f[e])&&(o[e]=y[e]+l*f[e]*t);return o},k=!1!==l.showBand1,w=!0===l.showBand2,v=!0===l.showBand3,C=he(l,"bandMult1",1),N=he(l,"bandMult2",2),M=he(l,"bandMult3",3);return{vwap:j(Se(y,p)),upper1:j(Se(g(k,C,1),p)),lower1:j(Se(g(k,C,-1),p)),upper2:j(Se(g(w,N,1),p)),lower2:j(Se(g(w,N,-1),p)),upper3:j(Se(g(v,M,1),p)),lower3:j(Se(g(v,M,-1),p))}}},Be={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,l)=>{const o=t(e,he(l,"period",10),he(l,"multiplier",3)),n=[],r=[],a=[];for(let t=0;t<o.length;t++){const l=o[t],i=Number.isFinite(l.value);n.push(i&&-1===l.direction?l.value:null),r.push(i&&1===l.direction?l.value:null);const s=e[t];a.push(i&&void 0!==s?(s.open+s.close)/2:null)}return{up:n,down:r,bodyMid:a}}},Ke={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,t)=>{const l=e.length,o=new Array(l).fill(NaN),n=he(t,"start",.02),r=he(t,"increment",.02),a=he(t,"maximum",.2);let i,s,c=!1,u=NaN,p=NaN,y=n;for(let t=0;t<l;t++){const l=e[t];Number.isFinite(l.high)&&Number.isFinite(l.low)&&Number.isFinite(l.close)&&(void 0!==i?void 0!==s?(u+=y*(p-u),c&&l.low<u?(c=!1,u=Math.max(p,l.high),p=l.low,y=n):!c&&l.high>u?(c=!0,u=Math.min(p,l.low),p=l.high,y=n):c&&l.high>p?(p=l.high,y=Math.min(a,y+r)):!c&&l.low<p&&(p=l.low,y=Math.min(a,y+r)),u=c?Math.min(u,i.low,s.low):Math.max(u,i.high,s.high),o[t]=u,s=i,i=l):(c=l.close>=i.close,u=c?i.low:i.high,p=c?l.high:l.low,o[t]=u,s=i,i=l):i=l)}return{sar:j(o)}}};function Fe(e,t){const l=e.length,o=new Array(l).fill(NaN);for(let n=0;n<l;n++){const r=n-t;r>=0&&r<l&&(o[n]=e[r])}return o}const We={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,t)=>{const l=e.length,o=(e,l)=>Math.max(1,Math.round(he(t,e,l))),n=o("conversionPeriod",9),r=o("basePeriod",26),a=o("laggingSpanPeriod",52),i=Math.round(he(t,"displacement",26)),s=t=>{const o=new Array(l).fill(NaN);for(let n=t-1;n<l;n++){let l=-1/0,r=1/0;for(let o=0;o<t;o++)e[n-o].high>l&&(l=e[n-o].high),e[n-o].low<r&&(r=e[n-o].low);o[n]=(l+r)/2}return o},c=s(n),u=s(r),p=c.map((e,t)=>(e+u[t])/2),y=s(a),f=e.map(e=>e.close);return{conversion:j(c),base:j(u),spanA:j(Fe(p,i)),spanB:j(Fe(y,i)),lagging:j(Fe(f,-i))}}},De={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:t,settings:l})=>{if(!1===l.showLabels)return[];const o=t.buySignal??[],n=t.sellSignal??[],r=[];for(let t=0;t<e.length;t++){const a=o[t];if(null!=a){r.push({time:e[t].time,position:"atPrice",price:a,shape:"labelUp",size:"small",color:ge(l,"upColor","#2962ff"),text:"Buy"});continue}const i=n[t];null!=i&&r.push({time:e[t].time,position:"atPrice",price:i,shape:"labelDown",size:"small",color:ge(l,"downColor","#ef5350"),text:"Sell"})}return r},calc:(e,t)=>{const o=e.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=new Array(o).fill(null),c=new Array(o).fill(null),u={up:n,down:r,atrHigh:a,atrLow:i,buySignal:s,sellSignal:c};if(0===o)return u;const p=Math.max(1,Math.round(he(t,"amplitude",2))),y=he(t,"channelDeviation",2),f=!1!==t.showChannels,m=!1!==t.showSignals,d=e.map(e=>e.high),b=e.map(e=>e.low),h=l(d,b,e.map(e=>e.close),Math.max(1,Math.round(he(t,"atrPeriod",100)))),g=I(d,p),k=I(b,p),w=$(d,p),v=z(b,p);let C=0,N=0,M=b[0],A=d[0],x=0,S=0,L=!1;for(let t=0;t<o;t++){const l=h[t]/2,o=y*l,u=w[t],p=v[t],B=t>0?d[t-1]:d[0],K=t>0?b[t-1]:b[0],F=L?C:-1;let W;1===N?(Number.isFinite(p)&&(M=Math.max(p,M)),Number.isFinite(g[t])&&g[t]<M&&e[t].close<K&&(C=1,N=0,A=u)):(Number.isFinite(u)&&(A=Math.min(u,A)),Number.isFinite(k[t])&&k[t]>A&&e[t].close>B&&(C=0,N=1,M=p)),0===C?(1===F?(x=S,m&&Number.isFinite(l)&&(s[t]=x-l)):x=-1===F?M:Math.max(M,x),W=x):(0===F?(S=x,m&&Number.isFinite(l)&&(c[t]=S+l)):S=-1===F?A:Math.min(A,S),W=S),L=!0,Number.isFinite(W)&&(0===C?n[t]=W:r[t]=W,f&&Number.isFinite(o)&&(a[t]=W+o,i[t]=W-o))}return u}},Re=[{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"}],Oe="SMA + Bollinger Bands";function Te(e,t){const l=e.length,o=new Array(l).fill(NaN);let n=0;for(;n<l&&!Number.isFinite(e[n]);)n+=1;if(n>=l)return o;const r=t(e.slice(n),n);for(let e=0;e<r.length&&n+e<l;e++)o[n+e]=r[e];return o}function Ue(e,t){return Te(e,e=>Z(e,t))}function Pe(e,t,l,o){switch(e){case"EMA":return Ue(t,o);case"SMMA (RMA)":return Te(t,e=>q(e,o));case"WMA":return Te(t,e=>V(e,o));case"VWMA":return Te(t,(e,t)=>Q(e,l.slice(t),o));default:return Te(t,e=>I(e,o))}}const Ie=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Ve=e=>e.source??"close",Ee=(e,t)=>new Array(e).fill(t),qe={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:(t,l)=>({rsi:j(u(e(t,Ve(l)),Ie(l,"length",14))),upperLevel:Ee(t.length,Ie(l,"overbought",70)),lowerLevel:Ee(t.length,Ie(l,"oversold",30))}),levels:e=>[{price:Ie(e,"overbought",70),color:"#ef5350",title:"OB",dashed:!0},{price:50,color:"#5a6b8c",title:"",dashed:!0},{price:Ie(e,"oversold",30),color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},He={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:t,values:l,settings:o})=>{const n=l.histogram?.[t-1],r=null==n||!Number.isFinite(n)||e>=n,a=(e,t)=>{const l=o[e];return"string"==typeof l?l:t};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:(t,l)=>{const o=e(t,Ve(l)),n=Z(o,Ie(l,"fastPeriod",12)),r=Z(o,Ie(l,"slowPeriod",26)),a=n.map((e,t)=>e-r[t]),i=Te(a,e=>Z(e,Ie(l,"signalPeriod",9))),s=a.map((e,t)=>e-i[t]);return{macd:j(a),signal:j(i),histogram:j(s)}},levels:()=>[{price:0,color:"#5a6b8c",dashed:!0}]},$e={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,t)=>{const l=$(e.map(e=>e.high),Ie(t,"kPeriod",14)),o=z(e.map(e=>e.low),Ie(t,"kPeriod",14)),n=e.map((e,t)=>{const n=l[t]-o[t];return n>0&&n<1/0?100*(e.close-o[t])/n:NaN}),r=I(n,Ie(t,"kSmoothing",1)),a=I(r,Ie(t,"dPeriod",3));return{k:j(r),d:j(a),upperLevel:Ee(e.length,80),lowerLevel:Ee(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})},ze={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,t)=>{const l=e.length,o=Ie(t,"period",14),n=e.map(e=>e.high),r=e.map(e=>e.low),a=e.map(e=>e.close),i=p(n,r,a);l>0&&(i[0]=NaN);const s=new Array(l).fill(NaN),c=new Array(l).fill(NaN);for(let e=1;e<l;e++){if(!(Number.isFinite(n[e])&&Number.isFinite(r[e])&&Number.isFinite(n[e-1])&&Number.isFinite(r[e-1])))continue;const t=n[e]-n[e-1],l=r[e-1]-r[e];s[e]=t>l&&t>0?t:0,c[e]=l>t&&l>0?l:0}const u=q(i,o),y=q(s,o),f=q(c,o),m=new Array(l).fill(NaN),d=new Array(l).fill(NaN),b=new Array(l).fill(NaN);for(let e=0;e<l;e++){const t=u[e];if(!Number.isFinite(t)||0===t)continue;const l=y[e]/t*100,o=f[e]/t*100;if(Number.isFinite(l)&&(m[e]=l),Number.isFinite(o)&&(d[e]=o),!Number.isFinite(m[e])||!Number.isFinite(d[e]))continue;const n=m[e]+d[e];b[e]=n>0?Math.abs(m[e]-d[e])/n*100:0}const h=Te(b,e=>q(e,Ie(t,"adxPeriod",14)));return{plusDi:j(m),minusDi:j(d),adx:j(h)}},levels:()=>[{price:25,color:"#5a6b8c",title:"25",dashed:!0}]},je={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:Re,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,t)=>{const l=e.length,o=Ie(t,"period",20),n=Ie(t,"constant",.015),r=e.map(e=>(e.high+e.low+e.close)/3),a=I(r,o),i=new Array(l).fill(NaN);for(let e=o-1;e<l;e++){let t=0;for(let l=0;l<o;l++)t+=Math.abs(r[e-l]-a[e]);const l=t/o;i[e]=Number.isFinite(l)?l>0?(r[e]-a[e])/(n*l):0:NaN}const s=((e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l})(t,"maType","SMA"),c=((e,t,l,o=1)=>Math.max(o,Math.round(Ie(e,t,l))))(t,"maLength",20),u=Ie(t,"bbMult",2),p="None"===s?new Array(l).fill(NaN):Pe(s,i,e.map(e=>e.volume??0),c),y=s===Oe?Te(i,e=>H(e,c)).map(e=>e*u):new Array(l).fill(NaN);return{cci:j(i),ma:j(p),bbUpper:j(p.map((e,t)=>e+y[t])),bbLower:j(p.map((e,t)=>e-y[t])),upperLevel:Ee(l,100),lowerLevel:Ee(l,-100)}},levels:()=>[{price:100,color:"#ef5350",dashed:!0},{price:0,color:"#5a6b8c",dashed:!0},{price:-100,color:"#26a69a",dashed:!0}]},Ze={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,t)=>{const l=e.length,o=Ie(t,"period",14),n=e.map(e=>(e.high+e.low+e.close)/3),r=new Array(l).fill(0),a=new Array(l).fill(0);for(let t=1;t<l;t++){const l=e[t].volume??0;if(!Number.isFinite(n[t])||!Number.isFinite(n[t-1])||!Number.isFinite(l)){r[t]=NaN,a[t]=NaN;continue}const o=n[t]*l,i=Number.isFinite(o)?o:NaN;n[t]>n[t-1]?r[t]=i:n[t]<n[t-1]&&(a[t]=i)}const i=new Array(l).fill(NaN);for(let e=o;e<l;e++){let t=0,l=0;for(let n=e-o+1;n<=e;n++)t+=r[n],l+=a[n];Number.isFinite(t)&&Number.isFinite(l)&&(i[e]=0===l?100:100-100/(1+t/l))}return{mfi:j(i),upperLevel:Ee(l,80),lowerLevel:Ee(l,20)}},levels:()=>[{price:80,color:"#ef5350",title:"OB",dashed:!0},{price:20,color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},Ye={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,t)=>({atr:j(l(e.map(e=>e.high),e.map(e=>e.low),e.map(e=>e.close),Ie(t,"period",14)))})},Je={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:t,settings:l})=>{const o=t.wvf?.[e],n=t.alertUpper?.[e],r=t.alertHigh?.[e],a=(e,t)=>"string"==typeof l[e]?l[e]:t;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,t)=>{const l=e.length,o=e.map(e=>e.close),n=e.map(e=>e.low),r=Ie(t,"pd",22),a=Ie(t,"bbl",20),i=Ie(t,"mult",2),s=Ie(t,"lb",50),c=Ie(t,"ph",.85),u=Ie(t,"pl",1.01),p=!0===t.hp,y=!0===t.sd,f=$(o,r),m=new Array(l);for(let e=0;e<l;e++){const t=f[e];m[e]=Number.isFinite(t)&&0!==t?(t-n[e])/t*100:NaN}const d=H(m,a),b=I(m,a),h=$(m,s),g=z(m,s),k=new Array(l),w=new Array(l),v=new Array(l),C=new Array(l),N=new Array(l);for(let e=0;e<l;e++){const t=b[e]+i*d[e],l=h[e]*c,o=g[e]*u;k[e]=Number.isFinite(t)?t:null,w[e]=Number.isFinite(l)?l:null,v[e]=y?k[e]:null,C[e]=p?w[e]:null,N[e]=p&&Number.isFinite(o)?o:null}return{wvf:j(m),rangeHigh:C,rangeLow:N,upperBand:v,alertUpper:k,alertHigh:w}}},Ge=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Xe=(e,t,l,o=1)=>Math.max(o,Math.round(Ge(e,t,l))),_e=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Qe=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0,et={id:"volume",name:"Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#3a4666"},{key:"colorByDirection",type:"boolean",label:"Match candle direction",default:!1},{key:"upColor",type:"color",label:"Up candle",default:"#26a69a"},{key:"downColor",type:"color",label:"Down candle",default:"#ef5350"},{key:"showMA",type:"boolean",label:"Show moving average",default:!1,group:"Moving average"},{key:"maPeriod",type:"number",label:"Period",default:20,min:1,max:500,step:1,group:"Moving average"},{key:"maColor",type:"color",label:"Color",default:"#e6b53c",group:"Moving average"}],plots:[{key:"volume",type:"histogram",title:"Volume",colorKey:"color",style:{base:0},colorBy:({index:e,values:t,settings:l})=>!0===l.colorByDirection?-1===t.direction[e]?_e(l,"downColor","#ef5350"):_e(l,"upColor","#26a69a"):void 0},{key:"ma",type:"line",title:"Volume average",colorKey:"maColor",style:{lineWidth:1.5}}],calc:(e,t)=>{const l=e.map(e=>e.volume??0);return{volume:j(l),direction:e.map(e=>e.close>=e.open?1:-1),ma:!0===t.showMA?j(I(l,Xe(t,"maPeriod",20))):l.map(()=>null)}}},tt={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:Re,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,t)=>{const l=e.length,o=new Array(l).fill(NaN);let n=0;for(let t=0;t<l;t++){if(t>0){const l=Qe(e[t]);e[t].close>e[t-1].close?n+=l:e[t].close<e[t-1].close&&(n-=l)}o[t]=n}const r=_e(t,"maType","None"),a=Xe(t,"maLength",9),i=Ge(t,"bbMult",2),s="None"===r?new Array(l).fill(NaN):Pe(r,o,e.map(Qe),a),c=r===Oe?H(o,a).map(e=>e*i):new Array(l).fill(NaN);return{obv:j(o),ma:j(s),bbUpper:j(s.map((e,t)=>e+c[t])),bbLower:j(s.map((e,t)=>e-c[t]))}}},lt={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 t=new Array(e.length).fill(NaN);let l=0;for(let o=0;o<e.length;o++){const n=e[o];if(!Number.isFinite(n.high)||!Number.isFinite(n.low)||!Number.isFinite(n.close))continue;const r=n.high-n.low;if(Number.isFinite(r)){if(r>0){const e=(n.close-n.low-(n.high-n.close))/r*Qe(n);if(!Number.isFinite(e))continue;l+=e}t[o]=l}}return{adl:j(t)}}},ot=e=>void 0!==e&&Number.isFinite(e)?e:null,nt=(e,t,l)=>"string"==typeof e[t]&&""!==e[t]?e[t]:l,rt={id:"open-interest",name:"Open Interest",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Open interest",default:"#26c6da"}],plots:[{key:"oi",type:"line",title:"Open interest",colorKey:"color",priceFormat:{type:"volume"},style:{lineWidth:1.5}}],calc:e=>({oi:e.map(e=>ot(e.oi))})},at={id:"open-interest-change",name:"Open Interest Change",category:"Volume",placement:"pane",inputs:[{key:"upColor",type:"color",label:"Increase",default:"#26a69a"},{key:"downColor",type:"color",label:"Decrease",default:"#ef5350"}],plots:[{key:"change",type:"histogram",title:"OI change",colorKey:"upColor",style:{base:0},priceFormat:{type:"volume"},colorBy:({value:e,settings:t})=>{const l=e<0?nt(t,"downColor","#ef5350"):nt(t,"upColor","#26a69a"),o=t["change:opacity"];return"number"==typeof o&&Number.isFinite(o)&&o<100?y(l,Math.max(0,o)/100):l}}],calc:e=>({change:e.map((t,l)=>{const o=ot(t.oi),n=ot(e[l-1]?.oi);return null===o||null===n?null:o-n})})},it=[["longBuildupColor","#26a69a"],["shortBuildupColor","#ef5350"],["shortCoveringColor","#42a5f5"],["longUnwindingColor","#ffb74d"]],st={id:"open-interest-buildup",name:"Open Interest Buildup",category:"Volume",placement:"onchart",inputs:[{key:"longBuildupColor",type:"color",label:"Long buildup",default:"#26a69a"},{key:"shortBuildupColor",type:"color",label:"Short buildup",default:"#ef5350"},{key:"shortCoveringColor",type:"color",label:"Short covering",default:"#42a5f5"},{key:"longUnwindingColor",type:"color",label:"Long unwinding",default:"#ffb74d"},{key:"unchanged",type:"select",label:"Unchanged reading",default:"neutral",options:[{value:"neutral",label:"Neutral"},{value:"up",label:"Treat as up"}]}],plots:[],calc:(e,t)=>({state:e.map((l,o)=>{const n=e[o-1],r=ot(l.oi),a=ot(n?.oi);if(void 0===n||null===r||null===a)return null;const i=l.close-n.close,s=r-a;return Number.isFinite(i)&&("up"===t.unchanged||0!==i&&0!==s)?s>=0?i>=0?1:2:i>=0?3:4:null})}),barColors:({values:e,settings:t})=>e.state.map(e=>{if(null===e)return null;const[l,o]=it[e-1];return nt(t,l,o)})},ct=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},ut=(e,t,l,o=1)=>Math.max(o,Math.round(ct(e,t,l))),pt=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},yt=(e,t="source")=>e[t]??"close",ft=e=>e.map(e=>e.high),mt=e=>e.map(e=>e.low);function dt(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(t<=0)return n;for(let r=t-1;r<o;r++){let o=l?-1/0:1/0,a=!0;for(let n=0;n<t;n++){const t=e[r-n];if(!Number.isFinite(t)){a=!1;break}(l?t>o:t<o)&&(o=t)}a&&(n[r]=o)}return n}function bt(e,t){const l=e.length,o=new Array(l).fill(NaN);for(let n=0;n<l;n++){const r=n-t;r>=0&&r<l&&(o[n]=e[r])}return o}const ht=.05,gt={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:(t,l)=>({alma:j(_(e(t,"close"),ut(l,"length",9),ct(l,"offset",.85),ct(l,"sigma",6)))})},kt={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:(t,l)=>{const o=e(t,yt(l)),n=ut(l,"length",9),r=Z(o,n),a=Ue(r,n);return{dema:j(r.map((e,t)=>2*e-a[t]))}}},wt={id:"hma",name:"Hull Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"HMA",default:"#2962ff"}],plots:[{key:"hma",type:"line",title:"HMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(t,l)=>({hma:j(Wt(e(t,yt(l)),ut(l,"length",9)))})},vt={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:ht}],calc:(t,l)=>{const o=e(t,yt(l)),n=ut(l,"length",20),r=ct(l,"percent",10)/100,a=!0===l.exponential?Z(o,n):I(o,n);return{upper:j(a.map(e=>e*(1+r))),basis:j(a),lower:j(a.map(e=>e*(1-r)))}}},Ct={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:ht}],calc:(e,t)=>{const l=ut(t,"length",20),o=Math.round(ct(t,"offset",0)),n=$(ft(e),l),r=z(mt(e),l),a=n.map((e,t)=>(e+r[t])/2);return{upper:j(bt(n,o)),basis:j(bt(a,o)),lower:j(bt(r,o))}}},Nt={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,t)=>{const o=ut(t,"p",10),n=ut(t,"x",1),r=ut(t,"q",9),a=ft(e),i=mt(e),s=l(a,i,e.map(e=>e.close),o),c=$(a,o).map((e,t)=>e-n*s[t]);return{stopLong:j(dt(z(i,o).map((e,t)=>e+n*s[t]),r,!1)),stopShort:j(dt(c,r,!0))}}},Mt={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,t)=>{const o=ut(t,"length",22),n=ct(t,"atrMultiplier",3),r=ft(e),a=mt(e),i=l(r,a,e.map(e=>e.close),ut(t,"atrLength",22));return{longExit:j($(r,o).map((e,t)=>e-n*i[t])),shortExit:j(z(a,o).map((e,t)=>e+n*i[t]))}}};const At={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:ht}],calc:(t,l)=>{const o=e(t,"close"),n=ut(l,"periods",21,3),r=ct(l,"errors",2),a=ut(l,"averagePeriods",3),i=function(e,t){const l=e.length,o=new Array(l).fill(NaN);if(t<3||l<t)return o;const n=(t+1)/2;for(let r=t-1;r<l;r++){let l=0;for(let o=0;o<t;o++)l+=e[r-o];const a=l/t;let i=0,s=0,c=0;for(let l=0;l<t;l++){const t=a-e[r-l],o=n-l-1;i+=t*t,s+=o*t,c+=o*o}o[r]=Math.sqrt((i-s*s/c)/(t-2))}return o}(o,n),s=re(o,n,0),c=e=>j("Exponential"===l.method?Ue(e,a):"Weighted"===l.method?V(e,a):I(e,a));return{upper:c(s.map((e,t)=>e+r*i[t])),basis:c(s),lower:c(s.map((e,t)=>e-r*i[t]))}}},xt={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:ht}],calc:(e,t)=>({upper:j(bt(I(ft(e),ut(t,"upperLength",20)),Math.round(ct(t,"upperOffset",0)))),lower:j(bt(I(mt(e),ut(t,"lowerLength",20)),Math.round(ct(t,"lowerOffset",0))))})},St="#00ff00",Lt="#ff0000",Bt="#ff9800",Kt=e=>Math.max(1,Math.floor(e)),Ft=e=>Math.max(1,Math.round(Math.sqrt(e)));function Wt(e,t){const l=V(e,Kt(t/2)),o=V(e,t);return V(l.map((e,t)=>2*e-o[t]),Ft(t))}function Dt(e,t,l){return"Ehma"===t?function(e,t){const l=Z(e,Kt(t/2)),o=Z(e,t);return Ue(l.map((e,t)=>2*e-o[t]),Ft(t))}(e,l):"Thma"===t?function(e,t){const l=V(e,Kt(t/3)),o=V(e,Kt(t/2)),n=V(e,t);return V(l.map((e,t)=>3*e-o[t]-n[t]),t)}(e,Kt(l/2)):Wt(e,l)}const Rt=(e,t,l)=>{if(!1===l.switchColor)return pt(l,"neutralColor",Bt);const o=e?.[t],n=e?.[t-2];return"number"==typeof o&&"number"==typeof n&&o>n?pt(l,"bullishColor",St):pt(l,"bearishColor",Lt)},Ot={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:St},{key:"bearishColor",type:"color",label:"Bearish Color",default:Lt},{key:"neutralColor",type:"color",label:"Neutral Color",default:Bt}],plots:[{key:"mhull",type:"line",title:"Hull",colorKey:"neutralColor",style:{color:Bt,lineWidth:2},colorBy:({index:e,values:t,settings:l})=>Rt(t.mhull,e,l)},{key:"shull",type:"line",title:"Hull Displaced",colorKey:"neutralColor",style:{color:Bt,lineWidth:2},colorBy:({index:e,values:t,settings:l})=>Rt(t.mhull,e,l)}],fills:[{between:["mhull","shull"],colorUp:St,colorDown:Lt,colorUpKey:"bullishColor",colorDownKey:"bearishColor",opacity:.6}],calc:(t,l)=>{const o=e(t,yt(l)),n=Kt(ut(l,"length",55)*ct(l,"lengthMult",1)),r=Dt(o,pt(l,"mode","Hma"),n),a=!1!==l.visualSwitch;return{mhull:j(r),shull:j(a?bt(r,2):new Array(r.length).fill(NaN))}},barColors:({bars:e,values:t,settings:l})=>!0===l.candleCol?e.map((e,o)=>Rt(t.mhull,o,l)):e.map(()=>null)},Tt=[gt,kt,wt,vt,Ct,Nt,Mt,At,xt,Ot],Ut=(e,t,l)=>Math.max(1,Math.floor(((e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l})(e,t,l))),Pt=t=>e(t,"hl2"),It={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,t)=>{const l=Ut(t,"length",14),o=ee(e.map(e=>e.high),l+1),n=te(e.map(e=>e.low),l+1),r=e=>e.map(e=>100*(e+l)/l);return{up:j(r(o)),down:j(r(n))}},levels:()=>[{price:50,color:"#5a6b8c",dashed:!0}],range:()=>({min:0,max:100})},Vt={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,t)=>{const l=Ut(t,"length",14),o=ee(e.map(e=>e.high),l+1),n=te(e.map(e=>e.low),l+1),r=o.map((e,t)=>100*(e-n[t])/l);return{osc:j(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})},Et={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:t,values:l,settings:o})=>{const n=l.ao?.[t-1],r=(e,t)=>"string"==typeof o[e]?o[e]:t;return null==n||!Number.isFinite(n)||e-n>0?r("upColor","#009688"):r("downColor","#f44336")}}],calc:e=>{const t=Pt(e),l=I(t,5),o=I(t,34);return{ao:j(l.map((e,t)=>e-o[t]))}},levels:()=>[{price:0,color:"#787b86"}]},qt={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 t=e.high-e.low,l=e.close-e.open;if(0===t||!Number.isFinite(t)||!Number.isFinite(l))return null;const o=l/t;return Number.isFinite(o)?o:null})}),levels:()=>[{price:0,color:"#787b86"}]},Ht={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:(t,l)=>{const o=t.length,n=Ut(l,"length",9),r=Y(e(t,(e=>e.source??"close")(l))),a=new Array(Math.max(0,o-1)),i=new Array(Math.max(0,o-1));for(let e=1;e<o;e++){const t=r[e];a[e-1]=t>=0?t:0,i[e-1]=t>=0?0:-t}const s=oe(a,n),c=oe(i,n),u=new Array(o).fill(NaN);for(let e=0;e<s.length;e++){const t=s[e]+c[e];u[e+1]=0===t?NaN:100*(s[e]-c[e])/t}return{cmo:j(u)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]},$t={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,t)=>{const l=e.map(e=>e.close),o=J(l,Ut(t,"longRoCLength",14)),n=J(l,Ut(t,"shortRoCLength",11));return{curve:j(V(o.map((e,t)=>e+n[t]),Ut(t,"wmaLength",10)))}}},zt={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,t)=>{const l=e.length,o=Ut(t,"period",21),n=Math.floor(o/2)+1,r=e.map(e=>e.close),a=I(r,o),i=new Array(l).fill(NaN);if(!0===t.isCentered)for(let e=0;e+n<l;e++)i[e]=r[e]-a[e+n];else for(let e=n;e<l;e++)i[e]=r[e]-a[e-n];return{dpo:j(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line"}]},jt={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,t)=>{const l=e.length,o=Ut(t,"length",9),n=Pt(e),r=$(n,o),a=z(n,o),i=new Array(l).fill(NaN);let s=0,c=0;for(let e=0;e<l;e++){const t=r[e]-a[e];if(!Number.isFinite(t)||!Number.isFinite(n[e])){s=0,c=0;continue}const l=.66*((n[e]-a[e])/Math.max(t,.001)-.5)+.67*s,o=l>.99?.999:l<-.99?-.999:l,u=.5*Math.log((1+o)/(1-o))+.5*c;i[e]=u,s=o,c=u}const u=new Array(l).fill(NaN);for(let e=1;e<l;e++)u[e]=i[e-1];return{fisher:j(i),trigger:j(u)}},levels:()=>[{price:1.5,color:"#e91e63",title:"1.5"},{price:.75,color:"#787b86",title:"0.75"},{price:0,color:"#e91e63",title:"0"},{price:-.75,color:"#787b86",title:"-0.75"},{price:-1.5,color:"#e91e63",title:"-1.5"}]};function Zt(e){const t=e.length,l=new Array(t).fill(0);for(let o=0;o<t;o++){const t=o>0?l[o-1]:0;o>0&&e[o]===e[o-1]?l[o]=0:o>0&&e[o]>e[o-1]?l[o]=t<=0?1:t+1:l[o]=t>=0?-1:t-1}return l}const Yt={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,t)=>{const l=e.length,o=e.map(e=>e.close),n=u(o,Ut(t,"lenrsi",3)),r=u(Zt(o),Ut(t,"lenupdown",2)),a=X(J(o,1).slice(1),Ut(t,"lenroc",100)),i=new Array(l).fill(NaN);for(let e=0;e<a.length;e++)i[e+1]=a[e];const s=new Array(l);for(let e=0;e<l;e++)s[e]=(n[e]+r[e]+i[e])/3;return{crsi:j(s),bandHigh:new Array(l).fill(70),bandLow:new Array(l).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})},Jt=[It,Vt,Et,qt,Ht,$t,zt,jt,Yt];function Gt(e,t){return`${e}${Math.round(255*(1-t/100)).toString(16).padStart(2,"0")}`}const Xt=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},_t=e=>e.source??"close",Qt=(e,t,l)=>"string"==typeof e[t]?e[t]:l;function el(e,t,l){const o=e.length,n=I(e,t),r=H(e,t),a=new Array(o),i=new Array(o);for(let e=0;e<o;e++){const t=l*r[e];a[e]=n[e]+t,i[e]=n[e]-t}return{middle:n,upper:a,lower:i}}function tl(e,t){const l=e.length;if(0===t)return e.slice();const o=new Array(l).fill(NaN);for(let n=0;n<l;n++){const r=n+t;r>=0&&r<l&&(o[r]=e[n])}return o}const ll={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:(t,l)=>{const o=e(t,_t(l)),{upper:n,lower:r}=el(o,Xt(l,"length",20),Xt(l,"mult",2)),a=new Array(o.length);for(let e=0;e<o.length;e++){const t=n[e]-r[e];a[e]=t>0?(o[e]-r[e])/t:NaN}return{percentB:j(a),bandHigh:new Array(t.length).fill(1),bandLow:new Array(t.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}]},ol={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:(t,l)=>{const o=e(t,_t(l)),{middle:n,upper:r,lower:a}=el(o,Xt(l,"length",20),Xt(l,"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:j(i),expansion:j($(i,Xt(l,"expansionLength",125))),contraction:j(z(i,Xt(l,"contractionLength",125)))}}},nl={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:t,values:l,settings:o})=>{const n=l.bbtrend?.[t-1],r="number"==typeof n&&Number.isFinite(n);return r&&e>0?Gt(Qt(o,"posColor","#089981"),e>=n?25:50):r&&e<0?Gt(Qt(o,"negColor","#f23645"),e>n?50:25):Gt(Qt(o,"posColor","#089981"),50)}}],calc:(e,t)=>{const l=e.map(e=>e.close),o=Xt(t,"stdDevMult",2),n=el(l,Xt(t,"shortLength",20),o),r=el(l,Xt(t,"longLength",50),o),a=new Array(l.length);for(let e=0;e<l.length;e++){const t=Math.abs(n.lower[e]-r.lower[e])-Math.abs(n.upper[e]-r.upper[e]);a[e]=0===n.middle[e]?NaN:t/n.middle[e]*100}return{bbtrend:j(a)}},levels:()=>[{price:0,color:"#5a6b8c",title:"Zero line",dashed:!0}]},rl={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,t)=>{const l=Xt(t,"length",14),o=e.map(e=>e.high),n=e.map(e=>e.low),r=oe(p(o,n,e.map(e=>e.close)),l),a=$(o,l),i=z(n,l),s=Math.log10(l),c=new Array(e.length).fill(NaN);if(0!==s)for(let t=0;t<e.length;t++){const e=a[t]-i[t];if(!(e>0))continue;const l=r[t]/e;l>0&&(c[t]=100*Math.log10(l)/s)}return{chop:j(tl(c,Xt(t,"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})},al={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,t)=>{const l=e.length,o=Xt(t,"per",1),n=new Array(l).fill(NaN);for(let t=1;t<l;t++){const l=e[t-1].close,o=e[t].close;n[t]=l>0&&o>0?Math.log(o/l):NaN}const r=H(n,Xt(t,"length",10)),a=o>0?Math.sqrt(365/o):NaN;return{hv:j(r.map(e=>100*e*a))}}},il={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,t)=>({adr:j(I(e.map(e=>e.high-e.low),Xt(t,"length",14)))})},sl=4*Math.atan(1),cl={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:t,settings:l})=>{const o=t.angle?.[e],n=(e,t)=>Qt(l,e,t);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 t=e.length,l=$(e.map(e=>e.high),30),o=z(e.map(e=>e.high),30),n=Z(e.map(e=>e.close),34),r=new Array(t).fill(NaN);for(let a=1;a<t;a++){const t=l[a]-o[a],i=(e[a].high+e[a].low+e[a].close)/3;if(!(t>0)||0===i)continue;const s=25/t*o[a],c=(n[a-1]-n[a])/i*s;if(!Number.isFinite(c))continue;const u=Math.sqrt(1+c*c),p=Math.round(180*Math.acos(1/u)/sl);r[a]=c>0?-p:p}return{chopZone:new Array(t).fill(1),angle:j(r)}},range:()=>({min:0,max:1})},ul={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,t)=>({chaikinVolatility:j(J(Z(e.map(e=>e.high-e.low),Xt(t,"periods",10)),Xt(t,"rocLookback",10)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},pl={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,t)=>{const l=Xt(t,"deviations",1);return{stdDev:j(H(e.map(e=>e.close),Xt(t,"periods",5)).map(e=>e*l))}}},yl={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,t)=>{const l=Math.max(3,Math.trunc(Xt(t,"length",14))),o=e.map(e=>e.close),n=(l+1)/2;let r=0;for(let e=0;e<l;e++)r+=(n-e-1)**2;const a=new Array(o.length).fill(NaN);for(let e=l-1;e<o.length;e++){let t=0;for(let n=0;n<l;n++)t+=o[e-n];const i=t/l;let s=0,c=0;for(let t=0;t<l;t++){const l=i-o[e-t];s+=l*l,c+=(n-t-1)*l}a[e]=Math.sqrt((s-c*c/r)/(l-2))}return{stdErr:j(a)}}},fl=[ll,ol,nl,rl,al,il,cl,ul,pl,yl],ml=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},dl=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function bl(e){const t=new Array(e.length);for(let l=0;l<e.length;l++){const o=e[l],n=o.close===o.high&&o.close===o.low||o.high===o.low;t[l]=n?0:(2*o.close-o.low-o.high)/(o.high-o.low)*dl(o)}return t}const hl={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,t)=>{const l=ml(t,"length",20),o=oe(bl(e),l),n=oe(e.map(dl),l),r=new Array(e.length).fill(NaN);for(let t=0;t<e.length;t++)n[t]>0&&(r[t]=o[t]/n[t]);return{cmf:j(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},gl={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,t)=>{const l=ne(bl(e)),o=Ue(l,ml(t,"short",3)),n=Ue(l,ml(t,"long",10)),r=new Array(e.length);for(let t=0;t<e.length;t++)r[t]=o[t]-n[t];return{osc:j(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},kl={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,t)=>{const l=ml(t,"divisor",1e4),o=Y(e.map(e=>(e.high+e.low)/2)),n=new Array(e.length);for(let t=0;t<e.length;t++){const r=e[t],a=dl(r);n[t]=0===a?NaN:l*o[t]*(r.high-r.low)/a}return{eom:j(I(n,ml(t,"length",14)))}}},wl={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,t)=>{const l=Y(e.map(e=>e.close)),o=new Array(e.length);for(let t=0;t<e.length;t++)o[t]=l[t]*dl(e[t]);return{efi:j(Ue(o,ml(t,"length",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},vl={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 t=new Array(e.length).fill(0);for(let l=1;l<e.length;l++){const o=e[l].close-e[l-1].close;t[l]=o>0?dl(e[l]):o<0?-dl(e[l]):0}return{net:j(t)}}},Cl=[hl,gl,kl,wl,vl],Nl=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Ml=(e,t,l,o=1)=>Math.max(o,Math.round(Nl(e,t,l))),Al=(e,t="source")=>e[t]??"close",xl={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:(t,l)=>{const o=e(t,Al(l)),n=o.length,r=Ml(l,"erLength",10),a=new Array(n).fill(NaN);if(n<=r)return{kama:j(a)};const i=Y(o,1);for(let e=0;e<n;e++)i[e]=Number.isFinite(i[e])?Math.abs(i[e]):0;const s=oe(i,r),c=Y(o,r),u=2/(Ml(l,"fastLength",2)+1),p=2/(Ml(l,"slowLength",30)+1);let y=o[r];a[r]=y;for(let e=r+1;e<n;e++){const t=s[e],l=(Number.isFinite(t)&&0!==t?Math.abs(c[e])/t:0)*(u-p)+p;y+=l*l*(o[e]-y),a[e]=y}return{kama:j(a)}}},Sl={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:(t,o)=>{const n=t.length,r=Ml(o,"length",20),a=Nl(o,"mult",2),i=e(t,Al(o)),s=((e,t,l)=>{const o=e[t];return"boolean"==typeof o?o:l})(o,"exp",!0)?Z(i,r):I(i,r),c=t.map(e=>e.high),u=t.map(e=>e.low),y=t.map(e=>e.close),f=((e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l})(o,"bandsStyle","Average True Range");let m;m="True Range"===f?p(c,u,y):"Range"===f?q(c.map((e,t)=>e-u[t]),r):l(c,u,y,Ml(o,"atrlength",10));const d=new Array(n).fill(NaN),b=new Array(n).fill(NaN);for(let e=0;e<n;e++){const t=m[e]*a;d[e]=s[e]+t,b[e]=s[e]-t}return{upper:j(d),basis:j(s),lower:j(b)}}},Ll={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:(t,l)=>({lsma:j(re(e(t,Al(l)),Ml(l,"length",25,2),Math.round(Nl(l,"offset",0))))})},Bl={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:t=>{const l=t.length,o=Y(e(t,"hlc3"),1),n=new Array(l);for(let e=0;e<l;e++){const l=t[e].volume??0;n[e]=o[e]>=0?l:-l}const r=Z(n,34),a=Z(n,55),i=new Array(l).fill(NaN);for(let e=0;e<l;e++)i[e]=r[e]-a[e];return{kvo:j(i),signal:j(Ue(i,13))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Kl={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:(t,l)=>{const o=t.length,n=e(t,"close"),r=(e,t,o,r)=>I(J(n,Ml(l,e,t)),Ml(l,o,r)),a=r("roclen1",10,"smalen1",10),i=r("roclen2",15,"smalen2",10),s=r("roclen3",20,"smalen3",10),c=r("roclen4",30,"smalen4",15),u=new Array(o).fill(NaN);for(let e=0;e<o;e++)u[e]=a[e]+2*i[e]+3*s[e]+4*c[e];return{kst:j(u),signal:j(I(u,Ml(l,"siglen",9)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Fl={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:(t,l)=>{const o=e(t,"close"),n=o.length,r=Ml(l,"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 t=0,l=0;for(let n=0;n<r;n++){const a=o[e-n];t+=a,l+=a*(r-n)}a[e]=(r*l-i*t)/s}return{slope:j(a)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Wl=[xl,Sl,Ll,Bl,Kl,Fl],Dl=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Rl=(e,t,l,o=1)=>Math.max(o,Math.round(Dl(e,t,l))),Ol=(e,t,l)=>Math.round(Dl(e,t,l)),Tl=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Ul=(e,t,l)=>{const o=e[t];return"boolean"==typeof o?o:l},Pl=(e,t="source")=>e[t]??"close",Il=e=>e.map(e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0);function Vl(e,t){const l=e.length,o=new Array(l).fill(NaN);for(let n=0;n<l;n++){const r=n-t;r>=0&&r<l&&(o[n]=e[r])}return o}const El={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:(t,l)=>{const o=e(t,"close"),n=I(o,Rl(l,"shortLength",9)),r=I(o,Rl(l,"longLength",21)),a=function(e,t){const l=e.length,o=new Array(l).fill(!1);for(let n=1;n<l;n++){const l=e[n-1],r=t[n-1],a=e[n],i=t[n];Number.isFinite(l)&&Number.isFinite(r)&&Number.isFinite(a)&&Number.isFinite(i)&&(o[n]=a>i&&l<=r||a<i&&l>=r)}return o}(n,r);return{short:j(n),long:j(r),cross:n.map((e,t)=>a[t]?e:null)}}},ql={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:(t,l)=>{const o=e(t,"close"),n=Rl(l,"length",14),r=Z(o,n),a=new Array(o.length).fill(NaN);let i=NaN;for(let e=0;e<o.length;e++){if(Number.isFinite(i)&&0!==i){const t=n*Math.pow(o[e]/i,4),l=i+(o[e]-i)/t;a[e]=Number.isFinite(l)?l:r[e]}else a[e]=r[e];i=a[e]}return{mg:j(a)}}},Hl={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:(t,o)=>{const n=e(t,Pl(o)),r=Rl(o,"length",3),a=Dl(o,"atrMult",2),i=se(n,r,50),s=l(t.map(e=>e.high),t.map(e=>e.low),t.map(e=>e.close),Rl(o,"atrLength",14));return{median:j(i),upper:j(i.map((e,t)=>e+a*s[t])),lower:j(i.map((e,t)=>e-a*s[t])),medianEma:j(Ue(i,r))}}},$l=[{label:"SMA",value:"SMA"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}];const zl=[{lane:1,length:20,color:"#f6c309"},{lane:2,length:50,color:"#fb9800"},{lane:3,length:100,color:"#fb6500"},{lane:4,length:200,color:"#f60c0c"}],jl={id:"ma-ribbon",name:"Moving Average Ribbon",category:"Trend",placement:"onchart",inputs:zl.flatMap(e=>function(e,t,l){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:$l,group:o},{key:`ma${e}Source`,type:"source",label:"Source",default:"close",group:o},{key:`ma${e}Length`,type:"number",label:"Length",default:t,min:1,max:1e3,step:1,group:o},{key:`ma${e}Color`,type:"color",label:"Color",default:l,group:o}]}(e.lane,e.length,e.color)),plots:zl.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:(t,l)=>{const o=Il(t),n={};for(const{lane:r,length:a}of zl){if(!Ul(l,`showMa${r}`,!0)){n[`ma${r}`]=new Array(t.length).fill(null);continue}const i=e(t,Pl(l,`ma${r}Source`));n[`ma${r}`]=j(Pe(Tl(l,`ma${r}Type`,"SMA"),i,o,Rl(l,`ma${r}Length`,a)))}return n}},Zl={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:(t,l)=>{const o=e(t,"close"),n=Rl(l,"length",9),r=Z(o,n),a=Ue(r,n),i=Ue(a,n);return{tema:j(r.map((e,t)=>3*e-3*a[t]+i[t]))}}},Yl={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:(t,l)=>{const n=e(t,Pl(l)),i="continuous"!==l.anchor?o(t.map(e=>e.time),(e=>{const t=e.timezone;return"string"!=typeof t||""===t||t===r?r:a(t)?t:r})(l)):null,s=new Array(t.length).fill(NaN);let c=0,u=0;for(let e=0;e<t.length;e++){null!==i&&i[e]&&(c=0,u=0);const t=n[e];Number.isFinite(t)&&(c+=t,u+=1,s[e]=c/u)}return{twap:j(Vl(s,Ol(l,"offset",0)))}}},Jl={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:(t,l)=>({vwma:j(Vl(Q(e(t,Pl(l)),Il(t),Rl(l,"length",20)),Ol(l,"offset",0)))})},Gl={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:(t,l)=>{const o=e(t,"hl2");return{jaw:j(Vl(q(o,Rl(l,"jawLength",13)),Ol(l,"jawOffset",8))),teeth:j(Vl(q(o,Rl(l,"teethLength",8)),Ol(l,"teethOffset",5))),lips:j(Vl(q(o,Rl(l,"lipsLength",5)),Ol(l,"lipsOffset",3)))}}},Xl={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:(t,l)=>({smma:j(q(e(t,Pl(l)),Rl(l,"length",7)))})};function _l(e,t,l){const o=Ue(e,t);if(0===l)return o;const n=Ue(o,t);return o.map((e,t)=>e*(1+l)-n[t]*l)}const Ql={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:t,values:l,settings:o})=>{if(!Ul(o,"highlightMovements",!0))return Tl(o,"neutralColor","#6d1e7f");const n=l.t3?.[t-1];return"number"==typeof n&&Number.isFinite(n)&&e>n?Tl(o,"upColor","#26a69a"):Tl(o,"downColor","#ff5252")}}],calc:(t,l)=>{const o=e(t,Pl(l)),n=Rl(l,"length",5),r=Dl(l,"factor",.7),a=_l(o,n,r),i=_l(a,n,r);return{t3:j(_l(i,n,r))}}},eo=[El,ql,Hl,jl,Zl,Yl,Jl,Gl,Xl,Ql],to=(e,t,l)=>Math.max(1,Math.floor(((e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l})(e,t,l))),lo=e=>e.source??"close",oo=(e,t,l)=>"string"==typeof e[t]?e[t]:l;function no(e,t,l){const o=Y(e),n=e=>Ue(Ue(e,l),t),r=n(o),a=n(o.map(e=>Math.abs(e)));return r.map((e,t)=>100*e/a[t])}const ro={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:(t,l)=>({mom:j(Y(e(t,lo(l)),to(l,"len",10)))})},ao={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:(t,l)=>({roc:j(J(e(t,lo(l)),to(l,"length",9)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]};function io(e,t,l){return"SMA"===l?I(e,t):Ue(e,t)}const so={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:t,values:l,settings:o})=>{const n=l.hist?.[t-1],r=(e,t)=>"string"==typeof o[e]?o[e]:t,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:(t,l)=>{const o=e(t,lo(l)),n=oo(l,"oscType","EMA"),r=io(o,to(l,"fastLength",12),n),a=io(o,to(l,"slowLength",26),n),i=r.map((e,t)=>0===a[t]?NaN:100*(e-a[t])/a[t]),s=io(i,to(l,"signalLength",9),oo(l,"sigType","EMA"));return{hist:j(i.map((e,t)=>e-s[t])),ppo:j(i),signal:j(s)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},co={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,t)=>{const l=to(t,"length",18);return{trix:j(Y(Ue(Ue(Ue(e.map(e=>e.close>0?Math.log(e.close):NaN),l),l),l)).map(e=>1e4*e))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},uo={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,t)=>{const l=no(e.map(e=>e.close),to(t,"short",13),to(t,"long",25));return{tsi:j(l),signal:j(Ue(l,to(t,"signal",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},po={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,t)=>{const l=no(e.map(e=>e.close),to(t,"shortlen",5),to(t,"longlen",20));return{erg:j(l),sig:j(Ue(l,to(t,"siglen",5)))}}},yo={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,t)=>{const l=no(e.map(e=>e.close),to(t,"shortlen",5),to(t,"longlen",20)),o=Ue(l,to(t,"siglen",5));return{osc:j(l.map((e,t)=>e-o[t]))}}},fo={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,t)=>{const l=to(t,"lengthK",10),o=to(t,"lengthD",3),n=$(e.map(e=>e.high),l),r=z(e.map(e=>e.low),l),a=n.map((e,t)=>e-r[t]),i=e=>Ue(Ue(e,o),o),s=i(e.map((e,t)=>e.close-(n[t]+r[t])/2)),c=i(a),u=s.map((e,t)=>0===c[t]?NaN:e/c[t]*200);return{smi:j(u),ema:j(Ue(u,to(t,"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}]},mo=[ro,ao,so,co,uo,po,yo,fo],bo=(e,t,l)=>Math.max(1,Math.floor(((e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l})(e,t,l))),ho=(e,t,l)=>"string"==typeof e[t]?e[t]:l,go=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function ko(e,t,l){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=l(e.slice(n,r),t);for(let e=0;e<a.length;e++)o[n+e]=a[e];n=r}return o}const wo=e=>"SMA"===e?I:Z;function vo(e,t,l,o){return{id:e,name:t,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:l,default:"#2962ff"},{key:"emaColor",type:"color",label:`${l}-based EMA`,default:"#ff9800"}],plots:[{key:e,type:"line",title:l,colorKey:"color",style:{lineWidth:1.5}},{key:"ema",type:"line",title:`${l}-based EMA`,colorKey:"emaColor",style:{lineWidth:1.5}}],calc:(t,l)=>{const n=function(e,t){const l=new Array(e.length);let o=1;for(let n=0;n<e.length;n++){if(n>0){const l=e[n-1].close,r=e[n].close;("falling"===t?go(e[n])<go(e[n-1]):go(e[n])>go(e[n-1]))&&0!==l&&Number.isFinite(l)&&Number.isFinite(r)&&(o*=r/l)}l[n]=1e3*o}return l}(t,o);return{[e]:j(n),ema:j(ko(n,bo(l,"maLength",255),Z))}}}}const Co=vo("nvi","Negative Volume Index","NVI","falling"),No=vo("pvi","Positive Volume Index","PVI","rising"),Mo={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 t=new Array(e.length).fill(NaN);for(let l=1;l<e.length;l++){const o=e[l-1].close;0!==o&&Number.isFinite(o)&&(t[l]=(e[l].close-o)/o*go(e[l]))}return{pvt:j(ne(t))}}},Ao={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:t,values:l,settings:o})=>{const n=l.hist?.[t-1],r=null!=n&&Number.isFinite(n)&&e>n,a=(e,t)=>"string"==typeof o[e]?o[e]:t;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,t)=>{const l=e.length,o=e.map(go),n=wo(ho(t,"oscType","EMA")),r=n(o,bo(t,"fastLength",12)),a=n(o,bo(t,"slowLength",26)),i=new Array(l).fill(NaN);for(let e=0;e<l;e++)0!==a[e]&&(i[e]=100*(r[e]-a[e])/a[e]);const s=ko(i,bo(t,"signalLength",9),wo(ho(t,"sigType","EMA"))),c=new Array(l);for(let e=0;e<l;e++)c[e]=i[e]-s[e];return{hist:j(c),pvo:j(i),signal:j(s)}},levels:()=>[{price:0,color:"#787b8680",title:"Zero"}]},xo={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,t)=>{const l=e.length,o=Z(e.map(e=>e.high-e.low),9),n=Z(o,9),r=new Array(l).fill(NaN);for(let e=0;e<l;e++)0!==n[e]&&(r[e]=o[e]/n[e]);return{mi:j(ko(r,bo(t,"length",10),oe))}}},So={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:(t,l)=>{const o=t.length,n=bo(l,"length",14),r=e(t,(e=>e.source??"close")(l)),a=$(r,n),i=new Array(o).fill(NaN);for(let e=0;e<o;e++){const t=a[e];if(!Number.isFinite(t)||0===t)continue;const l=100*(r[e]-t)/t;i[e]=l*l}const s=I(i,n),c=new Array(o);for(let e=0;e<o;e++)c[e]=Math.sqrt(s[e]);return{ui:j(c),zero:c.map(e=>Number.isFinite(e)?0:null)}},levels:()=>[{price:0,color:"#2196f3",title:"Zero"}]},Lo=[Co,No,Mo,Ao,xo,So],Bo=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Ko=(e,t,l,o=1)=>Math.max(o,Math.round(Bo(e,t,l))),Fo=(e,t,l)=>Math.round(Bo(e,t,l)),Wo=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Do=(e,t="source")=>e[t]??"close";function Ro(e,t,l){const o=e.length,n=new Array(o).fill(NaN),r=I(e,t),a=2/(t+1);let i=NaN;for(let t=0;t<o;t++){const o=e[t];if(Number.isFinite(i))if(Number.isFinite(o))i=o*a+i*(1-a);else{if(!(t<l))continue;i=NaN}else i=r[t];n[t]=i}return n}function Oo(e,t){if(0===t)return e.slice();const l=e.length,o=new Array(l).fill(null);for(let n=0;n<l;n++){const r=n+t;r>=0&&r<l&&(o[r]=e[n])}return o}const To={id:"stochastic-rsi",name:"Stochastic RSI",category:"Momentum",placement:"pane",inputs:[{key:"smoothK",type:"number",label:"K",default:3,min:1,max:100,step:1},{key:"smoothD",type:"number",label:"D",default:3,min:1,max:100,step:1},{key:"lengthRSI",type:"number",label:"RSI Length",default:14,min:1,max:500,step:1},{key:"lengthStoch",type:"number",label:"Stochastic Length",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"RSI Source",default:"close"},{key:"kColor",type:"color",label:"K",default:"#2962ff"},{key:"dColor",type:"color",label:"D",default:"#ff6d00"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"k",type:"line",title:"K",colorKey:"kColor",style:{lineWidth:1.5}},{key:"d",type:"line",title:"D",colorKey:"dColor",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(t,l)=>{const o=Ko(l,"lengthStoch",14),n=Te(u(e(t,Do(l)),Ko(l,"lengthRSI",14)),e=>ie(e,e,e,o)),r=Te(n,e=>I(e,Ko(l,"smoothK",3))),a=Te(r,e=>I(e,Ko(l,"smoothD",3)));return{k:j(r),d:j(a),bandHigh:new Array(t.length).fill(80),bandLow:new Array(t.length).fill(20)}},levels:()=>[{price:80,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band"},{price:20,color:"#787b86",title:"Lower Band"}],range:()=>({min:0,max:100})},Uo={id:"williams-percent-r",name:"Williams Percent Range",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"%R",default:"#7e57c2"},{key:"fillColor",type:"color",label:"Background",default:"#7e57c2"}],plots:[{key:"percentR",type:"line",title:"%R",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(t,l)=>{const o=Ko(l,"length",14),n=e(t,Do(l)),r=$(t.map(e=>e.high),o),a=z(t.map(e=>e.low),o),i=n.map((e,t)=>{const l=r[t]-a[t];return 0===l?NaN:100*(e-r[t])/l});return{percentR:j(i),bandHigh:new Array(t.length).fill(-20),bandLow:new Array(t.length).fill(-80)}},levels:()=>[{price:-20,color:"#787b86",title:"Upper Band"},{price:-50,color:"#787b86",title:"Middle Level",dashed:!0},{price:-80,color:"#787b86",title:"Lower Band"}],range:()=>({min:-100,max:0})},Po={id:"ultimate-oscillator",name:"Ultimate Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"length1",type:"number",label:"Fast Length",default:7,min:1,max:500,step:1},{key:"length2",type:"number",label:"Middle Length",default:14,min:1,max:500,step:1},{key:"length3",type:"number",label:"Slow Length",default:28,min:1,max:500,step:1},{key:"color",type:"color",label:"Oscillator",default:"#f44336"}],plots:[{key:"uo",type:"line",title:"Oscillator",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,t)=>{const l=e.length,o=Math.max(0,l-1),n=new Array(o),r=new Array(o);for(let t=1;t<l;t++){const l=e[t-1].close,o=Math.max(e[t].high,l),a=Math.min(e[t].low,l);n[t-1]=e[t].close-a,r[t-1]=o-a}const a=e=>{const t=oe(n,e),l=oe(r,e);return t.map((e,t)=>0===l[t]?NaN:e/l[t])},i=a(Ko(t,"length1",7)),s=a(Ko(t,"length2",14)),c=a(Ko(t,"length3",28)),u=new Array(l).fill(NaN);for(let e=0;e<o;e++)u[e+1]=100*(4*i[e]+2*s[e]+c[e])/7;return{uo:j(u)}}},Io={id:"relative-vigor-index",name:"Relative Vigor Index",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"rvgiColor",type:"color",label:"RVGI",default:"#008000"},{key:"signalColor",type:"color",label:"Signal",default:"#ff0000"}],plots:[{key:"rvgi",type:"line",title:"RVGI",colorKey:"rvgiColor",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(e,t)=>{const l=Ko(t,"length",10),o=ae(e.map(e=>e.close-e.open)),n=ae(e.map(e=>e.high-e.low)),r=Te(o,e=>oe(e,l)),a=Te(n,e=>oe(e,l)),i=r.map((e,t)=>0===a[t]?NaN:e/a[t]),s=Te(i,e=>ae(e)),c=Fo(t,"offset",0);return{rvgi:Oo(j(i),c),signal:Oo(j(s),c)}}},Vo={id:"relative-volatility-index",name:"Relative Volatility Index",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:10,min:1,max:500,step:1},{key:"offset",type:"number",label:"Offset",default:0,min:-500,max:500,step:1},{key:"color",type:"color",label:"RVI",default:"#7e57c2"},{key:"fillColor",type:"color",label:"Background",default:"#7e57c2"},{key:"maType",type:"select",label:"Type",default:"SMA",options:Re,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,t)=>{const l=e.length,o=e.map(e=>e.close),n=H(o,Ko(t,"length",10)),r=Y(o),a=new Array(l),i=new Array(l);for(let e=0;e<l;e++){const t=r[e];a[e]=Number.isFinite(t)&&t<=0?0:n[e],i[e]=Number.isFinite(t)&&t>0?0:n[e]}let s=0;for(;s<l&&!Number.isFinite(n[s]);)s+=1;const c=Ro(a,14,s),u=Ro(i,14,s),p=new Array(l).fill(NaN);for(let e=0;e<l;e++){const t=c[e]+u[e];p[e]=0===t?NaN:c[e]/t*100}const y=Wo(t,"maType","SMA"),f=Ko(t,"maLength",14),m=Bo(t,"bbMult",2),d=y===Oe,b="None"===y?new Array(l).fill(NaN):Pe(y,p,e.map(e=>e.volume??0),f),h=d?Te(p,e=>H(e,f)).map(e=>e*m):new Array(l).fill(NaN),g=Fo(t,"offset",0);return{rvi:Oo(j(p),g),ma:j(b),bbUpper:j(b.map((e,t)=>e+h[t])),bbLower:j(b.map((e,t)=>e-h[t])),bandHigh:new Array(l).fill(80),bandLow:new Array(l).fill(20)}},levels:()=>[{price:80,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band"},{price:20,color:"#787b86",title:"Lower Band"}]},Eo={id:"woodies-cci",name:"Woodies CCI",category:"Momentum",placement:"pane",inputs:[{key:"cciTurboLength",type:"number",label:"CCI Turbo Length",default:6,min:3,max:14,step:1},{key:"cci14Length",type:"number",label:"CCI 14 Length",default:14,min:7,max:20,step:1},{key:"upColor",type:"color",label:"Five bars up",default:"#009688"},{key:"downColor",type:"color",label:"Five bars down",default:"#f44336"},{key:"turboColor",type:"color",label:"CCI Turbo",default:"#009688"},{key:"cciColor",type:"color",label:"CCI 14",default:"#f44336"}],plots:[{key:"hist",type:"histogram",title:"CCI Turbo Histogram",colorKey:"upColor",style:{base:0},colorBy:({index:e,values:t,settings:l})=>{const o=Wo(l,"upColor","#009688"),n=Wo(l,"downColor","#f44336"),r=l=>{const o=t.hist?.[e-l];return"number"==typeof o&&Number.isFinite(o)?o:null};let a=!0,i=!0;for(let e=1;e<=5;e+=1){const t=r(e);(null===t||t<=0)&&(a=!1),(null===t||t>=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,t)=>{const l=e.map(e=>e.close),o=ue(l,Ko(t,"cciTurboLength",6)),n=ue(l,Ko(t,"cci14Length",14));return{hist:j(n),turbo:j(o),cci14:j(n)}},levels:()=>[{price:100,color:"#787b86",title:"Hundred Line",dashed:!0},{price:0,color:"#787b86",title:"Zero Line"},{price:-100,color:"#787b86",title:"Minus Line",dashed:!0}]},qo=[{weight:1,roc:10,smooth:10},{weight:2,roc:15,smooth:10},{weight:3,roc:20,smooth:10},{weight:4,roc:30,smooth:15},{weight:1,roc:40,smooth:50},{weight:2,roc:65,smooth:65},{weight:3,roc:75,smooth:75},{weight:4,roc:100,smooth:100},{weight:1,roc:195,smooth:130},{weight:2,roc:265,smooth:130},{weight:3,roc:390,smooth:130},{weight:4,roc:530,smooth:195}],Ho={id:"special-k",name:"Pring's Special K",category:"Momentum",placement:"pane",inputs:[{key:"source",type:"source",label:"Source",default:"close"},{key:"length1",type:"number",label:"Signal length 1",default:100,min:1,max:1e3,step:1},{key:"length2",type:"number",label:"Signal length 2",default:100,min:1,max:1e3,step:1},{key:"color",type:"color",label:"Special K",default:"#2962ff"},{key:"signalColor",type:"color",label:"Signal",default:"#ff6d00"}],plots:[{key:"specialK",type:"line",title:"Special K",colorKey:"color",style:{lineWidth:1.5}},{key:"signal",type:"line",title:"Signal",colorKey:"signalColor",style:{lineWidth:1.5}}],calc:(t,l)=>{const o=t.length,n=e(t,Do(l)),r=new Array(o).fill(0);for(const e of qo){const t=Te(J(n,e.roc),t=>I(t,e.smooth));for(let l=0;l<o;l++)r[l]+=e.weight*t[l]}const a=Te(r,e=>I(e,Ko(l,"length1",100))),i=Te(a,e=>I(e,Ko(l,"length2",100)));return{specialK:j(r),signal:j(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero"}]},$o=[To,Uo,Po,Io,Vo,Eo,Ho],zo=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},jo=(e,t,l)=>Math.max(1,Math.floor(zo(e,t,l))),Zo=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Yo=(e,t="source")=>e[t]??"close",Jo=(e,t)=>!1!==e[t];function Go(e,t){const l=new Array(e.length).fill(NaN);for(let o=t;o<e.length;o++)l[o]=e[o-t];return l}function Xo(e,t){const l=new Array(e.length).fill(!1);for(let o=t;o<e.length;o++)l[o]=e[o-t];return l}const _o={id:"vortex",name:"Vortex Indicator",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:2,max:500,step:1},{key:"upColor",type:"color",label:"VI +",default:"#2962ff"},{key:"downColor",type:"color",label:"VI -",default:"#e91e63"}],plots:[{key:"vip",type:"line",title:"VI +",colorKey:"upColor",style:{lineWidth:1.5}},{key:"vim",type:"line",title:"VI -",colorKey:"downColor",style:{lineWidth:1.5}}],calc:(e,t)=>{const l=e.length,o=jo(t,"length",14),n=new Array(l).fill(NaN),r=new Array(l).fill(NaN);if(0===l)return{vip:j(n),vim:j(r)};const a=e.map(e=>e.high),i=e.map(e=>e.low),s=e.map(e=>e.close),c=new Array(l-1),u=new Array(l-1);for(let e=1;e<l;e++)c[e-1]=Math.abs(a[e]-i[e-1]),u[e-1]=Math.abs(i[e]-a[e-1]);const y=oe(c,o),f=oe(u,o),m=oe(p(a,i,s),o);for(let e=1;e<l;e++)n[e]=y[e-1]/m[e],r[e]=f[e-1]/m[e];return{vip:j(n),vim:j(r)}}},Qo={id:"volatility-stop",name:"Volatility Stop",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:20,min:2,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"factor",type:"number",label:"Multiplier",default:2,min:.25,max:20,step:.25},{key:"upColor",type:"color",label:"Uptrend",default:"#009688"},{key:"downColor",type:"color",label:"Downtrend",default:"#f44336"}],plots:[{key:"up",type:"line",title:"Volatility Stop Up",colorKey:"upColor",style:{markersOnly:!0,markerRadius:1.5}},{key:"down",type:"line",title:"Volatility Stop Down",colorKey:"downColor",style:{markersOnly:!0,markerRadius:1.5}}],calc:(t,o)=>{const n=t.length,r=new Array(n).fill(null),a=new Array(n).fill(null);if(0===n)return{up:r,down:a};const i=e(t,Yo(o)),s=zo(o,"factor",2),c=t.map(e=>e.high),u=t.map(e=>e.low),y=t.map(e=>e.close),f=l(c,u,y,jo(o,"length",20)),m=p(c,u,y);let d=i[0],b=i[0],h=!0,g=NaN;for(let e=0;e<n;e++){const t=i[e],l=Number.isFinite(f[e])?f[e]*s:m[e];d=Math.max(d,t),b=Math.min(b,t);let o=h?Math.max(g,d-l):Math.min(g,b+l);Number.isFinite(o)||(o=t);const n=t-o>=0;e>0&&n!==h&&(d=t,b=t,o=n?d-l:b+l),h=n,g=o,Number.isFinite(o)&&(n?r[e]=o:a[e]=o)}return{up:r,down:a}}},en={id:"trend-strength-index",name:"Trend Strength Index",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:2,max:500,step:1},{key:"color",type:"color",label:"Trend Strength Index",default:"#7e57c2"},{key:"bullishColor",type:"color",label:"Bullish Color",default:"#089981"},{key:"bearishColor",type:"color",label:"Bearish Color",default:"#f23645"}],plots:[{key:"tsi",type:"line",title:"Trend Strength Index",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,t)=>{const l=e.map((e,t)=>t);return{tsi:j(ce(e.map(e=>e.close),l,jo(t,"length",14)))}},levels:e=>[{price:1,color:Zo(e,"bullishColor","#089981"),title:"TSI Bullish Band"},{price:0,color:"#787b86",title:"TSI Middle Band",dashed:!0},{price:-1,color:Zo(e,"bearishColor","#f23645"),title:"TSI Bearish Band"}],range:()=>({min:-1,max:1})};function tn(e,t,l,o){const n=e[t];if(!Number.isFinite(n))return!1;const r=t=>t>=0&&t<e.length&&Number.isFinite(e[t])&&(o?e[t]<n:e[t]>n),a=t=>t>=0&&t<e.length&&Number.isFinite(e[t])&&(o?e[t]<=n:e[t]>=n);for(let e=1;e<=l;e++)if(!r(t+e))return!1;for(let e=0;e<=4;e++){let o=!0;for(let l=1;l<=e&&o;l++)a(t-l)||(o=!1);for(let n=1;n<=l&&o;n++)r(t-e-n)||(o=!1);if(o)return!0}return!1}const ln={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,t)=>{const l=e.length,o=new Array(l).fill(null),n=new Array(l).fill(null),r=new Array(l).fill(null),a={fractals:o,upFractal:n,downFractal:r};if(0===l)return a;const i=Math.max(2,jo(t,"periods",2)),s=e.map(e=>e.high),c=e.map(e=>e.low),u=Jo(t,"showUp"),p=Jo(t,"showDown");for(let e=0;e<l;e++)u&&tn(s,e,i,!0)&&(n[e]=s[e]),p&&tn(c,e,i,!1)&&(r[e]=c[e]);return a},markers:({bars:e,values:t,settings:l})=>{const o=t.upFractal??[],n=t.downFractal??[],r=Zo(l,"upColor","#009688"),a=Zo(l,"downColor","#f44336"),i=[];for(let t=0;t<e.length;t++){const l=o[t];null!=l&&i.push({time:e[t].time,position:"atPrice",price:l,shape:"triangleUp",size:"small",color:r});const s=n[t];null!=s&&i.push({time:e[t].time,position:"atPrice",price:s,shape:"triangleDown",size:"small",color:a})}return i}},on={id:"rsi-divergence",name:"RSI Divergence Indicator",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"RSI Period",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"RSI Source",default:"close"},{key:"lbR",type:"number",label:"Pivot Lookback Right",default:5,min:1,max:100,step:1},{key:"lbL",type:"number",label:"Pivot Lookback Left",default:5,min:1,max:100,step:1},{key:"rangeUpper",type:"number",label:"Max of Lookback Range",default:60,min:1,max:1e3,step:1},{key:"rangeLower",type:"number",label:"Min of Lookback Range",default:5,min:1,max:1e3,step:1},{key:"plotBull",type:"boolean",label:"Plot Bullish",default:!0},{key:"plotHiddenBull",type:"boolean",label:"Plot Hidden Bullish",default:!1},{key:"plotBear",type:"boolean",label:"Plot Bearish",default:!0},{key:"plotHiddenBear",type:"boolean",label:"Plot Hidden Bearish",default:!1},{key:"color",type:"color",label:"RSI",default:"#2962ff"},{key:"bullColor",type:"color",label:"Bullish",default:"#4caf50"},{key:"bearColor",type:"color",label:"Bearish",default:"#ff5252"}],plots:[{key:"rsi",type:"line",title:"RSI",colorKey:"color",style:{lineWidth:2}}],calc:(t,l)=>{const o=t.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=u(e(t,Yo(l)),jo(l,"length",14)),c={rsi:j(s),bull:n,hiddenBull:r,bear:a,hiddenBear:i};if(0===o)return c;const p=jo(l,"lbR",5),y=jo(l,"lbL",5),f=zo(l,"rangeLower",5),m=zo(l,"rangeUpper",60),d=!1!==l.plotBull,b=!0===l.plotHiddenBull,h=!1!==l.plotBear,g=!0===l.plotHiddenBear,k=ye(s,y,p).map(e=>Number.isFinite(e)),w=pe(s,y,p).map(e=>Number.isFinite(e)),v=Go(s,p),C=Go(t.map(e=>e.low),p),N=Go(t.map(e=>e.high),p),M=de(Xo(k,1)),A=de(Xo(w,1)),x=be(k,v,1),S=be(k,C,1),L=be(w,v,1),B=be(w,N,1);for(let e=0;e<o;e++){const t=e-p;if(!(t<0)){if(k[e]){const l=f<=M[e]&&M[e]<=m,o=v[e]>x[e]&&l,a=v[e]<x[e]&&l;d&&o&&C[e]<S[e]&&(n[t]=v[e]),b&&a&&C[e]>S[e]&&(r[t]=v[e])}if(w[e]){const l=f<=A[e]&&A[e]<=m,o=v[e]<L[e]&&l,n=v[e]>L[e]&&l;h&&o&&N[e]>B[e]&&(a[t]=v[e]),g&&n&&N[e]<B[e]&&(i[t]=v[e])}}}return c},markers:({bars:e,values:t,settings:l})=>{const o=Zo(l,"bullColor","#4caf50"),n=Zo(l,"bearColor","#ff5252"),r=[{col:t.bull,shape:"labelUp",text:"Bull",color:o},{col:t.hiddenBull,shape:"labelUp",text:"H Bull",color:o},{col:t.bear,shape:"labelDown",text:"Bear",color:n},{col:t.hiddenBear,shape:"labelDown",text:"H Bear",color:n}],a=[];for(let t=0;t<e.length;t++)for(const l of r){const o=l.col?.[t];null!=o&&a.push({time:e[t].time,position:"atPrice",price:o,shape:l.shape,size:"small",color:l.color,text:l.text})}return a},levels:()=>[{price:70,color:"#787b86",title:"Overbought",dashed:!0},{price:50,color:"#787b86",title:"Middle Line",dashed:!0},{price:30,color:"#787b86",title:"Oversold",dashed:!0}],range:()=>({min:0,max:100})},nn={id:"consolidation-breakout",name:"Consolidation and Breakout",category:"Trend",placement:"onchart",inputs:[{key:"markbreakout",type:"boolean",label:"Mark Breakouts",default:!0},{key:"colorinside",type:"boolean",label:"Tint Inside Bars",default:!0},{key:"bullBreakColor",type:"color",label:"Break Up",default:"#00c853"},{key:"bearBreakColor",type:"color",label:"Break Down",default:"#ff5252"},{key:"insideColor",type:"color",label:"Inside Bar",default:"#000000"},{key:"highlowColor",type:"color",label:"Range",default:"#e91e63"}],plots:[{key:"rangeHigh",type:"line",title:"Range High",colorKey:"highlowColor",style:{lineWidth:2}},{key:"rangeLow",type:"line",title:"Range Low",colorKey:"highlowColor",style:{lineWidth:2}}],calc:e=>{const t=e.length,l=new Array(t).fill(NaN),o=new Array(t).fill(NaN),n=new Array(t).fill(NaN),r=new Array(t).fill(NaN),a=new Array(t).fill(NaN);let i=0;for(let s=0;s<t;s++){const t=e[s],c=Math.max(t.open,t.close),u=Math.min(t.open,t.close),p=e[i].high,y=e[i].low,f=s-i,m=f>1&&f<=250;m&&c>p&&(n[s]=p),m&&u<y&&(r[s]=y);const d=i;i=s>1&&u>=y&&u<=p&&c>=y&&c<=p?i:s,i===d&&(l[s]=e[i].high,o[s]=e[i].low);const b=s-i;b>0&&(a[s]=b)}return{rangeHigh:j(l),rangeLow:j(o),breakUp:j(n),breakDown:j(r),insideAge:j(a)}},markers:({bars:e,values:t,settings:l})=>{const o=[];if(!Jo(l,"markbreakout"))return o;const n=t.breakUp??[],r=t.breakDown??[],a=Zo(l,"bullBreakColor","#00c853"),i=Zo(l,"bearBreakColor","#ff5252");for(let t=0;t<e.length;t++)null!==n[t]&&void 0!==n[t]&&o.push({time:e[t].time,position:"belowBar",shape:"triangleUp",size:"small",color:a}),null!==r[t]&&void 0!==r[t]&&o.push({time:e[t].time,position:"aboveBar",shape:"triangleDown",size:"small",color:i});return o},barColors:({bars:e,values:t,settings:l})=>{const o=t.insideAge??[],n=Zo(l,"insideColor","#000000"),r=Jo(l,"colorinside");return e.map((e,t)=>r&&null!==o[t]&&void 0!==o[t]?n:null)}},rn=[_o,Qo,en,ln,on,nn],an=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},sn=(e,t,l)=>"string"==typeof e[t]?e[t]:l,cn=(e,t,l)=>"boolean"==typeof e[t]?e[t]:l,un=e=>new Array(e).fill(NaN),pn=86400,yn=e=>Math.floor(((e=>Math.floor((e+c)/pn))(e)-4)/7);function fn(e,t,l){const a=e.map(e=>e.time);return"daily"===t?o(a,l):n(a,function(e,t){return t!==r?"weekly"===e?(e,l)=>f(e,l,t):(e,l)=>m(e,l,t):"weekly"===e?(e,t)=>yn(e)!==yn(t):(e,t)=>{const l=s(e),o=s(t);return l.year!==o.year||l.month!==o.month}}(t,l))}function mn(e){const t=function(e){if(e.length<2)return 0;const t=[];for(let l=1;l<e.length;l++){const o=e[l].time-e[l-1].time;o>0&&t.push(o)}return 0===t.length?0:(t.sort((e,t)=>e-t),t[Math.floor(t.length/2)])}(e);return t<=0||t<pn?"daily":t<604800?"weekly":"monthly"}const dn={daily:"d",weekly:"w",monthly:"m"},bn={daily:"Daily",weekly:"Weekly",monthly:"Monthly"},hn=(e,t,l,o)=>({key:e,type:"line",title:t,colorKey:l,style:{markersOnly:!0,markerRadius:o}});function gn(e){const t=dn[e],l=bn[e],o=`${t}SupportColor`,n=`${t}ResistanceColor`,r=`${t}CprColor`;return[{key:`${t}Pivot`,type:"line",title:`${l} Pivot`,colorKey:`${t}PivotColor`,style:{lineWidth:2}},hn(`${t}S1`,`${l} S1`,o,1),hn(`${t}S2`,`${l} S2`,o,1),hn(`${t}S3`,`${l} S3`,o,1),hn(`${t}R1`,`${l} R1`,n,1),hn(`${t}R2`,`${l} R2`,n,1),hn(`${t}R3`,`${l} R3`,n,1),hn(`${t}Bc`,`${l} Bottom Pivot`,r,2),hn(`${t}Tc`,`${l} Top Pivot`,r,2)]}function kn(e){const t=dn[e],l=bn[e];return[{key:`${t}PivotColor`,type:"color",label:"Pivot",default:"#ffeb3b",group:l},{key:`${t}SupportColor`,type:"color",label:"Support",default:"#4caf50",group:l},{key:`${t}ResistanceColor`,type:"color",label:"Resistance",default:"#ff5252",group:l},{key:`${t}CprColor`,type:"color",label:"CPR",default:"#ff9800",group:l},{key:`${t}FillColor`,type:"color",label:"CPR Fill",default:"#f47676",group:l}]}function wn(e,t,l,o,n){const r=e.length,a=un(r),i=un(r),s=un(r),c=un(r),u=un(r),p=un(r),y=un(r),f=un(r),m=un(r);if(l){const l=fn(e,t,n);let d=NaN,b=NaN,h=NaN,g=NaN,k=NaN,w=NaN;for(let t=0;t<r;t++){l[t]&&(d=g,b=k,h=w);const n=e[t],r=Number.isFinite(n.high)?n.high:NaN,v=Number.isFinite(n.low)?n.low:NaN,C=0===t||l[t];if(g=C?r:Math.max(g,r),k=C?v:Math.min(k,v),w=n.close,!Number.isFinite(d)||!Number.isFinite(b)||!Number.isFinite(h))continue;const N=(d+b+h)/3,M=d-b,A=2*N-d,x=2*N-b,S=(d+b)/2;o.pivot&&(a[t]=N),o.support&&(o.s1r1&&(i[t]=A),s[t]=N-M,c[t]=A-M),o.resistance&&(o.s1r1&&(u[t]=x),p[t]=N+M,y[t]=x+M),o.cpr&&(f[t]=S,m[t]=2*N-S)}}const d=dn[t];return{[`${d}Pivot`]:j(a),[`${d}S1`]:j(i),[`${d}S2`]:j(s),[`${d}S3`]:j(c),[`${d}R1`]:j(u),[`${d}R2`]:j(p),[`${d}R3`]:j(y),[`${d}Bc`]:j(f),[`${d}Tc`]:j(m)}}const vn={id:"cpr",name:"CPR with Floor Pivot",category:"Trend",placement:"onchart",inputs:[{key:"pivotMode",type:"select",label:"Select Pivot Mode",default:"auto",options:[{label:"Auto",value:"auto"},{label:"Manual",value:"manual"}]},{key:"showDaily",type:"boolean",label:"Show Daily CPR (Manual)",default:!0},{key:"showWeekly",type:"boolean",label:"Show Weekly CPR (Manual)",default:!1},{key:"showMonthly",type:"boolean",label:"Show Monthly CPR (Manual)",default:!1},{key:"displaypivots",type:"boolean",label:"Plot Pivot",default:!0},{key:"displaysupport",type:"boolean",label:"Plot Support",default:!0},{key:"displayresistance",type:"boolean",label:"Plot Resistance",default:!0},{key:"displaycpr",type:"boolean",label:"Plot CPR",default:!0},{key:"displayS1R1",type:"boolean",label:"Plot S1 / R1",default:!1},...kn("daily"),...kn("weekly"),...kn("monthly")],plots:[...gn("daily"),...gn("weekly"),...gn("monthly")],fills:["daily","weekly","monthly"].map(e=>{const t=dn[e];return{between:[`${t}Tc`,`${t}Bc`],colorUpKey:`${t}FillColor`,colorDownKey:`${t}FillColor`,opacity:.48}}),calc:(e,t)=>{const l="manual"===t.pivotMode,o=mn(e),n={pivot:cn(t,"displaypivots",!0),support:cn(t,"displaysupport",!0),resistance:cn(t,"displayresistance",!0),cpr:cn(t,"displaycpr",!0),s1r1:cn(t,"displayS1R1",!1)},i=l?{daily:cn(t,"showDaily",!0),weekly:cn(t,"showWeekly",!1),monthly:cn(t,"showMonthly",!1)}:{daily:"daily"===o,weekly:"weekly"===o,monthly:"monthly"===o},s=(e=>{const t=e.timezone;return"string"!=typeof t||""===t||t===r?r:a(t)?t:r})(t);return{...wn(e,"daily",i.daily,n,s),...wn(e,"weekly",i.weekly,n,s),...wn(e,"monthly",i.monthly,n,s)}}};const Cn={id:"alphatrend",name:"AlphaTrend",category:"Trend",placement:"onchart",inputs:[{key:"coeff",type:"number",label:"Multiplier",default:1,min:0,max:20,step:.1},{key:"AP",type:"number",label:"Common Period",default:14,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"showsignalsk",type:"boolean",label:"Show Signals",default:!0},{key:"novolumedata",type:"boolean",label:"Change calculation (no volume data)",default:!1},{key:"color",type:"color",label:"AlphaTrend",default:"#0022fc"},{key:"lagColor",type:"color",label:"AlphaTrend Lag",default:"#fc0400"},{key:"risingFillColor",type:"color",label:"Rising Fill",default:"#00e60f"},{key:"fallingFillColor",type:"color",label:"Falling Fill",default:"#80000b"},{key:"buyColor",type:"color",label:"Buy",default:"#0022fc"},{key:"sellColor",type:"color",label:"Sell",default:"#880e4f"}],plots:[{key:"alphatrend",type:"line",title:"AlphaTrend",colorKey:"color",style:{lineWidth:3}},{key:"lagged",type:"line",title:"AlphaTrend Lag",colorKey:"lagColor",style:{lineWidth:3}}],fills:[{between:["alphatrend","lagged"],colorUpKey:"risingFillColor",colorDownKey:"fallingFillColor",opacity:1}],markers:({bars:e,values:t,settings:l})=>{if(!1===l.showsignalsk)return[];const o=t.buySignal??[],n=t.sellSignal??[],r=[];for(let t=0;t<e.length;t++){const a=o[t];if(null!=a){r.push({time:e[t].time,position:"atPrice",price:a,shape:"labelUp",size:"tiny",color:sn(l,"buyColor","#0022fc"),text:"BUY"});continue}const i=n[t];null!=i&&r.push({time:e[t].time,position:"atPrice",price:i,shape:"labelDown",size:"tiny",color:sn(l,"sellColor","#880e4f"),text:"SELL"})}return r},calc:(t,l)=>{const o=t.length,n=un(o),r=un(o),a=un(o),i=un(o);if(0===o)return{alphatrend:[],lagged:[],buySignal:[],sellSignal:[]};const s=Math.max(1,Math.round(an(l,"AP",14))),c=an(l,"coeff",1),y=!0===l.novolumedata,f=!1!==l.showsignalsk,m=t.map(e=>e.high),d=t.map(e=>e.low),b=t.map(e=>e.close),h=S(p(m,d,b),s),g=y?u(e(t,((e,t="source")=>e[t]??"close")(l)),s):function(e,t,l){const o=e.length,n=un(o);if(l<=0||0===o)return n;const r=new Array(o).fill(0),a=new Array(o).fill(0);for(let l=1;l<o;l++){const o=e[l]*t[l];e[l]>e[l-1]?r[l]=o:e[l]<e[l-1]&&(a[l]=o)}const i=x(r,l),s=x(a,l);for(let e=l;e<o;e++)Number.isFinite(i[e])&&Number.isFinite(s[e])&&(n[e]=0===s[e]?100:100-100/(1+i[e]/s[e]));return n}(t.map(e=>(e.high+e.low+e.close)/3),t.map(e=>e.volume??0),s);for(let e=0;e<o;e++){const l=e>0&&Number.isFinite(n[e-1])?n[e-1]:0;if(!Number.isFinite(h[e])||!Number.isFinite(g[e]))continue;const o=h[e]*c;n[e]=g[e]>=50?Math.max(t[e].low-o,l):Math.min(t[e].high+o,l)}for(let e=2;e<o;e++)r[e]=n[e-2];const k=new Array(o).fill(!1),w=new Array(o).fill(!1);for(let e=1;e<o;e++){const t=n[e],l=r[e],o=n[e-1],a=r[e-1];Number.isFinite(t)&&Number.isFinite(l)&&Number.isFinite(o)&&Number.isFinite(a)&&(t>l&&o<=a?k[e]=!0:t<l&&o>=a&&(w[e]=!0))}if(f){const e=k.map((e,t)=>t>0&&k[t-1]),t=w.map((e,t)=>t>0&&w[t-1]),l=de(k),n=de(w),s=de(e),c=de(t);for(let e=0;e<o;e++)k[e]&&s[e]>n[e]?a[e]=.9999*r[e]:w[e]&&c[e]>l[e]&&(i[e]=1.0001*r[e])}return{alphatrend:j(n),lagged:j(r),buySignal:j(a),sellSignal:j(i)}}},Nn={id:"range-analysis",name:"Range Analysis",category:"Volatility",placement:"pane",inputs:[{key:"showAverage",type:"boolean",label:"Show Average Range",default:!1},{key:"avgLength",type:"number",label:"Average Length",default:3,min:1,max:500,step:1},{key:"color",type:"color",label:"Range",default:"#ff5252"},{key:"avgColor",type:"color",label:"Average Range",default:"#2196f3"}],plots:[{key:"range",type:"histogram",title:"Range",colorKey:"color",style:{lineWidth:3,base:0}},{key:"avgRange",type:"line",title:"Average Range",colorKey:"avgColor",style:{lineWidth:2}}],calc:(e,t)=>{const l=e.map(e=>e.high-e.low);return!0!==t.showAverage?{range:j(l),avgRange:new Array(e.length).fill(null)}:{range:j(l),avgRange:j(I(l,Math.max(1,Math.round(an(t,"avgLength",3)))))}}},Mn=[vn,Cn,Nn],An=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},xn=(e,t,l)=>Math.max(1,Math.floor(An(e,t,l))),Sn=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Ln=(e,t)=>new Array(e).fill(t),Bn=e=>/^#[0-9a-f]{6}$/i.test(e)?`${e}99`:e;function Kn(e,t){const l=new Array(e.length).fill(NaN);for(let o=t;o<e.length;o++)l[o]=e[o-t];return l}function Fn(e,t){const l=new Array(e.length).fill(!1);for(let o=t;o<e.length;o++)l[o]=e[o-t];return l}const Wn={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:t})=>{const l=(e,l)=>{const o=t[e];return"string"==typeof o&&""!==o?o:l};return e>=0?l("momUpColor","#008080"):l("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:(t,l)=>{const o=t.length,n=xn(l,"n1",10),r=xn(l,"n2",21),a=xn(l,"sigLen",4),i=An(l,"obLevel1",60),s=An(l,"obLevel2",53),c=An(l,"osLevel1",-60),u=An(l,"osLevel2",-53),p=new Array(o).fill(null),y=new Array(o).fill(null),f=new Array(o).fill(null),m=new Array(o).fill(null),d=new Array(o).fill(null),b=new Array(o).fill(null),h=e(t,(e=>e.source??"hlc3")(l)),g=Te(h,e=>Z(e,n)),k=Te(h.map((e,t)=>Math.abs(e-g[t])),e=>Z(e,n)),w=Te(h.map((e,t)=>{const l=k[t];return Number.isFinite(l)?0===l?0:(e-g[t])/(.015*l):NaN}),e=>Z(e,r)),v=Te(w,e=>S(e,a)),C=w.map((e,t)=>e-v[t]),N={wt1:j(w),wt2:j(v),mom:!1===l.showMom?new Array(o).fill(null):j(C),obUpper:Ln(o,i),obLower:Ln(o,s),osUpper:Ln(o,u),osLower:Ln(o,c),buy:p,sell:y,bull:f,bear:m,hiddenBull:d,hiddenBear:b},M=!1!==l.filterZone,A=!1!==l.useInner,x=A?s:i,L=A?u:c;for(let e=1;e<o;e++){const t=w[e-1],l=v[e-1],o=w[e],n=v[e];Number.isFinite(t)&&Number.isFinite(l)&&(Number.isFinite(o)&&Number.isFinite(n)&&(o>n&&t<=l&&(!M||n<=L)&&(p[e]=n),o<n&&t>=l&&(!M||n>=x)&&(y[e]=n)))}const B=xn(l,"lbL",3),K=xn(l,"lbR",3),F=An(l,"rangeLower",5),W=An(l,"rangeUpper",60),D=!1!==l.showRegDiv,R=!0===l.showHidDiv,O=ye(v,B,K).map(e=>Number.isFinite(e)),T=pe(v,B,K).map(e=>Number.isFinite(e)),U=Kn(v,K),P=Kn(t.map(e=>e.low),K),I=Kn(t.map(e=>e.high),K),V=de(Fn(O,1)),E=de(Fn(T,1)),q=be(O,U,1),H=be(O,P,1),$=be(T,U,1),z=be(T,I,1);for(let e=0;e<o;e++){const t=e-K;if(!(t<0)){if(O[e]){const l=F<=V[e]&&V[e]<=W;D&&l&&U[e]>q[e]&&P[e]<H[e]&&(f[t]=U[e]),R&&l&&U[e]<q[e]&&P[e]>H[e]&&(d[t]=U[e])}if(T[e]){const l=F<=E[e]&&E[e]<=W;D&&l&&U[e]<$[e]&&I[e]>z[e]&&(m[t]=U[e]),R&&l&&U[e]>$[e]&&I[e]<z[e]&&(b[t]=U[e])}}}return N},markers:({bars:e,values:t,settings:l})=>{const o=Sn(l,"bullColor","#4caf50"),n=Sn(l,"bearColor","#ff5252"),r=[{col:t.buy,shape:"circle",size:"tiny",color:Sn(l,"buyColor","#00e676"),text:void 0},{col:t.sell,shape:"circle",size:"tiny",color:Sn(l,"sellColor","#ff5252"),text:void 0},{col:t.bull,shape:"labelUp",size:"small",color:o,text:"R"},{col:t.bear,shape:"labelDown",size:"small",color:n,text:"R"},{col:t.hiddenBull,shape:"labelUp",size:"small",color:Bn(o),text:"H"},{col:t.hiddenBear,shape:"labelDown",size:"small",color:Bn(n),text:"H"}],a=[];for(let t=0;t<e.length;t++)for(const l of r){const o=l.col?.[t];if(null==o)continue;const n={time:e[t].time,position:"atPrice",price:o,shape:l.shape,size:l.size,color:l.color};void 0!==l.text&&(n.text=l.text),a.push(n)}return a},levels:e=>[{price:An(e,"obLevel1",60),color:Sn(e,"obBandColor","#ff5252"),title:"Overbought 1",dashed:!0},{price:An(e,"obLevel2",53),color:Sn(e,"obBandColor","#ff5252"),title:"Overbought 2",dashed:!0},{price:0,color:"#787b86",title:"Zero",dashed:!0},{price:An(e,"osLevel2",-53),color:Sn(e,"osBandColor","#4caf50"),title:"Oversold 2",dashed:!0},{price:An(e,"osLevel1",-60),color:Sn(e,"osBandColor","#4caf50"),title:"Oversold 1",dashed:!0}]},Dn=[Wn],Rn=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},On=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Tn=(e,t)=>!1!==e[t],Un="#089981",Pn="#F23745",In="#787b86",Vn=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function En(e,t){let l=e;if(/^#[0-9a-f]{3}$/i.test(l))l=`#${l[1]}${l[1]}${l[2]}${l[2]}${l[3]}${l[3]}`;else if(/^#[0-9a-f]{8}$/i.test(l))l=l.slice(0,7);else if(!/^#[0-9a-f]{6}$/i.test(l))return e;return`${l}${Math.round(255*Math.min(1,Math.max(0,t))).toString(16).padStart(2,"0")}`}const qn=En(In,.2),Hn=En(In,.5);function $n(e,t,l,o){if(null===e||!Number.isFinite(e))return;return En(e>=0?l:o,.1+.4*(t>0?Math.min(1,Math.abs(e)/t):1))}const zn=e=>`${e.toFixed(2)}%`;const jn=(e,t)=>100*e+t;function Zn(e,t){const l=function(e,t){const l=[];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,t);o={year:e.year,month:e.month,last:a.close},l.push(o),n=b(e.year,e.month,1,0,0,0,t),r=b(e.year,e.month+1,1,0,0,0,t)}else o.last=a.close;return l}(e,(e=>{const t=e.timezone;return"string"!=typeof t||""===t||t===r?r:a(t)?t:r})(t)),o=Math.round(Rn(t,"startYear",2015)),n=function(e){const t=new Set;for(const l of e.split(",")){const e=l.replace(/[\s-]/g,"");if(!/^\d{6}$/.test(e))continue;const o=Number(e),n=o%100;n>=1&&n<=12&&t.add(o)}return t}(On(t,"ignoredMonths","")),i=l.length>0?l[l.length-1]:null;null!==i&&n.add(jn(i.year,i.month));const s=[],c=new Map;for(let e=1;e<l.length;e++){const t=l[e],r=l[e-1];if(t.year<o||n.has(jn(t.year,t.month)))continue;if(!Number.isFinite(r.last)||!Number.isFinite(t.last)||0===r.last)continue;const a=100*(t.last-r.last)/Math.abs(r.last);if(!Number.isFinite(a))continue;let i=c.get(t.year);void 0===i&&(i=new Array(12).fill(null),c.set(t.year,i),s.push(t.year)),i[t.month-1]=a}return{years:s,byYear:c,skipped:n}}function Yn(e,t){const l=[];for(const o of e.years){const n=e.byYear.get(o)?.[t];null!=n&&l.push(n)}return l}const Jn=e=>{if(0===e.length)return null;let t=0;for(const l of e)t+=l;const l=t/e.length;return Number.isFinite(l)?l:null};function Gn(e){if(e.length<2)return null;const t=Jn(e);if(null===t)return null;let l=0;for(const o of e)l+=(o-t)*(o-t);const o=Math.sqrt(l/(e.length-1));return Number.isFinite(o)?o:null}const Xn=e=>{if(0===e.length)return null;let t=0;for(const l of e)l>=0&&(t+=1);return 100*t/e.length},_n={Left:"bottom-left",Center:"bottom-center",Right:"bottom-right"},Qn=[52,...new Array(12).fill(46)],er=e=>({text:e,bgColor:qn}),tr={id:"seasonality",name:"Seasonality",category:"Trend",placement:"pane",inputs:[{key:"startYear",type:"number",label:"Starting year",default:2015,min:1800,max:2999,step:1},{key:"posColor",type:"color",label:"Positive Color",default:Un,group:"Color settings"},{key:"negColor",type:"color",label:"Negative Color",default:Pn,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:t})=>{const l=Zn(e,t);if(0===l.years.length)return null;const o=Rn(t,"cutoffPercent",10),n=On(t,"posColor",Un),r=On(t,"negColor",Pn),a=[[er("Year"),...Vn.map(er)]],i=[1];for(const e of l.years){const t=l.byYear.get(e)??[],s=[er(String(e))];for(let a=0;a<12;a++){if(l.skipped.has(jn(e,a+1))){s.push({text:"SKIP",bgColor:Hn});continue}const i=t[a]??null;s.push(null===i?{text:""}:{text:zn(i),bgColor:$n(i,o,n,r)})}a.push(s),i.push(1)}const s=Tn(t,"showAvg"),c=Tn(t,"showStDev"),u=Tn(t,"showPos");if(s||c||u){if(a.push(Array.from({length:13},()=>({text:"",bgColor:qn}))),i.push(.3),s){const e=[er("Avgs:")];for(let t=0;t<12;t++){const a=Jn(Yn(l,t));e.push(null===a?{text:""}:{text:zn(a),bgColor:$n(a,o,n,r)})}a.push(e),i.push(1)}if(c){const e=[er("StDev:")];for(let t=0;t<12;t++){const o=Gn(Yn(l,t));e.push({text:null===o?"":o.toFixed(2),bgColor:qn})}a.push(e),i.push(1)}if(u){const e=[er("Pos%:")];for(let t=0;t<12;t++){const o=Xn(Yn(l,t));e.push(null===o?{text:""}:{text:`${Math.round(o)}%`,bgColor:$n(o-50,50,n,r)})}a.push(e),i.push(1)}}return{rows:a,options:{position:_n[On(t,"tablePosition","Center")]??"bottom-center",cellWidth:Qn,cellHeight:18,rowWeights:i,widthPercent:Rn(t,"tableWidth",100),heightPercent:Rn(t,"tableHeight",95),fontSize:10,margin:8}}}},lr=[tr],or=e=>!0===e?.[Symbol.for("openalgo-charts.data-context.passing")];function nr(e){const t=h(e);return h(t&&{session:t.session,adjustment:t.adjustment})}const rr="__tier2",ar=e=>e[rr];function ir(e,t){return(e.refetchOn??[]).map(e=>`${e}=${String(t[e])}`).join("&")}function sr(e,t){const l=e[e.length-1];if(void 0===l||t.time>l.time)return void e.push(t);if(t.time===l.time)return void(e[e.length-1]=t);let o=0,n=e.length;for(;o<n;){const l=o+n>>1;e[l].time<t.time?o=l+1:n=l}e[o]?.time===t.time?e[o]=t:e.splice(o,0,t)}function cr(e){const t=new WeakMap;return{id:e.id,name:e.name,category:e.category,placement:e.placement,inputs:e.inputs,plots:e.plots,levels:e.levels,range:e.range,calc:(l,o,n,r)=>{const a=ar(n);try{const i=function(e,t,l){const o={};for(const t of l)o[t]=new Array(e.length).fill(null);if(0===t.length)return o;let n=-1;for(let r=0;r<e.length;r++){for(;n+1<t.length&&t[n+1].time<=e[r].time;)n+=1;if(n<0)continue;const a=t[n].values;for(const e of l){const t=a[e];o[e][r]="number"==typeof t&&Number.isFinite(t)?t:null}}return o}(l,a?.points??[],function(e){const t=e.plots.map(e=>e.key);for(const l of e.series??[])t.includes(l)||t.push(l);return t}(e)),s=void 0===e.calc?i:e.calc(l,i,o,n,r);return t.delete(n),s}catch(e){throw t.set(n,{points:a?.points,error:e}),e}},attach:l=>{const o=ar(l.store)??{key:null,points:[],live:[],loaded:!1,from:0,to:0,status:{state:"empty"},request:null,subscription:null,generation:0,completedVersion:null,liveRevision:0,liveVersions:new Map};l.store[rr]=o;let n=++o.generation,r=!0,a=0,i=()=>{};const s=()=>r&&o.generation===n&&!l.signal?.aborted,c=e=>{o.status=e;const n=t.get(l.store);s()&&l.setDataStatus?.("ready"!==e.state&&"empty"!==e.state||n?.points!==o.points?e:{state:"error",error:n.error})},u=()=>{const e=o.request;o.request=null,e?.controller.abort()},p=()=>{const e=o.subscription;o.subscription=null,e?.dispose?.()},y=()=>{n=++o.generation,o.loaded=!1,o.completedVersion=null,o.completedContext=void 0,o.baseDataRevision=o.lastContext?.requestState?.dataRevision,o.live=[],o.liveVersions.clear(),o.errorKind=void 0;const e=o.points.length>0;o.points=[],o.status={state:"empty"};const t=o.request,r=o.subscription;o.request=null,o.subscription=null,t?.controller.abort(),r?.dispose?.(),e&&l.requestRecompute()},f=e=>{e.receive=n=>{if(!s()||o.request!==e||e.controller.signal.aborted)return;if(o.request=null,o.completedVersion=e.version,!n.ok)return o.errorKind="fetch",c({state:"error",error:n.error}),void(void 0!==e.context.requestState&&b());const r="tail"===e.mode?o.points.slice():[];try{for(const t of n.points.slice().sort((e,t)=>e.time-t.time))Number.isFinite(t.time)&&(void 0===e.context.asOf||t.time<=e.context.asOf)&&sr(r,t)}catch(t){return o.errorKind="fetch",c({state:"error",error:t}),void(void 0!==e.context.requestState&&b())}if("prepend"===e.mode)for(const e of o.points)sr(r,e);if(void 0===e.context.asOf)for(const t of o.live)(null===e.liveAfter||(o.liveVersions.get(t.time)??0)>e.liveAfter)&&sr(r,t);const a=o.points;o.points=r;try{l.requestRecompute();const e=t.get(l.store);if(e?.points===r)throw e.error}catch(t){return void(s()&&o.points===r&&(o.points=a,o.errorKind="calc",c({state:"error",error:t}),void 0!==e.context.requestState&&b()))}if(s()&&o.points===r){if(null!==e.liveAfter){o.live=o.live.filter(t=>(o.liveVersions.get(t.time)??0)>e.liveAfter);for(const[t,l]of o.liveVersions)l<=e.liveAfter&&o.liveVersions.delete(t)}o.from=o.loaded&&"replace"!==e.mode?Math.min(o.from,e.from):e.from,o.to=o.loaded&&"replace"!==e.mode?Math.max(o.to,e.to):e.to,o.loaded=!0,o.completedContext=e.context,o.errorKind=void 0,c({state:r.length>0?"ready":"empty"}),b()}},void 0!==e.outcome&&e.receive(e.outcome)},m=t=>{if(!s()||o.request!==t||t.started||t.controller.signal.aborted)return;t.started=!0;const l=e=>{t.outcome=e,t.receive(e)};let n;try{n=e.fetch({...t.context,from:t.from,to:t.to,signal:t.controller.signal})}catch(e){return void l({ok:!1,error:e})}Promise.resolve(n).then(e=>l({ok:!0,points:e}),e=>l({ok:!1,error:e}))},d=(e,t,l,n,r,a=!1)=>{const i={controller:new AbortController,context:e,from:t,to:l,mode:n,version:r,liveAfter:a?o.liveRevision:null,started:!1,receive:()=>{}};o.request=i,f(i),c({state:"loading"}),m(i)},b=(t=!1)=>{if(!s()||or(l.dataContext?.()))return;const r=++a,i=()=>s()&&a===r,u=(()=>{const e=l.bars(),t=l.dataContext?.()??{symbol:l.symbol?.(),interval:l.interval?.()},o=l.requestState?.();return{settings:l.settings(),bars:e,dataContext:{...t},requestState:o,asOf:o?.replay?.asOf,from:e[0]?.time??0,to:e[e.length-1]?.time??0,requestBars:l.requestBars&&(e=>{const o=void 0===e.variant?nr(t.variant):e.variant;return l.requestBars(void 0===o?e:{...e,variant:o})})}})(),p=o.lastContext;o.lastContext=u;const b=u.dataContext,h=u.requestState,g=h?.replay,k=h?.source,w=p?.requestState?.source,v=p?.requestState?.replay,C=JSON.stringify([ir(e,u.settings),b?.symbol,b?.exchange,b?.interval,b?.variant??null,h?.providerRevision,k?.sourceId,void 0!==g]),N=u.bars.length-(p?.bars.length??0),M=void 0!==p&&void 0!==w&&void 0!==k&&"prepend"===k.change&&k.revision===w.revision+1&&k.historyRevision===w.historyRevision+1&&u.bars!==p.bars&&N>0&&p.bars.every((e,t)=>u.bars[N+t]===e),A=void 0===g&&void 0!==k&&void 0!==w&&k.historyRevision!==w.historyRevision&&!M,x=void 0!==u.asOf&&void 0!==v?.asOf&&u.asOf<v.asOf,S=C!==o.key||A||x;if(S){if(y(),!i())return;o.key=C}let L;try{L=(void 0===g||!0===e.supportsReplay&&Number.isFinite(u.asOf))&&(e.supports?.(u)??!0)}catch(e){return void(i()&&c({state:"error",error:e}))}if(!i())return;if(!L)return y(),void(i()&&c({state:"unsupported"}));if(0===u.bars.length)return void(void 0!==h?(y(),i()&&c({state:"empty"})):null===o.request&&c({state:"empty"}));const B=JSON.stringify([C,u.from,void 0===e.subscribe||void 0!==g?u.to:null,void 0===g&&void 0===e.subscribe?k?.revision:null,h?.dataRevision,u.asOf]),K=u.from<o.from||void 0===e.subscribe&&u.to>o.to;if(null!==o.request){const e=o.request;f(e),m(e)}else if(t||S||(void 0!==h?o.completedVersion!==B||K&&"error"!==o.status.state:"error"!==o.status.state)){const l=void 0!==h&&(o.completedContext?.requestState?.dataRevision??o.baseDataRevision)!==h.dataRevision;!o.loaded||t||void 0!==g||l?d(u,u.from,u.to,"replace",B,l):u.from<o.from?d(u,u.from,o.from,"prepend",B):void 0===e.subscribe&&(u.to>o.to||void 0!==h)?d(u,o.to,u.to,"tail",B):c({state:o.points.length>0?"ready":"empty"})}if(i()&&null===o.subscription&&void 0!==e.subscribe&&void 0===g){const t=n,r={};o.subscription=r;try{const a=e.subscribe(u,e=>{s()&&n===t&&o.subscription===r&&Number.isFinite(e.time)&&(sr(o.live,e),o.liveVersions.set(e.time,++o.liveRevision),sr(o.points,e),l.requestRecompute(),s()&&n===t&&o.subscription===r&&null===o.request&&"error"!==o.status.state&&c({state:"ready"}))});s()&&n===t&&o.subscription===r?r.dispose=a:a()}catch(e){s()&&o.subscription===r&&(o.subscription=null,c({state:"error",error:e}))}}},h=()=>{if(!s()&&!r)return;if(r=!1,i(),l.signal?.removeEventListener("abort",g),o.generation!==n)return;o.generation+=1;const e=o.generation;l.setDataRetry?.(null),p(),queueMicrotask(()=>{o.generation===e&&u()})},g=()=>{o.generation===n&&u(),h()};p(),l.signal?.addEventListener("abort",g,{once:!0}),i=void 0!==l.requestState&&void 0!==l.subscribeRequestChanges?l.subscribeRequestChanges(()=>b()):l.subscribeDataChanges?.(()=>b())??(()=>{}),l.setDataRetry?.(()=>b(!0));const k=t.get(l.store);return"calc"===o.errorKind&&void 0===k&&(o.errorKind=void 0,o.status={state:o.points.length?"ready":"empty"}),l.setDataStatus?.(k?.points===o.points?{state:"error",error:k.error}:o.status),b("error"===o.status.state&&"calc"!==o.errorKind),h}}}const ur=604800;function pr(e,t,l,o){if("calendar"===e.mode)return v(e,t,l);if("interval"!==e.mode)return t;const n=e.seconds;if(n%ur===0)return Math.floor(C(t,l)/(n/ur));if(n%86400==0)return Math.floor(N(t,l)/(n/86400));if(null===o)return v(e,t);const r=d(t,l),a=b(r.year,r.month,r.day,Math.floor(o/60),o%60,0,l);return 1e6*N(t,l)+Math.floor((t-a)/n)}const yr=e=>Number.isFinite(e);function fr(e,t,l={}){const o=l.timezone??r,n=Math.floor(l.offset??0);if(!Number.isFinite(n)||n<0)throw new g("securitySeries: offset must be zero or a positive count of buckets");const a=!0===l.lookahead,{bucketing:i}=k(t);if("ticks"===i.mode||"volume"===i.mode)throw new g(`securitySeries: "${t}" closes on trade flow rather than the clock and cannot be folded from time bars`);let s=null;if(void 0!==l.session){const e=w(l.session);if(null===e)throw new g(`securitySeries: cannot read session "${l.session}"`);s=e.start}const c=e.length,u=new Array(c).fill(null),p=new Array(c).fill(null),y=new Array(c).fill(null),f=new Array(c).fill(null),m=new Array(c).fill(null),d=new Array(c).fill(null),b=new Array(c).fill(null),h=new Array(c).fill(!1);if(0===c)return{open:u,high:p,low:y,close:f,volume:m,oi:d,bucketStart:b,isNew:h};const v=[],C=new Array(c);let N=NaN;for(let t=0;t<c;t++){const l=e[t],n=pr(i,l.time,o,s);if(0===t||n!==N)v.push({start:l.time,open:l.open,high:l.high,low:l.low,close:l.close,volume:void 0===l.volume?null:l.volume,oi:void 0===l.oi?null:l.oi}),h[t]=!0;else{const e=v[v.length-1];!yr(e.open)&&yr(l.open)&&(e.open=l.open),yr(l.high)&&(!yr(e.high)||l.high>e.high)&&(e.high=l.high),yr(l.low)&&(!yr(e.low)||l.low<e.low)&&(e.low=l.low),yr(l.close)&&(e.close=l.close),void 0!==l.volume&&(e.volume=(e.volume??0)+l.volume),void 0!==l.oi&&(e.oi=l.oi)}C[t]=v.length-1,N=n}let M=NaN,A=NaN,x=null,S=null;for(let t=0;t<c;t++){const l=e[t],o=C[t];if(n>0){const e=o-n;if(e<0)continue;const l=v[e];u[t]=l.open,p[t]=l.high,y[t]=l.low,f[t]=l.close,m[t]=l.volume,d[t]=l.oi,b[t]=l.start;continue}const r=v[o];b[t]=r.start,a?(u[t]=r.open,p[t]=r.high,y[t]=r.low,f[t]=r.close,m[t]=r.volume,d[t]=r.oi):(h[t]?(M=l.high,A=l.low,x=void 0===l.volume?null:l.volume,S=void 0===l.oi?null:l.oi):(yr(l.high)&&(!yr(M)||l.high>M)&&(M=l.high),yr(l.low)&&(!yr(A)||l.low<A)&&(A=l.low),void 0!==l.volume&&(x=(x??0)+l.volume),void 0!==l.oi&&(S=l.oi)),u[t]=r.open,p[t]=yr(M)?M:null,y[t]=yr(A)?A:null,f[t]=yr(l.close)?l.close:null,m[t]=x,d[t]=S)}return{open:u,high:p,low:y,close:f,volume:m,oi:d,bucketStart:b,isNew:h}}function mr(e,t,l,o={}){const n=o.mode??"confirmed";if(!["confirmed","developing","lookahead"].includes(n))throw new g("securityExpression: invalid mode");const a=o.timezone??r,{bucketing:i}=k(t);if("interval"!==i.mode&&"calendar"!==i.mode)throw new g("securityExpression: requested interval must close on the clock");const s=void 0===o.session?void 0:w(o.session);if(null===s)throw new g("securityExpression: invalid session");if(0===e.length)return{};const c=[],u=[],p={};let y,f,m=-1/0;const d=()=>{const t=l(Object.freeze(c.slice()));if(null===t||"object"!=typeof t||Array.isArray(t))throw new g("securityExpression: expression must return named columns");const o=Object.keys(t);if(y&&(o.length!==y.length||y.some(e=>!Object.prototype.hasOwnProperty.call(t,e))))throw new g("securityExpression: expression column keys must remain stable");for(const l of o){if(!Array.isArray(t[l])||t[l].length!==c.length)throw new g("securityExpression: expression column length must match requested bars");Object.prototype.hasOwnProperty.call(p,l)||Object.defineProperty(p,l,{value:new Array(e.length).fill(null),enumerable:!0})}return y=o,t},b=(e,t,l)=>{for(const o of y??[]){const n=e[o][l];p[o][t]="number"==typeof n&&Number.isFinite(n)?n:null}};for(let t=0;t<e.length;t++){const l=e[t];if(!Number.isFinite(l.time)||l.time<=m)throw new g("securityExpression: source times must be finite and strictly increasing");m=l.time;const o=pr(i,l.time,a,s?.start??null);if(o!==f)c.push(Object.freeze({...l}));else{const e=c[c.length-1],t={...e};!yr(e.open)&&yr(l.open)&&(t.open=l.open),yr(l.high)&&(!yr(e.high)||l.high>e.high)&&(t.high=l.high),yr(l.low)&&(!yr(e.low)||l.low<e.low)&&(t.low=l.low),yr(l.close)&&(t.close=l.close),void 0!==l.volume&&(t.volume=(e.volume??0)+l.volume),void 0!==l.oi&&(t.oi=l.oi),c[c.length-1]=Object.freeze(t)}f=o,u.push(c.length-1),"developing"===n&&b(d(),t,c.length-1)}if("developing"!==n){const t=d();for(let l=0;l<e.length;l++)b(t,l,u[l]-("confirmed"===n?1:0))}return p}function dr(e){const t=e.missing??"propagate";if("propagate"!==t&&"skip"!==t)throw new TypeError("Numerical missing policy must be propagate or skip");return t}function br(e){if(!Number.isSafeInteger(e)||e<=0)throw new RangeError("Numerical period must be a positive safe integer")}function hr(e,t,l,o){br(t);const n=dr(l),r=new Array(e.length).fill(NaN),a=[];for(let l=0;l<e.length;l++){const i=e[l];"skip"!==n||Number.isFinite(i)?(a.push(i),a.length>t&&a.shift(),a.length===t&&a.every(Number.isFinite)&&(r[l]=o(a))):l>0&&(r[l]=r[l-1])}return r}function gr(e,t,l={}){return hr(e,t,l,e=>{const l=e.slice().sort((e,t)=>e-t),o=Math.floor(t/2);if(t%2!=0)return l[o];const n=l[o-1],r=l[o];return n===r?n:n/2+r/2})}function kr(e,t,l={}){return hr(e,t,l,e=>{const t=new Map;let l=1/0,o=0;for(const n of e){const e=(t.get(n)??0)+1;t.set(n,e),(e>o||e===o&&n<l)&&(l=n,o=e)}return l})}function wr(e,t,l={}){if(void 0!==l.sample&&"boolean"!=typeof l.sample)throw new TypeError("Numerical sample option must be boolean");return hr(e,t,l,e=>{if(l.sample&&1===t)return NaN;const o=e[0];let n=0;for(const l of e){const e=l-o;if(!Number.isFinite(e))return 1/0;n+=e/t}const r=l.sample?t-1:t;let a=0;for(const t of e){const e=t-o-n;a+=e/r*e}return a})}function vr(e,t,l={}){return hr(e,t,l,e=>{let t=1/0,l=-1/0;for(const o of e)t=Math.min(t,o),l=Math.max(l,o);return l-t})}function Cr(e,t,l,o={}){if(!Number.isFinite(l)||l<0||l>100)throw new RangeError("Numerical percentage must be finite and between 0 and 100");return hr(e,t,o,e=>{const o=e.slice().sort((e,t)=>e-t),n=l/100*(t-1),r=Math.floor(n),a=Math.ceil(n),i=n-r;return o[r]===o[a]?o[r]:o[r]*(1-i)+o[a]*i})}function Nr(e,t,l={}){return hr(e,t,l,e=>{const l=e.map((e,t)=>({value:e,index:t})).sort((e,t)=>e.value-t.value),o=new Array(t);for(let e=0;e<t;){let n=e+1;for(;n<t&&l[n].value===l[e].value;)n++;const r=(e+n-1)/2;for(let t=e;t<n;t++)o[l[t].index]=r;e=n}const n=(t-1)/2;let r=0,a=0,i=0;for(let e=0;e<t;e++){const t=o[e]-n,l=e-n;r+=t*l,a+=t*t,i+=l*l}const s=Math.sqrt(a)*Math.sqrt(i);return 0===s?NaN:Math.max(-100,Math.min(100,100*r/s))})}function Mr(e,t,l){let o=0,n=0;for(let r=0;r<e.length;r++){const a=e[r]/t*(l?e.length-r:1),i=o+a;n+=Math.abs(o)>=Math.abs(a)?o-i+a:a-i+o,o=i}return o+n}function Ar(e,t,l={}){return hr(e,t,l,e=>{const t=Mr(e,1,!1);if(0===t)return NaN;const l=Mr(e,1,!0);if(Number.isFinite(t)&&Number.isFinite(l))return-l/t;let o=0;for(const t of e)o=Math.max(o,Math.abs(t));const n=2**Math.min(1023,Math.floor(Math.log2(o))),r=Number.isFinite(t)?t/n:Mr(e,n,!1),a=Mr(e,n,!0);return 0===r?Number.isFinite(t)?-a/t*n:NaN:-a/r})}function xr(e,t,l){const o=dr(t),n=new Array(e.length).fill(NaN);let r=NaN,a=!1;for(let t=0;t<e.length;t++){const i=e[t];Number.isFinite(i)?a||(Number.isNaN(r)||(l?i>r:i<r))&&(r=i):"propagate"===o&&(a=!0),a||(n[t]=r)}return n}function Sr(e,t={}){return xr(e,t,!1)}function Lr(e,t={}){return xr(e,t,!0)}function Br(e,t,l,o){if(e.length!==t.length)throw new RangeError("Numerical crossing arrays must have equal lengths");const n=dr(l),r=new Array(e.length).fill(!1);let a=NaN,i=NaN;for(let l=0;l<e.length;l++){if(!Number.isFinite(e[l])||!Number.isFinite(t[l])){"propagate"===n&&(a=NaN,i=NaN);continue}const s=e[l]>t[l]&&a<=i,c=e[l]<t[l]&&a>=i;r[l]="above"===o?s:"below"===o?c:s||c,a=e[l],i=t[l]}return r}function Kr(e,t,l={}){return Br(e,t,l,"above")}function Fr(e,t,l={}){return Br(e,t,l,"below")}function Wr(e,t,l={}){return Br(e,t,l,"either")}function Dr(e,t,l,o){br(t);const n=dr(l),r=new Array(e.length).fill(!1),a=[];for(let l=0;l<e.length;l++){const i=e[l];Number.isFinite(i)&&a.length===t&&(r[l]=a.every(e=>Number.isFinite(e)&&(o?i>e:i<e))),("propagate"===n||Number.isFinite(i))&&(a.push(i),a.length>t&&a.shift())}return r}function Rr(e,t,l={}){return Dr(e,t,l,!0)}function Or(e,t,l={}){return Dr(e,t,l,!1)}function Tr(e){throw new g(`Requested context: ${e}`)}function Ur(e){if(null===e||"object"!=typeof e||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function Pr(e,t,l){Object.defineProperty(e,t,{value:l,enumerable:!0,writable:!0,configurable:!0})}function Ir(e,t){Ur(e)&&Array.isArray(e.bars)&&Array.isArray(e.availableAt)&&Array.isArray(e.confirmed)||Tr("snapshot must contain bars, availableAt and confirmed arrays");const l=e.bars.length;e.availableAt.length===l&&e.confirmed.length===l||Tr("snapshot arrays must have equal lengths"),"function"!=typeof t&&Tr("expression must be a function");const o=[],n=[];let r=-1/0,a=-1/0,i=!1;for(let t=0;t<l;t++){const l=e.bars[t];(!Ur(l)||!Number.isFinite(l.time)||l.time<=r)&&Tr("bar times must be finite and strictly increasing"),(["open","high","low","close"].some(e=>"number"!=typeof l[e])||void 0!==l.volume&&"number"!=typeof l.volume||void 0!==l.oi&&"number"!=typeof l.oi)&&Tr("bar readings must be numbers");const s=e.availableAt[t];null!==s&&(!Number.isFinite(s)||s<l.time)&&Tr("availability must be null or finite and at or after bar opening"),"boolean"!=typeof e.confirmed[t]&&Tr("confirmation must be boolean"),r=l.time,o.push(Object.freeze({...l})),e.confirmed[t]&&null!==s||(i=!0),i||null===s||(a=Math.max(a,s),n.push(a))}const s={},c=Object.freeze(o);if(0===l)return{bars:c,eligibleAt:n,values:s};const u=t(c);Ur(u)||Tr("expression must return named columns");for(const e of Object.keys(u)){const t=u[e];Array.isArray(t)&&t.length===l||Tr("expression columns must match requested bar count");const o=[];for(let e=0;e<l;e++){const l=t[e];null!==l&&"number"!=typeof l&&Tr("expression values must be numbers or null"),o.push(null!==l&&Number.isFinite(l)?l:null)}Pr(s,e,o)}return{bars:c,eligibleAt:n,values:s}}function Vr(e,t,l,o={}){Array.isArray(e)||Tr("target times must be an array");let n=-1/0;for(const t of e)(!Number.isFinite(t)||t<=n)&&Tr("target times must be finite and strictly increasing"),n=t;(!Ur(o)||void 0!==o.gaps&&"carry"!==o.gaps&&"missing"!==o.gaps)&&Tr("gaps must be carry or missing");const{eligibleAt:r,values:a}=Ir(t,l),i=Object.keys(a),s={};for(const t of i)Pr(s,t,new Array(e.length).fill(null));let c=-1,u=-1;for(let t=0;t<e.length;t++){for(;c+1<r.length&&r[c+1]<=e[t];)c++;if(c>=0&&("missing"!==o.gaps||c!==u))for(const e of i)s[e][t]=a[e][c];u=c}return s}function Er(e,t,l,o={}){Array.isArray(e)||Tr("target windows must be an array");let n=-1/0;for(const t of e)(!Ur(t)||!Number.isFinite(t.start)||!Number.isFinite(t.end)||t.start>=t.end||t.start<n)&&Tr("windows must be finite, ordered and nonoverlapping with start < end"),n=t.end;Ur(o)&&(void 0===o.asOf||Number.isFinite(o.asOf))||Tr("asOf must be finite");const{bars:r,eligibleAt:a,values:i}=Ir(t,l),s=Object.keys(i),c={times:e.map(()=>[]),values:{}};for(const t of s)Pr(c.values,t,e.map(()=>[]));let u=0;for(let t=0;t<e.length;t++){const{start:l,end:n}=e[t],p=Math.min(n,o.asOf??1/0);for(;u<a.length&&r[u].time<l;)u++;for(;u<a.length&&r[u].time<n;){if(a[u]<=p){c.times[t].push(r[u].time);for(const e of s)c.values[e][t].push(i[e][u])}u++}}return c}const qr="__requestedIndicator",Hr={bars:[],availableAt:[],confirmed:[]},$r=e=>e[qr],zr=e=>{throw new g(`Requested indicator: ${e}`)};function jr(e){"function"==typeof e.request&&"function"==typeof e.expression||zr("request and expression must be functions"),void 0!==e.gaps&&"carry"!==e.gaps&&"missing"!==e.gaps&&zr("gaps must be carry or missing"),void 0!==e.targetTimes&&"function"!=typeof e.targetTimes&&zr("targetTimes must be a function");const t=[...new Set(e.plots.flatMap(e=>void 0===e.ohlc?[e.key]:[e.ohlc.open,e.ohlc.high,e.ohlc.low,e.ohlc.close]))],l=new WeakMap;return{id:e.id,name:e.name,category:e.category,placement:e.placement,inputs:e.inputs,plots:e.plots,levels:e.levels,range:e.range,calc:(o,n,r,a)=>{const i=$r(r);try{const s={...i?.context,bars:o,settings:n,calculation:a},c=e.targetTimes?.(s)??o.map(e=>e.time);Array.isArray(c)&&c.length===o.length||zr("target times must match source length");const u=Vr(c,i?.snapshot??Hr,t=>e.expression(t,n,s),{gaps:e.gaps});for(const e of t)i?.snapshot?.bars.length&&!Object.prototype.hasOwnProperty.call(u,e)&&zr(`expression is missing plot column ${e}`),Object.prototype.hasOwnProperty.call(u,e)||Object.defineProperty(u,e,{value:new Array(o.length).fill(null),enumerable:!0,writable:!0,configurable:!0});return l.delete(r),u}catch(e){throw l.set(r,{snapshot:i?.snapshot??null,error:e}),e}},attach:t=>{const o=$r(t.store)??{owner:0,key:null,completed:null,wanted:null,request:null,snapshot:null,context:null,status:{state:"empty"}};t.store[qr]=o;const n=++o.owner;let r=!0,a=0,i=0,s=null,c=()=>{};const u=()=>r&&o.owner===n&&!t.signal?.aborted,p=e=>{o.status=e,u()&&t.setDataStatus?.(e)},y=()=>{const e=o.request;o.request=null,s=null,e?.controller.abort(),e?.reject(e.controller.signal.reason)},f=()=>{o.completed=null,o.wanted=null;const e=null!==o.snapshot;o.snapshot=null,y(),e&&t.requestRecompute()},m=e=>{s!==e&&(s=e,e.promise.then(n=>{if(!u()||o.request!==e||e.controller.signal.aborted)return;let r;try{r=function(e,t){let l=[];Vr([],e,e=>(l=e,{}));let o=l.length;if(void 0!==t)for(o=0;o<l.length&&e.confirmed[o]&&null!==e.availableAt[o]&&e.availableAt[o]<=t;)o++;return Object.freeze({bars:Object.freeze(l.slice(0,o)),availableAt:Object.freeze(e.availableAt.slice(0,o)),confirmed:Object.freeze(e.confirmed.slice(0,o))})}(n,e.selection.request.asOf)}catch(t){return void d(e,t)}o.request=null,s=null;const a=o.snapshot;o.snapshot=r,o.completed=e.selection.version;try{t.requestRecompute();const e=l.get(t.store);if(e?.snapshot===r)throw e.error}catch(t){return void(u()&&o.snapshot===r&&o.key===e.selection.key&&(o.snapshot=a,p({state:"error",error:t}),o.wanted?.version!==e.selection.version&&g()))}u()&&o.snapshot===r&&(null===o.request&&p({state:r.bars.length?"ready":"empty"}),g())},t=>d(e,t)))},d=(e,t)=>{u()&&o.request===e&&!e.controller.signal.aborted&&(o.request=null,s=null,o.completed=e.selection.version,p({state:"error",error:t}),o.wanted?.version!==e.selection.version&&g())},b=e=>{if(u()&&o.request===e&&!e.controller.signal.aborted&&!e.started){e.started=!0;try{e.resolve(t.requestSnapshot({...e.selection.request,signal:e.controller.signal}))}catch(t){e.reject(t)}}},g=(l=!1)=>{if(!u()||or(t.dataContext?.()))return;const n=++i,r=()=>u()&&i===n,s=o.context?.requestState?.replay,c=t.requestState?.(),y=c?.replay,d={bars:t.bars(),settings:t.settings(),dataContext:t.dataContext?.(),requestState:c};let g;o.context=d;let k="";try{const t=e.request(d);g=null===t?null:function(e,t){let l;(null===e||"object"!=typeof e||"string"!=typeof e.symbol||""===e.symbol.trim()||"string"!=typeof e.interval||""===e.interval.trim()||void 0!==e.exchange&&"string"!=typeof e.exchange||!Number.isFinite(e.from)||!Number.isFinite(e.to)||e.from>e.to||void 0!==e.asOf&&!Number.isFinite(e.asOf))&&zr("request requires an instrument and a finite ordered time window");try{l=void 0===e.variant?nr(t?.variant):h(e.variant)}catch{zr("request variant must be a data variant")}return{symbol:e.symbol,exchange:e.exchange,interval:e.interval,from:e.from,to:e.to,asOf:e.asOf,...l?{variant:l}:{}}}(t,d.dataContext),k=M(d.dataContext?.variant)}catch(e){return void(r()&&(f(),r()&&p({state:"error",error:e})))}if(!r())return;if(null===g||void 0===t.requestSnapshot||!1===c?.supportsSnapshots||void 0!==y&&void 0===y.asOf)return f(),void(r()&&(o.key=null,p({state:"unsupported"})));if(0===d.bars.length)return f(),void(r()&&p({state:"empty"}));const w=c?.source,v=d.dataContext,C=JSON.stringify([g.symbol,g.exchange,g.interval,g.asOf,v?.symbol,v?.exchange,v?.interval,k,g.variant??null,c?.providerRevision,w?.sourceId,void 0===y?w?.historyRevision:null,void 0!==y]),N=void 0!==y?.asOf&&void 0!==s?.asOf&&y.asOf<s.asOf;if(o.key!==C||N){if(f(),!r())return;o.key=C}void 0!==y?.asOf&&(g.asOf=void 0===g.asOf?y.asOf:Math.min(g.asOf,y.asOf));const A=JSON.stringify([C,g.from,g.to,g.asOf,void 0===y?w?.revision:null,c?.dataRevision,y?.time,y?.forming,a]),x={key:C,version:A,request:g};o.wanted=x,null!==o.request?(m(o.request),b(o.request)):(l||o.completed!==A)&&(e=>{let t,l;const n={selection:e,controller:new AbortController,started:!1,promise:new Promise((e,o)=>{t=e,l=o}),resolve:t,reject:l};o.request=n,m(n),p({state:"loading"}),b(n)})(x)},k=()=>{r&&(r=!1,c(),t.signal?.removeEventListener("abort",w),o.owner===n&&(t.setDataRetry?.(null),queueMicrotask(()=>{o.owner===n&&y()})))},w=()=>{o.owner===n&&y(),k()};t.signal?.addEventListener("abort",w,{once:!0}),c=void 0!==t.subscribeRequestChanges?t.subscribeRequestChanges(()=>g()):t.subscribeDataChanges?.(()=>{a++,g()})??(()=>{}),t.setDataRetry?.(()=>g(!0));const v=l.get(t.store);return t.setDataStatus?.(v?.snapshot===o.snapshot?{state:"error",error:v.error}:o.status),g(),k}}}const Zr="indicators",Yr=[ve,Ne,Ce,Le,Me,Be,De,Ke,We,qe,He,$e,ze,je,Ze,Ye,Je,et,tt,lt,rt,at,st,...Tt,...Jt,...fl,...Cl,...Wl,...eo,...mo,...Lo,...$o,...rn,...Mn,...Dn,...lr];let Jr=!1;function Gr(){if(!Jr){Jr=!0;for(const e of Yr)A(e)}}Gr();export{Wl as ADAPTIVE_INDICATORS,lt as ADL,ze as ADX,Gl as ALLIGATOR,gt as ALMA,Cn as ALPHATREND,It as AROON,Vt as AROON_OSCILLATOR,Ye as ATR,il as AVERAGE_DAILY_RANGE,eo as AVERAGE_INDICATORS,Et as AWESOME_OSCILLATOR,qt as BALANCE_OF_POWER,nl as BB_TREND,Me as BOLLINGER,ol as BOLLINGER_BANDWIDTH,ll as BOLLINGER_PERCENT_B,Yr as BUILTIN_INDICATORS,je as CCI,hl as CHAIKIN_MONEY_FLOW,gl as CHAIKIN_OSCILLATOR,ul as CHAIKIN_VOLATILITY,Mt as CHANDELIER_EXIT,Nt as CHANDE_KROLL_STOP,Ht as CHANDE_MOMENTUM,rl as CHOPPINESS_INDEX,cl as CHOP_ZONE,Yt as CONNORS_RSI,nn as CONSOLIDATION_BREAKOUT,$t as COPPOCK_CURVE,vn as CPR,kt as DEMA,Ct as DONCHIAN,zt as DPO,kl as EASE_OF_MOVEMENT,wl as ELDER_FORCE_INDEX,Ne as EMA,vt as ENVELOPE,jt as FISHER_TRANSFORM,Cl as FLOW_INDICATORS,De as HALFTREND,al as HISTORICAL_VOLATILITY,wt as HMA,Ot as HULL_SUITE,We as ICHIMOKU,Lo as INDEX_INDICATORS,Zr as INDICATORS_TIER,xl as KAMA,Sl as KELTNER_CHANNEL,Bl as KLINGER_OSCILLATOR,Kl as KNOW_SURE_THING,Fl as LINREG_SLOPE,Ll as LSMA,He as MACD,xo as MASS_INDEX,xt as MA_CHANNEL,El as MA_CROSS,jl as MA_RIBBON,ql as MCGINLEY_DYNAMIC,Hl as MEDIAN,Ze as MFI,ro as MOMENTUM,vl as NET_VOLUME,Co as NVI,tt as OBV,rt as OPEN_INTEREST,st as OPEN_INTEREST_BUILDUP,at as OPEN_INTEREST_CHANGE,Jt as OSCILLATOR_INDICATORS,Tt as OVERLAY_INDICATORS,Ke as PARABOLIC_SAR,so as PPO,No as PVI,Ao as PVO,Mo as PVT,Nn as RANGE_ANALYSIS,$o as RANGE_INDICATORS,Io as RELATIVE_VIGOR_INDEX,Vo as RELATIVE_VOLATILITY_INDEX,ao as ROC,qe as RSI,on as RSI_DIVERGENCE,tr as SEASONALITY,lr as SEASONALITY_INDICATORS,rn as SIGNAL_INDICATORS,ve as SMA,fo as SMI,po as SMI_ERGODIC_INDICATOR,yo as SMI_ERGODIC_OSCILLATOR,Xl as SMMA,Ho as SPECIAL_K,pl as STANDARD_DEVIATION,yl as STANDARD_ERROR,At as STANDARD_ERROR_BANDS,$e as STOCHASTIC,To as STOCHASTIC_RSI,mo as STRENGTH_INDICATORS,Mn as STUDY_INDICATORS,Be as SUPERTREND,Ql as T3,Zl as TEMA,en as TREND_STRENGTH_INDEX,co as TRIX,uo as TSI,Yl as TWAP,So as ULCER_INDEX,Po as ULTIMATE_OSCILLATOR,fl as VOLATILITY_INDICATORS,Qo as VOLATILITY_STOP,et as VOLUME,_o as VORTEX,Le as VWAP,Jl as VWMA,Wn as WAVETREND,Dn as WAVETREND_INDICATORS,ln as WILLIAMS_FRACTALS,Uo as WILLIAMS_PERCENT_R,Je as WILLIAMS_VIX_FIX,Ce as WMA,Eo as WOODIES_CCI,Vr as alignRequestedExpression,_ as alma,de as barsSince,ue as cci,Ar as centerOfGravity,Y as change,Zt as connorsStreak,ce as correlation,jr as createRequestedIndicator,cr as createTier2Indicator,Wr as crosses,Kr as crossesAbove,Fr as crossesBelow,ne as cumulative,G as dev,Or as falling,$ as highest,ee as highestBars,nr as inheritedDataVariant,re as linreg,z as lowest,te as lowestBars,j as nulls,X as percentRank,Cr as percentileLinear,se as percentileNearestRank,pe as pivotHigh,ye as pivotLow,Nr as rankCorrelation,Gr as registerBuiltinIndicators,Er as requestedIntrabars,Rr as rising,q as rma,J as roc,gr as rollingMedian,kr as rollingMode,vr as rollingRange,oe as rollingSum,wr as rollingVariance,Lr as runningMax,Sr as runningMin,mr as securityExpression,fr as securitySeries,I as sma,Z as smaSeededEma,H as stdev,ie as stoch,ae as swma,be as valueWhen,Q as vwma,V as wma};
|
|
1
|
+
import{sourceValues as e,supertrend as t,atr as l,sourceValue as o,sessionStartFlags as n,calendarPeriodFlags as r,DEFAULT_TIMEZONE as a,isValidTimezone as i,isNewIstDay as s,isNewZonedDay as c,isNewZonedPeriod as u,utcSecondsToIstParts as p,IST_OFFSET_SECONDS as y,rsi as f,trueRange as m,withAlpha as d,isNewZonedWeek as h,isNewZonedMonth as b,utcSecondsToZonedParts as g,zonedWallClockToUtcSeconds as k,normalizeDataVariant as w,IndicatorInputError as v,resolveInterval as N,parseSessionSpec as C,bucketStartOf as M,zonedWeekIndex as A,zonedDayIndex as x,dataVariantKey as S,registerIndicator as L}from"./openalgo-charts.mjs";function F(e,t){const l=new Array(e.length).fill(NaN);if(e.length<t)return l;if(1===t){for(let t=0;t<e.length;t++){const o=e[t];Number.isFinite(o)&&(l[t]=0===o?0:o)}return l}let o=0;for(let n=0;n<e.length;n++){if(Number.isFinite(e[n])||o++,n>=t&&!Number.isFinite(e[n-t])&&o--,n<t-1||0!==o)continue;let r=0;for(let l=n-t+1;l<=n;l++)r+=e[l];Number.isFinite(r)&&(l[n]=r)}return l}function B(e,t){const l=F(e,t);if(1!==t)for(let e=0;e<l.length;e++)l[e]/=t;return l}function K(e,t){if(!Number.isSafeInteger(e)||e<=0)throw new RangeError("Missing-value period must be a positive safe integer");if(null===t||"object"!=typeof t||Array.isArray(t))throw new TypeError("Missing-value options must be an object");const l=void 0===t.missing?"propagate":t.missing;if("skip"!==l&&"propagate"!==l)throw new TypeError("Missing-value policy must be skip or propagate");return l}function W(e,t,l,o,n=!1){const r=K(t,l),a=new Array(e.length).fill(NaN),i=[];let s=0;for(let l=0;l<e.length;l++){const c=e[l],u=Number.isFinite(c);n&&u&&i.length===t&&0===s&&(a[l]=o(i,l)),("propagate"===r||u)&&(i.push({value:c,index:l}),u||s++,i.length>t&&!Number.isFinite(i.shift().value)&&s--),n||i.length!==t||0!==s||(a[l]=o(i,l))}return a}function D(e,t,l,o){if("number"!=typeof e)throw new TypeError(`${l} must contain numbers`);if(!(o&&Number.isNaN(e)||Number.isSafeInteger(e)&&!(e<t)))throw new RangeError(`${l} must be a safe integer greater than or equal to ${t}`)}function R(e,t,l,o){if(!Array.isArray(e))throw new TypeError(`${o} must be an array`);if(e.length!==t)throw new RangeError(`${o} array length must match the source`);for(let t=0;t<e.length;t++)D(e[t],l,o,!0)}function O(e,t,l,o,n=!1){R(t,e.length,1,"Window length");const r=K(1,void 0===l?{}:l),a=new Array(e.length).fill(NaN),i=[];let s=0;const c=(e,t)=>{const l=Number.isFinite(e);s=l?s+1:0,("propagate"===r||l)&&i.push({value:e,index:t})};for(let l=0;l<e.length;l++){const u=e[l];n||c(u,l);const p=t[l];!Number.isNaN(p)&&p<=i.length&&("skip"===r||p<=s)&&(!n||Number.isFinite(u))&&(a[l]=o(i.slice(i.length-p),l)),n&&c(u,l)}return a}function T(e,t){const l=new DataView(new ArrayBuffer(8)),o=(1n<<52n)-1n;let n=0n,r=0n;for(let a=0;a<e.length;a++){const i=BigInt(t?.[a]??1);if(0n===i)continue;l.setFloat64(0,e[a]);const s=l.getBigUint64(0),c=Number(s>>52n&0x7ffn),u=s&o,p=0===c?u:(1n<<52n|u)<<BigInt(c-1);n+=(s>>63n?-p:p)*i,r+=i}return function(e,t){const l=e<0n,o=l?-e:e,n=o/t,r=Math.max(0,n.toString(2).length-53),a=t<<BigInt(r);let i=o/a;const s=o%a;(2n*s>a||2n*s===a&&0n!=(1n&i))&&i++;const c=Number(i)*2**(r-1074);return l?-c:c}(n,r)}function U(e,t){let l=0,o=0,n=0,r=1/0,a=-1/0;for(let i=0;i<e.length;i++){const s=t?.[i]??1;if(0===s)continue;r=Math.min(r,e[i]),a=Math.max(a,e[i]),n+=s;const c=e[i]*s,u=l+c;o+=Math.abs(l)>=Math.abs(c)?l-u+c:c-u+l,l=u}if(r===a)return r;const i=l+o,s=Number.isFinite(i)&&Number.isSafeInteger(n)?i/n:T(e,t);return Math.max(r,Math.min(a,s))}function P(e){return U(e.map(e=>e.value))}function $(e,t){const l=e[0].value;let o=0,n=0,r=e.map(({value:e})=>{o=Math.max(o,Math.abs(e));const t=e-l;return n=Math.max(n,Math.abs(t)),t});if(0===n)return 0;const a=2**Math.min(1023,Math.floor(Math.log2(Number.isFinite(n)?n:o)));r=Number.isFinite(n)?r.map(e=>e/a):e.map(({value:e})=>e/a-l/a);const i=U(r),s=U(r.map(e=>{const l=Math.abs(e-i);return t?l*l:l}));return Math.min(o,(t?Math.sqrt(s):s)*a)}function I(e,t){let l=e[0];for(let o=1;o<e.length;o++){const n=e[o];(t?n.value>=l.value:n.value<=l.value)&&(l=n)}return l}function E(e,t,l,o){const n=K(t,l),r=new Array(e.length).fill(NaN);let a=0;const i=[];let s=NaN;for(let l=0;l<e.length;l++){const c=e[l];if(Number.isFinite(c)){if(a<t){if(i.push(c),++a<t)continue;s=U(i),i.length=0}else s=U([s,c],[t-1,o]);r[l]=s}else"propagate"===n?(a=0,i.length=0,s=NaN):a===t&&(r[l]=s)}return r}function V(e,t,l){if("number"!=typeof t)return O(e,t,l,P);if(void 0!==l)return W(e,t,l,P);if(Number.isSafeInteger(t)&&t>0)return B(e,t);const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;let r=0,a=0;for(let l=0;l<o;l++){const o=e[l];if(Number.isFinite(o)?r+=o:a+=1,l>=t){const o=e[l-t];Number.isFinite(o)?r-=o:a-=1}l>=t-1&&(n[l]=0===a?r/t:NaN)}return n}function q(e,t,l){if("number"!=typeof t)return O(e,t,l,e=>U(e.map(e=>e.value),e.map((e,t)=>t+1)));if(void 0!==l)return W(e,t,l,e=>U(e.map(e=>e.value),e.map((e,t)=>t+1)));const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;const r=t*(t+1)/2,a=Number.isSafeInteger(t);for(let l=t-1;l<o;l++){let o=0;for(let n=0;n<t;n++){const r=a?t-1-n:n;o+=e[l-r]*(t-r)}const i=o/r;a&&!Number.isFinite(i)||(n[l]=i)}return n}function H(e,t,l){const o=new Array(e.length).fill(NaN);if(e.length<t)return o;const n=2/(t+1);let r=0,a=NaN,i=!1;for(let s=0;s<e.length;s++){const c=e[s];if(Number.isFinite(c)){if(i)a=l?c*n+a*(1-n):(a*(t-1)+c)/t;else{if(++r<t)continue;let l=0;for(let o=s+1-t;o<=s;o++)l+=e[o];const o=l/t;if(!Number.isFinite(o))continue;a=0===o?0:o,i=!0}Number.isFinite(a)&&(o[s]=0===a?0:a)}else r=0}return o}function j(e,t,l){if(void 0!==l)return E(e,t,l,1);if(Number.isSafeInteger(t)&&t>0)return H(e,t,!1);const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;let r=0;for(let l=0;l<t;l++)r+=e[l];let a=r/t;n[t-1]=a;for(let l=t;l<o;l++)a=(a*(t-1)+e[l])/t,n[l]=a;return n}function z(e,t,l){if("number"!=typeof t)return O(e,t,l,e=>$(e,!0));if(void 0!==l)return W(e,t,l,e=>$(e,!0));const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;const r=V(e,t),a=Number.isSafeInteger(t);for(let l=t-1;l<o;l++){let o=0;const i=r[l];for(let n=0;n<t;n++){const r=e[l-(a?t-1-n:n)]-i;o+=r*r}const s=Math.sqrt(o/t);a&&!Number.isFinite(s)||(n[l]=s)}return n}function Z(e,t,l){if("number"!=typeof t)return O(e,t,l,e=>I(e,!0).value);if(void 0!==l)return W(e,t,l,e=>I(e,!0).value);const o=e.length,n=new Array(o).fill(NaN);if(t<=0)return n;for(let l=t-1;l<o;l++){let o=-1/0;for(let n=0;n<t;n++)e[l-n]>o&&(o=e[l-n]);n[l]=o}return n}function Y(e,t,l){if("number"!=typeof t)return O(e,t,l,e=>I(e,!1).value);if(void 0!==l)return W(e,t,l,e=>I(e,!1).value);const o=e.length,n=new Array(o).fill(NaN);if(t<=0)return n;for(let l=t-1;l<o;l++){let o=1/0;for(let n=0;n<t;n++)e[l-n]<o&&(o=e[l-n]);n[l]=o}return n}function J(e){const t=new Array(e.length);for(let l=0;l<e.length;l++){const o=e[l];t[l]=Number.isFinite(o)?o:null}return t}function G(e,t,l){if(void 0!==l)return E(e,t,l,2);if(Number.isSafeInteger(t)&&t>0)return H(e,t,!0);const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;let r=0;for(let l=0;l<t;l++)r+=e[l];let a=r/t;n[t-1]=a;const i=2/(t+1);for(let l=t;l<o;l++)a=e[l]*i+a*(1-i),n[l]=a;return n}function X(e,t=1){const l=e.length,o=new Array(l).fill(NaN);for(let n=t;n<l;n++)o[n]=e[n]-e[n-t];return o}function _(e,t){const l=e.length,o=new Array(l).fill(NaN);if(t<=0)return o;for(let n=t;n<l;n++){const l=e[n-t];o[n]=0===l?NaN:100*(e[n]-l)/l}return o}function Q(e,t,l){if("number"!=typeof t)return O(e,t,l,e=>$(e,!1));if(void 0!==l)return W(e,t,l,e=>$(e,!1));const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;const r=V(e,t),a=Number.isSafeInteger(t);for(let l=t-1;l<o;l++){let o=0;for(let n=0;n<t;n++)o+=Math.abs(e[l-(a?t-1-n:n)]-r[l]);const i=o/t;a&&!Number.isFinite(i)||(n[l]=i)}return n}function ee(e,t,l){if("number"!=typeof t)return O(e,t,l,(t,l)=>{let o=0;for(const n of t)n.value<=e[l]&&o++;return 100*o/t.length},!0);if(void 0!==l)return W(e,t,l,(l,o)=>{let n=0;for(const t of l)t.value<=e[o]&&n++;return 100*n/t},!0);const o=e.length,n=new Array(o).fill(NaN);if(t<=0)return n;for(let l=t;l<o;l++){let o=0;for(let n=1;n<=t;n++)e[l-n]<=e[l]&&(o+=1);n[l]=100*o/t}return n}function te(e,t,l,o){const n=e.length,r=new Array(n).fill(NaN);if(t<=0||o<=0||n<t)return r;const a=l*(t-1),i=t/o,s=new Array(t);let c=0;for(let e=0;e<t;e++){const t=Math.exp(-(e-a)*(e-a)/(2*i*i));s[e]=t,c+=t}if(0===c)return r;for(let l=t-1;l<n;l++){let o=0;for(let n=0;n<t;n++)o+=e[l-(t-1-n)]*s[n];r[l]=o/c}return r}function le(e,t,l){const o=e.length,n=new Array(o);for(let l=0;l<o;l++)n[l]=e[l]*(t[l]??0);const r=V(n,l),a=V(t,l),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 oe(e,t,l){return"number"!=typeof t?O(e,t,l,(e,t)=>I(e,!0).index-t):void 0!==l?W(e,t,l,(e,t)=>I(e,!0).index-t):re(e,t,!0)}function ne(e,t,l){return"number"!=typeof t?O(e,t,l,(e,t)=>I(e,!1).index-t):void 0!==l?W(e,t,l,(e,t)=>I(e,!1).index-t):re(e,t,!1)}function re(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;for(let r=t-1;r<o;r++){let o=e[r],a=0;for(let n=1;n<t;n++){const t=e[r-n];(l?t>o:t<o)&&(o=t,a=n)}n[r]=0===a?0:-a}return n}function ae(e,t){if(Number.isSafeInteger(t)&&t>0)return F(e,t);const l=e.length,o=new Array(l).fill(NaN);if(t<=0||l<t)return o;let n=0;for(let r=0;r<l;r++)n+=e[r],r>=t&&(n-=e[r-t]),r>=t-1&&(o[r]=n);return o}function ie(e){const t=e.length,l=new Array(t);let o=0;for(let n=0;n<t;n++){const t=e[n];Number.isFinite(t)&&(o+=t),l[n]=o}return l}function se(e,t,l=0){const o=e.length,n=new Array(o).fill(NaN);if(t<=1||o<t)return n;const r=(t-1)*t/2,a=t*((t-1)*t*(2*t-1)/6)-r*r;if(0===a)return n;for(let i=t-1;i<o;i++){let o=0,s=0;for(let l=0;l<t;l++){const n=e[i-(t-1-l)];o+=n,s+=n*l}const c=(t*s-r*o)/a,u=(o-c*r)/t;n[i]=u+c*(t-1-l)}return n}function ce(e){const t=e.length,l=new Array(t).fill(NaN);for(let o=3;o<t;o++)l[o]=(e[o-3]+2*e[o-2]+2*e[o-1]+e[o])/6;return l}function ue(e,t,l,o){const n=e.length,r=new Array(n).fill(NaN),a=Z(t,o),i=Y(l,o);for(let t=0;t<n;t++){const l=a[t]-i[t];r[t]=0===l?NaN:100*(e[t]-i[t])/l}return r}function pe(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;for(let r=t-1;r<o;r++){const o=e.slice(r-t+1,r+1);if(o.some(e=>!Number.isFinite(e)))continue;o.sort((e,t)=>e-t);const a=Math.max(1,Math.ceil(l/100*t));n[r]=o[a-1]}return n}function ye(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(l<=1||o<l)return n;for(let r=l-1;r<o;r++){let o=0,a=0,i=0,s=0,c=0;for(let n=r-l+1;n<=r;n++)o+=e[n],a+=t[n];const u=o/l,p=a/l;for(let o=r-l+1;o<=r;o++){const l=e[o]-u,n=t[o]-p;i+=l*n,s+=l*l,c+=n*n}const y=i/l/(Math.sqrt(s/l)*Math.sqrt(c/l));Number.isFinite(y)&&(n[r]=y)}return n}function fe(e,t){const l=e.length,o=new Array(l).fill(NaN),n=V(e,t),r=Q(e,t);for(let t=0;t<l;t++)o[t]=0===r[t]?NaN:(e[t]-n[t])/(.015*r[t]);return o}function me(e,t,l){return"number"!=typeof t||"number"!=typeof l?he(e,t,l,!0):be(e,t,l,!0)}function de(e,t,l){return"number"!=typeof t||"number"!=typeof l?he(e,t,l,!1):be(e,t,l,!1)}function he(e,t,l,o){for(const[o,n]of[["Left pivot width",t],["Right pivot width",l]])"number"==typeof n?D(n,0,o,!1):R(n,e.length,0,o);const n=new Array(e.length).fill(NaN);for(let r=0;r<e.length;r++){const a="number"==typeof t?t:t[r],i="number"==typeof l?l:l[r];if(Number.isNaN(a)||Number.isNaN(i)||i>r||a>r-i)continue;const s=r-i,c=e[s];if(!Number.isFinite(c))continue;let u=!0;for(let t=s-a;t<=r&&u;t++){if(t===s)continue;const l=e[t];Number.isFinite(l)&&!(o?l>=c:l<=c)||(u=!1)}u&&(n[r]=c)}return n}function be(e,t,l,o){const n=e.length,r=new Array(n).fill(NaN);for(let a=t+l;a<n;a++){const n=a-l,i=e[n];if(!Number.isFinite(i))continue;let s=!0;for(let l=1;l<=t&&s;l++){const t=e[n-l];Number.isFinite(t)&&!(o?t>=i:t<=i)||(s=!1)}for(let t=1;t<=l&&s;t++){const l=e[n+t];Number.isFinite(l)&&!(o?l>=i:l<=i)||(s=!1)}s&&(r[a]=i)}return r}function ge(e){const t=e.length,l=new Array(t).fill(NaN);let o=-1;for(let n=0;n<t;n++)e[n]&&(o=n),o>=0&&(l[n]=n-o);return l}function ke(e,t,l){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-l;o>=0&&(n[a]=t[r[o]])}return n}const we=new WeakMap,ve=e=>Number.isFinite(e)?e:null,Ne=e=>Number.isSafeInteger(e)&&e>0;function Ce(e){return(t,l,o,n,r,a)=>{const i=e(t,l,o,n,r,a);if(null===i)return null;for(const e of Object.keys(n))if(!Object.prototype.hasOwnProperty.call(i,e)){const e="object"==typeof r&&null!==r?we.get(r):void 0;return void 0!==e&&(e.misses=3),null}return i}}function Me(e,t){const l={...e,calc:(o=e.calc,(e,t,l,n)=>{if("object"==typeof l&&null!==l){const e=we.get(l);we.set(l,{owner:o,misses:e?.owner===o?e.misses:0})}return o(e,t,l,n)})};var o;return Object.defineProperty(l,"calcTail",{value:Ce(t(e.calc)),enumerable:!1,writable:!0,configurable:!0}),l}function Ae(e,t,l,o){if("object"!=typeof e||null===e||!Number.isSafeInteger(o)||o<0||o>=l.length)return;const n=we.get(e);return void 0!==n&&n.owner===t&&n.misses<3?n:void 0}function xe(e){return e.misses++,null}function Se(e){if(Array.isArray(e))return e.map(Se);if(null!==e&&"object"==typeof e){const t={};for(const l of Object.keys(e))t[l]=Se(e[l]);return t}return e}function Le(e,t,l,o,n){const r={};for(const a of Object.keys(t)){const i=t[a];if(n>0){const t=o[a];if(void 0===t||t.length<n||!Object.is(t[n-1]??null,i[l-1]??null))return xe(e)}r[a]=i.slice(l)}return e.misses=0,r}function Fe(e,t){return(l,o,n,r,a,i)=>{const s=Ae(a,e,l,n),c=t(o);if(void 0===s||null===c)return null;const u=Math.max(0,n-1-c);return Le(s,e(0===u?l:l.slice(u),o,a,i),n-u,r,n)}}function Be(e,t,l,o,n,r,a){const i=Ae(a,e,o,n);if(void 0===i)return null;const s=function(e,t,l,o){const n=e.at;return void 0===n||n.key!==t||n.index!==o-1||0!==o&&n.time!==l[o-1].time?void 0:n}(i,t,o,n);let c,u;if(void 0!==s)c=Se(s.state),u=s.row.slice();else{c=l.start(),u=l.keys.map(()=>null);for(let e=0;e<n;e++)l.step(c,e,u)}if(!function(e,t,l,o){if(0===o)return!0;for(let n=0;n<t.length;n++){const r=e[t[n]];if(void 0===r||r.length<o||!Object.is(r[o-1]??null,l[n]))return!1}return!0}(r,l.keys,u,n))return xe(i);if(!1===l.ready?.(c))return null;const p=o.length,y=l.keys.map(()=>new Array(p-n));for(let e=n;e<p;e++){e===p-1&&(i.at={key:t,index:e-1,time:e>0?o[e-1].time:NaN,state:Se(c),row:u.slice()}),l.step(c,e,u);for(let t=0;t<y.length;t++)y[t][e-n]=u[t]}i.misses=0;const f={};return l.keys.forEach((e,t)=>{f[e]=y[t]}),f}const Ke=()=>({run:0,value:NaN,seeded:!1,recent:[]});function We(e,t,l,o){if(!Number.isFinite(t))return e.run=0,e.recent.length=0,NaN;if(e.seeded){const n=2/(l+1);e.value=o?t*n+e.value*(1-n):(e.value*(l-1)+t)/l}else{const o=e.recent;if(o.push(t),o.length>l&&o.shift(),++e.run<l)return NaN;let n=0;for(let e=0;e<o.length;e++)n+=o[e];const r=n/l;if(!Number.isFinite(r))return NaN;e.value=0===r?0:r,e.seeded=!0,o.length=0}return Number.isFinite(e.value)?0===e.value?0:e.value:NaN}const De=()=>({count:0,seed:[],value:NaN});function Re(e,t){const l=e[t];if(0===t)return l.high-l.low;const o=e[t-1].close;return Math.max(l.high-l.low,Math.abs(l.high-o),Math.abs(l.low-o))}const Oe=()=>({a:NaN,run:0,recent:[]});function Te(e,t,l){if(!Number.isFinite(t))return e.run=0,e.recent.length=0,NaN;if(e.run++,Number.isNaN(e.a)){const o=e.recent;if(o.push(t),o.length>l&&o.shift(),e.run>=l){let t=0;for(let e=0;e<o.length;e++)t+=o[e];Number.isFinite(t/l)&&(e.a=t/l,o.length=0)}}else e.a=(e.a*(l-1)+t)/l;return Number.isFinite(e.a)?e.a:NaN}const Ue=()=>({primed:!1,last:NaN,gain:NaN,loss:NaN,gainSeeded:!1,lossSeeded:!1,run:0,recent:[]});const Pe=()=>({atr:{a:NaN,run:0,recent:[]},upper:NaN,lower:NaN,st:NaN,close:NaN,started:!1});function $e(e,t,l){if(t<l-1)return NaN;if(1===l){const l=e(t);return Number.isFinite(l)?0===l?0:l:NaN}let o=0;for(let n=t-l+1;n<=t;n++){const t=e(n);if(!Number.isFinite(t))return NaN;o+=t}return Number.isFinite(o)?o/l:NaN}const Ie=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Ee=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Ve=(e,t="source")=>e[t]??"close",qe=e=>{const t=e.timezone;return"string"!=typeof t||""===t||t===a?a:i(t)?t:a};function He(t,l,n,r,a){return Me({id:t,name:l,category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close",allowStudyOutputs:!0},{key:"color",type:"color",label:"Color",default:n}],plots:[{key:"ma",type:"line",title:l,colorKey:"color",style:{color:n,lineWidth:1.5}}],calc:(t,l,o,n)=>{const a=Ve(l),i="string"==typeof a?e(t,a):e(t,a,n).map(e=>e??NaN);return{ma:J(r(i,Ie(l,"length",9),"string"==typeof a?void 0:{missing:"propagate"}))}}},e=>a?function(e){return(t,l,n,r,a,i)=>{const s=Ie(l,"length",9);if(!Ne(s))return null;const c=Ve(l);if("string"==typeof c)return Be(e,`${s}|${c}`,{keys:["ma"],start:Ke,step:(e,l,n)=>{n[0]=ve(We(e,o(t[l],c),s,!0))}},t,n,r,a);if(void 0===Ae(a,e,t,n))return null;const u=i?.resolveSource?.(c);return Array.isArray(u)&&u.length===t.length?Be(e,`${s}|${c.instanceId}|${c.plotKey}`,{keys:["ma"],start:De,step:(e,t,l)=>{l[0]=ve(function(e,t,l){if(!Number.isFinite(t))return e.count=0,e.seed.length=0,e.value=NaN,NaN;if(e.count<l){if(e.seed.push(t),++e.count<l)return NaN;e.value=U(e.seed),e.seed.length=0}else e.value=U([e.value,t],[l-1,2]);return e.value}(e,u[t]??NaN,s))}},t,n,r,a):null}}(e):function(e,t){const l=Fe(e,e=>{const t=Ie(e,"length",9);return Ne(t)?t-1:null});return(o,n,r,a,i,s)=>{const c=Ve(n);if("string"==typeof c)return l(o,n,r,a,i,s);const u=Ie(n,"length",9),p=Ae(i,e,o,r),y=void 0===p?void 0:s?.resolveSource?.(c);if(void 0===p||!Ne(u)||!Array.isArray(y)||y.length!==o.length)return null;const f=Math.max(0,r-u),m=y.slice(f).map(e=>e??NaN);return Le(p,{ma:J(t(m,u,{missing:"propagate"}))},r-f,a,r)}}(e,r))}const je=He("sma","SMA","#4f8cff",V,!1),ze=He("wma","WMA","#ab47bc",q,!1),Ze=He("ema","EMA","#f5a623",G,!0);const Ye=Me({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:function(t,l){const o=e(t,Ve(l)),n=Ie(l,"length",20),r=Ie(l,"stdDev",2),a=V(o,n),i=z(o,n),s=a.map((e,t)=>e+r*i[t]),c=a.map((e,t)=>e-r*i[t]);return{upper:J(s),basis:J(a),lower:J(c)}}},e=>Fe(e,e=>{const t=Ie(e,"length",20);return Ne(t)?t-1:null})),Je=e=>Math.floor(((e=>Math.floor((e+y)/86400))(e)-4)/7);function Ge(e,t){return t===a?(t,l)=>function(e,t,l){if("week"===e)return Je(t)!==Je(l);const o=p(t),n=p(l);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,t,l):(l,o)=>u(l,o,e,t)}function Xe(e,t,l){if("continuous"===t)return new Array(e.length).fill(!1);const o=e.map(e=>e.time);return"session"===t?n(o,l):r(o,Ge(t,l))}function _e(e,t){if(0===t)return e.slice();const l=new Array(e.length).fill(NaN);for(let o=0;o<e.length;o++){const n=o+t;n>=0&&n<e.length&&(l[n]=e[o])}return l}const Qe=e=>e.median>0&&e.median<86400,et=e=>Math.max(4*e.median,14400),tt=e=>Qe(e)&&e.opens>0&&e.short>e.opens>>1;function lt(e,t){const l=[];for(let t=1;t<e.length;t++)e[t]>e[t-1]&&l.push(e[t]-e[t-1]);l.sort((e,t)=>e-t);const o=0===l.length?0:l[l.length>>1],n={gaps:l.length,median:o,below:0,equal:0,opens:0,short:0,open:e[0],last:e[e.length-1],flag:t};for(const e of l)e<o?n.below++:e===o&&n.equal++;if(Qe(n))for(let t=1;t<e.length;t++)e[t]-e[t-1]<et(n)||(n.opens++,e[t]-n.open<=129600&&n.short++,n.open=e[t]);return n}const ot=Me({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:(t,l)=>{const o=t.length,n=e(t,Ve(l)),r="string"==typeof l.anchor?l.anchor:"session",a="percent"===l.calcMode,i=Math.round(Ie(l,"offset",0)),s=new Array(o).fill(NaN),c=new Array(o).fill(NaN),u=Xe(t,r,qe(l));let p=0,y=0,f=0;for(let e=0;e<o;e++){u[e]&&(p=0,y=0,f=0);const l=t[e].volume??0,o=n[e];if(!Number.isFinite(o)||!Number.isFinite(l))continue;if(p+=o*l,f+=o*o*l,y+=l,y<=0)continue;const r=p/y;s[e]=r;const i=Math.max(0,f/y-r*r);c[e]=a?.01*r:Math.sqrt(i)}const m=(e,t,l)=>{const n=new Array(o).fill(NaN);if(!e)return n;for(let e=0;e<o;e++)Number.isFinite(s[e])&&Number.isFinite(c[e])&&(n[e]=s[e]+l*c[e]*t);return n},d=!1!==l.showBand1,h=!0===l.showBand2,b=!0===l.showBand3,g=Ie(l,"bandMult1",1),k=Ie(l,"bandMult2",2),w=Ie(l,"bandMult3",3);return{vwap:J(_e(s,i)),upper1:J(_e(m(d,g,1),i)),lower1:J(_e(m(d,g,-1),i)),upper2:J(_e(m(h,k,1),i)),lower2:J(_e(m(h,k,-1),i)),upper3:J(_e(m(b,w,1),i)),lower3:J(_e(m(b,w,-1),i))}}},function(e){return(t,l,n,r,i)=>{const u=t.length;if(0!==Math.round(Ie(l,"offset",0))||u-n>2)return null;const p=Ve(l),y="string"==typeof l.anchor?l.anchor:"session",f=qe(l),m="percent"===l.calcMode,d=[!1!==l.showBand1,!0===l.showBand2,!0===l.showBand3],h=[Ie(l,"bandMult1",1),Ie(l,"bandMult2",2),Ie(l,"bandMult3",3)];let b=[],g=[];return Be(e,`${y}|${p}|${f}|${m}|${d.join()}|${h.join()}`,{keys:["vwap","upper1","lower1","upper2","lower2","upper3","lower3"],start:()=>{const e=n+1===u?t:t.slice(0,n+1);return b=Xe(e,y,f),{pv:0,vol:0,pv2:0,reading:"continuous"===y?null:lt(e.map(e=>e.time),b[n])}},ready:e=>{const l=e.reading;if(null===l||"continuous"===y)return g=[!1,!1],!0;if(l.last!==t[n].time)return!1;const o=l.flag,r=u===n+2&&function(e,t,l,o){const n=tt(e),r=t-e.last;if(r>0){if(0===e.gaps)return null;const t=e.gaps+1>>1,l=e.below+(r<e.median?1:0),o=e.equal+(r===e.median?1:0);if(l>t||t>=l+o)return null;e.gaps++,e.below=l,e.equal=o}const i=Qe(e)&&r>=et(e),u=e.open,p=e.last;return i&&(e.opens++,t-e.open<=129600&&e.short++,e.open=t),tt(e)!==n?null:(e.last=t,e.flag="session"===l?n?i:o===a?s(p,t):c(p,t,o):n?i&&Ge(l,o)(u,t):Ge(l,o)(p,t),e.flag)}(l,t[u-1].time,y,f);return g=[o,!0===r],null!==r},step:(e,l,r)=>{(l<n?b[l]:g[l-n])&&(e.pv=0,e.vol=0,e.pv2=0);const a=t[l],i=a.volume??0,s=o(a,p);let c=NaN,u=NaN;if(Number.isFinite(s)&&Number.isFinite(i)&&(e.pv+=s*i,e.pv2+=s*s*i,e.vol+=i,e.vol>0)){c=e.pv/e.vol;const t=Math.max(0,e.pv2/e.vol-c*c);u=m?.01*c:Math.sqrt(t)}r[0]=ve(c);const y=Number.isFinite(c)&&Number.isFinite(u);for(let e=0;e<3;e++)r[1+2*e]=d[e]&&y?ve(c+u*h[e]):null,r[2+2*e]=d[e]&&y?ve(c-u*h[e]):null}},t,n,r,i)}}),nt=Me({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,l)=>{const o=t(e,Ie(l,"period",10),Ie(l,"multiplier",3)),n=[],r=[],a=[];for(let t=0;t<o.length;t++){const l=o[t],i=Number.isFinite(l.value);n.push(i&&-1===l.direction?l.value:null),r.push(i&&1===l.direction?l.value:null);const s=e[t];a.push(i&&void 0!==s?(s.open+s.close)/2:null)}return{up:n,down:r,bodyMid:a}}},e=>(t,l,o,n,r)=>{const a=Ie(l,"period",10),i=Ie(l,"multiplier",3);if(!Ne(a))return null;const s={direction:1};return Be(e,`${a}|${i}`,{keys:["up","down","bodyMid"],start:Pe,step:(e,l,o)=>{const n=function(e,t,l,o,n,r){const a=Te(e.atr,Re(t,l),o),i=t[l],s=i.close;if(!Number.isFinite(a)||!Number.isFinite(s))return NaN;const c=(i.high+i.low)/2,u=c+n*a,p=c-n*a,y=e.started?u<e.upper||e.close>e.upper?u:e.upper:u,f=e.started?p>e.lower||e.close<e.lower?p:e.lower:p;let m;return e.started&&e.st!==e.upper?s>=f?(m=f,r.direction=-1):(m=y,r.direction=1):s<=y?(m=y,r.direction=1):(m=f,r.direction=-1),e.upper=y,e.lower=f,e.st=m,e.close=s,e.started=!0,m}(e,t,l,a,i,s),r=Number.isFinite(n),c=t[l];o[0]=r&&-1===s.direction?n:null,o[1]=r&&1===s.direction?n:null,o[2]=r&&void 0!==c?(c.open+c.close)/2:null}},t,o,n,r)}),rt=Me({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,t)=>{const l=e.length,o=new Array(l).fill(NaN),n=Ie(t,"start",.02),r=Ie(t,"increment",.02),a=Ie(t,"maximum",.2);let i,s,c=!1,u=NaN,p=NaN,y=n;for(let t=0;t<l;t++){const l=e[t];Number.isFinite(l.high)&&Number.isFinite(l.low)&&Number.isFinite(l.close)&&(void 0!==i?void 0!==s?(u+=y*(p-u),c&&l.low<u?(c=!1,u=Math.max(p,l.high),p=l.low,y=n):!c&&l.high>u?(c=!0,u=Math.min(p,l.low),p=l.high,y=n):c&&l.high>p?(p=l.high,y=Math.min(a,y+r)):!c&&l.low<p&&(p=l.low,y=Math.min(a,y+r)),u=c?Math.min(u,i.low,s.low):Math.max(u,i.high,s.high),o[t]=u,s=i,i=l):(c=l.close>=i.close,u=c?i.low:i.high,p=c?l.high:l.low,o[t]=u,s=i,i=l):i=l)}return{sar:J(o)}}},e=>(t,l,o,n,r)=>{const a=Ie(l,"start",.02),i=Ie(l,"increment",.02),s=Ie(l,"maximum",.2);return Be(e,`${a}|${i}|${s}`,{keys:["sar"],start:()=>(e=>({prev:null,prev2:null,rising:!1,sar:NaN,ep:NaN,af:e}))(a),step:(e,l,o)=>{o[0]=ve(function(e,t,l,o,n){if(!Number.isFinite(t.high)||!Number.isFinite(t.low)||!Number.isFinite(t.close))return NaN;const r=e.prev;if(null===r)return e.prev=t,NaN;if(null===e.prev2)return e.rising=t.close>=r.close,e.sar=e.rising?r.low:r.high,e.ep=e.rising?t.high:t.low,e.prev2=r,e.prev=t,e.sar;const a=e.prev2;let i=e.sar+e.af*(e.ep-e.sar);return e.rising&&t.low<i?(e.rising=!1,i=Math.max(e.ep,t.high),e.ep=t.low,e.af=l):!e.rising&&t.high>i?(e.rising=!0,i=Math.min(e.ep,t.low),e.ep=t.high,e.af=l):e.rising&&t.high>e.ep?(e.ep=t.high,e.af=Math.min(n,e.af+o)):!e.rising&&t.low<e.ep&&(e.ep=t.low,e.af=Math.min(n,e.af+o)),i=e.rising?Math.min(i,r.low,a.low):Math.max(i,r.high,a.high),e.sar=i,e.prev2=r,e.prev=t,i}(e,t[l],a,i,s))}},t,o,n,r)});function at(e,t){const l=e.length,o=new Array(l).fill(NaN);for(let n=0;n<l;n++){const r=n-t;r>=0&&r<l&&(o[n]=e[r])}return o}const it={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,t)=>{const l=e.length,o=(e,l)=>Math.max(1,Math.round(Ie(t,e,l))),n=o("conversionPeriod",9),r=o("basePeriod",26),a=o("laggingSpanPeriod",52),i=Math.round(Ie(t,"displacement",26)),s=t=>{const o=new Array(l).fill(NaN);for(let n=t-1;n<l;n++){let l=-1/0,r=1/0;for(let o=0;o<t;o++)e[n-o].high>l&&(l=e[n-o].high),e[n-o].low<r&&(r=e[n-o].low);o[n]=(l+r)/2}return o},c=s(n),u=s(r),p=c.map((e,t)=>(e+u[t])/2),y=s(a),f=e.map(e=>e.close);return{conversion:J(c),base:J(u),spanA:J(at(p,i)),spanB:J(at(y,i)),lagging:J(at(f,-i))}}},st={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:t,settings:l})=>{if(!1===l.showLabels)return[];const o=t.buySignal??[],n=t.sellSignal??[],r=[];for(let t=0;t<e.length;t++){const a=o[t];if(null!=a){r.push({time:e[t].time,position:"atPrice",price:a,shape:"labelUp",size:"small",color:Ee(l,"upColor","#2962ff"),text:"Buy"});continue}const i=n[t];null!=i&&r.push({time:e[t].time,position:"atPrice",price:i,shape:"labelDown",size:"small",color:Ee(l,"downColor","#ef5350"),text:"Sell"})}return r},calc:(e,t)=>{const o=e.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=new Array(o).fill(null),c=new Array(o).fill(null),u={up:n,down:r,atrHigh:a,atrLow:i,buySignal:s,sellSignal:c};if(0===o)return u;const p=Math.max(1,Math.round(Ie(t,"amplitude",2))),y=Ie(t,"channelDeviation",2),f=!1!==t.showChannels,m=!1!==t.showSignals,d=e.map(e=>e.high),h=e.map(e=>e.low),b=l(d,h,e.map(e=>e.close),Math.max(1,Math.round(Ie(t,"atrPeriod",100)))),g=V(d,p),k=V(h,p),w=Z(d,p),v=Y(h,p);let N=0,C=0,M=h[0],A=d[0],x=0,S=0,L=!1;for(let t=0;t<o;t++){const l=b[t]/2,o=y*l,u=w[t],p=v[t],F=t>0?d[t-1]:d[0],B=t>0?h[t-1]:h[0],K=L?N:-1;let W;1===C?(Number.isFinite(p)&&(M=Math.max(p,M)),Number.isFinite(g[t])&&g[t]<M&&e[t].close<B&&(N=1,C=0,A=u)):(Number.isFinite(u)&&(A=Math.min(u,A)),Number.isFinite(k[t])&&k[t]>A&&e[t].close>F&&(N=0,C=1,M=p)),0===N?(1===K?(x=S,m&&Number.isFinite(l)&&(s[t]=x-l)):x=-1===K?M:Math.max(M,x),W=x):(0===K?(S=x,m&&Number.isFinite(l)&&(c[t]=S+l)):S=-1===K?A:Math.min(A,S),W=S),L=!0,Number.isFinite(W)&&(0===N?n[t]=W:r[t]=W,f&&Number.isFinite(o)&&(a[t]=W+o,i[t]=W-o))}return u}},ct=[{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"}],ut="SMA + Bollinger Bands";function pt(e,t){const l=e.length,o=new Array(l).fill(NaN);let n=0;for(;n<l&&!Number.isFinite(e[n]);)n+=1;if(n>=l)return o;const r=t(e.slice(n),n);for(let e=0;e<r.length&&n+e<l;e++)o[n+e]=r[e];return o}function yt(e,t){return pt(e,e=>G(e,t))}function ft(e,t,l,o){switch(e){case"EMA":return yt(t,o);case"SMMA (RMA)":return pt(t,e=>j(e,o));case"WMA":return pt(t,e=>q(e,o));case"VWMA":return pt(t,(e,t)=>le(e,l.slice(t),o));default:return pt(t,e=>V(e,o))}}const mt=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},dt=(e,t,l,o=1)=>Math.max(o,Math.round(mt(e,t,l))),ht=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},bt=e=>e.source??"close",gt=(e,t)=>new Array(e).fill(t),kt=Me({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:(t,l)=>({rsi:J(f(e(t,bt(l)),mt(l,"length",14))),upperLevel:gt(t.length,mt(l,"overbought",70)),lowerLevel:gt(t.length,mt(l,"oversold",30))}),levels:e=>[{price:mt(e,"overbought",70),color:"#ef5350",title:"OB",dashed:!0},{price:50,color:"#5a6b8c",title:"",dashed:!0},{price:mt(e,"oversold",30),color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},e=>(t,l,n,r,a)=>{const i=mt(l,"length",14);if(!Ne(i))return null;const s=bt(l),c=mt(l,"overbought",70),u=mt(l,"oversold",30);return Be(e,`${i}|${s}|${c}|${u}`,{keys:["rsi","upperLevel","lowerLevel"],start:Ue,step:(e,l,n)=>{n[0]=ve(function(e,t,l){const o=t-e.last;if(e.last=t,!e.primed)return e.primed=!0,NaN;if(!Number.isFinite(o))return e.run=0,e.recent.length=0,NaN;e.run++;const n=o>0?o:0,r=o<0?-o:0;if(e.gainSeeded&&(e.gain=(e.gain*(l-1)+n)/l),e.lossSeeded&&(e.loss=(e.loss*(l-1)+r)/l),!e.gainSeeded||!e.lossSeeded){const t=e.recent;if(t.push(o),t.length>l&&t.shift(),e.run>=l){let o=0,n=0;for(let e=0;e<t.length;e++){const l=t[e];l>=0?o+=l:n-=l}!e.gainSeeded&&Number.isFinite(o/l)&&(e.gain=o/l,e.gainSeeded=!0),!e.lossSeeded&&Number.isFinite(n/l)&&(e.loss=n/l,e.lossSeeded=!0)}}if(Number.isFinite(e.gain)&&Number.isFinite(e.loss)){const t=0===e.loss?100:100-100/(1+e.gain/e.loss);if(Number.isFinite(t))return t}return NaN}(e,o(t[l],s),i)),n[1]=c,n[2]=u}},t,n,r,a)}),wt=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:t,values:l,settings:o})=>{const n=l.histogram?.[t-1],r=null==n||!Number.isFinite(n)||e>=n,a=(e,t)=>{const l=o[e];return"string"==typeof l?l:t};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:(t,l)=>{const o=e(t,bt(l)),n=G(o,mt(l,"fastPeriod",12)),r=G(o,mt(l,"slowPeriod",26)),a=n.map((e,t)=>e-r[t]),i=pt(a,e=>G(e,mt(l,"signalPeriod",9))),s=a.map((e,t)=>e-i[t]);return{macd:J(a),signal:J(i),histogram:J(s)}},levels:()=>[{price:0,color:"#5a6b8c",dashed:!0}]},e=>(t,l,n,r,a)=>{const i=mt(l,"fastPeriod",12),s=mt(l,"slowPeriod",26),c=mt(l,"signalPeriod",9);if(!Ne(i)||!Ne(s)||!Ne(c))return null;const u=bt(l);return Be(e,`${i}|${s}|${c}|${u}`,{keys:["macd","signal","histogram"],start:()=>({fast:{run:0,value:NaN,seeded:!1,recent:[]},slow:{run:0,value:NaN,seeded:!1,recent:[]},signal:{run:0,value:NaN,seeded:!1,recent:[]}}),step:(e,l,n)=>{const r=o(t[l],u),a=We(e.fast,r,i,!0)-We(e.slow,r,s,!0),p=We(e.signal,a,c,!0);n[0]=ve(a),n[1]=ve(p),n[2]=ve(a-p)}},t,n,r,a)}),vt=Me({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,t)=>{const l=Z(e.map(e=>e.high),mt(t,"kPeriod",14)),o=Y(e.map(e=>e.low),mt(t,"kPeriod",14)),n=e.map((e,t)=>{const n=l[t]-o[t];return n>0&&n<1/0?100*(e.close-o[t])/n:NaN}),r=V(n,mt(t,"kSmoothing",1)),a=V(r,mt(t,"dPeriod",3));return{k:J(r),d:J(a),upperLevel:gt(e.length,80),lowerLevel:gt(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})},e=>Fe(e,e=>{const t=mt(e,"kPeriod",14),l=mt(e,"kSmoothing",1),o=mt(e,"dPeriod",3);return Ne(t)&&Ne(l)&&Ne(o)?t+l+o-3:null})),Nt=Me({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,t)=>{const l=e.length,o=mt(t,"period",14),n=e.map(e=>e.high),r=e.map(e=>e.low),a=e.map(e=>e.close),i=m(n,r,a);l>0&&(i[0]=NaN);const s=new Array(l).fill(NaN),c=new Array(l).fill(NaN);for(let e=1;e<l;e++){if(!(Number.isFinite(n[e])&&Number.isFinite(r[e])&&Number.isFinite(n[e-1])&&Number.isFinite(r[e-1])))continue;const t=n[e]-n[e-1],l=r[e-1]-r[e];s[e]=t>l&&t>0?t:0,c[e]=l>t&&l>0?l:0}const u=j(i,o),p=j(s,o),y=j(c,o),f=new Array(l).fill(NaN),d=new Array(l).fill(NaN),h=new Array(l).fill(NaN);for(let e=0;e<l;e++){const t=u[e];if(!Number.isFinite(t)||0===t)continue;const l=p[e]/t*100,o=y[e]/t*100;if(Number.isFinite(l)&&(f[e]=l),Number.isFinite(o)&&(d[e]=o),!Number.isFinite(f[e])||!Number.isFinite(d[e]))continue;const n=f[e]+d[e];h[e]=n>0?Math.abs(f[e]-d[e])/n*100:0}const b=pt(h,e=>j(e,mt(t,"adxPeriod",14)));return{plusDi:J(f),minusDi:J(d),adx:J(b)}},levels:()=>[{price:25,color:"#5a6b8c",title:"25",dashed:!0}]},e=>(t,l,o,n,r)=>{const a=mt(l,"period",14),i=mt(l,"adxPeriod",14);return Ne(a)&&Ne(i)?Be(e,`${a}|${i}`,{keys:["plusDi","minusDi","adx"],start:()=>({tr:{run:0,value:NaN,seeded:!1,recent:[]},plus:{run:0,value:NaN,seeded:!1,recent:[]},minus:{run:0,value:NaN,seeded:!1,recent:[]},adx:{run:0,value:NaN,seeded:!1,recent:[]}}),step:(e,l,o)=>{const[n,r,s]=function(e,t){if(0===t)return[NaN,NaN,NaN];const l=e[t],o=e[t-1],n=Re(e,t);if(!(Number.isFinite(l.high)&&Number.isFinite(l.low)&&Number.isFinite(o.high)&&Number.isFinite(o.low)))return[n,NaN,NaN];const r=l.high-o.high,a=o.low-l.low;return[n,r>a&&r>0?r:0,a>r&&a>0?a:0]}(t,l),c=We(e.tr,n,a,!1),u=We(e.plus,r,a,!1),p=We(e.minus,s,a,!1);let y=NaN,f=NaN,m=NaN;if(Number.isFinite(c)&&0!==c){const e=u/c*100,t=p/c*100;if(Number.isFinite(e)&&(y=e),Number.isFinite(t)&&(f=t),Number.isFinite(y)&&Number.isFinite(f)){const e=y+f;m=e>0?Math.abs(y-f)/e*100:0}}o[0]=ve(y),o[1]=ve(f),o[2]=ve(We(e.adx,m,i,!1))}},t,o,n,r):null});const Ct=Me({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:ct,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,t)=>{const l=e.length,o=mt(t,"period",20),n=mt(t,"constant",.015),r=e.map(e=>(e.high+e.low+e.close)/3),a=V(r,o),i=new Array(l).fill(NaN);for(let e=o-1;e<l;e++){let t=0;for(let l=0;l<o;l++)t+=Math.abs(r[e-l]-a[e]);const l=t/o;i[e]=Number.isFinite(l)?l>0?(r[e]-a[e])/(n*l):0:NaN}const s=ht(t,"maType","SMA"),c=dt(t,"maLength",20),u=mt(t,"bbMult",2),p="None"===s?new Array(l).fill(NaN):ft(s,i,e.map(e=>e.volume??0),c),y=s===ut?pt(i,e=>z(e,c)).map(e=>e*u):new Array(l).fill(NaN);return{cci:J(i),ma:J(p),bbUpper:J(p.map((e,t)=>e+y[t])),bbLower:J(p.map((e,t)=>e-y[t])),upperLevel:gt(l,100),lowerLevel:gt(l,-100)}},levels:()=>[{price:100,color:"#ef5350",dashed:!0},{price:0,color:"#5a6b8c",dashed:!0},{price:-100,color:"#26a69a",dashed:!0}]},function(e){const t=Fe(e,e=>{const t=mt(e,"period",20),l=dt(e,"maLength",20);return Ne(t)&&Ne(l)?t-1+("None"===ht(e,"maType","SMA")?0:l-1):null});return(l,o,n,r,a,i)=>{const s=ht(o,"maType","SMA");if("EMA"!==s&&"SMMA (RMA)"!==s)return t(l,o,n,r,a,i);const c=mt(o,"period",20),u=mt(o,"constant",.015),p=dt(o,"maLength",20);if(!Ne(c)||!Ne(p))return null;const y=e=>(l[e].high+l[e].low+l[e].close)/3;return Be(e,`${c}|${u}|${s}|${p}`,{keys:["cci","ma","bbUpper","bbLower","upperLevel","lowerLevel"],start:Ke,step:(e,t,l)=>{let o=NaN;if(t>=c-1){const e=$e(y,t,c),l=y(t);let n=0;for(let l=0;l<c;l++)n+=Math.abs(y(t-l)-e);const r=n/c;o=Number.isFinite(r)?r>0?(l-e)/(u*r):0:NaN}l[0]=ve(o),l[1]=ve(We(e,o,p,"EMA"===s)),l[2]=null,l[3]=null,l[4]=100,l[5]=-100}},l,n,r,a)}});const Mt={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,t)=>{const l=e.length,o=mt(t,"period",14),n=e.map(e=>(e.high+e.low+e.close)/3),r=new Array(l).fill(0),a=new Array(l).fill(0);for(let t=1;t<l;t++){const l=e[t].volume??0;if(!Number.isFinite(n[t])||!Number.isFinite(n[t-1])||!Number.isFinite(l)){r[t]=NaN,a[t]=NaN;continue}const o=n[t]*l,i=Number.isFinite(o)?o:NaN;n[t]>n[t-1]?r[t]=i:n[t]<n[t-1]&&(a[t]=i)}const i=new Array(l).fill(NaN);for(let e=o;e<l;e++){let t=0,l=0;for(let n=e-o+1;n<=e;n++)t+=r[n],l+=a[n];Number.isFinite(t)&&Number.isFinite(l)&&(i[e]=0===l?100:100-100/(1+t/l))}return{mfi:J(i),upperLevel:gt(l,80),lowerLevel:gt(l,20)}},levels:()=>[{price:80,color:"#ef5350",title:"OB",dashed:!0},{price:20,color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},At=Me({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,t)=>({atr:J(l(e.map(e=>e.high),e.map(e=>e.low),e.map(e=>e.close),mt(t,"period",14)))})},e=>(t,l,o,n,r)=>{const a=mt(l,"period",14);return Ne(a)?Be(e,`${a}`,{keys:["atr"],start:Oe,step:(e,l,o)=>{o[0]=ve(Te(e,Re(t,l),a))}},t,o,n,r):null}),xt={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:t,settings:l})=>{const o=t.wvf?.[e],n=t.alertUpper?.[e],r=t.alertHigh?.[e],a=(e,t)=>"string"==typeof l[e]?l[e]:t;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,t)=>{const l=e.length,o=e.map(e=>e.close),n=e.map(e=>e.low),r=mt(t,"pd",22),a=mt(t,"bbl",20),i=mt(t,"mult",2),s=mt(t,"lb",50),c=mt(t,"ph",.85),u=mt(t,"pl",1.01),p=!0===t.hp,y=!0===t.sd,f=Z(o,r),m=new Array(l);for(let e=0;e<l;e++){const t=f[e];m[e]=Number.isFinite(t)&&0!==t?(t-n[e])/t*100:NaN}const d=z(m,a),h=V(m,a),b=Z(m,s),g=Y(m,s),k=new Array(l),w=new Array(l),v=new Array(l),N=new Array(l),C=new Array(l);for(let e=0;e<l;e++){const t=h[e]+i*d[e],l=b[e]*c,o=g[e]*u;k[e]=Number.isFinite(t)?t:null,w[e]=Number.isFinite(l)?l:null,v[e]=y?k[e]:null,N[e]=p?w[e]:null,C[e]=p&&Number.isFinite(o)?o:null}return{wvf:J(m),rangeHigh:N,rangeLow:C,upperBand:v,alertUpper:k,alertHigh:w}}},St=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Lt=(e,t,l,o=1)=>Math.max(o,Math.round(St(e,t,l))),Ft=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Bt=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0,Kt={id:"volume",name:"Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#3a4666"},{key:"colorByDirection",type:"boolean",label:"Match candle direction",default:!1},{key:"upColor",type:"color",label:"Up candle",default:"#26a69a"},{key:"downColor",type:"color",label:"Down candle",default:"#ef5350"},{key:"showMA",type:"boolean",label:"Show moving average",default:!1,group:"Moving average"},{key:"maPeriod",type:"number",label:"Period",default:20,min:1,max:500,step:1,group:"Moving average"},{key:"maColor",type:"color",label:"Color",default:"#e6b53c",group:"Moving average"}],plots:[{key:"volume",type:"histogram",title:"Volume",colorKey:"color",style:{base:0},colorBy:({index:e,values:t,settings:l})=>!0===l.colorByDirection?-1===t.direction[e]?Ft(l,"downColor","#ef5350"):Ft(l,"upColor","#26a69a"):void 0},{key:"ma",type:"line",title:"Volume average",colorKey:"maColor",style:{lineWidth:1.5}}],calc:(e,t)=>{const l=e.map(e=>e.volume??0);return{volume:J(l),direction:e.map(e=>e.close>=e.open?1:-1),ma:!0===t.showMA?J(V(l,Lt(t,"maPeriod",20))):l.map(()=>null)}}};function Wt(e,t,l){const o=e.length,n=Ft(l,"maType","None"),r=Lt(l,"maLength",9),a=St(l,"bbMult",2),i="None"===n?new Array(o).fill(NaN):ft(n,e,t,r),s=n===ut?z(e,r).map(e=>e*a):new Array(o).fill(NaN);return{ma:J(i),bbUpper:J(i.map((e,t)=>e+s[t])),bbLower:J(i.map((e,t)=>e-s[t]))}}const Dt=Me({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:ct,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,t)=>{const l=e.length,o=new Array(l).fill(NaN);let n=0;for(let t=0;t<l;t++){if(t>0){const l=Bt(e[t]);e[t].close>e[t-1].close?n+=l:e[t].close<e[t-1].close&&(n-=l)}o[t]=n}return{obv:J(o),...Wt(o,e.map(Bt),t)}}},e=>(t,l,o,n,r)=>{const a=Ft(l,"maType","None"),i=Lt(l,"maLength",9);if(!Ne(i))return null;const s="EMA"===a||"SMMA (RMA)"===a,c=Be(e,`${a}|${i}`,{keys:s?["obv","ma","bbUpper","bbLower"]:["obv"],start:()=>({acc:0,ma:{run:0,value:NaN,seeded:!1,recent:[]}}),step:(e,l,o)=>{if(l>0){const o=Bt(t[l]);t[l].close>t[l-1].close?e.acc+=o:t[l].close<t[l-1].close&&(e.acc-=o)}o[0]=ve(e.acc),s&&(o[1]=ve(We(e.ma,e.acc,i,"EMA"===a)),o[2]=null,o[3]=null)}},t,o,n,r);if(null===c||s)return c;const u=n.obv,p=Ae(r,e,t,o);if(void 0===p||void 0===u||u.length<o)return null;const y=Math.max(0,o-i),f=[];for(let e=y;e<t.length;e++)f.push((e<o?u[e]:c.obv[e-o])??NaN);const m=Le(p,Wt(f,t.slice(y).map(Bt),l),o-y,n,o);return null===m?null:{obv:c.obv,...m}}),Rt={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 t=new Array(e.length).fill(NaN);let l=0;for(let o=0;o<e.length;o++){const n=e[o];if(!Number.isFinite(n.high)||!Number.isFinite(n.low)||!Number.isFinite(n.close))continue;const r=n.high-n.low;if(Number.isFinite(r)){if(r>0){const e=(n.close-n.low-(n.high-n.close))/r*Bt(n);if(!Number.isFinite(e))continue;l+=e}t[o]=l}}return{adl:J(t)}}},Ot=e=>void 0!==e&&Number.isFinite(e)?e:null,Tt=(e,t,l)=>"string"==typeof e[t]&&""!==e[t]?e[t]:l,Ut={id:"open-interest",name:"Open Interest",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Open interest",default:"#26c6da"}],plots:[{key:"oi",type:"line",title:"Open interest",colorKey:"color",priceFormat:{type:"volume"},style:{lineWidth:1.5}}],calc:e=>({oi:e.map(e=>Ot(e.oi))})},Pt={id:"open-interest-change",name:"Open Interest Change",category:"Volume",placement:"pane",inputs:[{key:"upColor",type:"color",label:"Increase",default:"#26a69a"},{key:"downColor",type:"color",label:"Decrease",default:"#ef5350"}],plots:[{key:"change",type:"histogram",title:"OI change",colorKey:"upColor",style:{base:0},priceFormat:{type:"volume"},colorBy:({value:e,settings:t})=>{const l=e<0?Tt(t,"downColor","#ef5350"):Tt(t,"upColor","#26a69a"),o=t["change:opacity"];return"number"==typeof o&&Number.isFinite(o)&&o<100?d(l,Math.max(0,o)/100):l}}],calc:e=>({change:e.map((t,l)=>{const o=Ot(t.oi),n=Ot(e[l-1]?.oi);return null===o||null===n?null:o-n})})},$t=[["longBuildupColor","#26a69a"],["shortBuildupColor","#ef5350"],["shortCoveringColor","#42a5f5"],["longUnwindingColor","#ffb74d"]],It={id:"open-interest-buildup",name:"Open Interest Buildup",category:"Volume",placement:"onchart",inputs:[{key:"longBuildupColor",type:"color",label:"Long buildup",default:"#26a69a"},{key:"shortBuildupColor",type:"color",label:"Short buildup",default:"#ef5350"},{key:"shortCoveringColor",type:"color",label:"Short covering",default:"#42a5f5"},{key:"longUnwindingColor",type:"color",label:"Long unwinding",default:"#ffb74d"},{key:"unchanged",type:"select",label:"Unchanged reading",default:"neutral",options:[{value:"neutral",label:"Neutral"},{value:"up",label:"Treat as up"}]}],plots:[],calc:(e,t)=>({state:e.map((l,o)=>{const n=e[o-1],r=Ot(l.oi),a=Ot(n?.oi);if(void 0===n||null===r||null===a)return null;const i=l.close-n.close,s=r-a;return Number.isFinite(i)&&("up"===t.unchanged||0!==i&&0!==s)?s>=0?i>=0?1:2:i>=0?3:4:null})}),barColors:({values:e,settings:t})=>e.state.map(e=>{if(null===e)return null;const[l,o]=$t[e-1];return Tt(t,l,o)})},Et=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Vt=(e,t,l,o=1)=>Math.max(o,Math.round(Et(e,t,l))),qt=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Ht=(e,t="source")=>e[t]??"close",jt=e=>e.map(e=>e.high),zt=e=>e.map(e=>e.low);function Zt(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(t<=0)return n;for(let r=t-1;r<o;r++){let o=l?-1/0:1/0,a=!0;for(let n=0;n<t;n++){const t=e[r-n];if(!Number.isFinite(t)){a=!1;break}(l?t>o:t<o)&&(o=t)}a&&(n[r]=o)}return n}function Yt(e,t){const l=e.length,o=new Array(l).fill(NaN);for(let n=0;n<l;n++){const r=n-t;r>=0&&r<l&&(o[n]=e[r])}return o}const Jt=.05,Gt={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:(t,l)=>({alma:J(te(e(t,"close"),Vt(l,"length",9),Et(l,"offset",.85),Et(l,"sigma",6)))})},Xt={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:(t,l)=>{const o=e(t,Ht(l)),n=Vt(l,"length",9),r=G(o,n),a=yt(r,n);return{dema:J(r.map((e,t)=>2*e-a[t]))}}},_t={id:"hma",name:"Hull Moving Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"HMA",default:"#2962ff"}],plots:[{key:"hma",type:"line",title:"HMA",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(t,l)=>({hma:J(ul(e(t,Ht(l)),Vt(l,"length",9)))})},Qt={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:Jt}],calc:(t,l)=>{const o=e(t,Ht(l)),n=Vt(l,"length",20),r=Et(l,"percent",10)/100,a=!0===l.exponential?G(o,n):V(o,n);return{upper:J(a.map(e=>e*(1+r))),basis:J(a),lower:J(a.map(e=>e*(1-r)))}}},el=Me({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:Jt}],calc:(e,t)=>{const l=Vt(t,"length",20),o=Math.round(Et(t,"offset",0)),n=Z(jt(e),l),r=Y(zt(e),l),a=n.map((e,t)=>(e+r[t])/2);return{upper:J(Yt(n,o)),basis:J(Yt(a,o)),lower:J(Yt(r,o))}}},e=>Fe(e,e=>{const t=Vt(e,"length",20),l=Math.round(Et(e,"offset",0));return Ne(t)&&l>=0?t-1+l:null})),tl={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,t)=>{const o=Vt(t,"p",10),n=Vt(t,"x",1),r=Vt(t,"q",9),a=jt(e),i=zt(e),s=l(a,i,e.map(e=>e.close),o),c=Z(a,o).map((e,t)=>e-n*s[t]);return{stopLong:J(Zt(Y(i,o).map((e,t)=>e+n*s[t]),r,!1)),stopShort:J(Zt(c,r,!0))}}},ll={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,t)=>{const o=Vt(t,"length",22),n=Et(t,"atrMultiplier",3),r=jt(e),a=zt(e),i=l(r,a,e.map(e=>e.close),Vt(t,"atrLength",22));return{longExit:J(Z(r,o).map((e,t)=>e-n*i[t])),shortExit:J(Y(a,o).map((e,t)=>e+n*i[t]))}}};const ol={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:Jt}],calc:(t,l)=>{const o=e(t,"close"),n=Vt(l,"periods",21,3),r=Et(l,"errors",2),a=Vt(l,"averagePeriods",3),i=function(e,t){const l=e.length,o=new Array(l).fill(NaN);if(t<3||l<t)return o;const n=(t+1)/2;for(let r=t-1;r<l;r++){let l=0;for(let o=0;o<t;o++)l+=e[r-o];const a=l/t;let i=0,s=0,c=0;for(let l=0;l<t;l++){const t=a-e[r-l],o=n-l-1;i+=t*t,s+=o*t,c+=o*o}o[r]=Math.sqrt((i-s*s/c)/(t-2))}return o}(o,n),s=se(o,n,0),c=e=>J("Exponential"===l.method?yt(e,a):"Weighted"===l.method?q(e,a):V(e,a));return{upper:c(s.map((e,t)=>e+r*i[t])),basis:c(s),lower:c(s.map((e,t)=>e-r*i[t]))}}},nl={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:Jt}],calc:(e,t)=>({upper:J(Yt(V(jt(e),Vt(t,"upperLength",20)),Math.round(Et(t,"upperOffset",0)))),lower:J(Yt(V(zt(e),Vt(t,"lowerLength",20)),Math.round(Et(t,"lowerOffset",0))))})},rl="#00ff00",al="#ff0000",il="#ff9800",sl=e=>Math.max(1,Math.floor(e)),cl=e=>Math.max(1,Math.round(Math.sqrt(e)));function ul(e,t){const l=q(e,sl(t/2)),o=q(e,t);return q(l.map((e,t)=>2*e-o[t]),cl(t))}function pl(e,t,l){return"Ehma"===t?function(e,t){const l=G(e,sl(t/2)),o=G(e,t);return yt(l.map((e,t)=>2*e-o[t]),cl(t))}(e,l):"Thma"===t?function(e,t){const l=q(e,sl(t/3)),o=q(e,sl(t/2)),n=q(e,t);return q(l.map((e,t)=>3*e-o[t]-n[t]),t)}(e,sl(l/2)):ul(e,l)}const yl=(e,t,l)=>{if(!1===l.switchColor)return qt(l,"neutralColor",il);const o=e?.[t],n=e?.[t-2];return"number"==typeof o&&"number"==typeof n&&o>n?qt(l,"bullishColor",rl):qt(l,"bearishColor",al)},fl={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:rl},{key:"bearishColor",type:"color",label:"Bearish Color",default:al},{key:"neutralColor",type:"color",label:"Neutral Color",default:il}],plots:[{key:"mhull",type:"line",title:"Hull",colorKey:"neutralColor",style:{color:il,lineWidth:2},colorBy:({index:e,values:t,settings:l})=>yl(t.mhull,e,l)},{key:"shull",type:"line",title:"Hull Displaced",colorKey:"neutralColor",style:{color:il,lineWidth:2},colorBy:({index:e,values:t,settings:l})=>yl(t.mhull,e,l)}],fills:[{between:["mhull","shull"],colorUp:rl,colorDown:al,colorUpKey:"bullishColor",colorDownKey:"bearishColor",opacity:.6}],calc:(t,l)=>{const o=e(t,Ht(l)),n=sl(Vt(l,"length",55)*Et(l,"lengthMult",1)),r=pl(o,qt(l,"mode","Hma"),n),a=!1!==l.visualSwitch;return{mhull:J(r),shull:J(a?Yt(r,2):new Array(r.length).fill(NaN))}},barColors:({bars:e,values:t,settings:l})=>!0===l.candleCol?e.map((e,o)=>yl(t.mhull,o,l)):e.map(()=>null)},ml=[Gt,Xt,_t,Qt,el,tl,ll,ol,nl,fl],dl=(e,t,l)=>Math.max(1,Math.floor(((e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l})(e,t,l))),hl=t=>e(t,"hl2"),bl={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,t)=>{const l=dl(t,"length",14),o=oe(e.map(e=>e.high),l+1),n=ne(e.map(e=>e.low),l+1),r=e=>e.map(e=>100*(e+l)/l);return{up:J(r(o)),down:J(r(n))}},levels:()=>[{price:50,color:"#5a6b8c",dashed:!0}],range:()=>({min:0,max:100})},gl={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,t)=>{const l=dl(t,"length",14),o=oe(e.map(e=>e.high),l+1),n=ne(e.map(e=>e.low),l+1),r=o.map((e,t)=>100*(e-n[t])/l);return{osc:J(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})},kl={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:t,values:l,settings:o})=>{const n=l.ao?.[t-1],r=(e,t)=>"string"==typeof o[e]?o[e]:t;return null==n||!Number.isFinite(n)||e-n>0?r("upColor","#009688"):r("downColor","#f44336")}}],calc:e=>{const t=hl(e),l=V(t,5),o=V(t,34);return{ao:J(l.map((e,t)=>e-o[t]))}},levels:()=>[{price:0,color:"#787b86"}]},wl={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 t=e.high-e.low,l=e.close-e.open;if(0===t||!Number.isFinite(t)||!Number.isFinite(l))return null;const o=l/t;return Number.isFinite(o)?o:null})}),levels:()=>[{price:0,color:"#787b86"}]},vl={id:"chande-momentum",name:"Chande Momentum Oscillator",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:500,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"Chande MO",default:"#2962ff"}],plots:[{key:"cmo",type:"line",title:"Chande MO",colorKey:"color",style:{lineWidth:1.5}}],calc:(t,l)=>{const o=t.length,n=dl(l,"length",9),r=X(e(t,(e=>e.source??"close")(l))),a=new Array(Math.max(0,o-1)),i=new Array(Math.max(0,o-1));for(let e=1;e<o;e++){const t=r[e];a[e-1]=t>=0?t:0,i[e-1]=t>=0?0:-t}const s=ae(a,n),c=ae(i,n),u=new Array(o).fill(NaN);for(let e=0;e<s.length;e++){const t=s[e]+c[e];u[e+1]=0===t?NaN:100*(s[e]-c[e])/t}return{cmo:J(u)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]},Nl={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,t)=>{const l=e.map(e=>e.close),o=_(l,dl(t,"longRoCLength",14)),n=_(l,dl(t,"shortRoCLength",11));return{curve:J(q(o.map((e,t)=>e+n[t]),dl(t,"wmaLength",10)))}}},Cl={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,t)=>{const l=e.length,o=dl(t,"period",21),n=Math.floor(o/2)+1,r=e.map(e=>e.close),a=V(r,o),i=new Array(l).fill(NaN);if(!0===t.isCentered)for(let e=0;e+n<l;e++)i[e]=r[e]-a[e+n];else for(let e=n;e<l;e++)i[e]=r[e]-a[e-n];return{dpo:J(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line"}]},Ml={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,t)=>{const l=e.length,o=dl(t,"length",9),n=hl(e),r=Z(n,o),a=Y(n,o),i=new Array(l).fill(NaN);let s=0,c=0;for(let e=0;e<l;e++){const t=r[e]-a[e];if(!Number.isFinite(t)||!Number.isFinite(n[e])){s=0,c=0;continue}const l=.66*((n[e]-a[e])/Math.max(t,.001)-.5)+.67*s,o=l>.99?.999:l<-.99?-.999:l,u=.5*Math.log((1+o)/(1-o))+.5*c;i[e]=u,s=o,c=u}const u=new Array(l).fill(NaN);for(let e=1;e<l;e++)u[e]=i[e-1];return{fisher:J(i),trigger:J(u)}},levels:()=>[{price:1.5,color:"#e91e63",title:"1.5"},{price:.75,color:"#787b86",title:"0.75"},{price:0,color:"#e91e63",title:"0"},{price:-.75,color:"#787b86",title:"-0.75"},{price:-1.5,color:"#e91e63",title:"-1.5"}]};function Al(e){const t=e.length,l=new Array(t).fill(0);for(let o=0;o<t;o++){const t=o>0?l[o-1]:0;o>0&&e[o]===e[o-1]?l[o]=0:o>0&&e[o]>e[o-1]?l[o]=t<=0?1:t+1:l[o]=t>=0?-1:t-1}return l}const xl={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,t)=>{const l=e.length,o=e.map(e=>e.close),n=f(o,dl(t,"lenrsi",3)),r=f(Al(o),dl(t,"lenupdown",2)),a=ee(_(o,1).slice(1),dl(t,"lenroc",100)),i=new Array(l).fill(NaN);for(let e=0;e<a.length;e++)i[e+1]=a[e];const s=new Array(l);for(let e=0;e<l;e++)s[e]=(n[e]+r[e]+i[e])/3;return{crsi:J(s),bandHigh:new Array(l).fill(70),bandLow:new Array(l).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})},Sl=[bl,gl,kl,wl,vl,Nl,Cl,Ml,xl];function Ll(e,t){return`${e}${Math.round(255*(1-t/100)).toString(16).padStart(2,"0")}`}const Fl=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Bl=e=>e.source??"close",Kl=(e,t,l)=>"string"==typeof e[t]?e[t]:l;function Wl(e,t,l){const o=e.length,n=V(e,t),r=z(e,t),a=new Array(o),i=new Array(o);for(let e=0;e<o;e++){const t=l*r[e];a[e]=n[e]+t,i[e]=n[e]-t}return{middle:n,upper:a,lower:i}}function Dl(e,t){const l=e.length;if(0===t)return e.slice();const o=new Array(l).fill(NaN);for(let n=0;n<l;n++){const r=n+t;r>=0&&r<l&&(o[r]=e[n])}return o}const Rl={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:(t,l)=>{const o=e(t,Bl(l)),{upper:n,lower:r}=Wl(o,Fl(l,"length",20),Fl(l,"mult",2)),a=new Array(o.length);for(let e=0;e<o.length;e++){const t=n[e]-r[e];a[e]=t>0?(o[e]-r[e])/t:NaN}return{percentB:J(a),bandHigh:new Array(t.length).fill(1),bandLow:new Array(t.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}]},Ol={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:(t,l)=>{const o=e(t,Bl(l)),{middle:n,upper:r,lower:a}=Wl(o,Fl(l,"length",20),Fl(l,"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:J(i),expansion:J(Z(i,Fl(l,"expansionLength",125))),contraction:J(Y(i,Fl(l,"contractionLength",125)))}}},Tl={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:t,values:l,settings:o})=>{const n=l.bbtrend?.[t-1],r="number"==typeof n&&Number.isFinite(n);return r&&e>0?Ll(Kl(o,"posColor","#089981"),e>=n?25:50):r&&e<0?Ll(Kl(o,"negColor","#f23645"),e>n?50:25):Ll(Kl(o,"posColor","#089981"),50)}}],calc:(e,t)=>{const l=e.map(e=>e.close),o=Fl(t,"stdDevMult",2),n=Wl(l,Fl(t,"shortLength",20),o),r=Wl(l,Fl(t,"longLength",50),o),a=new Array(l.length);for(let e=0;e<l.length;e++){const t=Math.abs(n.lower[e]-r.lower[e])-Math.abs(n.upper[e]-r.upper[e]);a[e]=0===n.middle[e]?NaN:t/n.middle[e]*100}return{bbtrend:J(a)}},levels:()=>[{price:0,color:"#5a6b8c",title:"Zero line",dashed:!0}]},Ul={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,t)=>{const l=Fl(t,"length",14),o=e.map(e=>e.high),n=e.map(e=>e.low),r=ae(m(o,n,e.map(e=>e.close)),l),a=Z(o,l),i=Y(n,l),s=Math.log10(l),c=new Array(e.length).fill(NaN);if(0!==s)for(let t=0;t<e.length;t++){const e=a[t]-i[t];if(!(e>0))continue;const l=r[t]/e;l>0&&(c[t]=100*Math.log10(l)/s)}return{chop:J(Dl(c,Fl(t,"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})},Pl={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,t)=>{const l=e.length,o=Fl(t,"per",1),n=new Array(l).fill(NaN);for(let t=1;t<l;t++){const l=e[t-1].close,o=e[t].close;n[t]=l>0&&o>0?Math.log(o/l):NaN}const r=z(n,Fl(t,"length",10)),a=o>0?Math.sqrt(365/o):NaN;return{hv:J(r.map(e=>100*e*a))}}},$l={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,t)=>({adr:J(V(e.map(e=>e.high-e.low),Fl(t,"length",14)))})},Il=4*Math.atan(1),El={id:"chop-zone",name:"Chop Zone",category:"Volatility",placement:"pane",inputs:[{key:"turquoiseColor",type:"color",label:"Steep up",default:"#26c6da"},{key:"darkGreenColor",type:"color",label:"Up",default:"#43a047"},{key:"paleGreenColor",type:"color",label:"Mild up",default:"#a5d6a7"},{key:"limeColor",type:"color",label:"Slight up",default:"#009688"},{key:"yellowColor",type:"color",label:"Flat",default:"#fdd835"},{key:"lightOrangeColor",type:"color",label:"Slight down",default:"#ffb74d"},{key:"orangeColor",type:"color",label:"Mild down",default:"#ff6d00"},{key:"redColor",type:"color",label:"Down",default:"#e91e63"},{key:"darkRedColor",type:"color",label:"Steep down",default:"#d50000"}],plots:[{key:"chopZone",type:"column",title:"Chop Zone",colorKey:"yellowColor",style:{base:0},colorBy:({index:e,values:t,settings:l})=>{const o=t.angle?.[e],n=(e,t)=>Kl(l,e,t);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 t=e.length,l=Z(e.map(e=>e.high),30),o=Y(e.map(e=>e.high),30),n=G(e.map(e=>e.close),34),r=new Array(t).fill(NaN);for(let a=1;a<t;a++){const t=l[a]-o[a],i=(e[a].high+e[a].low+e[a].close)/3;if(!(t>0)||0===i)continue;const s=25/t*o[a],c=(n[a-1]-n[a])/i*s;if(!Number.isFinite(c))continue;const u=Math.sqrt(1+c*c),p=Math.round(180*Math.acos(1/u)/Il);r[a]=c>0?-p:p}return{chopZone:new Array(t).fill(1),angle:J(r)}},range:()=>({min:0,max:1})},Vl={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,t)=>({chaikinVolatility:J(_(G(e.map(e=>e.high-e.low),Fl(t,"periods",10)),Fl(t,"rocLookback",10)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},ql={id:"standard-deviation",name:"Standard Deviation",category:"Volatility",placement:"pane",inputs:[{key:"periods",type:"number",label:"Periods",default:5,min:1,max:2e3,step:1},{key:"deviations",type:"number",label:"Deviations",default:1,min:.001,max:50,step:.1},{key:"color",type:"color",label:"Standard Deviation",default:"#089981"}],plots:[{key:"stdDev",type:"line",title:"Standard Deviation",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,t)=>{const l=Fl(t,"deviations",1);return{stdDev:J(z(e.map(e=>e.close),Fl(t,"periods",5)).map(e=>e*l))}}},Hl={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,t)=>{const l=Math.max(3,Math.trunc(Fl(t,"length",14))),o=e.map(e=>e.close),n=(l+1)/2;let r=0;for(let e=0;e<l;e++)r+=(n-e-1)**2;const a=new Array(o.length).fill(NaN);for(let e=l-1;e<o.length;e++){let t=0;for(let n=0;n<l;n++)t+=o[e-n];const i=t/l;let s=0,c=0;for(let t=0;t<l;t++){const l=i-o[e-t];s+=l*l,c+=(n-t-1)*l}a[e]=Math.sqrt((s-c*c/r)/(l-2))}return{stdErr:J(a)}}},jl=[Rl,Ol,Tl,Ul,Pl,$l,El,Vl,ql,Hl],zl=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Zl=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function Yl(e){const t=new Array(e.length);for(let l=0;l<e.length;l++){const o=e[l],n=o.close===o.high&&o.close===o.low||o.high===o.low;t[l]=n?0:(2*o.close-o.low-o.high)/(o.high-o.low)*Zl(o)}return t}const Jl={id:"chaikin-money-flow",name:"Chaikin Money Flow",category:"Volume",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:20,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#43a047"}],plots:[{key:"cmf",type:"line",title:"CMF",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,t)=>{const l=zl(t,"length",20),o=ae(Yl(e),l),n=ae(e.map(Zl),l),r=new Array(e.length).fill(NaN);for(let t=0;t<e.length;t++)n[t]>0&&(r[t]=o[t]/n[t]);return{cmf:J(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Gl={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,t)=>{const l=ie(Yl(e)),o=yt(l,zl(t,"short",3)),n=yt(l,zl(t,"long",10)),r=new Array(e.length);for(let t=0;t<e.length;t++)r[t]=o[t]-n[t];return{osc:J(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Xl={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,t)=>{const l=zl(t,"divisor",1e4),o=X(e.map(e=>(e.high+e.low)/2)),n=new Array(e.length);for(let t=0;t<e.length;t++){const r=e[t],a=Zl(r);n[t]=0===a?NaN:l*o[t]*(r.high-r.low)/a}return{eom:J(V(n,zl(t,"length",14)))}}},_l={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,t)=>{const l=X(e.map(e=>e.close)),o=new Array(e.length);for(let t=0;t<e.length;t++)o[t]=l[t]*Zl(e[t]);return{efi:J(yt(o,zl(t,"length",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Ql={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 t=new Array(e.length).fill(0);for(let l=1;l<e.length;l++){const o=e[l].close-e[l-1].close;t[l]=o>0?Zl(e[l]):o<0?-Zl(e[l]):0}return{net:J(t)}}},eo=[Jl,Gl,Xl,_l,Ql],to=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},lo=(e,t,l,o=1)=>Math.max(o,Math.round(to(e,t,l))),oo=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},no=(e,t,l)=>{const o=e[t];return"boolean"==typeof o?o:l},ro=(e,t="source")=>e[t]??"close",ao={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:(t,l)=>{const o=e(t,ro(l)),n=o.length,r=lo(l,"erLength",10),a=new Array(n).fill(NaN);if(n<=r)return{kama:J(a)};const i=X(o,1);for(let e=0;e<n;e++)i[e]=Number.isFinite(i[e])?Math.abs(i[e]):0;const s=ae(i,r),c=X(o,r),u=2/(lo(l,"fastLength",2)+1),p=2/(lo(l,"slowLength",30)+1);let y=o[r];a[r]=y;for(let e=r+1;e<n;e++){const t=s[e],l=(Number.isFinite(t)&&0!==t?Math.abs(c[e])/t:0)*(u-p)+p;y+=l*l*(o[e]-y),a[e]=y}return{kama:J(a)}}},io=Me({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:(t,o)=>{const n=t.length,r=lo(o,"length",20),a=to(o,"mult",2),i=e(t,ro(o)),s=no(o,"exp",!0)?G(i,r):V(i,r),c=t.map(e=>e.high),u=t.map(e=>e.low),p=t.map(e=>e.close),y=oo(o,"bandsStyle","Average True Range");let f;f="True Range"===y?m(c,u,p):"Range"===y?j(c.map((e,t)=>e-u[t]),r):l(c,u,p,lo(o,"atrlength",10));const d=new Array(n).fill(NaN),h=new Array(n).fill(NaN);for(let e=0;e<n;e++){const t=f[e]*a;d[e]=s[e]+t,h[e]=s[e]-t}return{upper:J(d),basis:J(s),lower:J(h)}}},e=>(t,l,n,r,a)=>{const i=lo(l,"length",20),s=lo(l,"atrlength",10);if(!Ne(i)||!Ne(s))return null;const c=to(l,"mult",2),u=ro(l),p=no(l,"exp",!0),y=oo(l,"bandsStyle","Average True Range"),f=e=>o(t[e],u);return Be(e,`${i}|${s}|${c}|${u}|${p}|${y}`,{keys:["upper","basis","lower"],start:()=>({basis:{run:0,value:NaN,seeded:!1,recent:[]},range:{run:0,value:NaN,seeded:!1,recent:[]},atr:{a:NaN,run:0,recent:[]}}),step:(e,l,o)=>{const n=t[l],r=p?We(e.basis,f(l),i,!0):$e(f,l,i),a=("True Range"===y?Re(t,l):"Range"===y?We(e.range,n.high-n.low,i,!1):Te(e.atr,Re(t,l),s))*c;o[0]=ve(r+a),o[1]=ve(r),o[2]=ve(r-a)}},t,n,r,a)}),so={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:(t,l)=>({lsma:J(se(e(t,ro(l)),lo(l,"length",25,2),Math.round(to(l,"offset",0))))})},co={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:t=>{const l=t.length,o=X(e(t,"hlc3"),1),n=new Array(l);for(let e=0;e<l;e++){const l=t[e].volume??0;n[e]=o[e]>=0?l:-l}const r=G(n,34),a=G(n,55),i=new Array(l).fill(NaN);for(let e=0;e<l;e++)i[e]=r[e]-a[e];return{kvo:J(i),signal:J(yt(i,13))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},uo={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:(t,l)=>{const o=t.length,n=e(t,"close"),r=(e,t,o,r)=>V(_(n,lo(l,e,t)),lo(l,o,r)),a=r("roclen1",10,"smalen1",10),i=r("roclen2",15,"smalen2",10),s=r("roclen3",20,"smalen3",10),c=r("roclen4",30,"smalen4",15),u=new Array(o).fill(NaN);for(let e=0;e<o;e++)u[e]=a[e]+2*i[e]+3*s[e]+4*c[e];return{kst:J(u),signal:J(V(u,lo(l,"siglen",9)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},po={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:(t,l)=>{const o=e(t,"close"),n=o.length,r=lo(l,"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 t=0,l=0;for(let n=0;n<r;n++){const a=o[e-n];t+=a,l+=a*(r-n)}a[e]=(r*l-i*t)/s}return{slope:J(a)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},yo=[ao,io,so,co,uo,po],fo=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},mo=(e,t,l,o=1)=>Math.max(o,Math.round(fo(e,t,l))),ho=(e,t,l)=>Math.round(fo(e,t,l)),bo=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},go=(e,t,l)=>{const o=e[t];return"boolean"==typeof o?o:l},ko=(e,t="source")=>e[t]??"close",wo=e=>e.map(e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0);function vo(e,t){const l=e.length,o=new Array(l).fill(NaN);for(let n=0;n<l;n++){const r=n-t;r>=0&&r<l&&(o[n]=e[r])}return o}const No={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:(t,l)=>{const o=e(t,"close"),n=V(o,mo(l,"shortLength",9)),r=V(o,mo(l,"longLength",21)),a=function(e,t){const l=e.length,o=new Array(l).fill(!1);for(let n=1;n<l;n++){const l=e[n-1],r=t[n-1],a=e[n],i=t[n];Number.isFinite(l)&&Number.isFinite(r)&&Number.isFinite(a)&&Number.isFinite(i)&&(o[n]=a>i&&l<=r||a<i&&l>=r)}return o}(n,r);return{short:J(n),long:J(r),cross:n.map((e,t)=>a[t]?e:null)}}},Co={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:(t,l)=>{const o=e(t,"close"),n=mo(l,"length",14),r=G(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 t=n*Math.pow(o[e]/i,4),l=i+(o[e]-i)/t;a[e]=Number.isFinite(l)?l:r[e]}else a[e]=r[e];i=a[e]}return{mg:J(a)}}},Mo={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:(t,o)=>{const n=e(t,ko(o)),r=mo(o,"length",3),a=fo(o,"atrMult",2),i=pe(n,r,50),s=l(t.map(e=>e.high),t.map(e=>e.low),t.map(e=>e.close),mo(o,"atrLength",14));return{median:J(i),upper:J(i.map((e,t)=>e+a*s[t])),lower:J(i.map((e,t)=>e-a*s[t])),medianEma:J(yt(i,r))}}},Ao=[{label:"SMA",value:"SMA"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}];const xo=[{lane:1,length:20,color:"#f6c309"},{lane:2,length:50,color:"#fb9800"},{lane:3,length:100,color:"#fb6500"},{lane:4,length:200,color:"#f60c0c"}],So={id:"ma-ribbon",name:"Moving Average Ribbon",category:"Trend",placement:"onchart",inputs:xo.flatMap(e=>function(e,t,l){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:Ao,group:o},{key:`ma${e}Source`,type:"source",label:"Source",default:"close",group:o},{key:`ma${e}Length`,type:"number",label:"Length",default:t,min:1,max:1e3,step:1,group:o},{key:`ma${e}Color`,type:"color",label:"Color",default:l,group:o}]}(e.lane,e.length,e.color)),plots:xo.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:(t,l)=>{const o=wo(t),n={};for(const{lane:r,length:a}of xo){if(!go(l,`showMa${r}`,!0)){n[`ma${r}`]=new Array(t.length).fill(null);continue}const i=e(t,ko(l,`ma${r}Source`));n[`ma${r}`]=J(ft(bo(l,`ma${r}Type`,"SMA"),i,o,mo(l,`ma${r}Length`,a)))}return n}},Lo={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:(t,l)=>{const o=e(t,"close"),n=mo(l,"length",9),r=G(o,n),a=yt(r,n),i=yt(a,n);return{tema:J(r.map((e,t)=>3*e-3*a[t]+i[t]))}}},Fo={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:(t,l)=>{const o=e(t,ko(l)),r="continuous"!==l.anchor?n(t.map(e=>e.time),(e=>{const t=e.timezone;return"string"!=typeof t||""===t||t===a?a:i(t)?t:a})(l)):null,s=new Array(t.length).fill(NaN);let c=0,u=0;for(let e=0;e<t.length;e++){null!==r&&r[e]&&(c=0,u=0);const t=o[e];Number.isFinite(t)&&(c+=t,u+=1,s[e]=c/u)}return{twap:J(vo(s,ho(l,"offset",0)))}}},Bo={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:(t,l)=>({vwma:J(vo(le(e(t,ko(l)),wo(t),mo(l,"length",20)),ho(l,"offset",0)))})},Ko={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:(t,l)=>{const o=e(t,"hl2");return{jaw:J(vo(j(o,mo(l,"jawLength",13)),ho(l,"jawOffset",8))),teeth:J(vo(j(o,mo(l,"teethLength",8)),ho(l,"teethOffset",5))),lips:J(vo(j(o,mo(l,"lipsLength",5)),ho(l,"lipsOffset",3)))}}},Wo={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:(t,l)=>({smma:J(j(e(t,ko(l)),mo(l,"length",7)))})};function Do(e,t,l){const o=yt(e,t);if(0===l)return o;const n=yt(o,t);return o.map((e,t)=>e*(1+l)-n[t]*l)}const Ro={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:t,values:l,settings:o})=>{if(!go(o,"highlightMovements",!0))return bo(o,"neutralColor","#6d1e7f");const n=l.t3?.[t-1];return"number"==typeof n&&Number.isFinite(n)&&e>n?bo(o,"upColor","#26a69a"):bo(o,"downColor","#ff5252")}}],calc:(t,l)=>{const o=e(t,ko(l)),n=mo(l,"length",5),r=fo(l,"factor",.7),a=Do(o,n,r),i=Do(a,n,r);return{t3:J(Do(i,n,r))}}},Oo=[No,Co,Mo,So,Lo,Fo,Bo,Ko,Wo,Ro],To=(e,t,l)=>Math.max(1,Math.floor(((e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l})(e,t,l))),Uo=e=>e.source??"close",Po=(e,t,l)=>"string"==typeof e[t]?e[t]:l;function $o(e,t,l){const o=X(e),n=e=>yt(yt(e,l),t),r=n(o),a=n(o.map(e=>Math.abs(e)));return r.map((e,t)=>100*e/a[t])}const Io={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:(t,l)=>({mom:J(X(e(t,Uo(l)),To(l,"len",10)))})},Eo={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:(t,l)=>({roc:J(_(e(t,Uo(l)),To(l,"length",9)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]};function Vo(e,t,l){return"SMA"===l?V(e,t):yt(e,t)}const qo={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:t,values:l,settings:o})=>{const n=l.hist?.[t-1],r=(e,t)=>"string"==typeof o[e]?o[e]:t,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:(t,l)=>{const o=e(t,Uo(l)),n=Po(l,"oscType","EMA"),r=Vo(o,To(l,"fastLength",12),n),a=Vo(o,To(l,"slowLength",26),n),i=r.map((e,t)=>0===a[t]?NaN:100*(e-a[t])/a[t]),s=Vo(i,To(l,"signalLength",9),Po(l,"sigType","EMA"));return{hist:J(i.map((e,t)=>e-s[t])),ppo:J(i),signal:J(s)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Ho={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,t)=>{const l=To(t,"length",18);return{trix:J(X(yt(yt(yt(e.map(e=>e.close>0?Math.log(e.close):NaN),l),l),l)).map(e=>1e4*e))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},jo={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,t)=>{const l=$o(e.map(e=>e.close),To(t,"short",13),To(t,"long",25));return{tsi:J(l),signal:J(yt(l,To(t,"signal",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},zo={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,t)=>{const l=$o(e.map(e=>e.close),To(t,"shortlen",5),To(t,"longlen",20));return{erg:J(l),sig:J(yt(l,To(t,"siglen",5)))}}},Zo={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,t)=>{const l=$o(e.map(e=>e.close),To(t,"shortlen",5),To(t,"longlen",20)),o=yt(l,To(t,"siglen",5));return{osc:J(l.map((e,t)=>e-o[t]))}}},Yo={id:"smi",name:"Stochastic Momentum Index",category:"Momentum",placement:"pane",inputs:[{key:"lengthK",type:"number",label:"%K Length",default:10,min:1,max:15e3,step:1},{key:"lengthD",type:"number",label:"%D Length",default:3,min:1,max:4999,step:1},{key:"lengthEMA",type:"number",label:"EMA Length",default:3,min:1,max:4999,step:1},{key:"color",type:"color",label:"SMI",default:"#2196f3"},{key:"emaColor",type:"color",label:"SMI-based EMA",default:"#ff9800"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"smi",type:"line",title:"SMI",colorKey:"color",style:{lineWidth:1.5}},{key:"ema",type:"line",title:"SMI-based EMA",colorKey:"emaColor",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,t)=>{const l=To(t,"lengthK",10),o=To(t,"lengthD",3),n=Z(e.map(e=>e.high),l),r=Y(e.map(e=>e.low),l),a=n.map((e,t)=>e-r[t]),i=e=>yt(yt(e,o),o),s=i(e.map((e,t)=>e.close-(n[t]+r[t])/2)),c=i(a),u=s.map((e,t)=>0===c[t]?NaN:e/c[t]*200);return{smi:J(u),ema:J(yt(u,To(t,"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}]},Jo=[Io,Eo,qo,Ho,jo,zo,Zo,Yo],Go=(e,t,l)=>Math.max(1,Math.floor(((e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l})(e,t,l))),Xo=(e,t,l)=>"string"==typeof e[t]?e[t]:l,_o=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function Qo(e,t,l){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=l(e.slice(n,r),t);for(let e=0;e<a.length;e++)o[n+e]=a[e];n=r}return o}const en=e=>"SMA"===e?V:G;function tn(e,t,l,o){return{id:e,name:t,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:l,default:"#2962ff"},{key:"emaColor",type:"color",label:`${l}-based EMA`,default:"#ff9800"}],plots:[{key:e,type:"line",title:l,colorKey:"color",style:{lineWidth:1.5}},{key:"ema",type:"line",title:`${l}-based EMA`,colorKey:"emaColor",style:{lineWidth:1.5}}],calc:(t,l)=>{const n=function(e,t){const l=new Array(e.length);let o=1;for(let n=0;n<e.length;n++){if(n>0){const l=e[n-1].close,r=e[n].close;("falling"===t?_o(e[n])<_o(e[n-1]):_o(e[n])>_o(e[n-1]))&&0!==l&&Number.isFinite(l)&&Number.isFinite(r)&&(o*=r/l)}l[n]=1e3*o}return l}(t,o);return{[e]:J(n),ema:J(Qo(n,Go(l,"maLength",255),G))}}}}const ln=tn("nvi","Negative Volume Index","NVI","falling"),on=tn("pvi","Positive Volume Index","PVI","rising"),nn={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 t=new Array(e.length).fill(NaN);for(let l=1;l<e.length;l++){const o=e[l-1].close;0!==o&&Number.isFinite(o)&&(t[l]=(e[l].close-o)/o*_o(e[l]))}return{pvt:J(ie(t))}}},rn={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:t,values:l,settings:o})=>{const n=l.hist?.[t-1],r=null!=n&&Number.isFinite(n)&&e>n,a=(e,t)=>"string"==typeof o[e]?o[e]:t;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,t)=>{const l=e.length,o=e.map(_o),n=en(Xo(t,"oscType","EMA")),r=n(o,Go(t,"fastLength",12)),a=n(o,Go(t,"slowLength",26)),i=new Array(l).fill(NaN);for(let e=0;e<l;e++)0!==a[e]&&(i[e]=100*(r[e]-a[e])/a[e]);const s=Qo(i,Go(t,"signalLength",9),en(Xo(t,"sigType","EMA"))),c=new Array(l);for(let e=0;e<l;e++)c[e]=i[e]-s[e];return{hist:J(c),pvo:J(i),signal:J(s)}},levels:()=>[{price:0,color:"#787b8680",title:"Zero"}]},an={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,t)=>{const l=e.length,o=G(e.map(e=>e.high-e.low),9),n=G(o,9),r=new Array(l).fill(NaN);for(let e=0;e<l;e++)0!==n[e]&&(r[e]=o[e]/n[e]);return{mi:J(Qo(r,Go(t,"length",10),ae))}}},sn={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:(t,l)=>{const o=t.length,n=Go(l,"length",14),r=e(t,(e=>e.source??"close")(l)),a=Z(r,n),i=new Array(o).fill(NaN);for(let e=0;e<o;e++){const t=a[e];if(!Number.isFinite(t)||0===t)continue;const l=100*(r[e]-t)/t;i[e]=l*l}const s=V(i,n),c=new Array(o);for(let e=0;e<o;e++)c[e]=Math.sqrt(s[e]);return{ui:J(c),zero:c.map(e=>Number.isFinite(e)?0:null)}},levels:()=>[{price:0,color:"#2196f3",title:"Zero"}]},cn=[ln,on,nn,rn,an,sn],un=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},pn=(e,t,l,o=1)=>Math.max(o,Math.round(un(e,t,l))),yn=(e,t,l)=>Math.round(un(e,t,l)),fn=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},mn=(e,t="source")=>e[t]??"close";function dn(e,t,l){const o=e.length,n=new Array(o).fill(NaN),r=V(e,t),a=2/(t+1);let i=NaN;for(let t=0;t<o;t++){const o=e[t];if(Number.isFinite(i))if(Number.isFinite(o))i=o*a+i*(1-a);else{if(!(t<l))continue;i=NaN}else i=r[t];n[t]=i}return n}function hn(e,t){if(0===t)return e.slice();const l=e.length,o=new Array(l).fill(null);for(let n=0;n<l;n++){const r=n+t;r>=0&&r<l&&(o[r]=e[n])}return o}const bn={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:(t,l)=>{const o=pn(l,"lengthStoch",14),n=pt(f(e(t,mn(l)),pn(l,"lengthRSI",14)),e=>ue(e,e,e,o)),r=pt(n,e=>V(e,pn(l,"smoothK",3))),a=pt(r,e=>V(e,pn(l,"smoothD",3)));return{k:J(r),d:J(a),bandHigh:new Array(t.length).fill(80),bandLow:new Array(t.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})},gn={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:(t,l)=>{const o=pn(l,"length",14),n=e(t,mn(l)),r=Z(t.map(e=>e.high),o),a=Y(t.map(e=>e.low),o),i=n.map((e,t)=>{const l=r[t]-a[t];return 0===l?NaN:100*(e-r[t])/l});return{percentR:J(i),bandHigh:new Array(t.length).fill(-20),bandLow:new Array(t.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})},kn={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,t)=>{const l=e.length,o=Math.max(0,l-1),n=new Array(o),r=new Array(o);for(let t=1;t<l;t++){const l=e[t-1].close,o=Math.max(e[t].high,l),a=Math.min(e[t].low,l);n[t-1]=e[t].close-a,r[t-1]=o-a}const a=e=>{const t=ae(n,e),l=ae(r,e);return t.map((e,t)=>0===l[t]?NaN:e/l[t])},i=a(pn(t,"length1",7)),s=a(pn(t,"length2",14)),c=a(pn(t,"length3",28)),u=new Array(l).fill(NaN);for(let e=0;e<o;e++)u[e+1]=100*(4*i[e]+2*s[e]+c[e])/7;return{uo:J(u)}}},wn={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,t)=>{const l=pn(t,"length",10),o=ce(e.map(e=>e.close-e.open)),n=ce(e.map(e=>e.high-e.low)),r=pt(o,e=>ae(e,l)),a=pt(n,e=>ae(e,l)),i=r.map((e,t)=>0===a[t]?NaN:e/a[t]),s=pt(i,e=>ce(e)),c=yn(t,"offset",0);return{rvgi:hn(J(i),c),signal:hn(J(s),c)}}},vn={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:ct,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,t)=>{const l=e.length,o=e.map(e=>e.close),n=z(o,pn(t,"length",10)),r=X(o),a=new Array(l),i=new Array(l);for(let e=0;e<l;e++){const t=r[e];a[e]=Number.isFinite(t)&&t<=0?0:n[e],i[e]=Number.isFinite(t)&&t>0?0:n[e]}let s=0;for(;s<l&&!Number.isFinite(n[s]);)s+=1;const c=dn(a,14,s),u=dn(i,14,s),p=new Array(l).fill(NaN);for(let e=0;e<l;e++){const t=c[e]+u[e];p[e]=0===t?NaN:c[e]/t*100}const y=fn(t,"maType","SMA"),f=pn(t,"maLength",14),m=un(t,"bbMult",2),d=y===ut,h="None"===y?new Array(l).fill(NaN):ft(y,p,e.map(e=>e.volume??0),f),b=d?pt(p,e=>z(e,f)).map(e=>e*m):new Array(l).fill(NaN),g=yn(t,"offset",0);return{rvi:hn(J(p),g),ma:J(h),bbUpper:J(h.map((e,t)=>e+b[t])),bbLower:J(h.map((e,t)=>e-b[t])),bandHigh:new Array(l).fill(80),bandLow:new Array(l).fill(20)}},levels:()=>[{price:80,color:"#787b86",title:"Upper Band"},{price:50,color:"#5a6b8c",title:"Middle Band"},{price:20,color:"#787b86",title:"Lower Band"}]},Nn={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:t,settings:l})=>{const o=fn(l,"upColor","#009688"),n=fn(l,"downColor","#f44336"),r=l=>{const o=t.hist?.[e-l];return"number"==typeof o&&Number.isFinite(o)?o:null};let a=!0,i=!0;for(let e=1;e<=5;e+=1){const t=r(e);(null===t||t<=0)&&(a=!1),(null===t||t>=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,t)=>{const l=e.map(e=>e.close),o=fe(l,pn(t,"cciTurboLength",6)),n=fe(l,pn(t,"cci14Length",14));return{hist:J(n),turbo:J(o),cci14:J(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}]},Cn=[{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}],Mn={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:(t,l)=>{const o=t.length,n=e(t,mn(l)),r=new Array(o).fill(0);for(const e of Cn){const t=pt(_(n,e.roc),t=>V(t,e.smooth));for(let l=0;l<o;l++)r[l]+=e.weight*t[l]}const a=pt(r,e=>V(e,pn(l,"length1",100))),i=pt(a,e=>V(e,pn(l,"length2",100)));return{specialK:J(r),signal:J(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero"}]},An=[bn,gn,kn,wn,vn,Nn,Mn],xn=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Sn=(e,t,l)=>Math.max(1,Math.floor(xn(e,t,l))),Ln=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},Fn=(e,t="source")=>e[t]??"close",Bn=(e,t)=>!1!==e[t];function Kn(e,t){const l=new Array(e.length).fill(NaN);for(let o=t;o<e.length;o++)l[o]=e[o-t];return l}function Wn(e,t){const l=new Array(e.length).fill(!1);for(let o=t;o<e.length;o++)l[o]=e[o-t];return l}const Dn={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,t)=>{const l=e.length,o=Sn(t,"length",14),n=new Array(l).fill(NaN),r=new Array(l).fill(NaN);if(0===l)return{vip:J(n),vim:J(r)};const a=e.map(e=>e.high),i=e.map(e=>e.low),s=e.map(e=>e.close),c=new Array(l-1),u=new Array(l-1);for(let e=1;e<l;e++)c[e-1]=Math.abs(a[e]-i[e-1]),u[e-1]=Math.abs(i[e]-a[e-1]);const p=ae(c,o),y=ae(u,o),f=ae(m(a,i,s),o);for(let e=1;e<l;e++)n[e]=p[e-1]/f[e],r[e]=y[e-1]/f[e];return{vip:J(n),vim:J(r)}}},Rn={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:(t,o)=>{const n=t.length,r=new Array(n).fill(null),a=new Array(n).fill(null);if(0===n)return{up:r,down:a};const i=e(t,Fn(o)),s=xn(o,"factor",2),c=t.map(e=>e.high),u=t.map(e=>e.low),p=t.map(e=>e.close),y=l(c,u,p,Sn(o,"length",20)),f=m(c,u,p);let d=i[0],h=i[0],b=!0,g=NaN;for(let e=0;e<n;e++){const t=i[e],l=Number.isFinite(y[e])?y[e]*s:f[e];d=Math.max(d,t),h=Math.min(h,t);let o=b?Math.max(g,d-l):Math.min(g,h+l);Number.isFinite(o)||(o=t);const n=t-o>=0;e>0&&n!==b&&(d=t,h=t,o=n?d-l:h+l),b=n,g=o,Number.isFinite(o)&&(n?r[e]=o:a[e]=o)}return{up:r,down:a}}},On={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,t)=>{const l=e.map((e,t)=>t);return{tsi:J(ye(e.map(e=>e.close),l,Sn(t,"length",14)))}},levels:e=>[{price:1,color:Ln(e,"bullishColor","#089981"),title:"TSI Bullish Band"},{price:0,color:"#787b86",title:"TSI Middle Band",dashed:!0},{price:-1,color:Ln(e,"bearishColor","#f23645"),title:"TSI Bearish Band"}],range:()=>({min:-1,max:1})};function Tn(e,t,l,o){const n=e[t];if(!Number.isFinite(n))return!1;const r=t=>t>=0&&t<e.length&&Number.isFinite(e[t])&&(o?e[t]<n:e[t]>n),a=t=>t>=0&&t<e.length&&Number.isFinite(e[t])&&(o?e[t]<=n:e[t]>=n);for(let e=1;e<=l;e++)if(!r(t+e))return!1;for(let e=0;e<=4;e++){let o=!0;for(let l=1;l<=e&&o;l++)a(t-l)||(o=!1);for(let n=1;n<=l&&o;n++)r(t-e-n)||(o=!1);if(o)return!0}return!1}const Un={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,t)=>{const l=e.length,o=new Array(l).fill(null),n=new Array(l).fill(null),r=new Array(l).fill(null),a={fractals:o,upFractal:n,downFractal:r};if(0===l)return a;const i=Math.max(2,Sn(t,"periods",2)),s=e.map(e=>e.high),c=e.map(e=>e.low),u=Bn(t,"showUp"),p=Bn(t,"showDown");for(let e=0;e<l;e++)u&&Tn(s,e,i,!0)&&(n[e]=s[e]),p&&Tn(c,e,i,!1)&&(r[e]=c[e]);return a},markers:({bars:e,values:t,settings:l})=>{const o=t.upFractal??[],n=t.downFractal??[],r=Ln(l,"upColor","#009688"),a=Ln(l,"downColor","#f44336"),i=[];for(let t=0;t<e.length;t++){const l=o[t];null!=l&&i.push({time:e[t].time,position:"atPrice",price:l,shape:"triangleUp",size:"small",color:r});const s=n[t];null!=s&&i.push({time:e[t].time,position:"atPrice",price:s,shape:"triangleDown",size:"small",color:a})}return i}},Pn={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:(t,l)=>{const o=t.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=f(e(t,Fn(l)),Sn(l,"length",14)),c={rsi:J(s),bull:n,hiddenBull:r,bear:a,hiddenBear:i};if(0===o)return c;const u=Sn(l,"lbR",5),p=Sn(l,"lbL",5),y=xn(l,"rangeLower",5),m=xn(l,"rangeUpper",60),d=!1!==l.plotBull,h=!0===l.plotHiddenBull,b=!1!==l.plotBear,g=!0===l.plotHiddenBear,k=de(s,p,u).map(e=>Number.isFinite(e)),w=me(s,p,u).map(e=>Number.isFinite(e)),v=Kn(s,u),N=Kn(t.map(e=>e.low),u),C=Kn(t.map(e=>e.high),u),M=ge(Wn(k,1)),A=ge(Wn(w,1)),x=ke(k,v,1),S=ke(k,N,1),L=ke(w,v,1),F=ke(w,C,1);for(let e=0;e<o;e++){const t=e-u;if(!(t<0)){if(k[e]){const l=y<=M[e]&&M[e]<=m,o=v[e]>x[e]&&l,a=v[e]<x[e]&&l;d&&o&&N[e]<S[e]&&(n[t]=v[e]),h&&a&&N[e]>S[e]&&(r[t]=v[e])}if(w[e]){const l=y<=A[e]&&A[e]<=m,o=v[e]<L[e]&&l,n=v[e]>L[e]&&l;b&&o&&C[e]>F[e]&&(a[t]=v[e]),g&&n&&C[e]<F[e]&&(i[t]=v[e])}}}return c},markers:({bars:e,values:t,settings:l})=>{const o=Ln(l,"bullColor","#4caf50"),n=Ln(l,"bearColor","#ff5252"),r=[{col:t.bull,shape:"labelUp",text:"Bull",color:o},{col:t.hiddenBull,shape:"labelUp",text:"H Bull",color:o},{col:t.bear,shape:"labelDown",text:"Bear",color:n},{col:t.hiddenBear,shape:"labelDown",text:"H Bear",color:n}],a=[];for(let t=0;t<e.length;t++)for(const l of r){const o=l.col?.[t];null!=o&&a.push({time:e[t].time,position:"atPrice",price:o,shape:l.shape,size:"small",color:l.color,text:l.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})},$n={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 t=e.length,l=new Array(t).fill(NaN),o=new Array(t).fill(NaN),n=new Array(t).fill(NaN),r=new Array(t).fill(NaN),a=new Array(t).fill(NaN);let i=0;for(let s=0;s<t;s++){const t=e[s],c=Math.max(t.open,t.close),u=Math.min(t.open,t.close),p=e[i].high,y=e[i].low,f=s-i,m=f>1&&f<=250;m&&c>p&&(n[s]=p),m&&u<y&&(r[s]=y);const d=i;i=s>1&&u>=y&&u<=p&&c>=y&&c<=p?i:s,i===d&&(l[s]=e[i].high,o[s]=e[i].low);const h=s-i;h>0&&(a[s]=h)}return{rangeHigh:J(l),rangeLow:J(o),breakUp:J(n),breakDown:J(r),insideAge:J(a)}},markers:({bars:e,values:t,settings:l})=>{const o=[];if(!Bn(l,"markbreakout"))return o;const n=t.breakUp??[],r=t.breakDown??[],a=Ln(l,"bullBreakColor","#00c853"),i=Ln(l,"bearBreakColor","#ff5252");for(let t=0;t<e.length;t++)null!==n[t]&&void 0!==n[t]&&o.push({time:e[t].time,position:"belowBar",shape:"triangleUp",size:"small",color:a}),null!==r[t]&&void 0!==r[t]&&o.push({time:e[t].time,position:"aboveBar",shape:"triangleDown",size:"small",color:i});return o},barColors:({bars:e,values:t,settings:l})=>{const o=t.insideAge??[],n=Ln(l,"insideColor","#000000"),r=Bn(l,"colorinside");return e.map((e,t)=>r&&null!==o[t]&&void 0!==o[t]?n:null)}},In=[Dn,Rn,On,Un,Pn,$n],En=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},Vn=(e,t,l)=>"string"==typeof e[t]?e[t]:l,qn=(e,t,l)=>"boolean"==typeof e[t]?e[t]:l,Hn=e=>new Array(e).fill(NaN),jn=86400,zn=e=>Math.floor(((e=>Math.floor((e+y)/jn))(e)-4)/7);function Zn(e,t,l){const o=e.map(e=>e.time);return"daily"===t?n(o,l):r(o,function(e,t){return t!==a?"weekly"===e?(e,l)=>h(e,l,t):(e,l)=>b(e,l,t):"weekly"===e?(e,t)=>zn(e)!==zn(t):(e,t)=>{const l=p(e),o=p(t);return l.year!==o.year||l.month!==o.month}}(t,l))}function Yn(e){const t=function(e){if(e.length<2)return 0;const t=[];for(let l=1;l<e.length;l++){const o=e[l].time-e[l-1].time;o>0&&t.push(o)}return 0===t.length?0:(t.sort((e,t)=>e-t),t[Math.floor(t.length/2)])}(e);return t<=0||t<jn?"daily":t<604800?"weekly":"monthly"}const Jn={daily:"d",weekly:"w",monthly:"m"},Gn={daily:"Daily",weekly:"Weekly",monthly:"Monthly"},Xn=(e,t,l,o)=>({key:e,type:"line",title:t,colorKey:l,style:{markersOnly:!0,markerRadius:o}});function _n(e){const t=Jn[e],l=Gn[e],o=`${t}SupportColor`,n=`${t}ResistanceColor`,r=`${t}CprColor`;return[{key:`${t}Pivot`,type:"line",title:`${l} Pivot`,colorKey:`${t}PivotColor`,style:{lineWidth:2}},Xn(`${t}S1`,`${l} S1`,o,1),Xn(`${t}S2`,`${l} S2`,o,1),Xn(`${t}S3`,`${l} S3`,o,1),Xn(`${t}R1`,`${l} R1`,n,1),Xn(`${t}R2`,`${l} R2`,n,1),Xn(`${t}R3`,`${l} R3`,n,1),Xn(`${t}Bc`,`${l} Bottom Pivot`,r,2),Xn(`${t}Tc`,`${l} Top Pivot`,r,2)]}function Qn(e){const t=Jn[e],l=Gn[e];return[{key:`${t}PivotColor`,type:"color",label:"Pivot",default:"#ffeb3b",group:l},{key:`${t}SupportColor`,type:"color",label:"Support",default:"#4caf50",group:l},{key:`${t}ResistanceColor`,type:"color",label:"Resistance",default:"#ff5252",group:l},{key:`${t}CprColor`,type:"color",label:"CPR",default:"#ff9800",group:l},{key:`${t}FillColor`,type:"color",label:"CPR Fill",default:"#f47676",group:l}]}function er(e,t,l,o,n){const r=e.length,a=Hn(r),i=Hn(r),s=Hn(r),c=Hn(r),u=Hn(r),p=Hn(r),y=Hn(r),f=Hn(r),m=Hn(r);if(l){const l=Zn(e,t,n);let d=NaN,h=NaN,b=NaN,g=NaN,k=NaN,w=NaN;for(let t=0;t<r;t++){l[t]&&(d=g,h=k,b=w);const n=e[t],r=Number.isFinite(n.high)?n.high:NaN,v=Number.isFinite(n.low)?n.low:NaN,N=0===t||l[t];if(g=N?r:Math.max(g,r),k=N?v:Math.min(k,v),w=n.close,!Number.isFinite(d)||!Number.isFinite(h)||!Number.isFinite(b))continue;const C=(d+h+b)/3,M=d-h,A=2*C-d,x=2*C-h,S=(d+h)/2;o.pivot&&(a[t]=C),o.support&&(o.s1r1&&(i[t]=A),s[t]=C-M,c[t]=A-M),o.resistance&&(o.s1r1&&(u[t]=x),p[t]=C+M,y[t]=x+M),o.cpr&&(f[t]=S,m[t]=2*C-S)}}const d=Jn[t];return{[`${d}Pivot`]:J(a),[`${d}S1`]:J(i),[`${d}S2`]:J(s),[`${d}S3`]:J(c),[`${d}R1`]:J(u),[`${d}R2`]:J(p),[`${d}R3`]:J(y),[`${d}Bc`]:J(f),[`${d}Tc`]:J(m)}}const tr={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},...Qn("daily"),...Qn("weekly"),...Qn("monthly")],plots:[..._n("daily"),..._n("weekly"),..._n("monthly")],fills:["daily","weekly","monthly"].map(e=>{const t=Jn[e];return{between:[`${t}Tc`,`${t}Bc`],colorUpKey:`${t}FillColor`,colorDownKey:`${t}FillColor`,opacity:.48}}),calc:(e,t)=>{const l="manual"===t.pivotMode,o=Yn(e),n={pivot:qn(t,"displaypivots",!0),support:qn(t,"displaysupport",!0),resistance:qn(t,"displayresistance",!0),cpr:qn(t,"displaycpr",!0),s1r1:qn(t,"displayS1R1",!1)},r=l?{daily:qn(t,"showDaily",!0),weekly:qn(t,"showWeekly",!1),monthly:qn(t,"showMonthly",!1)}:{daily:"daily"===o,weekly:"weekly"===o,monthly:"monthly"===o},s=(e=>{const t=e.timezone;return"string"!=typeof t||""===t||t===a?a:i(t)?t:a})(t);return{...er(e,"daily",r.daily,n,s),...er(e,"weekly",r.weekly,n,s),...er(e,"monthly",r.monthly,n,s)}}};const lr={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:t,settings:l})=>{if(!1===l.showsignalsk)return[];const o=t.buySignal??[],n=t.sellSignal??[],r=[];for(let t=0;t<e.length;t++){const a=o[t];if(null!=a){r.push({time:e[t].time,position:"atPrice",price:a,shape:"labelUp",size:"tiny",color:Vn(l,"buyColor","#0022fc"),text:"BUY"});continue}const i=n[t];null!=i&&r.push({time:e[t].time,position:"atPrice",price:i,shape:"labelDown",size:"tiny",color:Vn(l,"sellColor","#880e4f"),text:"SELL"})}return r},calc:(t,l)=>{const o=t.length,n=Hn(o),r=Hn(o),a=Hn(o),i=Hn(o);if(0===o)return{alphatrend:[],lagged:[],buySignal:[],sellSignal:[]};const s=Math.max(1,Math.round(En(l,"AP",14))),c=En(l,"coeff",1),u=!0===l.novolumedata,p=!1!==l.showsignalsk,y=t.map(e=>e.high),d=t.map(e=>e.low),h=t.map(e=>e.close),b=B(m(y,d,h),s),g=u?f(e(t,((e,t="source")=>e[t]??"close")(l)),s):function(e,t,l){const o=e.length,n=Hn(o);if(l<=0||0===o)return n;const r=new Array(o).fill(0),a=new Array(o).fill(0);for(let l=1;l<o;l++){const o=e[l]*t[l];e[l]>e[l-1]?r[l]=o:e[l]<e[l-1]&&(a[l]=o)}const i=F(r,l),s=F(a,l);for(let e=l;e<o;e++)Number.isFinite(i[e])&&Number.isFinite(s[e])&&(n[e]=0===s[e]?100:100-100/(1+i[e]/s[e]));return n}(t.map(e=>(e.high+e.low+e.close)/3),t.map(e=>e.volume??0),s);for(let e=0;e<o;e++){const l=e>0&&Number.isFinite(n[e-1])?n[e-1]:0;if(!Number.isFinite(b[e])||!Number.isFinite(g[e]))continue;const o=b[e]*c;n[e]=g[e]>=50?Math.max(t[e].low-o,l):Math.min(t[e].high+o,l)}for(let e=2;e<o;e++)r[e]=n[e-2];const k=new Array(o).fill(!1),w=new Array(o).fill(!1);for(let e=1;e<o;e++){const t=n[e],l=r[e],o=n[e-1],a=r[e-1];Number.isFinite(t)&&Number.isFinite(l)&&Number.isFinite(o)&&Number.isFinite(a)&&(t>l&&o<=a?k[e]=!0:t<l&&o>=a&&(w[e]=!0))}if(p){const e=k.map((e,t)=>t>0&&k[t-1]),t=w.map((e,t)=>t>0&&w[t-1]),l=ge(k),n=ge(w),s=ge(e),c=ge(t);for(let e=0;e<o;e++)k[e]&&s[e]>n[e]?a[e]=.9999*r[e]:w[e]&&c[e]>l[e]&&(i[e]=1.0001*r[e])}return{alphatrend:J(n),lagged:J(r),buySignal:J(a),sellSignal:J(i)}}},or={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,t)=>{const l=e.map(e=>e.high-e.low);return!0!==t.showAverage?{range:J(l),avgRange:new Array(e.length).fill(null)}:{range:J(l),avgRange:J(V(l,Math.max(1,Math.round(En(t,"avgLength",3)))))}}},nr=[tr,lr,or],rr=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},ar=(e,t,l)=>Math.max(1,Math.floor(rr(e,t,l))),ir=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},sr=(e,t)=>new Array(e).fill(t),cr=e=>/^#[0-9a-f]{6}$/i.test(e)?`${e}99`:e;function ur(e,t){const l=new Array(e.length).fill(NaN);for(let o=t;o<e.length;o++)l[o]=e[o-t];return l}function pr(e,t){const l=new Array(e.length).fill(!1);for(let o=t;o<e.length;o++)l[o]=e[o-t];return l}const yr={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:t})=>{const l=(e,l)=>{const o=t[e];return"string"==typeof o&&""!==o?o:l};return e>=0?l("momUpColor","#008080"):l("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:(t,l)=>{const o=t.length,n=ar(l,"n1",10),r=ar(l,"n2",21),a=ar(l,"sigLen",4),i=rr(l,"obLevel1",60),s=rr(l,"obLevel2",53),c=rr(l,"osLevel1",-60),u=rr(l,"osLevel2",-53),p=new Array(o).fill(null),y=new Array(o).fill(null),f=new Array(o).fill(null),m=new Array(o).fill(null),d=new Array(o).fill(null),h=new Array(o).fill(null),b=e(t,(e=>e.source??"hlc3")(l)),g=pt(b,e=>G(e,n)),k=pt(b.map((e,t)=>Math.abs(e-g[t])),e=>G(e,n)),w=pt(b.map((e,t)=>{const l=k[t];return Number.isFinite(l)?0===l?0:(e-g[t])/(.015*l):NaN}),e=>G(e,r)),v=pt(w,e=>B(e,a)),N=w.map((e,t)=>e-v[t]),C={wt1:J(w),wt2:J(v),mom:!1===l.showMom?new Array(o).fill(null):J(N),obUpper:sr(o,i),obLower:sr(o,s),osUpper:sr(o,u),osLower:sr(o,c),buy:p,sell:y,bull:f,bear:m,hiddenBull:d,hiddenBear:h},M=!1!==l.filterZone,A=!1!==l.useInner,x=A?s:i,S=A?u:c;for(let e=1;e<o;e++){const t=w[e-1],l=v[e-1],o=w[e],n=v[e];Number.isFinite(t)&&Number.isFinite(l)&&(Number.isFinite(o)&&Number.isFinite(n)&&(o>n&&t<=l&&(!M||n<=S)&&(p[e]=n),o<n&&t>=l&&(!M||n>=x)&&(y[e]=n)))}const L=ar(l,"lbL",3),F=ar(l,"lbR",3),K=rr(l,"rangeLower",5),W=rr(l,"rangeUpper",60),D=!1!==l.showRegDiv,R=!0===l.showHidDiv,O=de(v,L,F).map(e=>Number.isFinite(e)),T=me(v,L,F).map(e=>Number.isFinite(e)),U=ur(v,F),P=ur(t.map(e=>e.low),F),$=ur(t.map(e=>e.high),F),I=ge(pr(O,1)),E=ge(pr(T,1)),V=ke(O,U,1),q=ke(O,P,1),H=ke(T,U,1),j=ke(T,$,1);for(let e=0;e<o;e++){const t=e-F;if(!(t<0)){if(O[e]){const l=K<=I[e]&&I[e]<=W;D&&l&&U[e]>V[e]&&P[e]<q[e]&&(f[t]=U[e]),R&&l&&U[e]<V[e]&&P[e]>q[e]&&(d[t]=U[e])}if(T[e]){const l=K<=E[e]&&E[e]<=W;D&&l&&U[e]<H[e]&&$[e]>j[e]&&(m[t]=U[e]),R&&l&&U[e]>H[e]&&$[e]<j[e]&&(h[t]=U[e])}}}return C},markers:({bars:e,values:t,settings:l})=>{const o=ir(l,"bullColor","#4caf50"),n=ir(l,"bearColor","#ff5252"),r=[{col:t.buy,shape:"circle",size:"tiny",color:ir(l,"buyColor","#00e676"),text:void 0},{col:t.sell,shape:"circle",size:"tiny",color:ir(l,"sellColor","#ff5252"),text:void 0},{col:t.bull,shape:"labelUp",size:"small",color:o,text:"R"},{col:t.bear,shape:"labelDown",size:"small",color:n,text:"R"},{col:t.hiddenBull,shape:"labelUp",size:"small",color:cr(o),text:"H"},{col:t.hiddenBear,shape:"labelDown",size:"small",color:cr(n),text:"H"}],a=[];for(let t=0;t<e.length;t++)for(const l of r){const o=l.col?.[t];if(null==o)continue;const n={time:e[t].time,position:"atPrice",price:o,shape:l.shape,size:l.size,color:l.color};void 0!==l.text&&(n.text=l.text),a.push(n)}return a},levels:e=>[{price:rr(e,"obLevel1",60),color:ir(e,"obBandColor","#ff5252"),title:"Overbought 1",dashed:!0},{price:rr(e,"obLevel2",53),color:ir(e,"obBandColor","#ff5252"),title:"Overbought 2",dashed:!0},{price:0,color:"#787b86",title:"Zero",dashed:!0},{price:rr(e,"osLevel2",-53),color:ir(e,"osBandColor","#4caf50"),title:"Oversold 2",dashed:!0},{price:rr(e,"osLevel1",-60),color:ir(e,"osBandColor","#4caf50"),title:"Oversold 1",dashed:!0}]},fr=[yr],mr=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},dr=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},hr=(e,t)=>!1!==e[t],br="#089981",gr="#F23745",kr="#787b86",wr=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function vr(e,t){let l=e;if(/^#[0-9a-f]{3}$/i.test(l))l=`#${l[1]}${l[1]}${l[2]}${l[2]}${l[3]}${l[3]}`;else if(/^#[0-9a-f]{8}$/i.test(l))l=l.slice(0,7);else if(!/^#[0-9a-f]{6}$/i.test(l))return e;return`${l}${Math.round(255*Math.min(1,Math.max(0,t))).toString(16).padStart(2,"0")}`}const Nr=vr(kr,.2),Cr=vr(kr,.5);function Mr(e,t,l,o){if(null===e||!Number.isFinite(e))return;return vr(e>=0?l:o,.1+.4*(t>0?Math.min(1,Math.abs(e)/t):1))}const Ar=e=>`${e.toFixed(2)}%`;const xr=(e,t)=>100*e+t;function Sr(e,t){const l=function(e,t){const l=[];let o=null,n=0,r=0;for(const a of e)if(null===o||a.time<n||a.time>=r){const e=g(a.time,t);o={year:e.year,month:e.month,last:a.close},l.push(o),n=k(e.year,e.month,1,0,0,0,t),r=k(e.year,e.month+1,1,0,0,0,t)}else o.last=a.close;return l}(e,(e=>{const t=e.timezone;return"string"!=typeof t||""===t||t===a?a:i(t)?t:a})(t)),o=Math.round(mr(t,"startYear",2015)),n=function(e){const t=new Set;for(const l of e.split(",")){const e=l.replace(/[\s-]/g,"");if(!/^\d{6}$/.test(e))continue;const o=Number(e),n=o%100;n>=1&&n<=12&&t.add(o)}return t}(dr(t,"ignoredMonths","")),r=l.length>0?l[l.length-1]:null;null!==r&&n.add(xr(r.year,r.month));const s=[],c=new Map;for(let e=1;e<l.length;e++){const t=l[e],r=l[e-1];if(t.year<o||n.has(xr(t.year,t.month)))continue;if(!Number.isFinite(r.last)||!Number.isFinite(t.last)||0===r.last)continue;const a=100*(t.last-r.last)/Math.abs(r.last);if(!Number.isFinite(a))continue;let i=c.get(t.year);void 0===i&&(i=new Array(12).fill(null),c.set(t.year,i),s.push(t.year)),i[t.month-1]=a}return{years:s,byYear:c,skipped:n}}function Lr(e,t){const l=[];for(const o of e.years){const n=e.byYear.get(o)?.[t];null!=n&&l.push(n)}return l}const Fr=e=>{if(0===e.length)return null;let t=0;for(const l of e)t+=l;const l=t/e.length;return Number.isFinite(l)?l:null};function Br(e){if(e.length<2)return null;const t=Fr(e);if(null===t)return null;let l=0;for(const o of e)l+=(o-t)*(o-t);const o=Math.sqrt(l/(e.length-1));return Number.isFinite(o)?o:null}const Kr=e=>{if(0===e.length)return null;let t=0;for(const l of e)l>=0&&(t+=1);return 100*t/e.length},Wr={Left:"bottom-left",Center:"bottom-center",Right:"bottom-right"},Dr=[52,...new Array(12).fill(46)],Rr=e=>({text:e,bgColor:Nr}),Or={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:br,group:"Color settings"},{key:"negColor",type:"color",label:"Negative Color",default:gr,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:t})=>{const l=Sr(e,t);if(0===l.years.length)return null;const o=mr(t,"cutoffPercent",10),n=dr(t,"posColor",br),r=dr(t,"negColor",gr),a=[[Rr("Year"),...wr.map(Rr)]],i=[1];for(const e of l.years){const t=l.byYear.get(e)??[],s=[Rr(String(e))];for(let a=0;a<12;a++){if(l.skipped.has(xr(e,a+1))){s.push({text:"SKIP",bgColor:Cr});continue}const i=t[a]??null;s.push(null===i?{text:""}:{text:Ar(i),bgColor:Mr(i,o,n,r)})}a.push(s),i.push(1)}const s=hr(t,"showAvg"),c=hr(t,"showStDev"),u=hr(t,"showPos");if(s||c||u){if(a.push(Array.from({length:13},()=>({text:"",bgColor:Nr}))),i.push(.3),s){const e=[Rr("Avgs:")];for(let t=0;t<12;t++){const a=Fr(Lr(l,t));e.push(null===a?{text:""}:{text:Ar(a),bgColor:Mr(a,o,n,r)})}a.push(e),i.push(1)}if(c){const e=[Rr("StDev:")];for(let t=0;t<12;t++){const o=Br(Lr(l,t));e.push({text:null===o?"":o.toFixed(2),bgColor:Nr})}a.push(e),i.push(1)}if(u){const e=[Rr("Pos%:")];for(let t=0;t<12;t++){const o=Kr(Lr(l,t));e.push(null===o?{text:""}:{text:`${Math.round(o)}%`,bgColor:Mr(o-50,50,n,r)})}a.push(e),i.push(1)}}return{rows:a,options:{position:Wr[dr(t,"tablePosition","Center")]??"bottom-center",cellWidth:Dr,cellHeight:18,rowWeights:i,widthPercent:mr(t,"tableWidth",100),heightPercent:mr(t,"tableHeight",95),fontSize:10,margin:8}}}},Tr=[Or],Ur=e=>!0===e?.[Symbol.for("openalgo-charts.data-context.passing")];function Pr(e){const t=w(e);return w(t&&{session:t.session,adjustment:t.adjustment})}const $r="__tier2",Ir=e=>e[$r];function Er(e,t){return(e.refetchOn??[]).map(e=>`${e}=${String(t[e])}`).join("&")}function Vr(e,t){const l=e[e.length-1];if(void 0===l||t.time>l.time)return void e.push(t);if(t.time===l.time)return void(e[e.length-1]=t);let o=0,n=e.length;for(;o<n;){const l=o+n>>1;e[l].time<t.time?o=l+1:n=l}e[o]?.time===t.time?e[o]=t:e.splice(o,0,t)}function qr(e){const t=new WeakMap;return{id:e.id,name:e.name,category:e.category,placement:e.placement,inputs:e.inputs,plots:e.plots,levels:e.levels,range:e.range,calc:(l,o,n,r)=>{const a=Ir(n);try{const i=function(e,t,l){const o={};for(const t of l)o[t]=new Array(e.length).fill(null);if(0===t.length)return o;let n=-1;for(let r=0;r<e.length;r++){for(;n+1<t.length&&t[n+1].time<=e[r].time;)n+=1;if(n<0)continue;const a=t[n].values;for(const e of l){const t=a[e];o[e][r]="number"==typeof t&&Number.isFinite(t)?t:null}}return o}(l,a?.points??[],function(e){const t=e.plots.map(e=>e.key);for(const l of e.series??[])t.includes(l)||t.push(l);return t}(e)),s=void 0===e.calc?i:e.calc(l,i,o,n,r);return t.delete(n),s}catch(e){throw t.set(n,{points:a?.points,error:e}),e}},attach:l=>{const o=Ir(l.store)??{key:null,points:[],live:[],loaded:!1,from:0,to:0,status:{state:"empty"},request:null,subscription:null,generation:0,completedVersion:null,liveRevision:0,liveVersions:new Map};l.store[$r]=o;let n=++o.generation,r=!0,a=0,i=()=>{};const s=()=>r&&o.generation===n&&!l.signal?.aborted,c=e=>{o.status=e;const n=t.get(l.store);s()&&l.setDataStatus?.("ready"!==e.state&&"empty"!==e.state||n?.points!==o.points?e:{state:"error",error:n.error})},u=()=>{const e=o.request;o.request=null,e?.controller.abort()},p=()=>{const e=o.subscription;o.subscription=null,e?.dispose?.()},y=()=>{n=++o.generation,o.loaded=!1,o.completedVersion=null,o.completedContext=void 0,o.baseDataRevision=o.lastContext?.requestState?.dataRevision,o.live=[],o.liveVersions.clear(),o.errorKind=void 0;const e=o.points.length>0;o.points=[],o.status={state:"empty"};const t=o.request,r=o.subscription;o.request=null,o.subscription=null,t?.controller.abort(),r?.dispose?.(),e&&l.requestRecompute()},f=e=>{e.receive=n=>{if(!s()||o.request!==e||e.controller.signal.aborted)return;if(o.request=null,o.completedVersion=e.version,!n.ok)return o.errorKind="fetch",c({state:"error",error:n.error}),void(void 0!==e.context.requestState&&h());const r="tail"===e.mode?o.points.slice():[];try{for(const t of n.points.slice().sort((e,t)=>e.time-t.time))Number.isFinite(t.time)&&(void 0===e.context.asOf||t.time<=e.context.asOf)&&Vr(r,t)}catch(t){return o.errorKind="fetch",c({state:"error",error:t}),void(void 0!==e.context.requestState&&h())}if("prepend"===e.mode)for(const e of o.points)Vr(r,e);if(void 0===e.context.asOf)for(const t of o.live)(null===e.liveAfter||(o.liveVersions.get(t.time)??0)>e.liveAfter)&&Vr(r,t);const a=o.points;o.points=r;try{l.requestRecompute();const e=t.get(l.store);if(e?.points===r)throw e.error}catch(t){return void(s()&&o.points===r&&(o.points=a,o.errorKind="calc",c({state:"error",error:t}),void 0!==e.context.requestState&&h()))}if(s()&&o.points===r){if(null!==e.liveAfter){o.live=o.live.filter(t=>(o.liveVersions.get(t.time)??0)>e.liveAfter);for(const[t,l]of o.liveVersions)l<=e.liveAfter&&o.liveVersions.delete(t)}o.from=o.loaded&&"replace"!==e.mode?Math.min(o.from,e.from):e.from,o.to=o.loaded&&"replace"!==e.mode?Math.max(o.to,e.to):e.to,o.loaded=!0,o.completedContext=e.context,o.errorKind=void 0,c({state:r.length>0?"ready":"empty"}),h()}},void 0!==e.outcome&&e.receive(e.outcome)},m=t=>{if(!s()||o.request!==t||t.started||t.controller.signal.aborted)return;t.started=!0;const l=e=>{t.outcome=e,t.receive(e)};let n;try{n=e.fetch({...t.context,from:t.from,to:t.to,signal:t.controller.signal})}catch(e){return void l({ok:!1,error:e})}Promise.resolve(n).then(e=>l({ok:!0,points:e}),e=>l({ok:!1,error:e}))},d=(e,t,l,n,r,a=!1)=>{const i={controller:new AbortController,context:e,from:t,to:l,mode:n,version:r,liveAfter:a?o.liveRevision:null,started:!1,receive:()=>{}};o.request=i,f(i),c({state:"loading"}),m(i)},h=(t=!1)=>{if(!s()||Ur(l.dataContext?.()))return;const r=++a,i=()=>s()&&a===r,u=(()=>{const e=l.bars(),t=l.dataContext?.()??{symbol:l.symbol?.(),interval:l.interval?.()},o=l.requestState?.();return{settings:l.settings(),bars:e,dataContext:{...t},requestState:o,asOf:o?.replay?.asOf,from:e[0]?.time??0,to:e[e.length-1]?.time??0,requestBars:l.requestBars&&(e=>{const o=void 0===e.variant?Pr(t.variant):e.variant;return l.requestBars(void 0===o?e:{...e,variant:o})})}})(),p=o.lastContext;o.lastContext=u;const h=u.dataContext,b=u.requestState,g=b?.replay,k=b?.source,w=p?.requestState?.source,v=p?.requestState?.replay,N=JSON.stringify([Er(e,u.settings),h?.symbol,h?.exchange,h?.interval,h?.variant??null,b?.providerRevision,k?.sourceId,void 0!==g]),C=u.bars.length-(p?.bars.length??0),M=void 0!==p&&void 0!==w&&void 0!==k&&"prepend"===k.change&&k.revision===w.revision+1&&k.historyRevision===w.historyRevision+1&&u.bars!==p.bars&&C>0&&p.bars.every((e,t)=>u.bars[C+t]===e),A=void 0===g&&void 0!==k&&void 0!==w&&k.historyRevision!==w.historyRevision&&!M,x=void 0!==u.asOf&&void 0!==v?.asOf&&u.asOf<v.asOf,S=N!==o.key||A||x;if(S){if(y(),!i())return;o.key=N}let L;try{L=(void 0===g||!0===e.supportsReplay&&Number.isFinite(u.asOf))&&(e.supports?.(u)??!0)}catch(e){return void(i()&&c({state:"error",error:e}))}if(!i())return;if(!L)return y(),void(i()&&c({state:"unsupported"}));if(0===u.bars.length)return void(void 0!==b?(y(),i()&&c({state:"empty"})):null===o.request&&c({state:"empty"}));const F=JSON.stringify([N,u.from,void 0===e.subscribe||void 0!==g?u.to:null,void 0===g&&void 0===e.subscribe?k?.revision:null,b?.dataRevision,u.asOf]),B=u.from<o.from||void 0===e.subscribe&&u.to>o.to;if(null!==o.request){const e=o.request;f(e),m(e)}else if(t||S||(void 0!==b?o.completedVersion!==F||B&&"error"!==o.status.state:"error"!==o.status.state)){const l=void 0!==b&&(o.completedContext?.requestState?.dataRevision??o.baseDataRevision)!==b.dataRevision;!o.loaded||t||void 0!==g||l?d(u,u.from,u.to,"replace",F,l):u.from<o.from?d(u,u.from,o.from,"prepend",F):void 0===e.subscribe&&(u.to>o.to||void 0!==b)?d(u,o.to,u.to,"tail",F):c({state:o.points.length>0?"ready":"empty"})}if(i()&&null===o.subscription&&void 0!==e.subscribe&&void 0===g){const t=n,r={};o.subscription=r;try{const a=e.subscribe(u,e=>{s()&&n===t&&o.subscription===r&&Number.isFinite(e.time)&&(Vr(o.live,e),o.liveVersions.set(e.time,++o.liveRevision),Vr(o.points,e),l.requestRecompute(),s()&&n===t&&o.subscription===r&&null===o.request&&"error"!==o.status.state&&c({state:"ready"}))});s()&&n===t&&o.subscription===r?r.dispose=a:a()}catch(e){s()&&o.subscription===r&&(o.subscription=null,c({state:"error",error:e}))}}},b=()=>{if(!s()&&!r)return;if(r=!1,i(),l.signal?.removeEventListener("abort",g),o.generation!==n)return;o.generation+=1;const e=o.generation;l.setDataRetry?.(null),p(),queueMicrotask(()=>{o.generation===e&&u()})},g=()=>{o.generation===n&&u(),b()};p(),l.signal?.addEventListener("abort",g,{once:!0}),i=void 0!==l.requestState&&void 0!==l.subscribeRequestChanges?l.subscribeRequestChanges(()=>h()):l.subscribeDataChanges?.(()=>h())??(()=>{}),l.setDataRetry?.(()=>h(!0));const k=t.get(l.store);return"calc"===o.errorKind&&void 0===k&&(o.errorKind=void 0,o.status={state:o.points.length?"ready":"empty"}),l.setDataStatus?.(k?.points===o.points?{state:"error",error:k.error}:o.status),h("error"===o.status.state&&"calc"!==o.errorKind),b}}}const Hr=604800;function jr(e,t,l,o){if("calendar"===e.mode)return M(e,t,l);if("interval"!==e.mode)return t;const n=e.seconds;if(n%Hr===0)return Math.floor(A(t,l)/(n/Hr));if(n%86400==0)return Math.floor(x(t,l)/(n/86400));if(null===o)return M(e,t);const r=g(t,l),a=k(r.year,r.month,r.day,Math.floor(o/60),o%60,0,l);return 1e6*x(t,l)+Math.floor((t-a)/n)}const zr=e=>Number.isFinite(e);function Zr(e,t,l={}){const o=l.timezone??a,n=Math.floor(l.offset??0);if(!Number.isFinite(n)||n<0)throw new v("securitySeries: offset must be zero or a positive count of buckets");const r=!0===l.lookahead,{bucketing:i}=N(t);if("ticks"===i.mode||"volume"===i.mode)throw new v(`securitySeries: "${t}" closes on trade flow rather than the clock and cannot be folded from time bars`);let s=null;if(void 0!==l.session){const e=C(l.session);if(null===e)throw new v(`securitySeries: cannot read session "${l.session}"`);s=e.start}const c=e.length,u=new Array(c).fill(null),p=new Array(c).fill(null),y=new Array(c).fill(null),f=new Array(c).fill(null),m=new Array(c).fill(null),d=new Array(c).fill(null),h=new Array(c).fill(null),b=new Array(c).fill(!1);if(0===c)return{open:u,high:p,low:y,close:f,volume:m,oi:d,bucketStart:h,isNew:b};const g=[],k=new Array(c);let w=NaN;for(let t=0;t<c;t++){const l=e[t],n=jr(i,l.time,o,s);if(0===t||n!==w)g.push({start:l.time,open:l.open,high:l.high,low:l.low,close:l.close,volume:void 0===l.volume?null:l.volume,oi:void 0===l.oi?null:l.oi}),b[t]=!0;else{const e=g[g.length-1];!zr(e.open)&&zr(l.open)&&(e.open=l.open),zr(l.high)&&(!zr(e.high)||l.high>e.high)&&(e.high=l.high),zr(l.low)&&(!zr(e.low)||l.low<e.low)&&(e.low=l.low),zr(l.close)&&(e.close=l.close),void 0!==l.volume&&(e.volume=(e.volume??0)+l.volume),void 0!==l.oi&&(e.oi=l.oi)}k[t]=g.length-1,w=n}let M=NaN,A=NaN,x=null,S=null;for(let t=0;t<c;t++){const l=e[t],o=k[t];if(n>0){const e=o-n;if(e<0)continue;const l=g[e];u[t]=l.open,p[t]=l.high,y[t]=l.low,f[t]=l.close,m[t]=l.volume,d[t]=l.oi,h[t]=l.start;continue}const a=g[o];h[t]=a.start,r?(u[t]=a.open,p[t]=a.high,y[t]=a.low,f[t]=a.close,m[t]=a.volume,d[t]=a.oi):(b[t]?(M=l.high,A=l.low,x=void 0===l.volume?null:l.volume,S=void 0===l.oi?null:l.oi):(zr(l.high)&&(!zr(M)||l.high>M)&&(M=l.high),zr(l.low)&&(!zr(A)||l.low<A)&&(A=l.low),void 0!==l.volume&&(x=(x??0)+l.volume),void 0!==l.oi&&(S=l.oi)),u[t]=a.open,p[t]=zr(M)?M:null,y[t]=zr(A)?A:null,f[t]=zr(l.close)?l.close:null,m[t]=x,d[t]=S)}return{open:u,high:p,low:y,close:f,volume:m,oi:d,bucketStart:h,isNew:b}}function Yr(e,t,l,o={}){const n=o.mode??"confirmed";if(!["confirmed","developing","lookahead"].includes(n))throw new v("securityExpression: invalid mode");const r=o.timezone??a,{bucketing:i}=N(t);if("interval"!==i.mode&&"calendar"!==i.mode)throw new v("securityExpression: requested interval must close on the clock");const s=void 0===o.session?void 0:C(o.session);if(null===s)throw new v("securityExpression: invalid session");if(0===e.length)return{};const c=[],u=[],p={};let y,f,m=-1/0;const d=()=>{const t=l(Object.freeze(c.slice()));if(null===t||"object"!=typeof t||Array.isArray(t))throw new v("securityExpression: expression must return named columns");const o=Object.keys(t);if(y&&(o.length!==y.length||y.some(e=>!Object.prototype.hasOwnProperty.call(t,e))))throw new v("securityExpression: expression column keys must remain stable");for(const l of o){if(!Array.isArray(t[l])||t[l].length!==c.length)throw new v("securityExpression: expression column length must match requested bars");Object.prototype.hasOwnProperty.call(p,l)||Object.defineProperty(p,l,{value:new Array(e.length).fill(null),enumerable:!0})}return y=o,t},h=(e,t,l)=>{for(const o of y??[]){const n=e[o][l];p[o][t]="number"==typeof n&&Number.isFinite(n)?n:null}};for(let t=0;t<e.length;t++){const l=e[t];if(!Number.isFinite(l.time)||l.time<=m)throw new v("securityExpression: source times must be finite and strictly increasing");m=l.time;const o=jr(i,l.time,r,s?.start??null);if(o!==f)c.push(Object.freeze({...l}));else{const e=c[c.length-1],t={...e};!zr(e.open)&&zr(l.open)&&(t.open=l.open),zr(l.high)&&(!zr(e.high)||l.high>e.high)&&(t.high=l.high),zr(l.low)&&(!zr(e.low)||l.low<e.low)&&(t.low=l.low),zr(l.close)&&(t.close=l.close),void 0!==l.volume&&(t.volume=(e.volume??0)+l.volume),void 0!==l.oi&&(t.oi=l.oi),c[c.length-1]=Object.freeze(t)}f=o,u.push(c.length-1),"developing"===n&&h(d(),t,c.length-1)}if("developing"!==n){const t=d();for(let l=0;l<e.length;l++)h(t,l,u[l]-("confirmed"===n?1:0))}return p}function Jr(e){const t=e.missing??"propagate";if("propagate"!==t&&"skip"!==t)throw new TypeError("Numerical missing policy must be propagate or skip");return t}function Gr(e){if(!Number.isSafeInteger(e)||e<=0)throw new RangeError("Numerical period must be a positive safe integer")}function Xr(e,t,l,o){Gr(t);const n=Jr(l),r=new Array(e.length).fill(NaN),a=[];for(let l=0;l<e.length;l++){const i=e[l];"skip"!==n||Number.isFinite(i)?(a.push(i),a.length>t&&a.shift(),a.length===t&&a.every(Number.isFinite)&&(r[l]=o(a))):l>0&&(r[l]=r[l-1])}return r}function _r(e,t,l={}){return Xr(e,t,l,e=>{const l=e.slice().sort((e,t)=>e-t),o=Math.floor(t/2);if(t%2!=0)return l[o];const n=l[o-1],r=l[o];return n===r?n:n/2+r/2})}function Qr(e,t,l={}){return Xr(e,t,l,e=>{const t=new Map;let l=1/0,o=0;for(const n of e){const e=(t.get(n)??0)+1;t.set(n,e),(e>o||e===o&&n<l)&&(l=n,o=e)}return l})}function ea(e,t,l={}){if(void 0!==l.sample&&"boolean"!=typeof l.sample)throw new TypeError("Numerical sample option must be boolean");return Xr(e,t,l,e=>{if(l.sample&&1===t)return NaN;const o=e[0];let n=0;for(const l of e){const e=l-o;if(!Number.isFinite(e))return 1/0;n+=e/t}const r=l.sample?t-1:t;let a=0;for(const t of e){const e=t-o-n;a+=e/r*e}return a})}function ta(e,t,l={}){return Xr(e,t,l,e=>{let t=1/0,l=-1/0;for(const o of e)t=Math.min(t,o),l=Math.max(l,o);return l-t})}function la(e,t,l,o={}){if(!Number.isFinite(l)||l<0||l>100)throw new RangeError("Numerical percentage must be finite and between 0 and 100");return Xr(e,t,o,e=>{const o=e.slice().sort((e,t)=>e-t),n=l/100*(t-1),r=Math.floor(n),a=Math.ceil(n),i=n-r;return o[r]===o[a]?o[r]:o[r]*(1-i)+o[a]*i})}function oa(e,t,l={}){return Xr(e,t,l,e=>{const l=e.map((e,t)=>({value:e,index:t})).sort((e,t)=>e.value-t.value),o=new Array(t);for(let e=0;e<t;){let n=e+1;for(;n<t&&l[n].value===l[e].value;)n++;const r=(e+n-1)/2;for(let t=e;t<n;t++)o[l[t].index]=r;e=n}const n=(t-1)/2;let r=0,a=0,i=0;for(let e=0;e<t;e++){const t=o[e]-n,l=e-n;r+=t*l,a+=t*t,i+=l*l}const s=Math.sqrt(a)*Math.sqrt(i);return 0===s?NaN:Math.max(-100,Math.min(100,100*r/s))})}function na(e,t,l){let o=0,n=0;for(let r=0;r<e.length;r++){const a=e[r]/t*(l?e.length-r:1),i=o+a;n+=Math.abs(o)>=Math.abs(a)?o-i+a:a-i+o,o=i}return o+n}function ra(e,t,l={}){return Xr(e,t,l,e=>{const t=na(e,1,!1);if(0===t)return NaN;const l=na(e,1,!0);if(Number.isFinite(t)&&Number.isFinite(l))return-l/t;let o=0;for(const t of e)o=Math.max(o,Math.abs(t));const n=2**Math.min(1023,Math.floor(Math.log2(o))),r=Number.isFinite(t)?t/n:na(e,n,!1),a=na(e,n,!0);return 0===r?Number.isFinite(t)?-a/t*n:NaN:-a/r})}function aa(e,t,l){const o=Jr(t),n=new Array(e.length).fill(NaN);let r=NaN,a=!1;for(let t=0;t<e.length;t++){const i=e[t];Number.isFinite(i)?a||(Number.isNaN(r)||(l?i>r:i<r))&&(r=i):"propagate"===o&&(a=!0),a||(n[t]=r)}return n}function ia(e,t={}){return aa(e,t,!1)}function sa(e,t={}){return aa(e,t,!0)}function ca(e,t,l,o){if(e.length!==t.length)throw new RangeError("Numerical crossing arrays must have equal lengths");const n=Jr(l),r=new Array(e.length).fill(!1);let a=NaN,i=NaN;for(let l=0;l<e.length;l++){if(!Number.isFinite(e[l])||!Number.isFinite(t[l])){"propagate"===n&&(a=NaN,i=NaN);continue}const s=e[l]>t[l]&&a<=i,c=e[l]<t[l]&&a>=i;r[l]="above"===o?s:"below"===o?c:s||c,a=e[l],i=t[l]}return r}function ua(e,t,l={}){return ca(e,t,l,"above")}function pa(e,t,l={}){return ca(e,t,l,"below")}function ya(e,t,l={}){return ca(e,t,l,"either")}function fa(e,t,l,o){Gr(t);const n=Jr(l),r=new Array(e.length).fill(!1),a=[];for(let l=0;l<e.length;l++){const i=e[l];Number.isFinite(i)&&a.length===t&&(r[l]=a.every(e=>Number.isFinite(e)&&(o?i>e:i<e))),("propagate"===n||Number.isFinite(i))&&(a.push(i),a.length>t&&a.shift())}return r}function ma(e,t,l={}){return fa(e,t,l,!0)}function da(e,t,l={}){return fa(e,t,l,!1)}function ha(e){throw new v(`Requested context: ${e}`)}function ba(e){if(null===e||"object"!=typeof e||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function ga(e,t,l){Object.defineProperty(e,t,{value:l,enumerable:!0,writable:!0,configurable:!0})}function ka(e,t){ba(e)&&Array.isArray(e.bars)&&Array.isArray(e.availableAt)&&Array.isArray(e.confirmed)||ha("snapshot must contain bars, availableAt and confirmed arrays");const l=e.bars.length;e.availableAt.length===l&&e.confirmed.length===l||ha("snapshot arrays must have equal lengths"),"function"!=typeof t&&ha("expression must be a function");const o=[],n=[];let r=-1/0,a=-1/0,i=!1;for(let t=0;t<l;t++){const l=e.bars[t];(!ba(l)||!Number.isFinite(l.time)||l.time<=r)&&ha("bar times must be finite and strictly increasing"),(["open","high","low","close"].some(e=>"number"!=typeof l[e])||void 0!==l.volume&&"number"!=typeof l.volume||void 0!==l.oi&&"number"!=typeof l.oi)&&ha("bar readings must be numbers");const s=e.availableAt[t];null!==s&&(!Number.isFinite(s)||s<l.time)&&ha("availability must be null or finite and at or after bar opening"),"boolean"!=typeof e.confirmed[t]&&ha("confirmation must be boolean"),r=l.time,o.push(Object.freeze({...l})),e.confirmed[t]&&null!==s||(i=!0),i||null===s||(a=Math.max(a,s),n.push(a))}const s={},c=Object.freeze(o);if(0===l)return{bars:c,eligibleAt:n,values:s};const u=t(c);ba(u)||ha("expression must return named columns");for(const e of Object.keys(u)){const t=u[e];Array.isArray(t)&&t.length===l||ha("expression columns must match requested bar count");const o=[];for(let e=0;e<l;e++){const l=t[e];null!==l&&"number"!=typeof l&&ha("expression values must be numbers or null"),o.push(null!==l&&Number.isFinite(l)?l:null)}ga(s,e,o)}return{bars:c,eligibleAt:n,values:s}}function wa(e,t,l,o={}){Array.isArray(e)||ha("target times must be an array");let n=-1/0;for(const t of e)(!Number.isFinite(t)||t<=n)&&ha("target times must be finite and strictly increasing"),n=t;(!ba(o)||void 0!==o.gaps&&"carry"!==o.gaps&&"missing"!==o.gaps)&&ha("gaps must be carry or missing");const{eligibleAt:r,values:a}=ka(t,l),i=Object.keys(a),s={};for(const t of i)ga(s,t,new Array(e.length).fill(null));let c=-1,u=-1;for(let t=0;t<e.length;t++){for(;c+1<r.length&&r[c+1]<=e[t];)c++;if(c>=0&&("missing"!==o.gaps||c!==u))for(const e of i)s[e][t]=a[e][c];u=c}return s}function va(e,t,l,o={}){Array.isArray(e)||ha("target windows must be an array");let n=-1/0;for(const t of e)(!ba(t)||!Number.isFinite(t.start)||!Number.isFinite(t.end)||t.start>=t.end||t.start<n)&&ha("windows must be finite, ordered and nonoverlapping with start < end"),n=t.end;ba(o)&&(void 0===o.asOf||Number.isFinite(o.asOf))||ha("asOf must be finite");const{bars:r,eligibleAt:a,values:i}=ka(t,l),s=Object.keys(i),c={times:e.map(()=>[]),values:{}};for(const t of s)ga(c.values,t,e.map(()=>[]));let u=0;for(let t=0;t<e.length;t++){const{start:l,end:n}=e[t],p=Math.min(n,o.asOf??1/0);for(;u<a.length&&r[u].time<l;)u++;for(;u<a.length&&r[u].time<n;){if(a[u]<=p){c.times[t].push(r[u].time);for(const e of s)c.values[e][t].push(i[e][u])}u++}}return c}const Na="__requestedIndicator",Ca={bars:[],availableAt:[],confirmed:[]},Ma=e=>e[Na],Aa=e=>{throw new v(`Requested indicator: ${e}`)};function xa(e){"function"==typeof e.request&&"function"==typeof e.expression||Aa("request and expression must be functions"),void 0!==e.gaps&&"carry"!==e.gaps&&"missing"!==e.gaps&&Aa("gaps must be carry or missing"),void 0!==e.targetTimes&&"function"!=typeof e.targetTimes&&Aa("targetTimes must be a function");const t=[...new Set(e.plots.flatMap(e=>void 0===e.ohlc?[e.key]:[e.ohlc.open,e.ohlc.high,e.ohlc.low,e.ohlc.close]))],l=new WeakMap;return{id:e.id,name:e.name,category:e.category,placement:e.placement,inputs:e.inputs,plots:e.plots,levels:e.levels,range:e.range,calc:(o,n,r,a)=>{const i=Ma(r);try{const s={...i?.context,bars:o,settings:n,calculation:a},c=e.targetTimes?.(s)??o.map(e=>e.time);Array.isArray(c)&&c.length===o.length||Aa("target times must match source length");const u=wa(c,i?.snapshot??Ca,t=>e.expression(t,n,s),{gaps:e.gaps});for(const e of t)i?.snapshot?.bars.length&&!Object.prototype.hasOwnProperty.call(u,e)&&Aa(`expression is missing plot column ${e}`),Object.prototype.hasOwnProperty.call(u,e)||Object.defineProperty(u,e,{value:new Array(o.length).fill(null),enumerable:!0,writable:!0,configurable:!0});return l.delete(r),u}catch(e){throw l.set(r,{snapshot:i?.snapshot??null,error:e}),e}},attach:t=>{const o=Ma(t.store)??{owner:0,key:null,completed:null,wanted:null,request:null,snapshot:null,context:null,status:{state:"empty"}};t.store[Na]=o;const n=++o.owner;let r=!0,a=0,i=0,s=null,c=()=>{};const u=()=>r&&o.owner===n&&!t.signal?.aborted,p=e=>{o.status=e,u()&&t.setDataStatus?.(e)},y=()=>{const e=o.request;o.request=null,s=null,e?.controller.abort(),e?.reject(e.controller.signal.reason)},f=()=>{o.completed=null,o.wanted=null;const e=null!==o.snapshot;o.snapshot=null,y(),e&&t.requestRecompute()},m=e=>{s!==e&&(s=e,e.promise.then(n=>{if(!u()||o.request!==e||e.controller.signal.aborted)return;let r;try{r=function(e,t){let l=[];wa([],e,e=>(l=e,{}));let o=l.length;if(void 0!==t)for(o=0;o<l.length&&e.confirmed[o]&&null!==e.availableAt[o]&&e.availableAt[o]<=t;)o++;return Object.freeze({bars:Object.freeze(l.slice(0,o)),availableAt:Object.freeze(e.availableAt.slice(0,o)),confirmed:Object.freeze(e.confirmed.slice(0,o))})}(n,e.selection.request.asOf)}catch(t){return void d(e,t)}o.request=null,s=null;const a=o.snapshot;o.snapshot=r,o.completed=e.selection.version;try{t.requestRecompute();const e=l.get(t.store);if(e?.snapshot===r)throw e.error}catch(t){return void(u()&&o.snapshot===r&&o.key===e.selection.key&&(o.snapshot=a,p({state:"error",error:t}),o.wanted?.version!==e.selection.version&&b()))}u()&&o.snapshot===r&&(null===o.request&&p({state:r.bars.length?"ready":"empty"}),b())},t=>d(e,t)))},d=(e,t)=>{u()&&o.request===e&&!e.controller.signal.aborted&&(o.request=null,s=null,o.completed=e.selection.version,p({state:"error",error:t}),o.wanted?.version!==e.selection.version&&b())},h=e=>{if(u()&&o.request===e&&!e.controller.signal.aborted&&!e.started){e.started=!0;try{e.resolve(t.requestSnapshot({...e.selection.request,signal:e.controller.signal}))}catch(t){e.reject(t)}}},b=(l=!1)=>{if(!u()||Ur(t.dataContext?.()))return;const n=++i,r=()=>u()&&i===n,s=o.context?.requestState?.replay,c=t.requestState?.(),y=c?.replay,d={bars:t.bars(),settings:t.settings(),dataContext:t.dataContext?.(),requestState:c};let b;o.context=d;let g="";try{const t=e.request(d);b=null===t?null:function(e,t){let l;(null===e||"object"!=typeof e||"string"!=typeof e.symbol||""===e.symbol.trim()||"string"!=typeof e.interval||""===e.interval.trim()||void 0!==e.exchange&&"string"!=typeof e.exchange||!Number.isFinite(e.from)||!Number.isFinite(e.to)||e.from>e.to||void 0!==e.asOf&&!Number.isFinite(e.asOf))&&Aa("request requires an instrument and a finite ordered time window");try{l=void 0===e.variant?Pr(t?.variant):w(e.variant)}catch{Aa("request variant must be a data variant")}return{symbol:e.symbol,exchange:e.exchange,interval:e.interval,from:e.from,to:e.to,asOf:e.asOf,...l?{variant:l}:{}}}(t,d.dataContext),g=S(d.dataContext?.variant)}catch(e){return void(r()&&(f(),r()&&p({state:"error",error:e})))}if(!r())return;if(null===b||void 0===t.requestSnapshot||!1===c?.supportsSnapshots||void 0!==y&&void 0===y.asOf)return f(),void(r()&&(o.key=null,p({state:"unsupported"})));if(0===d.bars.length)return f(),void(r()&&p({state:"empty"}));const k=c?.source,v=d.dataContext,N=JSON.stringify([b.symbol,b.exchange,b.interval,b.asOf,v?.symbol,v?.exchange,v?.interval,g,b.variant??null,c?.providerRevision,k?.sourceId,void 0===y?k?.historyRevision:null,void 0!==y]),C=void 0!==y?.asOf&&void 0!==s?.asOf&&y.asOf<s.asOf;if(o.key!==N||C){if(f(),!r())return;o.key=N}void 0!==y?.asOf&&(b.asOf=void 0===b.asOf?y.asOf:Math.min(b.asOf,y.asOf));const M=JSON.stringify([N,b.from,b.to,b.asOf,void 0===y?k?.revision:null,c?.dataRevision,y?.time,y?.forming,a]),A={key:N,version:M,request:b};o.wanted=A,null!==o.request?(m(o.request),h(o.request)):(l||o.completed!==M)&&(e=>{let t,l;const n={selection:e,controller:new AbortController,started:!1,promise:new Promise((e,o)=>{t=e,l=o}),resolve:t,reject:l};o.request=n,m(n),p({state:"loading"}),h(n)})(A)},g=()=>{r&&(r=!1,c(),t.signal?.removeEventListener("abort",k),o.owner===n&&(t.setDataRetry?.(null),queueMicrotask(()=>{o.owner===n&&y()})))},k=()=>{o.owner===n&&y(),g()};t.signal?.addEventListener("abort",k,{once:!0}),c=void 0!==t.subscribeRequestChanges?t.subscribeRequestChanges(()=>b()):t.subscribeDataChanges?.(()=>{a++,b()})??(()=>{}),t.setDataRetry?.(()=>b(!0));const v=l.get(t.store);return t.setDataStatus?.(v?.snapshot===o.snapshot?{state:"error",error:v.error}:o.status),b(),g}}}const Sa="indicators",La=[je,Ze,ze,ot,Ye,nt,st,rt,it,kt,wt,vt,Nt,Ct,Mt,At,xt,Kt,Dt,Rt,Ut,Pt,It,...ml,...Sl,...jl,...eo,...yo,...Oo,...Jo,...cn,...An,...In,...nr,...fr,...Tr];let Fa=!1;function Ba(){if(!Fa){Fa=!0;for(const e of La)L(e)}}Ba();export{yo as ADAPTIVE_INDICATORS,Rt as ADL,Nt as ADX,Ko as ALLIGATOR,Gt as ALMA,lr as ALPHATREND,bl as AROON,gl as AROON_OSCILLATOR,At as ATR,$l as AVERAGE_DAILY_RANGE,Oo as AVERAGE_INDICATORS,kl as AWESOME_OSCILLATOR,wl as BALANCE_OF_POWER,Tl as BB_TREND,Ye as BOLLINGER,Ol as BOLLINGER_BANDWIDTH,Rl as BOLLINGER_PERCENT_B,La as BUILTIN_INDICATORS,Ct as CCI,Jl as CHAIKIN_MONEY_FLOW,Gl as CHAIKIN_OSCILLATOR,Vl as CHAIKIN_VOLATILITY,ll as CHANDELIER_EXIT,tl as CHANDE_KROLL_STOP,vl as CHANDE_MOMENTUM,Ul as CHOPPINESS_INDEX,El as CHOP_ZONE,xl as CONNORS_RSI,$n as CONSOLIDATION_BREAKOUT,Nl as COPPOCK_CURVE,tr as CPR,Xt as DEMA,el as DONCHIAN,Cl as DPO,Xl as EASE_OF_MOVEMENT,_l as ELDER_FORCE_INDEX,Ze as EMA,Qt as ENVELOPE,Ml as FISHER_TRANSFORM,eo as FLOW_INDICATORS,st as HALFTREND,Pl as HISTORICAL_VOLATILITY,_t as HMA,fl as HULL_SUITE,it as ICHIMOKU,cn as INDEX_INDICATORS,Sa as INDICATORS_TIER,ao as KAMA,io as KELTNER_CHANNEL,co as KLINGER_OSCILLATOR,uo as KNOW_SURE_THING,po as LINREG_SLOPE,so as LSMA,wt as MACD,an as MASS_INDEX,nl as MA_CHANNEL,No as MA_CROSS,So as MA_RIBBON,Co as MCGINLEY_DYNAMIC,Mo as MEDIAN,Mt as MFI,Io as MOMENTUM,Ql as NET_VOLUME,ln as NVI,Dt as OBV,Ut as OPEN_INTEREST,It as OPEN_INTEREST_BUILDUP,Pt as OPEN_INTEREST_CHANGE,Sl as OSCILLATOR_INDICATORS,ml as OVERLAY_INDICATORS,rt as PARABOLIC_SAR,qo as PPO,on as PVI,rn as PVO,nn as PVT,or as RANGE_ANALYSIS,An as RANGE_INDICATORS,wn as RELATIVE_VIGOR_INDEX,vn as RELATIVE_VOLATILITY_INDEX,Eo as ROC,kt as RSI,Pn as RSI_DIVERGENCE,Or as SEASONALITY,Tr as SEASONALITY_INDICATORS,In as SIGNAL_INDICATORS,je as SMA,Yo as SMI,zo as SMI_ERGODIC_INDICATOR,Zo as SMI_ERGODIC_OSCILLATOR,Wo as SMMA,Mn as SPECIAL_K,ql as STANDARD_DEVIATION,Hl as STANDARD_ERROR,ol as STANDARD_ERROR_BANDS,vt as STOCHASTIC,bn as STOCHASTIC_RSI,Jo as STRENGTH_INDICATORS,nr as STUDY_INDICATORS,nt as SUPERTREND,Ro as T3,Lo as TEMA,On as TREND_STRENGTH_INDEX,Ho as TRIX,jo as TSI,Fo as TWAP,sn as ULCER_INDEX,kn as ULTIMATE_OSCILLATOR,jl as VOLATILITY_INDICATORS,Rn as VOLATILITY_STOP,Kt as VOLUME,Dn as VORTEX,ot as VWAP,Bo as VWMA,yr as WAVETREND,fr as WAVETREND_INDICATORS,Un as WILLIAMS_FRACTALS,gn as WILLIAMS_PERCENT_R,xt as WILLIAMS_VIX_FIX,ze as WMA,Nn as WOODIES_CCI,wa as alignRequestedExpression,te as alma,ge as barsSince,fe as cci,ra as centerOfGravity,X as change,Al as connorsStreak,ye as correlation,xa as createRequestedIndicator,qr as createTier2Indicator,ya as crosses,ua as crossesAbove,pa as crossesBelow,ie as cumulative,Q as dev,da as falling,Z as highest,oe as highestBars,Pr as inheritedDataVariant,se as linreg,Y as lowest,ne as lowestBars,J as nulls,ee as percentRank,la as percentileLinear,pe as percentileNearestRank,me as pivotHigh,de as pivotLow,oa as rankCorrelation,Ba as registerBuiltinIndicators,va as requestedIntrabars,ma as rising,j as rma,_ as roc,_r as rollingMedian,Qr as rollingMode,ta as rollingRange,ae as rollingSum,ea as rollingVariance,sa as runningMax,ia as runningMin,Yr as securityExpression,Zr as securitySeries,V as sma,G as smaSeededEma,z as stdev,ue as stoch,ce as swma,ke as valueWhen,le as vwma,q as wma};
|
|
2
2
|
//# sourceMappingURL=openalgo-charts.indicators.mjs.map
|