UNPKG

openalgo-charts

Version:

From-scratch, dependency-free canvas charting engine for OpenAlgo: professional-grade interactive rendering, advanced on-chart trading, and a one-call widget tier that adds the toolbar, drawing rail, dialogs and shortcuts.

2 lines • 202 kB
if("undefined"==typeof OpenAlgoCharts)throw new Error("openalgo-charts.indicators.standalone.js needs openalgo-charts.standalone.js loaded before it");this.OpenAlgoCharts=this.OpenAlgoCharts||{},this.OpenAlgoCharts.indicators=function(e,t){"use strict";function l(e,t){if(void 0!==e&&(!Number.isSafeInteger(e)||e<=0))throw new RangeError("Missing-value window 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("propagate"!==l&&"skip"!==l)throw new TypeError("Missing-value policy must be propagate or skip");return l}function o(e,t,o,n){const r=l(t,o),a=new Array(e.length).fill(NaN),i=[];for(let l=0;l<e.length;l++){const o=e[l];"skip"!==r||Number.isFinite(o)?(i.push(o),i.length>t&&i.shift(),i.length===t&&i.every(Number.isFinite)&&(a[l]=n(i))):l>0&&(a[l]=a[l-1])}return a}function n(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 r(e,t,o){const n=l(void 0,t),r=new Array(e.length).fill(NaN);let a=NaN,i=!1;for(let t=0;t<e.length;t++){const l=e[t];Number.isFinite(l)?i||(Number.isNaN(a)||(o?l>a:l<a))&&(a=l):"propagate"===n&&(i=!0),i||(r[t]=a)}return r}function a(e,t,o,n){if(e.length!==t.length)throw new RangeError("Numerical crossing arrays must have equal lengths");const r=l(void 0,o),a=new Array(e.length).fill(!1);let i=NaN,s=NaN;for(let l=0;l<e.length;l++){if(!Number.isFinite(e[l])||!Number.isFinite(t[l])){"propagate"===r&&(i=NaN,s=NaN);continue}const o=e[l]>t[l]&&i<=s,c=e[l]<t[l]&&i>=s;a[l]="above"===n?o:"below"===n?c:o||c,i=e[l],s=t[l]}return a}function i(e,t,l={}){return a(e,t,l,"above")}function s(e,t,l={}){return a(e,t,l,"below")}function c(e,t,l={}){return a(e,t,l,"either")}function u(e,t,o,n){const r=l(t,o),a=new Array(e.length).fill(!1),i=[];for(let l=0;l<e.length;l++){const o=e[l];Number.isFinite(o)&&i.length===t&&(a[l]=i.every(e=>Number.isFinite(e)&&(n?o>e:o<e))),("propagate"===r||Number.isFinite(o))&&(i.push(o),i.length>t&&i.shift())}return a}function p(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 y(e,t){const l=p(e,t);if(1!==t)for(let e=0;e<l.length;e++)l[e]/=t;return l}function f(e,t,o,n,r=!1){const a=l(t,o),i=new Array(e.length).fill(NaN),s=[];let c=0;for(let l=0;l<e.length;l++){const o=e[l],u=Number.isFinite(o);r&&u&&s.length===t&&0===c&&(i[l]=n(s,l)),("propagate"===a||u)&&(s.push({value:o,index:l}),u||c++,s.length>t&&!Number.isFinite(s.shift().value)&&c--),r||s.length!==t||0!==c||(i[l]=n(s,l))}return i}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 m(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 h(e,t,o,n,r=!1){m(t,e.length,1,"Window length");const a=l(1,void 0===o?{}:o),i=new Array(e.length).fill(NaN),s=[];let c=0;const u=(e,t)=>{const l=Number.isFinite(e);c=l?c+1:0,("propagate"===a||l)&&s.push({value:e,index:t})};for(let l=0;l<e.length;l++){const o=e[l];r||u(o,l);const p=t[l];!Number.isNaN(p)&&p<=s.length&&("skip"===a||p<=c)&&(!r||Number.isFinite(o))&&(i[l]=n(s.slice(s.length-p),l)),r&&u(o,l)}return i}function b(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 g(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:b(e,t);return Math.max(r,Math.min(a,s))}function w(e){return g(e.map(e=>e.value))}function k(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=g(r),s=g(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 v(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 N(e,t,o,n){const r=l(t,o),a=new Array(e.length).fill(NaN);let i=0;const s=[];let c=NaN;for(let l=0;l<e.length;l++){const o=e[l];if(Number.isFinite(o)){if(i<t){if(s.push(o),++i<t)continue;c=g(s),s.length=0}else c=g([c,o],[t-1,n]);a[l]=c}else"propagate"===r?(i=0,s.length=0,c=NaN):i===t&&(a[l]=c)}return a}function C(e,t,l){if("number"!=typeof t)return h(e,t,l,w);if(void 0!==l)return f(e,t,l,w);if(Number.isSafeInteger(t)&&t>0)return y(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 A(e,t,l){if("number"!=typeof t)return h(e,t,l,e=>g(e.map(e=>e.value),e.map((e,t)=>t+1)));if(void 0!==l)return f(e,t,l,e=>g(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 M(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 S(e,t,l){if(void 0!==l)return N(e,t,l,1);if(Number.isSafeInteger(t)&&t>0)return M(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 x(e,t,l){if("number"!=typeof t)return h(e,t,l,e=>k(e,!0));if(void 0!==l)return f(e,t,l,e=>k(e,!0));const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;const r=C(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 L(e,t,l){if("number"!=typeof t)return h(e,t,l,e=>v(e,!0).value);if(void 0!==l)return f(e,t,l,e=>v(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 I(e,t,l){if("number"!=typeof t)return h(e,t,l,e=>v(e,!1).value);if(void 0!==l)return f(e,t,l,e=>v(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 O(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 B(e,t,l){if(void 0!==l)return N(e,t,l,2);if(Number.isSafeInteger(t)&&t>0)return M(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 F(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 R(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 T(e,t,l){if("number"!=typeof t)return h(e,t,l,e=>k(e,!1));if(void 0!==l)return f(e,t,l,e=>k(e,!1));const o=e.length,n=new Array(o).fill(NaN);if(t<=0||o<t)return n;const r=C(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 K(e,t,l){if("number"!=typeof t)return h(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 f(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 D(e,t,l,o){const n=e.length,r=new Array(n).fill(NaN);if(!Number.isSafeInteger(t)||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 E(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=C(n,l),a=C(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 W(e,t,l){return"number"!=typeof t?h(e,t,l,(e,t)=>v(e,!0).index-t):void 0!==l?f(e,t,l,(e,t)=>v(e,!0).index-t):V(e,t,!0)}function P(e,t,l){return"number"!=typeof t?h(e,t,l,(e,t)=>v(e,!1).index-t):void 0!==l?f(e,t,l,(e,t)=>v(e,!1).index-t):V(e,t,!1)}function V(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 U(e,t){if(Number.isSafeInteger(t)&&t>0)return p(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 $(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 H(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 q(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 _(e,t,l,o){const n=e.length,r=new Array(n).fill(NaN),a=L(t,o),i=I(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 z(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]??NaN}return n}function j(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 Z(e,t){const l=e.length,o=new Array(l).fill(NaN),n=C(e,t),r=T(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 Y(e,t){const l=e.length,o=new Array(l).fill(NaN);if(t<3||l<t)return o;const n=(t+1)/2;let r=0;for(let e=0;e<t;e++)r+=(n-e-1)*(n-e-1);for(let a=t-1;a<l;a++){let l=0;for(let o=0;o<t;o++)l+=e[a-o];const i=l/t;let s=0,c=0;for(let l=0;l<t;l++){const t=i-e[a-l];s+=t*t,c+=(n-l-1)*t}o[a]=Math.sqrt((s-c*c/r)/(t-2))}return o}function G(e,t,l){const o=e.length,n=new Array(o).fill(NaN),r=p(e,l),a=p(t,l);for(let e=l;e<o;e++){const t=r[e],l=a[e];Number.isFinite(t)&&Number.isFinite(l)&&(n[e]=0===l?100:100-100/(1+t/l))}return n}function X(e,t,l){return"number"!=typeof t||"number"!=typeof l?Q(e,t,l,!0):ee(e,t,l,!0)}function J(e,t,l){return"number"!=typeof t||"number"!=typeof l?Q(e,t,l,!1):ee(e,t,l,!1)}function Q(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):m(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 ee(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 te(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 le(e,t,l){const o=e.length,n=new Array(o).fill(NaN);if(!Number.isSafeInteger(l)||l<0)return n;const 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]]??NaN)}return n}const oe=new WeakMap,ne=e=>Number.isFinite(e)?e:null,re=e=>Number.isSafeInteger(e)&&e>0;function ae(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?oe.get(r):void 0;return void 0!==e&&(e.misses=3),null}return i}}function ie(e,t){const l={...e,calc:(o=e.calc,(e,t,l,n)=>{if("object"==typeof l&&null!==l){const e=oe.get(l);oe.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:ae(t(e.calc)),enumerable:!1,writable:!0,configurable:!0}),l}function se(e,t,l,o){if("object"!=typeof e||null===e||!Number.isSafeInteger(o)||o<0||o>=l.length)return;const n=oe.get(e);return void 0!==n&&n.owner===t&&n.misses<3?n:void 0}function ce(e){return e.misses++,null}function ue(e){if(Array.isArray(e))return e.map(ue);if(null!==e&&"object"==typeof e){const t={};for(const l of Object.keys(e))t[l]=ue(e[l]);return t}return e}function pe(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}function ye(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 ce(e)}r[a]=i.slice(l)}return e.misses=0,r}function fe(e,t){return(l,o,n,r,a,i)=>{const s=se(a,e,l,n),c=t(o);if(void 0===s||null===c)return null;const u=Math.max(0,n-1-c);return ye(s,e(0===u?l:l.slice(u),o,a,i),n-u,r,n)}}function de(e,t,l,o,n,r,a){const i=se(a,e,o,n);if(void 0===i)return null;const s=pe(i,t,o,n);let c,u;if(void 0!==s)c=ue(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 ce(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:ue(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}function me(e,t){const l=e.start(),o=e.keys.map(()=>null),n=e.keys.map(()=>new Array(t));for(let r=0;r<t;r++){e.step(l,r,o);for(let e=0;e<n.length;e++)n[e][r]=o[e]}const r={};return e.keys.forEach((e,t)=>{r[e]=n[t]}),r}const he=()=>({run:0,value:NaN,seeded:!1,recent:[]});function be(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 ge=()=>({count:0,seed:[],value:NaN});function we(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 ke=()=>({a:NaN,run:0,recent:[]});function ve(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 Ne=()=>({primed:!1,last:NaN,gain:NaN,loss:NaN,gainSeeded:!1,lossSeeded:!1,run:0,recent:[]});const Ce=()=>({atr:{a:NaN,run:0,recent:[]},upper:NaN,lower:NaN,st:NaN,close:NaN,started:!1});function Ae(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 Me=604800,Se=86400;function xe(e,l,o,n){if("calendar"===e.mode)return t.bucketStartOf(e,l,o);if("interval"!==e.mode)return l;const r=e.seconds;if(r%Me===0)return Math.floor(t.zonedWeekIndex(l,o)/(r/Me));if(r%Se===0)return Math.floor(t.zonedDayIndex(l,o)/(r/Se));if(null===n)return t.bucketStartOf(e,l);const a=t.utcSecondsToZonedParts(l,o),i=t.zonedWallClockToUtcSeconds(a.year,a.month,a.day,Math.floor(n/60),n%60,0,o);return 1e6*t.zonedDayIndex(l,o)+Math.floor((l-i)/r)}function Le(e){const l={index:NaN,year:0,month:0,date:0,from:1/0,to:-1/0};return o=>{if(o>=l.from&&o<l.to)return l;const n=t.utcSecondsToZonedParts(o,e),r=new Date(Date.UTC(n.year,n.month-1,n.day+1));return l.index=t.zonedDayIndex(o,e),l.year=n.year,l.month=n.month,l.date=n.day,l.from=t.zonedWallClockToUtcSeconds(n.year,n.month,n.day,0,0,0,e),l.to=t.zonedWallClockToUtcSeconds(r.getUTCFullYear(),r.getUTCMonth()+1,r.getUTCDate(),0,0,0,e),l}}function Ie(e,l,o){const n="calendar"===e.mode&&void 0!==e.timezone&&e.timezone!==l;if("calendar"!==e.mode&&"interval"!==e.mode)return t=>xe(e,t,l,o);if(n||"interval"===e.mode&&e.seconds%Se!==0&&null===o)return t=>xe(e,t,l,o);const r="interval"===e.mode?e.seconds:0,a=Le(l);let i=NaN,s=0;return n=>{const c=a(n);return c.index!==i&&(i=c.index,"calendar"===e.mode?s=t.bucketStartOf(e,n,l):null!==o&&r%Se!==0&&(s=t.zonedWallClockToUtcSeconds(c.year,c.month,c.date,Math.floor(o/60),o%60,0,l))),"calendar"===e.mode?s:r%Me===0?Math.floor(Math.floor((c.index+3)/7)/(r/Me)):r%Se===0?Math.floor(c.index/(r/Se)):1e6*c.index+Math.floor((n-s)/r)}}const Oe=e=>Number.isFinite(e);function Be(e,t){!Oe(e.open)&&Oe(t.open)&&(e.open=t.open),Oe(t.high)&&(!Oe(e.high)||t.high>e.high)&&(e.high=t.high),Oe(t.low)&&(!Oe(e.low)||t.low<e.low)&&(e.low=t.low),Oe(t.close)&&(e.close=t.close),void 0!==t.volume&&(e.volume=(e.volume??0)+t.volume),void 0!==t.oi&&(e.oi=t.oi)}function Fe(e,l,o,n={}){const r=n.mode??"confirmed";if(!["confirmed","developing","lookahead"].includes(r))throw new t.IndicatorInputError("securityExpression: invalid mode");const a=n.timezone??t.DEFAULT_TIMEZONE,{bucketing:i}=t.resolveInterval(l);if("interval"!==i.mode&&"calendar"!==i.mode)throw new t.IndicatorInputError("securityExpression: requested interval must close on the clock");const s=void 0===n.session?void 0:t.parseSessionSpec(n.session);if(null===s)throw new t.IndicatorInputError("securityExpression: invalid session");if(0===e.length)return{};const c=[],u=[],p=Ie(i,a,s?.start??null),y={};let f,d,m=-1/0;const h=()=>{const l=o(Object.freeze(c.slice()));if(null===l||"object"!=typeof l||Array.isArray(l))throw new t.IndicatorInputError("securityExpression: expression must return named columns");const n=Object.keys(l);if(f&&(n.length!==f.length||f.some(e=>!Object.prototype.hasOwnProperty.call(l,e))))throw new t.IndicatorInputError("securityExpression: expression column keys must remain stable");for(const o of n){if(!Array.isArray(l[o])||l[o].length!==c.length)throw new t.IndicatorInputError("securityExpression: expression column length must match requested bars");Object.prototype.hasOwnProperty.call(y,o)||Object.defineProperty(y,o,{value:new Array(e.length).fill(null),enumerable:!0})}return f=n,l},b=(e,t,l)=>{for(const o of f??[]){const n=e[o][l];y[o][t]="number"==typeof n&&Number.isFinite(n)?n:null}};for(let l=0;l<e.length;l++){const o=e[l];if(!Number.isFinite(o.time)||o.time<=m)throw new t.IndicatorInputError("securityExpression: source times must be finite and strictly increasing");m=o.time;const n=p(o.time);if(n!==d)c.push(Object.freeze({...o}));else{const e={...c[c.length-1]};Be(e,o),c[c.length-1]=Object.freeze(e)}d=n,u.push(c.length-1),"developing"===r&&b(h(),l,c.length-1)}if("developing"!==r){const t=h();for(let l=0;l<e.length;l++)b(t,l,u[l]-("confirmed"===r?1:0))}return y}function Re(e){throw new t.IndicatorInputError(`Requested context: ${e}`)}function Te(e){if(null===e||"object"!=typeof e||Array.isArray(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function Ke(e,t,l){Object.defineProperty(e,t,{value:l,enumerable:!0,writable:!0,configurable:!0})}function De(e,t){Te(e)&&Array.isArray(e.bars)&&Array.isArray(e.availableAt)&&Array.isArray(e.confirmed)||Re("snapshot must contain bars, availableAt and confirmed arrays");const l=e.bars.length;e.availableAt.length===l&&e.confirmed.length===l||Re("snapshot arrays must have equal lengths"),"function"!=typeof t&&Re("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];(!Te(l)||!Number.isFinite(l.time)||l.time<=r)&&Re("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)&&Re("bar readings must be numbers");const s=e.availableAt[t];null!==s&&(!Number.isFinite(s)||s<l.time)&&Re("availability must be null or finite and at or after bar opening"),"boolean"!=typeof e.confirmed[t]&&Re("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);Te(u)||Re("expression must return named columns");for(const e of Object.keys(u)){const t=u[e];Array.isArray(t)&&t.length===l||Re("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&&Re("expression values must be numbers or null"),o.push(null!==l&&Number.isFinite(l)?l:null)}Ke(s,e,o)}return{bars:c,eligibleAt:n,values:s}}function Ee(e,t,l,o={}){Array.isArray(e)||Re("target times must be an array");let n=-1/0;for(const t of e)(!Number.isFinite(t)||t<=n)&&Re("target times must be finite and strictly increasing"),n=t;(!Te(o)||void 0!==o.gaps&&"carry"!==o.gaps&&"missing"!==o.gaps)&&Re("gaps must be carry or missing");const{eligibleAt:r,values:a}=De(t,l),i=Object.keys(a),s={};for(const t of i)Ke(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}const We=e=>!0===e?.[Symbol.for("openalgo-charts.data-context.passing")];function Pe(e){const l=t.normalizeDataVariant(e);return t.normalizeDataVariant(l&&{session:l.session,adjustment:l.adjustment})}const Ve="__requestedIndicator",Ue={bars:[],availableAt:[],confirmed:[]},$e=e=>e[Ve],He=e=>{throw new t.IndicatorInputError(`Requested indicator: ${e}`)};function qe(e){!function(e){"function"==typeof e.request&&"function"==typeof e.expression||He("request and expression must be functions"),void 0!==e.gaps&&"carry"!==e.gaps&&"missing"!==e.gaps&&He("gaps must be carry or missing"),void 0!==e.targetTimes&&"function"!=typeof e.targetTimes&&He("targetTimes must be a function")}(e);const l=[...new Set(e.plots.flatMap(e=>void 0===e.ohlc?[e.key]:[e.ohlc.open,e.ohlc.high,e.ohlc.low,e.ohlc.close]))],o=new WeakMap;return{id:e.id,name:e.name,category:e.category,placement:e.placement,inputs:e.inputs,plots:e.plots,levels:e.levels,range:e.range,calc:(t,n,r,a)=>{const i=$e(r);try{const s={...i?.context,bars:t,settings:n,calculation:a},c=e.targetTimes?.(s)??t.map(e=>e.time);Array.isArray(c)&&c.length===t.length||He("target times must match source length");const u=Ee(c,i?.snapshot??Ue,t=>e.expression(t,n,s),{gaps:e.gaps});for(const e of l)i?.snapshot?.bars.length&&!Object.prototype.hasOwnProperty.call(u,e)&&He(`expression is missing plot column ${e}`),Object.prototype.hasOwnProperty.call(u,e)||Object.defineProperty(u,e,{value:new Array(t.length).fill(null),enumerable:!0,writable:!0,configurable:!0});return o.delete(r),u}catch(e){throw o.set(r,{snapshot:i?.snapshot??null,error:e}),e}},attach:l=>{const n=$e(l.store)??{owner:0,key:null,completed:null,wanted:null,request:null,snapshot:null,context:null,status:{state:"empty"}};l.store[Ve]=n;const r=++n.owner;let a=!0,i=0,s=0,c=null,u=()=>{};const p=()=>a&&n.owner===r&&!l.signal?.aborted,y=e=>{n.status=e,p()&&l.setDataStatus?.(e)},f=()=>{const e=n.request;n.request=null,c=null,e?.controller.abort(),e?.reject(e.controller.signal.reason)},d=()=>{n.completed=null,n.wanted=null;const e=null!==n.snapshot;n.snapshot=null,f(),e&&l.requestRecompute()},m=e=>{c!==e&&(c=e,e.promise.then(t=>{if(!p()||n.request!==e||e.controller.signal.aborted)return;let r;try{r=function(e,t){let l=[];Ee([],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))})}(t,e.selection.request.asOf)}catch(t){return void h(e,t)}n.request=null,c=null;const a=n.snapshot;n.snapshot=r,n.completed=e.selection.version;try{l.requestRecompute();const e=o.get(l.store);if(e?.snapshot===r)throw e.error}catch(t){return void(p()&&n.snapshot===r&&n.key===e.selection.key&&(n.snapshot=a,y({state:"error",error:t}),n.wanted?.version!==e.selection.version&&g()))}p()&&n.snapshot===r&&(null===n.request&&y({state:r.bars.length?"ready":"empty"}),g())},t=>h(e,t)))},h=(e,t)=>{p()&&n.request===e&&!e.controller.signal.aborted&&(n.request=null,c=null,n.completed=e.selection.version,y({state:"error",error:t}),n.wanted?.version!==e.selection.version&&g())},b=e=>{if(p()&&n.request===e&&!e.controller.signal.aborted&&!e.started){e.started=!0;try{e.resolve(l.requestSnapshot({...e.selection.request,signal:e.controller.signal}))}catch(t){e.reject(t)}}},g=(o=!1)=>{if(!p()||We(l.dataContext?.()))return;const r=++s,a=()=>p()&&s===r,c=n.context?.requestState?.replay,u=l.requestState?.(),f=u?.replay,h={bars:l.bars(),settings:l.settings(),dataContext:l.dataContext?.(),requestState:u};let g;n.context=h;let w="";try{const l=e.request(h);g=null===l?null:function(e,l){let o;(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)||void 0!==e.warmupBars&&(!Number.isInteger(e.warmupBars)||e.warmupBars<0||e.warmupBars>1e5))&&He("request requires an instrument and a finite ordered time window");try{o=void 0===e.variant?Pe(l?.variant):t.normalizeDataVariant(e.variant)}catch{He("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,...void 0===e.warmupBars?{}:{warmupBars:e.warmupBars},...o?{variant:o}:{}}}(l,h.dataContext),w=t.dataVariantKey(h.dataContext?.variant)}catch(e){return void(a()&&(d(),a()&&y({state:"error",error:e})))}if(!a())return;if(null===g||void 0===l.requestSnapshot||!1===u?.supportsSnapshots||void 0!==f&&void 0===f.asOf)return d(),void(a()&&(n.key=null,y({state:"unsupported"})));if(0===h.bars.length)return d(),void(a()&&y({state:"empty"}));const k=u?.source,v=h.dataContext,N=JSON.stringify([g.symbol,g.exchange,g.interval,g.asOf,g.warmupBars,v?.symbol,v?.exchange,v?.interval,w,g.variant??null,u?.providerRevision,k?.sourceId,void 0===f?k?.historyRevision:null,void 0!==f]),C=void 0!==f?.asOf&&void 0!==c?.asOf&&f.asOf<c.asOf;if(n.key!==N||C){if(d(),!a())return;n.key=N}void 0!==f?.asOf&&(g.asOf=void 0===g.asOf?f.asOf:Math.min(g.asOf,f.asOf));const A=JSON.stringify([N,g.from,g.to,g.asOf,g.warmupBars,void 0===f&&!1!==e.refreshOnSourceUpdate?k?.revision:null,u?.dataRevision,f?.time,f?.forming,i]),M={key:N,version:A,request:g};n.wanted=M,null!==n.request?(m(n.request),b(n.request)):(o||n.completed!==A)&&(e=>{let t,l;const o={selection:e,controller:new AbortController,started:!1,promise:new Promise((e,o)=>{t=e,l=o}),resolve:t,reject:l};n.request=o,m(o),y({state:"loading"}),b(o)})(M)},w=()=>{a&&(a=!1,u(),l.signal?.removeEventListener("abort",k),n.owner===r&&(l.setDataRetry?.(null),queueMicrotask(()=>{n.owner===r&&f()})))},k=()=>{n.owner===r&&f(),w()};l.signal?.addEventListener("abort",k,{once:!0}),u=void 0!==l.subscribeRequestChanges?l.subscribeRequestChanges(()=>g()):l.subscribeDataChanges?.(()=>{i++,g()})??(()=>{}),l.setDataRetry?.(()=>g(!0));const v=o.get(l.store);return l.setDataStatus?.(v?.snapshot===n.snapshot?{state:"error",error:v.error}:n.status),g(),w}}}const _e="timeframe",ze={key:_e,type:"interval",label:"Timeframe",default:"",tooltip:"Compute on a higher timeframe, using independent history when the host supports it. Values appear once their periods close."},je={month:1,quarter:3,year:12};function Ze(e){return"interval"===e.mode?e.seconds:"calendar"===e.mode?je[e.unit]*Math.max(1,Math.floor(e.count??1))*2629746:NaN}function Ye(e,l,o){const n=l[_e];if(null==n)return null;if("string"!=typeof n)throw new t.IndicatorInputError(`${e.name}: the timeframe must be an interval code`);const r=n.trim();if(""===r)return null;const a=t.tryResolveInterval(r);if(null===a)throw new t.IndicatorInputError(`${e.name}: "${r}" is not a known timeframe`);if(!t.isTimeBucketed(a.bucketing))throw new t.IndicatorInputError(`${e.name}: "${r}" bars close on trade flow, not the clock, so they cannot be folded`);const i=o?.interval,s=void 0===i||""===i?null:t.tryResolveInterval(i)?.bucketing??null;if(null!==s){if(!t.isTimeBucketed(s))throw new t.IndicatorInputError(`${e.name}: the chart's "${i??""}" bars close on trade flow, not the clock, so they cannot be folded`);if(Ze(a.bucketing)<=Ze(s))return null}if(!0===o?.transformed)throw new t.IndicatorInputError(`${e.name}: this chart draws transformed bars, which a timeframe cannot fold; compute the study on the underlying bars`);for(const o of e.inputs){const n=l[o.key];if("source"===o.type&&"object"==typeof n&&null!==n)throw new t.IndicatorInputError(`${e.name}: another study's output cannot be folded to a timeframe; pick a price source`)}const c=o?.timezone??("string"==typeof l.timezone&&""!==l.timezone?l.timezone:t.DEFAULT_TIMEZONE);return{tf:r,bucketing:a.bucketing,zone:c,known:null!==s}}function Ge(e){const t=String(Math.floor(e/60)).padStart(2,"0")+String(e%60).padStart(2,"0");return`${t}-${t}`}function Xe(e,t,l){if(void 0===e)return;const{resolveSource:o,...n}=e;return{...n,interval:t,barState:{...e.barState,lastIndex:l-1}}}const Je=e=>"number"==typeof e&&Number.isFinite(e)?e:null;const Qe=new WeakMap,et=e=>"object"==typeof e&&null!==e?e:null;function tt(e,t){const l=et(e);null!==l&&(null===t?Qe.delete(l):Qe.set(l,t))}function lt(e,l={}){if(e.inputs.some(e=>e.key===_e))throw new Error(`withTimeframe: ${e.id} already has a "${_e}" input`);if(void 0!==e.attach)throw new Error(`withTimeframe: ${e.id} brings its own data, which a timeframe cannot fold`);const o=e.inputs.findIndex(e=>void 0!==e.group),n=o<0?[...e.inputs,ze]:[...e.inputs.slice(0,o),ze,...e.inputs.slice(o)],r={...e,inputs:n,calc:(l,o,n,r)=>{const a=Ye(e,o,r);if(null===a||0===l.length)return tt(n,null),e.calc(l,o,n,r);const i="interval"===a.bucketing.mode&&a.bucketing.seconds%86400!=0?function(e,l){const o=new Map,n=Le(l);let r=NaN;for(const a of e){const e=n(a.time).index;if(e===r)continue;const i=t.utcSecondsToZonedParts(a.time,l),s=60*i.hour+i.minute;o.set(s,(o.get(s)??0)+1),r=e}let a=null,i=0;for(const[e,t]of o)(t>i||t===i&&null!==a&&e<a)&&(a=e,i=t);return a}(l,a.zone):null;let s=0,c=!0;const u=Fe(l,a.tf,t=>{s=t.length;const l=e.calc(t,o,n,Xe(r,a.tf,s));if(s>1){const n=e.calc(t.slice(0,-1),o,{},Xe(r,a.tf,s-1));c=function(e,t,l){for(const o of Object.keys(t)){const n=e[o],r=t[o];if(void 0===n||void 0===r)return!1;for(let e=0;e<l;e++)if(!Object.is(Je(n[e]),Je(r[e])))return!1}return!0}(n,l,s-1)}return l},{mode:"confirmed",timezone:a.zone,...null===i?{}:{session:Ge(i)}});return a.known||s!==l.length?(tt(n,c?{tf:a.tf,zone:a.zone,sessionStart:i,identity:!1}:null),u):(tt(n,{tf:a.tf,zone:a.zone,sessionStart:i,identity:!0}),e.calc(l,o,n,r))}};return Object.defineProperty(r,"calcTail",{value:(t,l,o,n,r,a)=>{const i=Ye(e,l,a);if(null===i)return e.calcTail?.(t,l,o,n,r,a)??null;const s=et(r),c=null===s?void 0:Qe.get(s),u=t.length;if(void 0===c||c.tf!==i.tf||c.zone!==i.zone||o<0||o>=u)return null;if(c.identity)return u===o+1?e.calcTail?.(t,l,o,n,r,a)??null:null;const p=e=>xe(i.bucketing,t[e]?.time??NaN,i.zone,c.sessionStart),y=p(o);for(let e=o+1;e<u;e++)if(p(e)!==y)return null;const f={};for(const e of Object.keys(n)){const t=n[e];if(void 0===t||t.length<=o)return null;f[e]=new Array(u-o).fill(t[o]??null)}return f},enumerable:!1,writable:!0,configurable:!0}),function(e,t,l,o){const n=new WeakMap,r=new WeakSet,a=e=>{const t=e.requestState?.();return!0===t?.supportsWarmup&&!0===t.supportsSnapshots},i=e=>{if(!a(e)||null===l(e.settings()))return!1;const t=e.dataContext?.()?.interval;try{return null!==o(e.settings(),{interval:t,barState:{isNew:!1,isConfirmed:!0,isRealtime:!1,lastIndex:0}})}catch{return!0}},s=qe({...e,refreshOnSourceUpdate:!1,request:e=>{if(!e.requestState?.supportsWarmup||!e.requestState.supportsSnapshots)return null;const t=l(e.settings),n=e.dataContext?.interval,r=o(e.settings,{interval:n,barState:{isNew:!1,isConfirmed:!0,isRealtime:!1,lastIndex:e.bars.length-1}});return null===t||!r||!e.dataContext?.symbol||!e.bars.length||Number(e.settings.offset??0)<0?null:{symbol:e.dataContext.symbol,interval:r,...void 0===e.dataContext.exchange?{}:{exchange:e.dataContext.exchange},from:e.bars[0].time,to:e.bars[e.bars.length-1].time+1,warmupBars:t}},expression:(t,l,o)=>{const{resolveSource:n,...r}=o.calculation??{},a=o.calculation?{...r,interval:String(l.timeframe),barState:{...o.calculation.barState,lastIndex:t.length-1}}:void 0;return e.calc(t,l,{},a)}}),c=(e,t,r)=>{const i=n.get(e);return void 0!==i&&a(i)&&null!==l(t)&&null!==o(t,r)},u={...t,calc:(e,l,o,n)=>c(o,l,n)?s.calc(e,l,o,n):t.calc(e,l,o,n),attach:e=>{n.set(e.store,e);const t=s.attach({...e,setDataStatus:t=>{i(e)?(r.add(e.store),e.setDataStatus?.(t)):r.delete(e.store)&&e.setDataStatus?.({state:"ready"})},setDataRetry:t=>{(i(e)||null===t)&&e.setDataRetry?.(t)}});return()=>{n.get(e.store)===e&&n.delete(e.store),"function"==typeof t&&t()}}};return Object.defineProperty(u,"calcTail",{enumerable:!1,configurable:!0,writable:!0,value:(...e)=>c(e[4],e[1],e[5])?null:t.calcTail?.(...e)??null}),u}(e,r,l.historyBars??(t=>function(e,t){const l=(e,l)=>Math.max(1,Math.round(Number(t[e]??l))),o=l("length",20),n=Math.max(0,Math.round(Number(t.offset??0)));switch(e){case"sma":case"ema":case"wma":return l("length",9);case"vwma":case"lsma":case"donchian":return o+n;case"alma":case"smma":case"mcginley-dynamic":case"bollinger":case"envelope":return o;case"dema":return 2*o-1;case"tema":return 3*o-2;case"t3":return 6*o-5;case"hma":return o+Math.ceil(Math.sqrt(o));case"zlema":return o+Math.floor((o-1)/2);case"kama":return l("erLength",10)+1;case"vidya":return o+l("cmoLength",9)+1;case"rsi":return l("length",14)+1;case"macd":return Math.max(l("fastPeriod",12),l("slowPeriod",26))+l("signalPeriod",9)-1;case"stochastic":return l("kPeriod",14)+l("kSmoothing",1)+l("dPeriod",3)-2;case"stochastic-rsi":return l("lengthRSI",14)+l("lengthStoch",14)+l("smoothK",3)+l("smoothD",3);case"adx":return l("period",14)+l("adxPeriod",14);case"atr":case"supertrend":return l("period",14)+1;case"keltner-channel":return Math.max(o,l("atrlength",10))+1;case"parabolic-sar":return 2;case"williams-percent-r":return l("length",14);case"cci":return l("period",20);default:return null}}(e.id,t)),(t,l)=>Ye(e,t,l)?.tf??null)}const ot=(e,t,l)=>{const o=e[t];return"number"==typeof o&&Number.isFinite(o)?o:l},nt=(e,t,l,o=1)=>Math.max(o,Math.round(ot(e,t,l))),rt=(e,t,l)=>Math.round(ot(e,t,l)),at=(e,t,l)=>{const o=e[t];return"string"==typeof o&&""!==o?o:l},it=(e,t,l)=>{const o=e[t];return"boolean"==typeof o?o:l},st=(e,t="source",l="close")=>e[t]??l,ct=e=>{const l=e.timezone;return"string"!=typeof l||""===l||l===t.DEFAULT_TIMEZONE?t.DEFAULT_TIMEZONE:t.isValidTimezone(l)?l:t.DEFAULT_TIMEZONE};function ut(e,t){const l=e.length,o=new Array(l).fill(NaN);for(let n=Math.max(0,t),r=Math.min(l,l+t);n<r;n++)o[n]=e[n-t];return o}function pt(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 yt=(e,t)=>new Array(e).fill(t),ft=e=>"number"==typeof e.volume&&Number.isFinite(e.volume)?e.volume:0;function dt(e,t,l){const o=new Array(e.length);for(let n=0;n<e.length;n++)o[n]=l(e[n],t[n]);return o}const mt=e=>Math.floor((Math.floor((e+t.IST_OFFSET_SECONDS)/86400)+3)/7);function ht(e,l){return l!==t.DEFAULT_TIMEZONE?(o,n)=>t.isNewZonedPeriod(o,n,e,l):"week"===e?(e,t)=>mt(e)!==mt(t):(l,o)=>{const n=t.utcSecondsToIstParts(l),r=t.utcSecondsToIstParts(o);return n.year!==r.year||"year"!==e&&("quarter"===e?Math.floor((n.month-1)/3)!==Math.floor((r.month-1)/3):n.month!==r.month)}}function bt(e,l,o,n,r){return ie({id:e,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:(e,l,o,r)=>{const a=st(l),i="string"==typeof a?t.sourceValues(e,a):t.sourceValues(e,a,r).map(e=>e??NaN);return{ma:O(n(i,nt(l,"length",9),"string"==typeof a?void 0:{missing:"propagate"}))}}},e=>r?function(e){return(l,o,n,r,a,i)=>{const s=nt(o,"length",9);if(!re(s))return null;const c=st(o);if("string"==typeof c)return de(e,`${s}|${c}`,{keys:["ma"],start:he,step:(e,o,n)=>{n[0]=ne(be(e,t.sourceValue(l[o],c),s,!0))}},l,n,r,a);if(void 0===se(a,e,l,n))return null;const u=i?.resolveSource?.(c);return Array.isArray(u)&&u.length===l.length?de(e,`${s}|${c.instanceId}|${c.plotKey}`,{keys:["ma"],start:ge,step:(e,t,l)=>{l[0]=ne(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=g(e.seed),e.seed.length=0}else e.value=g([e.value,t],[l-1,2]);return e.value}(e,u[t]??NaN,s))}},l,n,r,a):null}}(e):function(e,t){const l=fe(e,e=>{const t=nt(e,"length",9);return re(t)?t-1:null});return(o,n,r,a,i,s)=>{const c=st(n);if("string"==typeof c)return l(o,n,r,a,i,s);const u=nt(n,"length",9),p=se(i,e,o,r),y=void 0===p?void 0:s?.resolveSource?.(c);if(void 0===p||!re(u)||!Array.isArray(y)||y.length!==o.length)return null;const f=Math.max(0,r-u),d=y.slice(f).map(e=>e??NaN);return ye(p,{ma:O(t(d,u,{missing:"propagate"}))},r-f,a,r)}}(e,n))}const gt=lt(bt("sma","SMA","#4f8cff",C,!1)),wt=lt(bt("wma","WMA","#ab47bc",A,!1)),kt=lt(bt("ema","EMA","#f5a623",B,!0));const vt=lt(ie({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(e,l){const o=t.sourceValues(e,st(l)),n=nt(l,"length",20),r=ot(l,"stdDev",2),a=C(o,n),i=x(o,n),s=dt(a,i,(e,t)=>e+r*t),c=dt(a,i,(e,t)=>e-r*t);return{upper:O(s),basis:O(a),lower:O(c)}}},e=>fe(e,e=>{const t=nt(e,"length",20);return re(t)?t-1:null})));function Nt(e,l,o){if("continuous"===l)return new Array(e.length).fill(!1);const n=e.map(e=>e.time);return"session"===l?t.sessionStartFlags(n,o):t.calendarPeriodFlags(n,ht(l,o))}const Ct=e=>e.median>0&&e.median<86400,At=e=>Math.max(4*e.median,14400),Mt=e=>Ct(e)&&e.opens>0&&e.short>e.opens>>1;function St(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(Ct(n))for(let t=1;t<e.length;t++)e[t]-e[t-1]<At(n)||(n.opens++,e[t]-n.open<=129600&&n.short++,n.open=e[t]);return n}const xt=ie({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:(e,l)=>{const o=e.length,n=t.sourceValues(e,st(l,"source","hlc3")),r=at(l,"anchor","session"),a="percent"===l.calcMode,i=rt(l,"offset",0),s=new Array(o).fill(NaN),c=new Array(o).fill(NaN),u=Nt(e,r,ct(l));let p=0,y=0,f=0;for(let t=0;t<o;t++){u[t]&&(p=0,y=0,f=0);const l=e[t].volume??0,o=n[t];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[t]=r;const i=Math.max(0,f/y-r*r);c[t]=a?.01*r:Math.sqrt(i)}const d=(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},m=!1!==l.showBand1,h=!0===l.showBand2,b=!0===l.showBand3,g=ot(l,"bandMult1",1),w=ot(l,"bandMult2",2),k=ot(l,"bandMult3",3);return{vwap:O(ut(s,i)),upper1:O(ut(d(m,g,1),i)),lower1:O(ut(d(m,g,-1),i)),upper2:O(ut(d(h,w,1),i)),lower2:O(ut(d(h,w,-1),i)),upper3:O(ut(d(b,k,1),i)),lower3:O(ut(d(b,k,-1),i))}}},function(e){return(l,o,n,r,a)=>{const i=l.length;if(0!==rt(o,"offset",0)||i-n>2)return null;const s=st(o,"source","hlc3"),c=at(o,"anchor","session"),u=ct(o),p="percent"===o.calcMode,y=[!1!==o.showBand1,!0===o.showBand2,!0===o.showBand3],f=[ot(o,"bandMult1",1),ot(o,"bandMult2",2),ot(o,"bandMult3",3)];let d=[],m=[];return de(e,`${c}|${s}|${u}|${p}|${y.join()}|${f.join()}`,{keys:["vwap","upper1","lower1","upper2","lower2","upper3","lower3"],start:()=>{const e=n+1===i?l:l.slice(0,n+1);return d=Nt(e,c,u),{pv:0,vol:0,pv2:0,reading:"continuous"===c?null:St(e.map(e=>e.time),d[n])}},ready:e=>{const o=e.reading;if(null===o||"continuous"===c)return m=[!1,!1],!0;if(o.last!==l[n].time)return!1;const r=o.flag,a=i===n+2&&function(e,l,o,n){const r=Mt(e),a=l-e.last;if(a>0){if(0===e.gaps)return null;const t=e.gaps+1>>1,l=e.below+(a<e.median?1:0),o=e.equal+(a===e.median?1:0);if(l>t||t>=l+o)return null;e.gaps++,e.below=l,e.equal=o}const i=Ct(e)&&a>=At(e),s=e.open,c=e.last;return i&&(e.opens++,l-e.open<=129600&&e.short++,e.open=l),Mt(e)!==r?null:(e.last=l,e.flag="session"===o?r?i:n===t.DEFAULT_TIMEZONE?t.isNewIstDay(c,l):t.isNewZonedDay(c,l,n):r?i&&ht(o,n)(s,l):ht(o,n)(c,l),e.flag)}(o,l[i-1].time,c,u);return m=[r,!0===a],null!==a},step:(e,o,r)=>{(o<n?d[o]:m[o-n])&&(e.pv=0,e.vol=0,e.pv2=0);const a=l[o],i=a.volume??0,c=t.sourceValue(a,s);let u=NaN,h=NaN;if(Number.isFinite(c)&&Number.isFinite(i)&&(e.pv+=c*i,e.pv2+=c*c*i,e.vol+=i,e.vol>0)){u=e.pv/e.vol;const t=Math.max(0,e.pv2/e.vol-u*u);h=p?.01*u:Math.sqrt(t)}r[0]=ne(u);const b=Number.isFinite(u)&&Number.isFinite(h);for(let e=0;e<3;e++)r[1+2*e]=y[e]&&b?ne(u+h*f[e]):null,r[2+2*e]=y[e]&&b?ne(u-h*f[e]):null}},l,n,r,a)}}),Lt=lt(ie({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.supertrend(e,nt(l,"period",10),ot(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=nt(l,"period",10),i=ot(l,"multiplier",3);if(!re(a))return null;const s={direction:1};return de(e,`${a}|${i}`,{keys:["up","down","bodyMid"],start:Ce,step:(e,l,o)=>{const n=function(e,t,l,o,n,r){const a=ve(e.atr,we(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 d;return e.started&&e.st!==e.upper?s>=f?(d=f,r.direction=-1):(d=y,r.direction=1):s<=y?(d=y,r.direction=1):(d=f,r.direction=-1),e.upper=y,e.lower=f,e.st=d,e.close=s,e.started=!0,d}(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)})),It=lt(ie({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=ot(t,"start",.02),r=ot(t,"increment",.02),a=ot(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:O(o)}}},e=>(t,l,o,n,r)=>{const a=ot(l,"start",.02),i=ot(l,"increment",.02),s=ot(l,"maximum",.2);return de(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]=ne(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)})),Ot={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=nt(t,"conversionPeriod",9),n=nt(t,"basePeriod",26),r=nt(t,"laggingSpanPeriod",52),a=rt(t,"displacement",26),i=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++){const t=e[n-o];t.high>l&&(l=t.high),t.low<r&&(r=t.low)}o[n]=(l+r)/2}return o},s=i(o),c=i(n),u=dt(s,c,(e,t)=>(e+t)/2),p=i(r),y=e.map(e=>e.close);return{conversion:O(s),base:O(c),spanA:O(ut(u,a)),spanB:O(ut(p,a)),lagging:O(ut(y,-a))}}},Bt={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:at(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:at(l,"downColor","#ef5350"),text:"Sell"})}return r},calc:(e,l)=>{const o=e.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=new Array(o).fill(null),c=new Array(o).fill(null),u={up:n,down:r,atrHigh:a,atrLow:i,buySignal:s,sellSignal:c};if(0===o)return u;const p=nt(l,"amplitude",2),y=ot(l,"channelDeviation",2),f=!1!==l.showChannels,d=!1!==l.showSignals,m=e.map(e=>e.high),h=e.map(e=>e.low),b=t.atr(m,h,e.map(e=>e.close),nt(l,"atrPeriod",100)),g=C(m,p),w=C(h,p),k=L(m,p),v=I(h,p);let N=0,A=0,M=h[0],S=m[0],x=0,O=0,B=!1;for(let t=0;t<o;t++){const l=b[t]/2,o=y*l,u=k[t],p=v[t],C=t>0?m[t-1]:m[0],L=t>0?h[t-1]:h[0],I=B?N:-1;let F;1===A?(Number.isFinite(p)&&(M=Math.max(p,M)),Number.isFinite(g[t])&&g[t]<M&&e[t].close<L&&(N=1,A=0,S=u)):(Number.isFinite(u)&&(S=Math.min(u,S)),Number.isFinite(w[t])&&w[t]>S&&e[t].close>C&&(N=0,A=1,M=p)),0===N?(1===I?(x=O,d&&Number.isFinite(l)&&(s[t]=x-l)):x=-1===I?M:Math.max(M,x),F=x):(0===I?(O=x,d&&Number.isFinite(l)&&(c[t]=O+l)):O=-1===I?S:Math.min(S,O),F=O),B=!0,Number.isFinite(F)&&(0===N?n[t]=F:r[t]=F,f&&Number.isFinite(o)&&(a[t]=F+o,i[t]=F-o))}return u}},Ft=[{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"}];function Rt(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 Tt(e,t){return Rt(e,e=>B(e,t))}function Kt(e,t,l,o){switch(e){case"EMA":return Tt(t,o);case"SMMA (RMA)":return Rt(t,e=>S(e,o));case"WMA":return Rt(t,e=>A(e,o));case"VWMA":return Rt(t,(e,t)=>E(e,l.slice(t),o));default:return Rt(t,e=>C(e,o))}}function Dt(e,t,l){return[{key:"maType",type:"select",label:"Type",default:t,options:Ft,group:"Smoothing"},{key:"maLength",type:"number",label:"Length",default:l,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:`${e}-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"}]}function Et(e){return[{key:"ma",type:"line",title:`${e}-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}}]}function Wt(e,t,l,o,n){const r=e.length,a=at(l,"maType",o),i=nt(l,"maLength",n),s=ot(l,"bbMult",2),c="None"===a?new Array(r).fill(NaN):Kt(a,e,t,i),u="SMA + Bollinger Bands"===a?Rt(e,e=>x(e,i)).map(e=>e*s):new Array(r).fill(NaN);return{ma:O(c),bbUpper:O(dt(c,u,(e,t)=>e+t)),bbLower:O(dt(c,u,(e,t)=>e-t))}}const Pt=lt(ie({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:(e,l)=>({rsi:O(t.rsi(t.sourceValues(e,st(l)),nt(l,"length",14))),upperLevel:yt(e.length,ot(l,"overbought",70)),lowerLevel:yt(e.length,ot(l,"oversold",30))}),levels:e=>[{price:ot(e,"overbought",70),color:"#ef5350",title:"OB",dashed:!0},{price:50,color:"#5a6b8c",title:"",dashed:!0},{price:ot(e,"oversold",30),color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},e=>(l,o,n,r,a)=>{const i=nt(o,"length",14);if(!re(i))return null;const s=st(o),c=ot(o,"overbought",70),u=ot(o,"oversold",30);return de(e,`${i}|${s}|${c}|${u}`,{keys:["rsi","upperLevel","lowerLevel"],start:Ne,step:(e,o,n)=>{n[0]=ne(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,t.sourceValue(l[o],s),i)),n[1]=c,n[2]=u}},l,n,r,a)})),Vt=lt(ie({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;return e>=0?r?at(o,"histUpColor","#26a69a"):at(o,"histUpFadeColor","#a7d8d2"):r?at(o,"histDownFadeColor","#f5b0ae"):at(o,"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:(e,l)=>{const o=t.sourceValues(e,st(l)),n=dt(B(o,nt(l,"fastPeriod",12)),B(o,nt(l,"slowPeriod",26)),(e,t)=>e-t),r=Rt(n,e=>B(e,nt(l,"signalPeriod",9))),a=dt(n,r,(e,t)=>e-t);return{macd:O(n),signal:O(r),histogram:O(a)}},levels:()=>[{price:0,color:"#5a6b8c",dashed:!0}]},e=>(l,o,n,r,a)=>{const i=nt(o,"fastPeriod",12),s=nt(o,"slowPeriod",26),c=nt(o,"signalPeriod",9);if(!re(i)||!re(s)||!re(c))return null;const u=st(o);return de(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,o,n)=>{const r=t.sourceValue(l[o],u),a=be(e.fast,r,i,!0)-be(e.slow,r,s,!0),p=be(e.signal,a,c,!0);n[0]=ne(a),n[1]=ne(p),n[2]=ne(a-p)}},l,n,r,a)})),Ut=lt(ie({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=L(e.map(e=>e.high),nt(t,"kPeriod",14)),o=I(e.map(e=>e.low),nt(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=C(n,nt(t,"kSmoothing",1)),a=C(r,nt(t,"dPeriod",3));return{k:O(r),d:O(a),upperLevel:yt(e.length,80),lowerLevel:yt(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=nt(e,"kPeriod",14),l=nt(e,"kSmoothing",1),o=nt(e,"dPeriod",3);return re(t)&&re(l)&&re(o)?t+l+o-3:null}))),$t=lt(ie({id:"adx",name:"ADX / DMI",category:"Trend",placement:"pane",inputs:[{key:"period",type:"number",label:"DI Length",default:14,min:1,max:500,step:1},{key:"adxPeriod",type:"number",label:"ADX Smoothing",default:14,min:1,max:500,step:1},{key:"adxColor",type:"color",label:"ADX",default:"#e0e3ea"},{key:"plusColor",type:"color",label:"+DI",default:"#26a69a"},{key:"minusColor",type:"color",label:"-DI",default:"#ef5350"}],plots:[{key:"plusDi",type:"line",title:"+DI",colorKey:"plusColor",style:{lineWidth:1}},{key:"minusDi",type:"line",title:"-DI",colorKey:"minusColor",style:{lineWidth:1}},{key:"adx",type:"line",title:"ADX",colorKey:"adxColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const o=e.length,n=nt(l,"period",14),r=e.map(e=>e.high),a=e.map(e=>e.low),i=e.map(e=>e.close),s=t.trueRange(r,a,i);o>0&&(s[0]=NaN);const c=new Array(o).fill(NaN),u=new Array(o).fill(NaN);for(let e=1;e<o;e++){if(!(Number.isFinite(r[e])&&Number.isFinite(a[e])&&Number.isFinite(r[e-1])&&Number.isFinite(a[e-1])))continue;const t=r[e]-r[e-1],l=a[e-1]-a[e];c[e]=t>l&&t>0?t:0,u[e]=l>t&&l>0?l:0}const p=S(s,n),y=S(c,n),f=S(u,n),d=new Array(o).fill(NaN),m=new Array(o).fill(NaN),h=new Array(o).fill(NaN);for(let e=0;e<o;e++){const t=p[e];if(!Number.isFinite(t)||0===t)continue;const l=y[e]/t*100,o=f[e]/t*100;if(Number.isFinite(l)&&(d[e]=l),Number.isFinite(o)&&(m[e]=o),!Number.isFinite(d[e])||!Number.isFinite(m[e]))continue;const n=d[e]+m[e];h[e]=n>0?Math.abs(d[e]-m[e])/n*100:0}const b=Rt(h,e=>S(e,nt(l,"adxPeriod",14)));return{plusDi:O(d),minusDi:O(m),adx:O(b)}},levels:()=>[{price:25,color:"#5a6b8c",title:"25",dashed:!0}]},e=>(t,l,o,n,r)=>{const a=nt(l,"period",14),i=nt(l,"adxPeriod",14);return re(a)&&re(i)?de(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=we(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=be(e.tr,n,a,!1),u=be(e.plus,r,a,!1),p=be(e.minus,s,a,!1);let y=NaN,f=NaN,d=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;d=e>0?Math.abs(y-f)/e*100:0}}o[0]=ne(y),o[1]=ne(f),o[2]=ne(be(e.adx,d,i,!1))}},t,o,n,r):null}));const Ht=lt(ie({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"},...Dt("CCI","SMA",20)],plots:[{key:"cci",type:"line",title:"CCI",colorKey:"color",style:{lineWidth:1.5}},...Et("CCI")],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=nt(t,"period",20),n=ot(t,"constant",.015),r=e.map(e=>(e.high+e.low+e.close)/3),a=C(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}return{cci:O(i),...Wt(i,e.map(e=>e.volume??0),t,"SMA",20),upperLevel:yt(l,100),lowerLevel:yt(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=nt(e,"period",20),l=nt(e,"maLength",20);return re(t)&&re(l)?t-1+("None"===at(e,"maType","SMA")?0:l-1):null});return(l,o,n,r,a,i)=>{const s=at(o,"maType","SMA");if("EMA"!==s&&"SMMA (RMA)"!==s)return t(l,o,n,r,a,i);const c=nt(o,"period",20),u=ot(o,"constant",.015),p=nt(o,"maLength",20);if(!re(c)||!re(p))return null;const y=e=>(l[e].high+l[e].low+l[e].close)/3;return de(e,`${c}|${u}|${s}|${p}`,{keys:["cci","ma","bbUpper","bbLower","upperLevel","lowerLevel"],start:he,step:(e,t,l)=>{let o=NaN;if(t>=c-1){const e=Ae(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]=ne(o),l[1]=ne(be(e,o,p,"EMA"===s)),l[2]=null,l[3]=null,l[4]=100,l[5]=-100}},l,n,r,a)}}));const qt={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=nt(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)}return{mfi:O(G(r,a,o)),upperLevel:yt(l,80),lowerLevel:yt(l,20)}},levels:()=>[{price:80,color:"#ef5350",title:"OB",dashed:!0},{price:20,color:"#26a69a",title:"OS",dashed:!0}],range:()=>({min:0,max:100})},_t=lt(ie({id:"atr",name:"ATR",category:"Volatility",placement:"pane",inputs:[{key:"period",type:"number",label:"Length",default:14,min:1,max:500,step:1},{key:"color",type:"color",label:"Color",default:"#f5a623"}],plots:[{key:"atr",type:"line",title:"ATR",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,l)=>({atr:O(t.atr(e.map(e=>e.high),e.map(e=>e.low),e.map(e=>e.close),nt(l,"period",14)))})},e=>(t,l,o,n,r)=>{const a=nt(l,"period",14);return re(a)?de(e,`${a}`,{keys:["atr"],start:ke,step:(e,l,o)=>{o[0]=ne(ve(e,we(t,l),a))}},t,o,n,r):null})),zt={id:"williams-vix-fix",name:"Williams 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];if(null==o)return;return null!=n&&o>=n||null!=r&&o>=r?at(l,"highColor","#00ff00"):at(l,"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=nt(t,"pd",22),a=nt(t,"bbl",20),i=ot(t,"mult",2),s=nt(t,"lb",50),c=ot(t,"ph",.85),u=ot(t,"pl",1.01),p=!0===t.hp,y=!0===t.sd,f=L(o,r),d=new Array(l);for(let e=0;e<l;e++){const t=f[e];d[e]=Number.isFinite(t)&&0!==t?(t-n[e])/t*100:NaN}const m=x(d,a),h=C(d,a),b=L(d,s),g=I(d,s),w=new Array(l),k=new Array(l),v=new Array(l),N=new Array(l),A=new Array(l);for(let e=0;e<l;e++){const t=h[e]+i*m[e],l=b[e]*c,o=g[e]*u;w[e]=Number.isFinite(t)?t:null,k[e]=Number.isFinite(l)?l:null,v[e]=y?w[e]:null,N[e]=p?k[e]:null,A[e]=p&&Number.isFinite(o)?o:null}return{wvf:O(d),rangeHigh:N,rangeLow:A,upperBand:v,alertUpper:w,alertHigh:k}}},jt={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]?at(l,"downColor","#ef5350"):at(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:O(l),direction:e.map(e=>e.close>=e.open?1:-1),ma:!0===t.showMA?O(C(l,nt(t,"maPeriod",20))):l.map(()=>null)}}},Zt=ie({id:"obv",name:"On-Balance Volume",category:"Volume",placement:"pane",inputs:[{key:"color",type:"color",label:"Color",default:"#26c6da"},...Dt("OBV","None",9)],plots:[{key:"obv",type:"line",title:"OBV",colorKey:"color",style:{lineWidth:1.5}},...Et("OBV")],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=e[t],o=e[t-1],r=ft(l);l.close>o.close?n+=r:l.close<o.close&&(n-=r)}o[t]=n}return{obv:O(o),...Wt(o,e.map(ft),t,"None",9)}}},e=>(t,l,o,n,r)=>{const a=at(l,"maType","None"),i=nt(l,"maLength",9);if(!re(i))return null;const s="EMA"===a||"SMMA (RMA)"===a,c=de(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=t[l],n=t[l-1],r=ft(o);o.close>n.close?e.acc+=r:o.close<n.close&&(e.acc-=r)}o[0]=ne(e.acc),s&&(o[1]=ne(be(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=se(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 d=ye(p,Wt(f,t.slice(y).map(ft),l,"None",9),o-y,n,o);return null===d?null:{obv:c.obv,...d}}),Yt={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*ft(n);if(!Number.isFinite(e))continue;l+=e}t[o]=l}}return{adl:O(t)}}},Gt=e=>void 0!==e&&Number.isFinite(e)?e:null,Xt={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=>Gt(e.oi))})},Jt={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})=>e<0?at(t,"downColor","#ef5350"):at(t,"upColor","#26a69a")}],calc:e=>({change:e.map((t,l)=>{const o=Gt(t.oi),n=Gt(e[l-1]?.oi);return null===o||null===n?null:o-n})})},Qt=[["longBuildupColor","#26a69a"],["shortBuildupColor","#ef5350"],["shortCoveringColor","#42a5f5"],["longUnwindingColor","#ffb74d"]],el={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=Gt(l.oi),a=Gt(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]=Qt[e-1];return at(t,l,o)})},tl=e=>e.map(e=>e.high),ll=e=>e.map(e=>e.low);function ol(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}const nl=.05,rl=lt({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:(e,l)=>({alma:O(D(t.sourceValues(e,"close"),nt(l,"length",9),ot(l,"offset",.85),ot(l,"sigma",6)))})}),al=lt({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:(e,l)=>{const o=t.sourceValues(e,st(l)),n=nt(l,"length",9),r=B(o,n);return{dema:O(dt(r,Tt(r,n),(e,t)=>2*e-t))}}}),il=lt({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:(e,l)=>({hma:O(wl(t.sourceValues(e,st(l)),nt(l,"length",9)))})}),sl=lt({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:nl}],calc:(e,l)=>{const o=t.sourceValues(e,st(l)),n=nt(l,"length",20),r=ot(l,"percent",10)/100,a=!0===l.exponential?B(o,n):C(o,n);return{upper:O(a.map(e=>e*(1+r))),basis:O(a),lower:O(a.map(e=>e*(1-r)))}}}),cl=lt(ie({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:nl}],calc:(e,t)=>{const l=nt(t,"length",20),o=rt(t,"offset",0),n=L(tl(e),l),r=I(ll(e),l),a=dt(n,r,(e,t)=>(e+t)/2);return{upper:O(ut(n,o)),basis:O(ut(a,o)),lower:O(ut(r,o))}}},e=>fe(e,e=>{const t=nt(e,"length",20),l=rt(e,"offset",0);return re(t)&&l>=0?t-1+l:null}))),ul={id:"chande-kroll-stop",name:"Chande Kroll Stop",category:"Trend",placement:"onchart",inputs:[{key:"p",type:"number",label:"ATR Length (p)",default:10,min:1,max:500,step:1},{key:"x",type:"number",label:"ATR Coefficient (x)",default:1,min:1,max:100,step:1},{key:"q",type:"number",label:"Stop Length (q)",default:9,min:1,max:500,step:1},{key:"longColor",type:"color",label:"Stop Long",default:"#2962ff"},{key:"shortColor",type:"color",label:"Stop Short",default:"#ff6d00"}],plots:[{key:"stopLong",type:"line",title:"Stop Long",colorKey:"longColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"stopShort",type:"line",title:"Stop Short",colorKey:"shortColor",style:{color:"#ff6d00",lineWidth:1.5}}],calc:(e,l)=>{const o=nt(l,"p",10),n=nt(l,"x",1),r=nt(l,"q",9),a=tl(e),i=ll(e),s=t.atr(a,i,e.map(e=>e.close),o),c=dt(L(a,o),s,(e,t)=>e-n*t);return{stopLong:O(ol(dt(I(i,o),s,(e,t)=>e+n*t),r,!1)),stopShort:O(ol(c,r,!0))}}},pl={id:"chandelier-exit",name:"Chandelier Exit",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:22,min:1,max:500,step:1},{key:"atrLength",type:"number",label:"ATR length",default:22,min:1,max:500,step:1},{key:"atrMultiplier",type:"number",label:"ATR multiplier",default:3,min:0,max:50,step:.01},{key:"longColor",type:"color",label:"Long exit",default:"#2962ff"},{key:"shortColor",type:"color",label:"Short exit",default:"#ff6d00"}],plots:[{key:"longExit",type:"line",title:"Long Exit",colorKey:"longColor",style:{color:"#2962ff",lineWidth:1.5}},{key:"shortExit",type:"line",title:"Short Exit",colorKey:"shortColor",style:{color:"#ff6d00",lineWidth:1.5}}],calc:(e,l)=>{const o=nt(l,"length",22),n=ot(l,"atrMultiplier",3),r=tl(e),a=ll(e),i=t.atr(r,a,e.map(e=>e.close),nt(l,"atrLength",22));return{longExit:O(dt(L(r,o),i,(e,t)=>e-n*t)),shortExit:O(dt(I(a,o),i,(e,t)=>e+n*t))}}},yl={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:nl}],calc:(e,l)=>{const o=t.sourceValues(e,"close"),n=nt(l,"periods",21,3),r=ot(l,"errors",2),a=nt(l,"averagePeriods",3),i=Y(o,n),s=H(o,n,0),c=e=>O("Exponential"===l.method?Tt(e,a):"Weighted"===l.method?A(e,a):C(e,a));return{upper:c(dt(s,i,(e,t)=>e+r*t)),basis:c(s),lower:c(dt(s,i,(e,t)=>e-r*t))}}},fl={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:nl}],calc:(e,t)=>({upper:O(ut(C(tl(e),nt(t,"upperLength",20)),rt(t,"upperOffset",0))),lower:O(ut(C(ll(e),nt(t,"lowerLength",20)),rt(t,"lowerOffset",0)))})},dl="#00ff00",ml="#ff0000",hl="#ff9800",bl=e=>Math.max(1,Math.floor(e)),gl=e=>Math.max(1,Math.round(Math.sqrt(e)));function wl(e,t){const l=A(e,bl(t/2)),o=A(e,t);return A(dt(l,o,(e,t)=>2*e-t),gl(t))}function kl(e,t,l){return"Ehma"===t?function(e,t){return Tt(dt(B(e,bl(t/2)),B(e,t),(e,t)=>2*e-t),gl(t))}(e,l):"Thma"===t?function(e,t){const l=A(e,bl(t/3)),o=A(e,bl(t/2)),n=A(e,t);return A(l.map((e,t)=>3*e-o[t]-n[t]),t)}(e,bl(l/2)):wl(e,l)}const vl=(e,t,l)=>{if(!1===l.switchColor)return at(l,"neutralColor",hl);const o=e?.[t],n=e?.[t-2];return"number"==typeof o&&"number"==typeof n&&o>n?at(l,"bullishColor",dl):at(l,"bearishColor",ml)},Nl={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:dl},{key:"bearishColor",type:"color",label:"Bearish Color",default:ml},{key:"neutralColor",type:"color",label:"Neutral Color",default:hl}],plots:[{key:"mhull",type:"line",title:"Hull",colorKey:"neutralColor",style:{color:hl,lineWidth:2},colorBy:({index:e,values:t,settings:l})=>vl(t.mhull,e,l)},{key:"shull",type:"line",title:"Hull Displaced",colorKey:"neutralColor",style:{color:hl,lineWidth:2},colorBy:({index:e,values:t,settings:l})=>vl(t.mhull,e,l)}],fills:[{between:["mhull","shull"],colorUp:dl,colorDown:ml,colorUpKey:"bullishColor",colorDownKey:"bearishColor",opacity:.6}],calc:(e,l)=>{const o=t.sourceValues(e,st(l)),n=bl(nt(l,"length",55)*ot(l,"lengthMult",1)),r=kl(o,at(l,"mode","Hma"),n),a=!1!==l.visualSwitch;return{mhull:O(r),shull:O(a?ut(r,2):new Array(r.length).fill(NaN))}},barColors:({bars:e,values:t,settings:l})=>!0===l.candleCol?e.map((e,o)=>vl(t.mhull,o,l)):e.map(()=>null)},Cl=[rl,al,il,sl,cl,ul,pl,yl,fl,Nl],Al=e=>t.sourceValues(e,"hl2"),Ml={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=nt(t,"length",14),o=W(e.map(e=>e.high),l+1),n=P(e.map(e=>e.low),l+1),r=e=>e.map(e=>100*(e+l)/l);return{up:O(r(o)),down:O(r(n))}},levels:()=>[{price:50,color:"#5a6b8c",dashed:!0}],range:()=>({min:0,max:100})},Sl={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=nt(t,"length",14),o=dt(W(e.map(e=>e.high),l+1),P(e.map(e=>e.low),l+1),(e,t)=>100*(e-t)/l);return{osc:O(o),zero:o.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})},xl={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];return null==n||!Number.isFinite(n)||e-n>0?at(o,"upColor","#009688"):at(o,"downColor","#f44336")}}],calc:e=>{const t=Al(e);return{ao:O(dt(C(t,5),C(t,34),(e,t)=>e-t))}},levels:()=>[{price:0,color:"#787b86"}]},Ll={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"}]},Il={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:(e,l)=>{const o=e.length,n=nt(l,"length",9),r=F(t.sourceValues(e,st(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=U(a,n),c=U(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:O(u)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]},Ol={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);return{curve:O(A(dt(R(l,nt(t,"longRoCLength",14)),R(l,nt(t,"shortRoCLength",11)),(e,t)=>e+t),nt(t,"wmaLength",10)))}}},Bl={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=nt(t,"period",21),n=Math.floor(o/2)+1,r=e.map(e=>e.close),a=C(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:O(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero Line"}]},Fl={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=nt(t,"length",9),n=Al(e),r=L(n,o),a=I(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:O(i),trigger:O(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 Rl(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 Tl={id:"connors-rsi",name:"Connors RSI",category:"Momentum",placement:"pane",inputs:[{key:"lenrsi",type:"number",label:"RSI Length",default:3,min:1,max:500,step:1},{key:"lenupdown",type:"number",label:"UpDown Length",default:2,min:1,max:500,step:1},{key:"lenroc",type:"number",label:"ROC Length",default:100,min:1,max:1e3,step:1},{key:"color",type:"color",label:"CRSI",default:"#2962ff"},{key:"fillColor",type:"color",label:"Background",default:"#2196f3"}],plots:[{key:"crsi",type:"line",title:"CRSI",colorKey:"color",style:{lineWidth:1.5}}],fills:[{between:["bandHigh","bandLow"],colorUpKey:"fillColor",colorDownKey:"fillColor",opacity:.1}],calc:(e,l)=>{const o=e.length,n=e.map(e=>e.close),r=t.rsi(n,nt(l,"lenrsi",3)),a=t.rsi(Rl(n),nt(l,"lenupdown",2)),i=K(R(n,1).slice(1),nt(l,"lenroc",100)),s=new Array(o).fill(NaN);for(let e=0;e<i.length;e++)s[e+1]=i[e];const c=new Array(o);for(let e=0;e<o;e++)c[e]=(r[e]+a[e]+s[e])/3;return{crsi:O(c),bandHigh:new Array(o).fill(70),bandLow:new Array(o).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})},Kl=[Ml,Sl,xl,Ll,Il,Ol,Bl,Fl,Tl];function Dl(e,t){return`${e}${Math.round(255*(1-t/100)).toString(16).padStart(2,"0")}`}function El(e,t,l){const o=e.length,n=C(e,t),r=x(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}}const Wl={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:(e,l)=>{const o=t.sourceValues(e,st(l)),{upper:n,lower:r}=El(o,nt(l,"length",20),ot(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:O(a),bandHigh:new Array(e.length).fill(1),bandLow:new Array(e.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}]},Pl={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:(e,l)=>{const o=t.sourceValues(e,st(l)),{middle:n,upper:r,lower:a}=El(o,nt(l,"length",20),ot(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:O(i),expansion:O(L(i,nt(l,"expansionLength",125))),contraction:O(I(i,nt(l,"contractionLength",125)))}}},Vl={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?Dl(at(o,"posColor","#089981"),e>=n?25:50):r&&e<0?Dl(at(o,"negColor","#f23645"),e>n?50:25):Dl(at(o,"posColor","#089981"),50)}}],calc:(e,t)=>{const l=e.map(e=>e.close),o=ot(t,"stdDevMult",2),n=El(l,nt(t,"shortLength",20),o),r=El(l,nt(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:O(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,l)=>{const o=nt(l,"length",14),n=e.map(e=>e.high),r=e.map(e=>e.low),a=U(t.trueRange(n,r,e.map(e=>e.close)),o),i=L(n,o),s=I(r,o),c=Math.log10(o),u=new Array(e.length).fill(NaN);if(0!==c)for(let t=0;t<e.length;t++){const e=i[t]-s[t];if(!(e>0))continue;const l=a[t]/e;l>0&&(u[t]=100*Math.log10(l)/c)}return{chop:O(ut(u,rt(l,"offset",0))),bandHigh:new Array(e.length).fill(61.8),bandLow:new Array(e.length).fill(38.2)}},levels:()=>[{price:61.8,color:"#787b86",title:"Upper Band",dashed:!0},{price:50,color:"#787b86",title:"Middle Band"},{price:38.2,color:"#787b86",title:"Lower Band",dashed:!0}],range:()=>({min:0,max:100})},$l={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=ot(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=x(n,nt(t,"length",10)),a=o>0?Math.sqrt(365/o):NaN;return{hv:O(r.map(e=>100*e*a))}}},Hl={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:O(C(e.map(e=>e.high-e.low),nt(t,"length",14)))})},ql=4*Math.atan(1),_l={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];return null!=o&&Number.isFinite(o)?o>=5?at(l,"turquoiseColor","#26c6da"):o>=3.57?at(l,"darkGreenColor","#43a047"):o>=2.14?at(l,"paleGreenColor","#a5d6a7"):o>=.71?at(l,"limeColor","#009688"):o<=-5?at(l,"darkRedColor","#d50000"):o<=-3.57?at(l,"redColor","#e91e63"):o<=-2.14?at(l,"orangeColor","#ff6d00"):o<=-.71?at(l,"lightOrangeColor","#ffb74d"):at(l,"yellowColor","#fdd835"):at(l,"yellowColor","#fdd835")}}],calc:e=>{const t=e.length,l=L(e.map(e=>e.high),30),o=I(e.map(e=>e.high),30),n=B(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)/ql);r[a]=c>0?-p:p}return{chopZone:new Array(t).fill(1),angle:O(r)}},range:()=>({min:0,max:1})},zl={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:O(R(B(e.map(e=>e.high-e.low),nt(t,"periods",10)),nt(t,"rocLookback",10)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},jl={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=ot(t,"deviations",1);return{stdDev:O(x(e.map(e=>e.close),nt(t,"periods",5)).map(e=>e*l))}}},Zl={id:"standard-error",name:"Standard Error",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:3,max:2e3,step:1},{key:"color",type:"color",label:"Standard Error",default:"#ff6d00"}],plots:[{key:"stdErr",type:"line",title:"Standard Error",colorKey:"color",style:{lineWidth:1.5}}],calc:(e,t)=>({stdErr:O(Y(e.map(e=>e.close),nt(t,"length",14,3)))})},Yl=e=>nt(e,"length",20,2),Gl=ie({id:"volatility-squeeze",name:"Volatility Squeeze",category:"Volatility",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:20,min:2,max:1e3,step:1},{key:"bbMult",type:"number",label:"BB StdDev",default:2,min:.1,max:10,step:.1},{key:"kcMult",type:"number",label:"KC Multiplier",default:1.5,min:.1,max:10,step:.1},{key:"upColor",type:"color",label:"Momentum up",default:"#26a69a"},{key:"upFadeColor",type:"color",label:"Momentum up (weakening)",default:"#a7d8d2"},{key:"downColor",type:"color",label:"Momentum down",default:"#ef5350"},{key:"downFadeColor",type:"color",label:"Momentum down (weakening)",default:"#f5b0ae"},{key:"onColor",type:"color",label:"Squeeze on",default:"#ff9800"},{key:"offColor",type:"color",label:"Squeeze off",default:"#787b86"}],plots:[{key:"momentum",type:"histogram",title:"Momentum",colorKey:"upColor",style:{color:"#26a69a",base:0},colorBy:({value:e,index:t,values:l,settings:o})=>{const n=l.momentum?.[t-1],r="number"==typeof n&&Number.isFinite(n)?n:0;return e>0?e>r?at(o,"upColor","#26a69a"):at(o,"upFadeColor","#a7d8d2"):e<r?at(o,"downColor","#ef5350"):at(o,"downFadeColor","#f5b0ae")}},{key:"squeeze",type:"line",title:"Squeeze",colorKey:"offColor",style:{color:"#787b86",markersOnly:!0,markerRadius:3},colorBy:({index:e,values:t,settings:l})=>1===t.state?.[e]?at(l,"onColor","#ff9800"):at(l,"offColor","#787b86")}],calc:(e,l)=>{const o=e.length,n=Yl(l),r=e.map(e=>e.high),a=e.map(e=>e.low),i=e.map(e=>e.close),{middle:s,upper:c,lower:u}=El(i,n,ot(l,"bbMult",2)),p=C(t.trueRange(r,a,i),n),y=ot(l,"kcMult",1.5),f=L(r,n),d=I(a,n),m=i.map((e,t)=>e-((f[t]+d[t])/2+s[t])/2),h=new Array(o).fill(null),b=new Array(o).fill(null);for(let e=0;e<o;e++){const t=y*p[e],l=s[e]+t,o=s[e]-t;[c[e],u[e],l,o].every(Number.isFinite)&&(h[e]=u[e]>o&&c[e]<l?1:0,b[e]=0)}return{momentum:O(H(m,n)),squeeze:b,state:h}}},e=>fe(e,e=>2*Yl(e)-2)),Xl=[Wl,Pl,Vl,Ul,$l,Hl,_l,zl,jl,Zl,Gl];function Jl(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)*ft(o)}return t}const Ql={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=nt(t,"length",20),o=U(Jl(e),l),n=U(e.map(ft),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:O(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},eo={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=$(Jl(e)),o=Tt(l,nt(t,"short",3)),n=Tt(l,nt(t,"long",10)),r=new Array(e.length);for(let t=0;t<e.length;t++)r[t]=o[t]-n[t];return{osc:O(r)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},to={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=ot(t,"divisor",1e4),o=F(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=ft(r);n[t]=0===a?NaN:l*o[t]*(r.high-r.low)/a}return{eom:O(C(n,nt(t,"length",14)))}}},lo={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=F(e.map(e=>e.close)),o=new Array(e.length);for(let t=0;t<e.length;t++)o[t]=l[t]*ft(e[t]);return{efi:O(Tt(o,nt(t,"length",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},oo={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?ft(e[l]):o<0?-ft(e[l]):0}return{net:O(t)}}},no=[Ql,eo,to,lo,oo],ro=lt({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:(e,l)=>{const o=t.sourceValues(e,st(l)),n=o.length,r=nt(l,"erLength",10),a=new Array(n).fill(NaN);if(n<=r)return{kama:O(a)};const i=F(o,1);for(let e=0;e<n;e++)i[e]=Number.isFinite(i[e])?Math.abs(i[e]):0;const s=U(i,r),c=F(o,r),u=2/(nt(l,"fastLength",2)+1),p=2/(nt(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:O(a)}}}),ao=lt(ie({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:(e,l)=>{const o=e.length,n=nt(l,"length",20),r=ot(l,"mult",2),a=t.sourceValues(e,st(l)),i=it(l,"exp",!0)?B(a,n):C(a,n),s=e.map(e=>e.high),c=e.map(e=>e.low),u=e.map(e=>e.close),p=at(l,"bandsStyle","Average True Range");let y;y="True Range"===p?t.trueRange(s,c,u):"Range"===p?S(dt(s,c,(e,t)=>e-t),n):t.atr(s,c,u,nt(l,"atrlength",10));const f=new Array(o).fill(NaN),d=new Array(o).fill(NaN);for(let e=0;e<o;e++){const t=y[e]*r;f[e]=i[e]+t,d[e]=i[e]-t}return{upper:O(f),basis:O(i),lower:O(d)}}},e=>(l,o,n,r,a)=>{const i=nt(o,"length",20),s=nt(o,"atrlength",10);if(!re(i)||!re(s))return null;const c=ot(o,"mult",2),u=st(o),p=it(o,"exp",!0),y=at(o,"bandsStyle","Average True Range"),f=e=>t.sourceValue(l[e],u);return de(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,t,o)=>{const n=l[t],r=p?be(e.basis,f(t),i,!0):Ae(f,t,i),a=("True Range"===y?we(l,t):"Range"===y?be(e.range,n.high-n.low,i,!1):ve(e.atr,we(l,t),s))*c;o[0]=ne(r+a),o[1]=ne(r),o[2]=ne(r-a)}},l,n,r,a)})),io=lt({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:(e,l)=>({lsma:O(H(t.sourceValues(e,st(l)),nt(l,"length",25,2),rt(l,"offset",0)))})}),so={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:e=>{const l=e.length,o=F(t.sourceValues(e,"hlc3"),1),n=new Array(l);for(let t=0;t<l;t++){const l=e[t].volume??0;n[t]=o[t]>=0?l:-l}const r=B(n,34),a=B(n,55),i=new Array(l).fill(NaN);for(let e=0;e<l;e++)i[e]=r[e]-a[e];return{kvo:O(i),signal:O(Tt(i,13))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},co={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:(e,l)=>{const o=e.length,n=t.sourceValues(e,"close"),r=(e,t,o,r)=>C(R(n,nt(l,e,t)),nt(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:O(u),signal:O(C(u,nt(l,"siglen",9)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},uo={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:(e,l)=>{const o=t.sourceValues(e,"close"),n=o.length,r=nt(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:O(a)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},po=[ro,ao,io,so,co,uo],yo={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:(e,l)=>{const o=t.sourceValues(e,"close"),n=C(o,nt(l,"shortLength",9)),r=C(o,nt(l,"longLength",26)),a=c(n,r);return{short:O(n),long:O(r),cross:n.map((e,t)=>a[t]?e:null)}}},fo=lt({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:(e,l)=>{const o=t.sourceValues(e,"close"),n=nt(l,"length",14),r=B(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:O(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:(e,l)=>{const o=t.sourceValues(e,st(l,"source","hl2")),n=nt(l,"length",3),r=ot(l,"atrMult",2),a=z(o,n,50),i=t.atr(e.map(e=>e.high),e.map(e=>e.low),e.map(e=>e.close),nt(l,"atrLength",14));return{median:O(a),upper:O(dt(a,i,(e,t)=>e+r*t)),lower:O(dt(a,i,(e,t)=>e-r*t)),medianEma:O(Tt(a,n))}}},ho=[{label:"SMA",value:"SMA"},{label:"EMA",value:"EMA"},{label:"SMMA (RMA)",value:"SMMA (RMA)"},{label:"WMA",value:"WMA"},{label:"VWMA",value:"VWMA"}];const bo=[{lane:1,length:20,color:"#f6c309"},{lane:2,length:50,color:"#fb9800"},{lane:3,length:100,color:"#fb6500"},{lane:4,length:200,color:"#f60c0c"}],go={id:"ma-ribbon",name:"Moving Average Ribbon",category:"Trend",placement:"onchart",inputs:bo.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:ho,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:bo.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:(e,l)=>{const o=e.map(ft),n={};for(const{lane:r,length:a}of bo){if(!it(l,`showMa${r}`,!0)){n[`ma${r}`]=new Array(e.length).fill(null);continue}const i=t.sourceValues(e,st(l,`ma${r}Source`));n[`ma${r}`]=O(Kt(at(l,`ma${r}Type`,"SMA"),i,o,nt(l,`ma${r}Length`,a)))}return n}},wo=lt({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:(e,l)=>{const o=t.sourceValues(e,"close"),n=nt(l,"length",9),r=B(o,n),a=Tt(r,n),i=Tt(a,n);return{tema:O(r.map((e,t)=>3*e-3*a[t]+i[t]))}}}),ko={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:(e,l)=>{const o=t.sourceValues(e,st(l,"source","ohlc4")),n="continuous"!==l.anchor?t.sessionStartFlags(e.map(e=>e.time),ct(l)):null,r=new Array(e.length).fill(NaN);let a=0,i=0;for(let t=0;t<e.length;t++){null!==n&&n[t]&&(a=0,i=0);const e=o[t];Number.isFinite(e)&&(a+=e,i+=1,r[t]=a/i)}return{twap:O(ut(r,rt(l,"offset",0)))}}},vo=lt({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:(e,l)=>({vwma:O(ut(E(t.sourceValues(e,st(l)),e.map(ft),nt(l,"length",20)),rt(l,"offset",0)))})}),No={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:(e,l)=>{const o=t.sourceValues(e,"hl2");return{jaw:O(ut(S(o,nt(l,"jawLength",21)),rt(l,"jawOffset",8))),teeth:O(ut(S(o,nt(l,"teethLength",13)),rt(l,"teethOffset",5))),lips:O(ut(S(o,nt(l,"lipsLength",8)),rt(l,"lipsOffset",3)))}}},Co=lt({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:(e,l)=>({smma:O(S(t.sourceValues(e,st(l)),nt(l,"length",7)))})});function Ao(e,t,l){const o=Tt(e,t);if(0===l)return o;return dt(o,Tt(o,t),(e,t)=>e*(1+l)-t*l)}const Mo=lt({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(!it(o,"highlightMovements",!0))return at(o,"neutralColor","#6d1e7f");const n=l.t3?.[t-1];return"number"==typeof n&&Number.isFinite(n)&&e>n?at(o,"upColor","#26a69a"):at(o,"downColor","#ff5252")}}],calc:(e,l)=>{const o=t.sourceValues(e,st(l)),n=nt(l,"length",5),r=ot(l,"factor",.7),a=Ao(o,n,r),i=Ao(a,n,r);return{t3:O(Ao(i,n,r))}}}),So=[yo,fo,mo,go,wo,ko,vo,No,Co,Mo];function xo(e,t,l){const o=F(e),n=e=>Tt(Tt(e,l),t);return dt(n(o),n(o.map(e=>Math.abs(e))),(e,t)=>100*e/t)}const Lo={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:(e,l)=>({mom:O(F(t.sourceValues(e,st(l)),nt(l,"len",10)))})},Io={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:(e,l)=>({roc:O(R(t.sourceValues(e,st(l)),nt(l,"length",9)))}),levels:()=>[{price:0,color:"#787b86",title:"Zero Line",dashed:!0}]};function Oo(e,t,l){return"SMA"===l?C(e,t):Tt(e,t)}const Bo={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="number"==typeof n&&Number.isFinite(n)&&e>n;return e>=0?r?at(o,"histUpColor","#26a69a"):at(o,"histUpFadeColor","#b2dfdb"):r?at(o,"histDownFadeColor","#ffcdd2"):at(o,"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:(e,l)=>{const o=t.sourceValues(e,st(l)),n=at(l,"oscType","EMA"),r=dt(Oo(o,nt(l,"fastLength",12),n),Oo(o,nt(l,"slowLength",26),n),(e,t)=>0===t?NaN:100*(e-t)/t),a=Oo(r,nt(l,"signalLength",9),at(l,"sigType","EMA"));return{hist:O(dt(r,a,(e,t)=>e-t)),ppo:O(r),signal:O(a)}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},Fo={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=nt(t,"length",18);return{trix:O(F(Tt(Tt(Tt(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}]},Ro={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=xo(e.map(e=>e.close),nt(t,"short",13),nt(t,"long",25));return{tsi:O(l),signal:O(Tt(l,nt(t,"signal",13)))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},To={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=xo(e.map(e=>e.close),nt(t,"shortlen",5),nt(t,"longlen",20));return{erg:O(l),sig:O(Tt(l,nt(t,"siglen",5)))}}},Ko={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=xo(e.map(e=>e.close),nt(t,"shortlen",5),nt(t,"longlen",20));return{osc:O(dt(l,Tt(l,nt(t,"siglen",5)),(e,t)=>e-t))}}},Do={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=nt(t,"lengthK",10),o=nt(t,"lengthD",3),n=L(e.map(e=>e.high),l),r=I(e.map(e=>e.low),l),a=dt(n,r,(e,t)=>e-t),i=e=>Tt(Tt(e,o),o),s=dt(i(e.map((e,t)=>e.close-(n[t]+r[t])/2)),i(a),(e,t)=>0===t?NaN:e/t*200);return{smi:O(s),ema:O(Tt(s,nt(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}]},Eo=[Lo,Io,Bo,Fo,Ro,To,Ko,Do];function Wo(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 Po=e=>"SMA"===e?C:B;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],r=e[n-1],a=r.close,i=l.close;("falling"===t?ft(l)<ft(r):ft(l)>ft(r))&&0!==a&&Number.isFinite(a)&&Number.isFinite(i)&&(o*=i/a)}l[n]=1e3*o}return l}(t,o);return{[e]:O(n),ema:O(Wo(n,nt(l,"maLength",255),B))}}}}const Uo=Vo("nvi","Negative Volume Index","NVI","falling"),$o=Vo("pvi","Positive Volume Index","PVI","rising"),Ho={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*ft(e[l]))}return{pvt:O($(t))}}},qo={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;return e>=0?r?at(o,"histUpColor","#26a69a"):at(o,"histUpFadeColor","#b2dfdb"):r?at(o,"histDownFadeColor","#ffcdd2"):at(o,"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(ft),n=Po(at(t,"oscType","EMA")),r=n(o,nt(t,"fastLength",12)),a=n(o,nt(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=Wo(i,nt(t,"signalLength",9),Po(at(t,"sigType","EMA"))),c=new Array(l);for(let e=0;e<l;e++)c[e]=i[e]-s[e];return{hist:O(c),pvo:O(i),signal:O(s)}},levels:()=>[{price:0,color:"#787b8680",title:"Zero"}]},_o={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=B(e.map(e=>e.high-e.low),9),n=B(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:O(Wo(r,nt(t,"length",10),U))}}},zo={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:(e,l)=>{const o=e.length,n=nt(l,"length",14),r=t.sourceValues(e,st(l)),a=L(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=C(i,n),c=new Array(o);for(let e=0;e<o;e++)c[e]=Math.sqrt(s[e]);return{ui:O(c),zero:c.map(e=>Number.isFinite(e)?0:null)}},levels:()=>[{price:0,color:"#2196f3",title:"Zero"}]},jo=[Uo,$o,Ho,qo,_o,zo];function Zo(e,t,l){const o=e.length,n=new Array(o).fill(NaN),r=C(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}const Yo=lt({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:(e,l)=>{const o=nt(l,"lengthStoch",14),n=Rt(t.rsi(t.sourceValues(e,st(l)),nt(l,"lengthRSI",14)),e=>_(e,e,e,o)),r=Rt(n,e=>C(e,nt(l,"smoothK",3))),a=Rt(r,e=>C(e,nt(l,"smoothD",3)));return{k:O(r),d:O(a),bandHigh:new Array(e.length).fill(80),bandLow:new Array(e.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})}),Go=lt({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:(e,l)=>{const o=nt(l,"length",14),n=t.sourceValues(e,st(l)),r=L(e.map(e=>e.high),o),a=I(e.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:O(i),bandHigh:new Array(e.length).fill(-20),bandLow:new Array(e.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})}),Xo={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=>dt(U(n,e),U(r,e),(e,t)=>0===t?NaN:e/t),i=a(nt(t,"length1",7)),s=a(nt(t,"length2",14)),c=a(nt(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:O(u)}}},Jo={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=nt(t,"length",10),o=q(e.map(e=>e.close-e.open)),n=q(e.map(e=>e.high-e.low)),r=dt(Rt(o,e=>U(e,l)),Rt(n,e=>U(e,l)),(e,t)=>0===t?NaN:e/t),a=Rt(r,e=>q(e)),i=rt(t,"offset",0);return{rvgi:O(ut(r,i)),signal:O(ut(a,i))}}},Qo={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"},...Dt("RVI","SMA",14)],plots:[{key:"rvi",type:"line",title:"RVI",colorKey:"color",style:{lineWidth:1.5}},...Et("RVI")],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=x(o,nt(t,"length",10)),r=F(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=Zo(a,14,s),u=Zo(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}return{rvi:O(ut(p,rt(t,"offset",0))),...Wt(p,e.map(e=>e.volume??0),t,"SMA",14),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"}]},en={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=at(l,"upColor","#009688"),n=at(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=Z(l,nt(t,"cciTurboLength",6)),n=Z(l,nt(t,"cci14Length",14));return{hist:O(n),turbo:O(o),cci14:O(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}]},tn=[{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}],ln={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:(e,l)=>{const o=e.length,n=t.sourceValues(e,st(l)),r=new Array(o).fill(0);for(const e of tn){const t=Rt(R(n,e.roc),t=>C(t,e.smooth));for(let l=0;l<o;l++)r[l]+=e.weight*t[l]}const a=Rt(r,e=>C(e,nt(l,"length1",100))),i=Rt(a,e=>C(e,nt(l,"length2",100)));return{specialK:O(r),signal:O(i)}},levels:()=>[{price:0,color:"#787b86",title:"Zero"}]},on=[Yo,Go,Xo,Jo,Qo,en,ln],nn={id:"vortex",name:"Vortex Indicator",category:"Trend",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:14,min:2,max:500,step:1},{key:"upColor",type:"color",label:"VI +",default:"#2962ff"},{key:"downColor",type:"color",label:"VI -",default:"#e91e63"}],plots:[{key:"vip",type:"line",title:"VI +",colorKey:"upColor",style:{lineWidth:1.5}},{key:"vim",type:"line",title:"VI -",colorKey:"downColor",style:{lineWidth:1.5}}],calc:(e,l)=>{const o=e.length,n=nt(l,"length",14),r=new Array(o).fill(NaN),a=new Array(o).fill(NaN);if(0===o)return{vip:O(r),vim:O(a)};const i=e.map(e=>e.high),s=e.map(e=>e.low),c=e.map(e=>e.close),u=new Array(o-1),p=new Array(o-1);for(let e=1;e<o;e++)u[e-1]=Math.abs(i[e]-s[e-1]),p[e-1]=Math.abs(s[e]-i[e-1]);const y=U(u,n),f=U(p,n),d=U(t.trueRange(i,s,c),n);for(let e=1;e<o;e++)r[e]=y[e-1]/d[e],a[e]=f[e-1]/d[e];return{vip:O(r),vim:O(a)}}},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:(e,l)=>{const o=e.length,n=new Array(o).fill(null),r=new Array(o).fill(null);if(0===o)return{up:n,down:r};const a=t.sourceValues(e,st(l)),i=ot(l,"factor",2),s=e.map(e=>e.high),c=e.map(e=>e.low),u=e.map(e=>e.close),p=t.atr(s,c,u,nt(l,"length",20)),y=t.trueRange(s,c,u);let f=a[0],d=a[0],m=!0,h=NaN;for(let e=0;e<o;e++){const t=a[e],l=Number.isFinite(p[e])?p[e]*i:y[e];f=Math.max(f,t),d=Math.min(d,t);let o=m?Math.max(h,f-l):Math.min(h,d+l);Number.isFinite(o)||(o=t);const s=t-o>=0;e>0&&s!==m&&(f=t,d=t,o=s?f-l:d+l),m=s,h=o,Number.isFinite(o)&&(s?n[e]=o:r[e]=o)}return{up:n,down:r}}},an={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:O(j(e.map(e=>e.close),l,nt(t,"length",14)))}},levels:e=>[{price:1,color:at(e,"bullishColor","#089981"),title:"TSI Bullish Band"},{price:0,color:"#787b86",title:"TSI Middle Band",dashed:!0},{price:-1,color:at(e,"bearishColor","#f23645"),title:"TSI Bearish Band"}],range:()=>({min:-1,max:1})};function sn(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 cn={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,nt(t,"periods",2)),s=e.map(e=>e.high),c=e.map(e=>e.low),u=it(t,"showUp",!0),p=it(t,"showDown",!0);for(let e=0;e<l;e++)u&&sn(s,e,i,!0)&&(n[e]=s[e]),p&&sn(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=at(l,"upColor","#009688"),a=at(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}},un={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:(e,l)=>{const o=e.length,n=new Array(o).fill(null),r=new Array(o).fill(null),a=new Array(o).fill(null),i=new Array(o).fill(null),s=t.rsi(t.sourceValues(e,st(l)),nt(l,"length",14)),c={rsi:O(s),bull:n,hiddenBull:r,bear:a,hiddenBear:i};if(0===o)return c;const u=nt(l,"lbR",5),p=nt(l,"lbL",5),y=nt(l,"rangeLower",5),f=nt(l,"rangeUpper",60),d=!1!==l.plotBull,m=!0===l.plotHiddenBull,h=!1!==l.plotBear,b=!0===l.plotHiddenBear,g=J(s,p,u).map(e=>Number.isFinite(e)),w=X(s,p,u).map(e=>Number.isFinite(e)),k=ut(s,u),v=ut(e.map(e=>e.low),u),N=ut(e.map(e=>e.high),u),C=te(pt(g,1)),A=te(pt(w,1)),M=le(g,k,1),S=le(g,v,1),x=le(w,k,1),L=le(w,N,1);for(let e=0;e<o;e++){const t=e-u;if(t<0)continue;const l=k[e];if(g[e]){const o=y<=C[e]&&C[e]<=f,a=l>M[e]&&o,i=l<M[e]&&o;d&&a&&v[e]<S[e]&&(n[t]=l),m&&i&&v[e]>S[e]&&(r[t]=l)}if(w[e]){const o=y<=A[e]&&A[e]<=f,n=l<x[e]&&o,r=l>x[e]&&o;h&&n&&N[e]>L[e]&&(a[t]=l),b&&r&&N[e]<L[e]&&(i[t]=l)}}return c},markers:({bars:e,values:t,settings:l})=>{const o=at(l,"bullColor","#4caf50"),n=at(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})},pn={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,d=f>1&&f<=250;d&&c>p&&(n[s]=p),d&&u<y&&(r[s]=y);const m=i;i=s>1&&u>=y&&u<=p&&c>=y&&c<=p?i:s,i===m&&(l[s]=e[i].high,o[s]=e[i].low);const h=s-i;h>0&&(a[s]=h)}return{rangeHigh:O(l),rangeLow:O(o),breakUp:O(n),breakDown:O(r),insideAge:O(a)}},markers:({bars:e,values:t,settings:l})=>{const o=[];if(!it(l,"markbreakout",!0))return o;const n=t.breakUp??[],r=t.breakDown??[],a=at(l,"bullBreakColor","#00c853"),i=at(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=at(l,"insideColor","#000000"),r=it(l,"colorinside",!0);return e.map((e,t)=>r&&null!==o[t]&&void 0!==o[t]?n:null)}},yn=[nn,rn,an,cn,un,pn],fn=e=>new Array(e).fill(NaN);function dn(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<86400?"daily":t<604800?"weekly":"monthly"}const mn={daily:"d",weekly:"w",monthly:"m"},hn={daily:"Daily",weekly:"Weekly",monthly:"Monthly"},bn=(e,t,l,o)=>({key:e,type:"line",title:t,colorKey:l,style:{markersOnly:!0,markerRadius:o}});function gn(e){const t=mn[e],l=hn[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}},bn(`${t}S1`,`${l} S1`,o,1),bn(`${t}S2`,`${l} S2`,o,1),bn(`${t}S3`,`${l} S3`,o,1),bn(`${t}R1`,`${l} R1`,n,1),bn(`${t}R2`,`${l} R2`,n,1),bn(`${t}R3`,`${l} R3`,n,1),bn(`${t}Bc`,`${l} Bottom Pivot`,r,2),bn(`${t}Tc`,`${l} Top Pivot`,r,2)]}function wn(e){const t=mn[e],l=hn[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 kn(e,l,o,n,r){const a=e.length,i=fn(a),s=fn(a),c=fn(a),u=fn(a),p=fn(a),y=fn(a),f=fn(a),d=fn(a),m=fn(a);if(o){const o=function(e,l,o){const n=e.map(e=>e.time);return"daily"===l?t.sessionStartFlags(n,o):t.calendarPeriodFlags(n,ht("weekly"===l?"week":"month",o))}(e,l,r);let h=NaN,b=NaN,g=NaN,w=NaN,k=NaN,v=NaN;for(let t=0;t<a;t++){o[t]&&(h=w,b=k,g=v);const l=e[t],r=Number.isFinite(l.high)?l.high:NaN,a=Number.isFinite(l.low)?l.low:NaN,N=0===t||o[t];if(w=N?r:Math.max(w,r),k=N?a:Math.min(k,a),v=l.close,!Number.isFinite(h)||!Number.isFinite(b)||!Number.isFinite(g))continue;const C=(h+b+g)/3,A=h-b,M=2*C-h,S=2*C-b,x=(h+b)/2;n.pivot&&(i[t]=C),n.support&&(n.s1r1&&(s[t]=M),c[t]=C-A,u[t]=M-A),n.resistance&&(n.s1r1&&(p[t]=S),y[t]=C+A,f[t]=S+A),n.cpr&&(d[t]=x,m[t]=2*C-x)}}const h=mn[l];return{[`${h}Pivot`]:O(i),[`${h}S1`]:O(s),[`${h}S2`]:O(c),[`${h}S3`]:O(u),[`${h}R1`]:O(p),[`${h}R2`]:O(y),[`${h}R3`]:O(f),[`${h}Bc`]:O(d),[`${h}Tc`]:O(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},...wn("daily"),...wn("weekly"),...wn("monthly")],plots:[...gn("daily"),...gn("weekly"),...gn("monthly")],fills:["daily","weekly","monthly"].map(e=>{const t=mn[e];return{between:[`${t}Tc`,`${t}Bc`],colorUpKey:`${t}FillColor`,colorDownKey:`${t}FillColor`,opacity:.48}}),calc:(e,t)=>{const l="manual"===t.pivotMode,o=dn(e),n={pivot:it(t,"displaypivots",!0),support:it(t,"displaysupport",!0),resistance:it(t,"displayresistance",!0),cpr:it(t,"displaycpr",!0),s1r1:it(t,"displayS1R1",!1)},r=l?{daily:it(t,"showDaily",!0),weekly:it(t,"showWeekly",!1),monthly:it(t,"showMonthly",!1)}:{daily:"daily"===o,weekly:"weekly"===o,monthly:"monthly"===o},a=ct(t);return{...kn(e,"daily",r.daily,n,a),...kn(e,"weekly",r.weekly,n,a),...kn(e,"monthly",r.monthly,n,a)}}};const Nn={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:at(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:at(l,"sellColor","#880e4f"),text:"SELL"})}return r},calc:(e,l)=>{const o=e.length,n=fn(o),r=fn(o),a=fn(o);if(0===o)return{alphatrend:[],lagged:[],buySignal:[],sellSignal:[]};const c=nt(l,"AP",14),u=ot(l,"coeff",1),p=!0===l.novolumedata,f=!1!==l.showsignalsk,d=e.map(e=>e.high),m=e.map(e=>e.low),h=e.map(e=>e.close),b=y(t.trueRange(d,m,h),c),g=p?t.rsi(t.sourceValues(e,st(l)),c):function(e,t,l){const o=e.length,n=new Array(o).fill(0),r=new Array(o).fill(0);for(let l=1;l<o;l++){const o=e[l]*t[l];e[l]>e[l-1]?n[l]=o:e[l]<e[l-1]&&(r[l]=o)}return G(n,r,l)}(e.map(e=>(e.high+e.low+e.close)/3),e.map(e=>e.volume??0),c);for(let t=0;t<o;t++){const l=t>0&&Number.isFinite(n[t-1])?n[t-1]:0;if(!Number.isFinite(b[t])||!Number.isFinite(g[t]))continue;const o=b[t]*u;n[t]=g[t]>=50?Math.max(e[t].low-o,l):Math.min(e[t].high+o,l)}const w=ut(n,2),k=i(n,w),v=s(n,w);if(f){const e=pt(k,1),t=pt(v,1),l=te(k),n=te(v),i=te(e),s=te(t);for(let e=0;e<o;e++)k[e]&&i[e]>n[e]?r[e]=.9999*w[e]:v[e]&&s[e]>l[e]&&(a[e]=1.0001*w[e])}return{alphatrend:O(n),lagged:O(w),buySignal:O(r),sellSignal:O(a)}}},Cn={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:O(l),avgRange:new Array(e.length).fill(null)}:{range:O(l),avgRange:O(C(l,nt(t,"avgLength",3)))}}},An=[vn,Nn,Cn],Mn=e=>/^#[0-9a-f]{6}$/i.test(e)?`${e}99`:e,Sn={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})=>e>=0?at(t,"momUpColor","#008080"):at(t,"momDownColor","#880e4f")},{key:"wt1",type:"line",title:"WT1",colorKey:"wt1Color",style:{lineWidth:2}},{key:"wt2",type:"line",title:"WT2",colorKey:"wt2Color",style:{lineWidth:1}}],fills:[{between:["wt1","wt2"],colorUp:"#4caf50",colorDown:"#ff5252",colorUpKey:"fillUpColor",colorDownKey:"fillDownColor",opacity:.15},{between:["obUpper","obLower"],colorUp:"#ff5252",colorDown:"#ff5252",colorUpKey:"obBandColor",colorDownKey:"obBandColor",opacity:.08},{between:["osUpper","osLower"],colorUp:"#4caf50",colorDown:"#4caf50",colorUpKey:"osBandColor",colorDownKey:"osBandColor",opacity:.08}],calc:(e,l)=>{const o=e.length,n=nt(l,"n1",10),r=nt(l,"n2",21),a=nt(l,"sigLen",4),i=ot(l,"obLevel1",60),s=ot(l,"obLevel2",53),c=ot(l,"osLevel1",-60),u=ot(l,"osLevel2",-53),p=new Array(o).fill(null),f=new Array(o).fill(null),d=new Array(o).fill(null),m=new Array(o).fill(null),h=new Array(o).fill(null),b=new Array(o).fill(null),g=t.sourceValues(e,st(l,"source","hlc3")),w=Rt(g,e=>B(e,n)),k=Rt(dt(g,w,(e,t)=>Math.abs(e-t)),e=>B(e,n)),v=Rt(g.map((e,t)=>{const l=k[t];return Number.isFinite(l)?0===l?0:(e-w[t])/(.015*l):NaN}),e=>B(e,r)),N=Rt(v,e=>y(e,a)),C=dt(v,N,(e,t)=>e-t),A={wt1:O(v),wt2:O(N),mom:!1===l.showMom?new Array(o).fill(null):O(C),obUpper:yt(o,i),obLower:yt(o,s),osUpper:yt(o,u),osLower:yt(o,c),buy:p,sell:f,bull:d,bear:m,hiddenBull:h,hiddenBear:b},M=!1!==l.filterZone,S=!1!==l.useInner,x=S?s:i,L=S?u:c;for(let e=1;e<o;e++){const t=v[e-1],l=N[e-1],o=v[e],n=N[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)&&(f[e]=n)))}const I=nt(l,"lbL",3),F=nt(l,"lbR",3),R=nt(l,"rangeLower",5),T=nt(l,"rangeUpper",60),K=!1!==l.showRegDiv,D=!0===l.showHidDiv,E=J(N,I,F).map(e=>Number.isFinite(e)),W=X(N,I,F).map(e=>Number.isFinite(e)),P=ut(N,F),V=ut(e.map(e=>e.low),F),U=ut(e.map(e=>e.high),F),$=te(pt(E,1)),H=te(pt(W,1)),q=le(E,P,1),_=le(E,V,1),z=le(W,P,1),j=le(W,U,1);for(let e=0;e<o;e++){const t=e-F;if(t<0)continue;const l=P[e];if(E[e]){const o=R<=$[e]&&$[e]<=T;K&&o&&l>q[e]&&V[e]<_[e]&&(d[t]=l),D&&o&&l<q[e]&&V[e]>_[e]&&(h[t]=l)}if(W[e]){const o=R<=H[e]&&H[e]<=T;K&&o&&l<z[e]&&U[e]>j[e]&&(m[t]=l),D&&o&&l>z[e]&&U[e]<j[e]&&(b[t]=l)}}return A},markers:({bars:e,values:t,settings:l})=>{const o=at(l,"bullColor","#4caf50"),n=at(l,"bearColor","#ff5252"),r=[{col:t.buy,shape:"circle",size:"tiny",color:at(l,"buyColor","#00e676"),text:void 0},{col:t.sell,shape:"circle",size:"tiny",color:at(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:Mn(o),text:"H"},{col:t.hiddenBear,shape:"labelDown",size:"small",color:Mn(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:ot(e,"obLevel1",60),color:at(e,"obBandColor","#ff5252"),title:"Overbought 1",dashed:!0},{price:ot(e,"obLevel2",53),color:at(e,"obBandColor","#ff5252"),title:"Overbought 2",dashed:!0},{price:0,color:"#787b86",title:"Zero",dashed:!0},{price:ot(e,"osLevel2",-53),color:at(e,"osBandColor","#4caf50"),title:"Oversold 2",dashed:!0},{price:ot(e,"osLevel1",-60),color:at(e,"osBandColor","#4caf50"),title:"Oversold 1",dashed:!0}]},xn=[Sn],Ln="#089981",In="#F23745",On="#787b86",Bn=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function Fn(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 Rn=Fn(On,.2),Tn=Fn(On,.5);function Kn(e,t,l,o){if(null===e||!Number.isFinite(e))return;return Fn(e>=0?l:o,.1+.4*(t>0?Math.min(1,Math.abs(e)/t):1))}const Dn=e=>`${e.toFixed(2)}%`;const En=(e,t)=>100*e+t;function Wn(e,l){const o=function(e,l){const o=[];let n=null,r=0,a=0;for(const i of e)if(null===n||i.time<r||i.time>=a){const e=t.utcSecondsToZonedParts(i.time,l);n={year:e.year,month:e.month,last:i.close},o.push(n),r=t.zonedWallClockToUtcSeconds(e.year,e.month,1,0,0,0,l),a=t.zonedWallClockToUtcSeconds(e.year,e.month+1,1,0,0,0,l)}else n.last=i.close;return o}(e,ct(l)),n=Math.round(ot(l,"startYear",2015)),r=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}(at(l,"ignoredMonths","")),a=o.length>0?o[o.length-1]:null;null!==a&&r.add(En(a.year,a.month));const i=[],s=new Map;for(let e=1;e<o.length;e++){const t=o[e],l=o[e-1];if(t.year<n||r.has(En(t.year,t.month)))continue;if(!Number.isFinite(l.last)||!Number.isFinite(t.last)||0===l.last)continue;const a=100*(t.last-l.last)/Math.abs(l.last);if(!Number.isFinite(a))continue;let c=s.get(t.year);void 0===c&&(c=new Array(12).fill(null),s.set(t.year,c),i.push(t.year)),c[t.month-1]=a}return{years:i,byYear:s,skipped:r}}function Pn(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 Vn=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 Un(e){if(e.length<2)return null;const t=Vn(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 $n=e=>{if(0===e.length)return null;let t=0;for(const l of e)l>=0&&(t+=1);return 100*t/e.length},Hn={Left:"bottom-left",Center:"bottom-center",Right:"bottom-right"},qn=[52,...new Array(12).fill(46)],_n=e=>({text:e,bgColor:Rn}),zn={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:Ln,group:"Color settings"},{key:"negColor",type:"color",label:"Negative Color",default:In,group:"Color settings"},{key:"cutoffPercent",type:"number",label:"Color intensity cutoff (%)",default:10,min:0,max:100,step:1,group:"Color settings"},{key:"tablePosition",type:"select",label:"Table Position",default:"Center",options:[{label:"Left",value:"Left"},{label:"Center",value:"Center"},{label:"Right",value:"Right"}],group:"Heatmap settings"},{key:"tableWidth",type:"number",label:"Table Width (%)",default:100,min:0,max:100,step:1,group:"Heatmap settings"},{key:"tableHeight",type:"number",label:"Table Height (%)",default:95,min:0,max:100,step:1,group:"Heatmap settings"},{key:"showAvg",type:"boolean",label:"Show Averages",default:!0,group:"Heatmap settings"},{key:"showStDev",type:"boolean",label:"Show Standard Deviation",default:!0,group:"Heatmap settings"},{key:"showPos",type:"boolean",label:"Show Percent Positive",default:!0,group:"Heatmap settings"},{key:"ignoredMonths",type:"text",label:"Ignored months",default:"YYYY-MM, YYYY-MM",group:"Additional settings"}],plots:[{key:"seasonality",type:"line",title:"Seasonality"}],calc:e=>({seasonality:new Array(e.length).fill(null)}),table:({bars:e,settings:t})=>{const l=Wn(e,t);if(0===l.years.length)return null;const o=ot(t,"cutoffPercent",10),n=at(t,"posColor",Ln),r=at(t,"negColor",In),a=[[_n("Year"),...Bn.map(_n)]],i=[1];for(const e of l.years){const t=l.byYear.get(e)??[],s=[_n(String(e))];for(let a=0;a<12;a++){if(l.skipped.has(En(e,a+1))){s.push({text:"SKIP",bgColor:Tn});continue}const i=t[a]??null;s.push(null===i?{text:""}:{text:Dn(i),bgColor:Kn(i,o,n,r)})}a.push(s),i.push(1)}const s=it(t,"showAvg",!0),c=it(t,"showStDev",!0),u=it(t,"showPos",!0);if(s||c||u){if(a.push(Array.from({length:13},()=>({text:"",bgColor:Rn}))),i.push(.3),s){const e=[_n("Avgs:")];for(let t=0;t<12;t++){const a=Vn(Pn(l,t));e.push(null===a?{text:""}:{text:Dn(a),bgColor:Kn(a,o,n,r)})}a.push(e),i.push(1)}if(c){const e=[_n("StDev:")];for(let t=0;t<12;t++){const o=Un(Pn(l,t));e.push({text:null===o?"":o.toFixed(2),bgColor:Rn})}a.push(e),i.push(1)}if(u){const e=[_n("Pos%:")];for(let t=0;t<12;t++){const o=$n(Pn(l,t));e.push(null===o?{text:""}:{text:`${Math.round(o)}%`,bgColor:Kn(o-50,50,n,r)})}a.push(e),i.push(1)}}return{rows:a,options:{position:Hn[at(t,"tablePosition","Center")]??"bottom-center",cellWidth:qn,cellHeight:18,rowWeights:i,widthPercent:ot(t,"tableWidth",100),heightPercent:ot(t,"tableHeight",95),fontSize:10,margin:8}}}},jn=[zn],Zn=e=>Math.floor((e-1)/2),Yn=lt(ie({id:"zlema",name:"Zero Lag EMA",category:"Trend",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:"color",type:"color",label:"ZLEMA",default:"#00bcd4"}],plots:[{key:"zlema",type:"line",title:"ZLEMA",colorKey:"color",style:{color:"#00bcd4",lineWidth:1.5}}],calc:(e,l)=>{const o=nt(l,"length",20),n=Zn(o),r=t.sourceValues(e,st(l));return{zlema:O(B(r.map((e,t)=>t>=n?e+(e-r[t-n]):NaN),o))}}},e=>(l,o,n,r,a)=>{const i=nt(o,"length",20),s=Zn(i),c=st(o);return de(e,`${i}|${c}`,{keys:["zlema"],start:he,step:(e,o,n)=>{const r=t.sourceValue(l[o],c);n[0]=ne(be(e,o>=s?r+(r-t.sourceValue(l[o-s],c)):NaN,i,!0))}},l,n,r,a)}));function Gn(e,l){const o=2/(nt(l,"length",9)+1),n=nt(l,"cmoLength",9),r=st(l),a=l=>t.sourceValue(e[l],r);return{keys:["vidya"],start:()=>({value:NaN}),step:(e,t,l)=>{const r=a(t),i=t>=n?o*function(e,t,l){let o=0,n=0;for(let r=t-l+1;r<=t;r++){const t=e(r)-e(r-1);if(!Number.isFinite(t))return NaN;t>=0?o+=t:n-=t}const r=o+n;return 0===r?0:Math.abs(o-n)/r}(a,t,n):NaN,s=Number.isNaN(e.value)?r:i*r+(1-i)*e.value;Number.isFinite(r)&&Number.isFinite(i)&&Number.isFinite(s)?(e.value=s,l[0]=s):l[0]=null}}}const Xn=lt(ie({id:"vidya",name:"Variable Index Dynamic Average",category:"Trend",placement:"onchart",inputs:[{key:"length",type:"number",label:"Length",default:9,min:1,max:1e3,step:1},{key:"cmoLength",type:"number",label:"CMO Length",default:9,min:1,max:1e3,step:1},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"VIDYA",default:"#ff9800"}],plots:[{key:"vidya",type:"line",title:"VIDYA",colorKey:"color",style:{color:"#ff9800",lineWidth:1.5}}],calc:(e,t)=>me(Gn(e,t),e.length)},e=>(t,l,o,n,r)=>de(e,`${nt(l,"length",9)}|${nt(l,"cmoLength",9)}|${st(l)}`,Gn(t,l),t,o,n,r))),Jn=ie({id:"elder-ray",name:"Elder-Ray Index",category:"Momentum",placement:"pane",inputs:[{key:"length",type:"number",label:"Length",default:13,min:1,max:500,step:1},{key:"bullColor",type:"color",label:"Bull Power",default:"#26a69a"},{key:"bearColor",type:"color",label:"Bear Power",default:"#ef5350"}],plots:[{key:"bull",type:"histogram",title:"Bull Power",colorKey:"bullColor",style:{color:"#26a69a",base:0}},{key:"bear",type:"histogram",title:"Bear Power",colorKey:"bearColor",style:{color:"#ef5350",base:0}}],calc:(e,l)=>{const o=B(t.sourceValues(e,"close"),nt(l,"length",13));return{bull:O(dt(e,o,(e,t)=>e.high-t)),bear:O(dt(e,o,(e,t)=>e.low-t))}},levels:()=>[{price:0,color:"#787b86",title:"Zero",dashed:!0}]},e=>(t,l,o,n,r)=>{const a=nt(l,"length",13);return de(e,`${a}`,{keys:["bull","bear"],start:he,step:(e,l,o)=>{const n=t[l],r=be(e,n.close,a,!0);o[0]=ne(n.high-r),o[1]=ne(n.low-r)}},t,o,n,r)});function Qn(e,t,l,o){if(e.push(t),e.length>l&&e.shift(),e.length<l)return NaN;let n=1/0,r=-1/0;for(const t of e){if(!Number.isFinite(t))return NaN;t<n&&(n=t),t>r&&(r=t)}const a=r-n;return 0===a?o:a<1/0?100*(t-n)/a:NaN}function er(e,l){const o=nt(l,"fastLength",23),n=nt(l,"slowLength",50),r=nt(l,"cycleLength",10),a=ot(l,"factor",.5),i=st(l);return{keys:["stc"],start:()=>({fast:{run:0,value:NaN,seeded:!1,recent:[]},slow:{run:0,value:NaN,seeded:!1,recent:[]},macd:[],pfs:[],f1:NaN,pf:NaN,f2:NaN,stc:NaN}),step:(l,s,c)=>{const u=t.sourceValue(e[s],i),p=be(l.fast,u,o,!0)-be(l.slow,u,n,!0),y=Qn(l.macd,p,r,l.f1);let f=NaN;Number.isFinite(y)&&(l.f1=y,f=Number.isNaN(l.pf)?y:l.pf+a*(y-l.pf),l.pf=f);const d=Qn(l.pfs,f,r,l.f2);let m=NaN;Number.isFinite(d)&&(l.f2=d,m=Number.isNaN(l.stc)?d:l.stc+a*(d-l.stc),l.stc=m),c[0]=ne(m)}}}const tr=ie({id:"schaff-trend-cycle",name:"Schaff Trend Cycle",category:"Momentum",placement:"pane",inputs:[{key:"fastLength",type:"number",label:"Fast Length",default:23,min:1,max:500,step:1},{key:"slowLength",type:"number",label:"Slow Length",default:50,min:1,max:500,step:1},{key:"cycleLength",type:"number",label:"Cycle Length",default:10,min:1,max:500,step:1},{key:"factor",type:"number",label:"Smoothing Factor",default:.5,min:.01,max:1,step:.01},{key:"source",type:"source",label:"Source",default:"close"},{key:"color",type:"color",label:"STC",default:"#2962ff"}],plots:[{key:"stc",type:"line",title:"STC",colorKey:"color",style:{color:"#2962ff",lineWidth:1.5}}],calc:(e,t)=>me(er(e,t),e.length),levels:()=>[{price:75,color:"#ef5350",title:"Upper",dashed:!0},{price:25,color:"#26a69a",title:"Lower",dashed:!0}],range:()=>({min:0,max:100})},e=>(t,l,o,n,r)=>de(e,`${nt(l,"fastLength",23)}|${nt(l,"slowLength",50)}|${nt(l,"cycleLength",10)}|${ot(l,"factor",.5)}|${st(l)}`,er(t,l),t,o,n,r)),lr=[Yn,Xn,Jn,tr],or=e=>Math.max(.01,ot(e,"deviation",5)),nr=(e,t,l)=>e>0&&100*e>=Math.abs(t)*l;function rr(e,t,l,o,n){const r=t.high,a=t.low;if(Number.isFinite(r)&&Number.isFinite(a))if(0===e.dir){if(r<=e.high||(e.high=r,e.highAt=l),a>=e.low||(e.low=a,e.lowAt=l),e.highAt===e.lowAt)return;const t=e.lowAt<e.highAt;if(!nr(e.high-e.low,t?e.low:e.high,o))return;e.dir=t?1:-1,n(e.lowAt,e.low),n(e.highAt,e.high)}else e.dir>0?r>e.high?(n(e.highAt,null),e.high=r,e.highAt=l,n(l,r)):nr(e.high-a,e.high,o)&&(e.dir=-1,e.low=a,e.lowAt=l,n(l,a)):a<e.low?(n(e.lowAt,null),e.low=a,e.lowAt=l,n(l,a)):nr(r-e.low,e.low,o)&&(e.dir=1,e.high=r,e.highAt=l,n(l,r))}const ar={key:"zigzag",type:"line",title:"ZigZag",colorKey:"color",style:{color:"#2962ff",lineWidth:2}},ir=()=>{};const sr=["solid","dashed","dotted"],cr=ie({id:"zigzag",name:"ZigZag",category:"Trend",placement:"onchart",inputs:[{key:"deviation",type:"number",label:"Deviation (%)",default:5,min:.01,max:100,step:.1},{key:"color",type:"color",label:"ZigZag",default:"#2962ff"}],plots:[ar],calc:(e,t)=>{const l=new Array(e.length).fill(null),o=or(t),n={dir:0,high:NaN,highAt:-1,low:NaN,lowAt:-1},r=(e,t)=>{l[e]=t};for(let t=0;t<e.length;t++)rr(n,e[t],t,o,r);return{zigzag:l}},draws:({bars:e,values:l,settings:o})=>{const n=l.zigzag??[],r=[];for(let t=0;t<e.length;t++){const l=n[t];"number"==typeof l&&Number.isFinite(l)&&r.push({time:e[t].time,price:l})}const a=t.plotStyleKeys(ar),i=at(o,a.color,"#2962ff"),s=ot(o,a.opacity,100),c=ot(o,a.width,2),u=o[a.lineStyle],p=sr.includes(u)?u:"solid",y=[];for(let e=1;e<r.length;e++)y.push({kind:"line",from:r[e-1],to:r[e],color:s>=100?i:t.withAlpha(i,Math.max(0,s)/100),lineWidth:c>0?c:2,lineStyle:e<r.length-1?p:"dashed"===p?"dotted":"dashed"});return y}},function(e){return(t,l,o,n,r)=>{const a=se(r,e,t,o),i=n.zigzag;if(void 0===a||void 0===i||i.length<o)return null;const s=or(l),c=`${s}`,u=pe(a,c,t,o),p=void 0!==u?{...u.state}:{dir:0,high:NaN,highAt:-1,low:NaN,lowAt:-1};if(void 0===u)for(let e=0;e<o;e++)rr(p,t[e],e,s,ir);const y=new Map;p.dir>=0&&p.highAt>=0&&y.set(p.highAt,0===p.dir?null:p.high),p.dir<=0&&p.lowAt>=0&&y.set(p.lowAt,0===p.dir?null:p.low);const f=t.length,d=new Array(f-o).fill(null),m=(e,t)=>{e>=o?d[e-o]=t:y.set(e,t)};for(let e=o;e<f;e++)e===f-1&&(a.at={key:c,index:e-1,time:e>0?t[e-1].time:NaN,state:{...p},row:[]}),rr(p,t[e],e,s,m);for(const[e,t]of y)if(!Object.is(i[e]??null,t))return null;return a.misses=0,{zigzag:d}}});function ur(e,l,o){const n=e.length,r=new Array(n-o).fill(null),a=new Array(n-o).fill(null);if(0===n)return{high:r,low:a};const i=o=>t.zonedDayIndex(e[o].time,l),s=i(0);let c=n;for(;c>o&&i(c-1)-364>=s;)c--;if(c===n)return{high:r,low:a};let u=c;const p=i(c)-364;for(;u>0&&i(u-1)>p;)u--;const y=[],f=[],d=[];let m=0,h=0;for(let t=u;t<n;t++){const l=e[t];if(y.push(i(t)),Number.isFinite(l.high)){for(;f.length>m&&e[f[f.length-1]].high<=l.high;)f.pop();f.push(t)}if(Number.isFinite(l.low)){for(;d.length>h&&e[d[d.length-1]].low>=l.low;)d.pop();d.push(t)}if(t<c)continue;const n=y[t-u]-364;for(;m<f.length&&y[f[m]-u]<=n;)m++;for(;h<d.length&&y[d[h]-u]<=n;)h++;m<f.length&&(r[t-o]=e[f[m]].high),h<d.length&&(a[t-o]=e[d[h]].low)}return{high:r,low:a}}const pr=ie({id:"high-low-52-week",name:"52 Week High/Low",category:"Trend",placement:"onchart",inputs:[{key:"highColor",type:"color",label:"52W High",default:"#26a69a"},{key:"lowColor",type:"color",label:"52W Low",default:"#ef5350"}],plots:[{key:"high",type:"step",title:"52W High",colorKey:"highColor",style:{color:"#26a69a",lineWidth:1.5}},{key:"low",type:"step",title:"52W Low",colorKey:"lowColor",style:{color:"#ef5350",lineWidth:1.5}}],calc:(e,t)=>ur(e,ct(t),0)},e=>(t,l,o,n,r)=>{const a=se(r,e,t,o);if(void 0===a)return null;const i=Math.max(0,o-1);return ye(a,ur(t,ct(l),i),o-i,n,o)}),yr=[cr,pr];function fr(e){return{symbol:e.symbol,exchange:e.exchange??"",interval:e.interval,signal:e.signal,...e.variant?{variant:e.variant}:{}}}function dr(e,t){return Array.from(new Map([...e,...t].map(e=>[e.time,{...e}])).values()).sort((e,t)=>e.time-t.time)}function mr(e){if(e.signal?.aborted)throw e.signal.reason}const hr="__tier2",br=e=>e[hr];function gr(e,t){return(e.refetchOn??[]).map(e=>`${e}=${String(t[e])}`).join("&")}function wr(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)}const kr=[gt,kt,wt,xt,vt,Lt,Bt,It,Ot,Pt,Vt,Ut,$t,Ht,qt,_t,zt,jt,Zt,Yt,Xt,Jt,el,...Cl,...Kl,...Xl,...no,...po,...So,...Eo,...jo,...on,...yn,...An,...xn,...jn,...lr,...yr];let vr=!1;function Nr(){if(!vr){vr=!0;for(const e of kr)t.registerIndicator(e)}}return Nr(),e.ADAPTIVE_INDICATORS=po,e.ADL=Yt,e.ADX=$t,e.ALLIGATOR=No,e.ALMA=rl,e.ALPHATREND=Nn,e.AROON=Ml,e.AROON_OSCILLATOR=Sl,e.ATR=_t,e.AVERAGE_DAILY_RANGE=Hl,e.AVERAGE_INDICATORS=So,e.AWESOME_OSCILLATOR=xl,e.BALANCE_OF_POWER=Ll,e.BB_TREND=Vl,e.BOLLINGER=vt,e.BOLLINGER_BANDWIDTH=Pl,e.BOLLINGER_PERCENT_B=Wl,e.BUILTIN_INDICATORS=kr,e.CCI=Ht,e.CHAIKIN_MONEY_FLOW=Ql,e.CHAIKIN_OSCILLATOR=eo,e.CHAIKIN_VOLATILITY=zl,e.CHANDELIER_EXIT=pl,e.CHANDE_KROLL_STOP=ul,e.CHANDE_MOMENTUM=Il,e.CHOPPINESS_INDEX=Ul,e.CHOP_ZONE=_l,e.CONNORS_RSI=Tl,e.CONSOLIDATION_BREAKOUT=pn,e.COPPOCK_CURVE=Ol,e.CPR=vn,e.DEMA=al,e.DONCHIAN=cl,e.DPO=Bl,e.EASE_OF_MOVEMENT=to,e.ELDER_FORCE_INDEX=lo,e.ELDER_RAY=Jn,e.EMA=kt,e.ENVELOPE=sl,e.EXPONENTIAL_INDICATORS=lr,e.FISHER_TRANSFORM=Fl,e.FLOW_INDICATORS=no,e.HALFTREND=Bt,e.HIGH_LOW_52_WEEK=pr,e.HISTORICAL_VOLATILITY=$l,e.HMA=il,e.HULL_SUITE=Nl,e.ICHIMOKU=Ot,e.INDEX_INDICATORS=jo,e.INDICATORS_TIER="indicators",e.KAMA=ro,e.KELTNER_CHANNEL=ao,e.KLINGER_OSCILLATOR=so,e.KNOW_SURE_THING=co,e.LINREG_SLOPE=uo,e.LSMA=io,e.MACD=Vt,e.MASS_INDEX=_o,e.MA_CHANNEL=fl,e.MA_CROSS=yo,e.MA_RIBBON=go,e.MCGINLEY_DYNAMIC=fo,e.MEDIAN=mo,e.MFI=qt,e.MOMENTUM=Lo,e.NET_VOLUME=oo,e.NVI=Uo,e.OBV=Zt,e.OPEN_INTEREST=Xt,e.OPEN_INTEREST_BUILDUP=el,e.OPEN_INTEREST_CHANGE=Jt,e.OSCILLATOR_INDICATORS=Kl,e.OVERLAY_INDICATORS=Cl,e.PARABOLIC_SAR=It,e.PPO=Bo,e.PVI=$o,e.PVO=qo,e.PVT=Ho,e.RANGE_ANALYSIS=Cn,e.RANGE_INDICATORS=on,e.RELATIVE_VIGOR_INDEX=Jo,e.RELATIVE_VOLATILITY_INDEX=Qo,e.ROC=Io,e.RSI=Pt,e.RSI_DIVERGENCE=un,e.SCHAFF_TREND_CYCLE=tr,e.SEASONALITY=zn,e.SEASONALITY_INDICATORS=jn,e.SIGNAL_INDICATORS=yn,e.SMA=gt,e.SMI=Do,e.SMI_ERGODIC_INDICATOR=To,e.SMI_ERGODIC_OSCILLATOR=Ko,e.SMMA=Co,e.SPECIAL_K=ln,e.STANDARD_DEVIATION=jl,e.STANDARD_ERROR=Zl,e.STANDARD_ERROR_BANDS=yl,e.STOCHASTIC=Ut,e.STOCHASTIC_RSI=Yo,e.STRENGTH_INDICATORS=Eo,e.STUDY_INDICATORS=An,e.SUPERTREND=Lt,e.SWING_INDICATORS=yr,e.T3=Mo,e.TEMA=wo,e.TREND_STRENGTH_INDEX=an,e.TRIX=Fo,e.TSI=Ro,e.TWAP=ko,e.ULCER_INDEX=zo,e.ULTIMATE_OSCILLATOR=Xo,e.VIDYA=Xn,e.VOLATILITY_INDICATORS=Xl,e.VOLATILITY_SQUEEZE=Gl,e.VOLATILITY_STOP=rn,e.VOLUME=jt,e.VORTEX=nn,e.VWAP=xt,e.VWMA=vo,e.WAVETREND=Sn,e.WAVETREND_INDICATORS=xn,e.WILLIAMS_FRACTALS=cn,e.WILLIAMS_PERCENT_R=Go,e.WILLIAMS_VIX_FIX=zt,e.WMA=wt,e.WOODIES_CCI=en,e.ZIGZAG=cr,e.ZLEMA=Yn,e.alignRequestedExpression=Ee,e.alma=D,e.barsSince=te,e.cci=Z,e.centerOfGravity=function(e,t,l={}){return o(e,t,l,e=>{const t=n(e,1,!1);if(0===t)return NaN;const l=n(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 r=2**Math.min(1023,Math.floor(Math.log2(o))),a=Number.isFinite(t)?t/r:n(e,r,!1),i=n(e,r,!0);return 0===a?Number.isFinite(t)?-i/t*r:NaN:-i/a})},e.change=F,e.connorsStreak=Rl,e.correlation=j,e.createRequestedIndicator=qe,e.createTier2Indicator=function(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=br(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=br(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[hr]=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)&&wr(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)wr(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)&&wr(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)},d=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}))},m=(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"}),d(i)},h=(t=!1)=>{if(!s()||We(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?Pe(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,w=b?.source,k=p?.requestState?.source,v=p?.requestState?.replay,N=JSON.stringify([gr(e,u.settings),h?.symbol,h?.exchange,h?.interval,h?.variant??null,b?.providerRevision,w?.sourceId,void 0!==g]),C=u.bars.length-(p?.bars.length??0),A=void 0!==p&&void 0!==k&&void 0!==w&&"prepend"===w.change&&w.revision===k.revision+1&&w.historyRevision===k.historyRevision+1&&u.bars!==p.bars&&C>0&&p.bars.every((e,t)=>u.bars[C+t]===e),M=void 0===g&&void 0!==w&&void 0!==k&&w.historyRevision!==k.historyRevision&&!A,S=void 0!==u.asOf&&void 0!==v?.asOf&&u.asOf<v.asOf,x=N!==o.key||M||S;if(x){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 I=JSON.stringify([N,u.from,void 0===e.subscribe||void 0!==g?u.to:null,void 0===g&&void 0===e.subscribe?w?.revision:null,b?.dataRevision,u.asOf]),O=u.from<o.from||void 0===e.subscribe&&u.to>o.to;if(null!==o.request){const e=o.request;f(e),d(e)}else if(t||x||(void 0!==b?o.completedVersion!==I||O&&"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?m(u,u.from,u.to,"replace",I,l):u.from<o.from?m(u,u.from,o.from,"prepend",I):void 0===e.subscribe&&(u.to>o.to||void 0!==b)?m(u,o.to,u.to,"tail",I):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)&&(wr(o.live,e),o.liveVersions.set(e.time,++o.liveRevision),wr(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 w=t.get(l.store);return"calc"===o.errorKind&&void 0===w&&(o.errorKind=void 0,o.status={state:o.points.length?"ready":"empty"}),l.setDataStatus?.(w?.points===o.points?{state:"error",error:w.error}:o.status),h("error"===o.status.state&&"calc"!==o.errorKind),b}}},e.createTimeframeProvider=function(e,l){const o=t.sharedHistoryRequests(e),n=new Map,r=l.now??(()=>Date.now()/1e3),a=(e,t)=>{const o=e.map(e=>l.availability(e,t)),n={bars:e.map(e=>({...e})),availableAt:o.map(e=>e.at),confirmed:o.map(e=>e.confirmed)};return Ee([],n,()=>({})),n};return{supportsWarmup:!0,requestBars:e=>o.getBars({...fr(e),from:e.from,to:e.to}),requestSnapshot:async i=>{mr(i);const s=i.warmupBars??0;if(!Number.isInteger(s)||s<0||s>1e5||!Number.isFinite(i.from)||!Number.isFinite(i.to)||i.from>i.to)throw new Error("Invalid timeframe history window or warmup count");if(void 0!==i.asOf){if(!l.historicalSnapshot)throw new Error("Historical value snapshots are unavailable for this source");const e=await l.historicalSnapshot(i);return mr(i),Ee([],e,()=>({})),e}const c=fr(i),u=e.resolve({...c,from:i.from,to:i.to}),p=JSON.stringify([u.market.key,i.symbol,i.exchange,i.interval,t.dataVariantKey(i.variant)]);let y=n.get(p);y&&r()-y.stored>300&&(n.delete(p),y=void 0);let f=y?y.bars.map(e=>({...e})):[],d=y?.from??i.from,m=y?.exhausted??!1;if(!y||i.from<y.from||i.to>y.to){const e=!y||i.from<y.from?i.from:y.to;i.to>e&&(f=dr(f,await o.getBars({...c,from:e,to:i.to}))),d=Math.min(d,i.from)}let h=a(f.filter(e=>e.time<i.to),i);const b=()=>h.bars.filter((e,t)=>e.time<i.from&&h.confirmed[t]&&null!==h.availableAt[t]&&h.availableAt[t]<=i.from).length;let g=0,w=d,k=1;for(let e=0;b()<s&&!m;e++){if(e>=512||f.length>=1e5)throw new Error("Timeframe warmup history limit reached");const t=d,l=await o.getBarsPage({...c,before:t,countBack:Math.max(1,s-b())*k});f=dr(l.bars,f);const n=l.nextBefore??l.bars[0]?.time;if(m=!1===l.hasMore||void 0!==u.source.earliest&&void 0!==n&&n<=u.source.earliest,!m&&(void 0===n||n>=d))throw new Error("Warmup history page did not advance");if(0===l.bars.length?(0===g&&(w=t),g++,k=Math.min(2*k,64)):(g=0,k=1),void 0!==n&&(d=Math.min(d,n)),!m&&g>=4&&w-d>2592e3)throw new Error("Insufficient confirmed history: no source bars in more than 30 days before the warmup");h=a(f.filter(e=>e.time<i.to),i)}mr(i);let v=0;for(;v<h.bars.length&&h.confirmed[v]&&null!==h.availableAt[v];)v++;return((e,t)=>{n.delete(e),n.set(e,t);let l=0;for(const e of n.values())l+=e.bars.length;for(;n.size>24||l>25e4;){const e=n.keys().next().value;l-=n.get(e).bars.length,n.delete(e)}})(p,{bars:h.bars.slice(0,v),from:d,to:h.bars[v]?.time??i.to,exhausted:m,stored:y?.stored??r()}),h}}},e.crosses=c,e.crossesAbove=i,e.crossesBelow=s,e.cumulative=$,e.dev=T,e.falling=function(e,t,l={}){return u(e,t,l,!1)},e.highest=L,e.highestBars=W,e.inheritedDataVariant=Pe,e.linreg=H,e.lowest=I,e.lowestBars=P,e.nulls=O,e.percentRank=K,e.percentileLinear=function(e,t,l,n={}){if(!Number.isFinite(l)||l<0||l>100)throw new RangeError("Numerical percentage must be finite and between 0 and 100");return o(e,t,n,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})},e.percentileNearestRank=z,e.pivotHigh=X,e.pivotLow=J,e.rankCorrelation=function(e,t,l={}){return o(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))})},e.registerBuiltinIndicators=Nr,e.requestedIntrabars=function(e,t,l,o={}){Array.isArray(e)||Re("target windows must be an array");let n=-1/0;for(const t of e)(!Te(t)||!Number.isFinite(t.start)||!Number.isFinite(t.end)||t.start>=t.end||t.start<n)&&Re("windows must be finite, ordered and nonoverlapping with start < end"),n=t.end;Te(o)&&(void 0===o.asOf||Number.isFinite(o.asOf))||Re("asOf must be finite");const{bars:r,eligibleAt:a,values:i}=De(t,l),s=Object.keys(i),c={times:e.map(()=>[]),values:{}};for(const t of s)Ke(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},e.rising=function(e,t,l={}){return u(e,t,l,!0)},e.rma=S,e.roc=R,e.rollingMedian=function(e,t,l={}){return o(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})},e.rollingMode=function(e,t,l={}){return o(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})},e.rollingRange=function(e,t,l={}){return o(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})},e.rollingSum=U,e.rollingVariance=function(e,t,l={}){if(void 0!==l.sample&&"boolean"!=typeof l.sample)throw new TypeError("Numerical sample option must be boolean");return o(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})},e.runningMax=function(e,t={}){return r(e,t,!0)},e.runningMin=function(e,t={}){return r(e,t,!1)},e.securityExpression=Fe,e.securitySeries=function(e,l,o={}){const n=o.timezone??t.DEFAULT_TIMEZONE,r=Math.floor(o.offset??0);if(!Number.isFinite(r)||r<0)throw new t.IndicatorInputError("securitySeries: offset must be zero or a positive count of buckets");const a=!0===o.lookahead,{bucketing:i}=t.resolveInterval(l);if("ticks"===i.mode||"volume"===i.mode)throw new t.IndicatorInputError(`securitySeries: "${l}" closes on trade flow rather than the clock and cannot be folded from time bars`);let s=null;if(void 0!==o.session){const e=t.parseSessionSpec(o.session);if(null===e)throw new t.IndicatorInputError(`securitySeries: cannot read session "${o.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),d=new Array(c).fill(null),m=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:d,oi:m,bucketStart:h,isNew:b};const g=[],w=new Array(c),k=Ie(i,n,s);let v=NaN;for(let t=0;t<c;t++){const l=e[t],o=k(l.time);0===t||o!==v?(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):Be(g[g.length-1],l),w[t]=g.length-1,v=o}let N=NaN,C=NaN,A=null,M=null;for(let t=0;t<c;t++){const l=e[t],o=w[t];if(r>0){const e=o-r;if(e<0)continue;const l=g[e];u[t]=l.open,p[t]=l.high,y[t]=l.low,f[t]=l.close,d[t]=l.volume,m[t]=l.oi,h[t]=l.start;continue}const n=g[o];h[t]=n.start,a?(u[t]=n.open,p[t]=n.high,y[t]=n.low,f[t]=n.close,d[t]=n.volume,m[t]=n.oi):(b[t]?(N=l.high,C=l.low,A=void 0===l.volume?null:l.volume,M=void 0===l.oi?null:l.oi):(Oe(l.high)&&(!Oe(N)||l.high>N)&&(N=l.high),Oe(l.low)&&(!Oe(C)||l.low<C)&&(C=l.low),void 0!==l.volume&&(A=(A??0)+l.volume),void 0!==l.oi&&(M=l.oi)),u[t]=n.open,p[t]=Oe(N)?N:null,y[t]=Oe(C)?C:null,f[t]=Oe(l.close)?l.close:null,d[t]=A,m[t]=M)}return{open:u,high:p,low:y,close:f,volume:d,oi:m,bucketStart:h,isNew:b}},e.sma=C,e.smaSeededEma=B,e.stdev=x,e.stoch=_,e.swma=q,e.valueWhen=le,e.vwma=E,e.withTimeframe=lt,e.wma=A,e}({},OpenAlgoCharts);