ohlcv-indicators 2.1.3 → 2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- var OHLCV_INDICATORS;(()=>{"use strict";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};(()=>{function r(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return n(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var o=0,i=function(){};return{s:i,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u=!0,l=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){l=!0,a=t},f:function(){try{u||null==r.return||r.return()}finally{if(l)throw a}}}}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}t.r(e),t.d(e,{default:()=>Je});var o=function(t){return"string"==typeof t&&/^\d{4}-\d{2}-\d{2}/.test(t)},i=function(t){if(0!==t.lastComputedIndex)throw Error('ohlcv is already computed, you can not add new indicators after "compute", "getLastValues" , "getDataAsCols" or "getData" methods are called.')},a=1e6,u="[big.js] ",l=u+"Invalid ",c=l+"decimal places",s=l+"rounding mode",f=u+"Division by zero",h={},p=void 0,y=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;function v(t,e,r,n){var o=t.c;if(r===p&&(r=t.constructor.RM),0!==r&&1!==r&&2!==r&&3!==r)throw Error(s);if(e<1)n=3===r&&(n||!!o[0])||0===e&&(1===r&&o[0]>=5||2===r&&(o[0]>5||5===o[0]&&(n||o[1]!==p))),o.length=1,n?(t.e=t.e-e+1,o[0]=1):o[0]=t.e=0;else if(e<o.length){if(n=1===r&&o[e]>=5||2===r&&(o[e]>5||5===o[e]&&(n||o[e+1]!==p||1&o[e-1]))||3===r&&(n||!!o[0]),o.length=e,n)for(;++o[--e]>9;)if(o[e]=0,0===e){++t.e,o.unshift(1);break}for(e=o.length;!o[--e];)o.pop()}return t}function d(t,e,r){var n=t.e,o=t.c.join(""),i=o.length;if(e)o=o.charAt(0)+(i>1?"."+o.slice(1):"")+(n<0?"e":"e+")+n;else if(n<0){for(;++n;)o="0"+o;o="0."+o}else if(n>0)if(++n>i)for(n-=i;n--;)o+="0";else n<i&&(o=o.slice(0,n)+"."+o.slice(n));else i>1&&(o=o.charAt(0)+"."+o.slice(1));return t.s<0&&r?"-"+o:o}function b(t){return b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},b(t)}function m(t){var e="function"==typeof Map?new Map:void 0;return m=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,r)}function r(){return function(t,e,r){if(g())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,e);var o=new(t.bind.apply(t,n));return r&&w(o,r.prototype),o}(t,arguments,O(this).constructor)}return r.prototype=Object.create(t.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),w(r,t)},m(t)}function g(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(g=function(){return!!t})()}function w(t,e){return w=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},w(t,e)}function O(t){return O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},O(t)}h.abs=function(){var t=new this.constructor(this);return t.s=1,t},h.cmp=function(t){var e,r=this,n=r.c,o=(t=new r.constructor(t)).c,i=r.s,a=t.s,u=r.e,l=t.e;if(!n[0]||!o[0])return n[0]?i:o[0]?-a:0;if(i!=a)return i;if(e=i<0,u!=l)return u>l^e?1:-1;for(a=(u=n.length)<(l=o.length)?u:l,i=-1;++i<a;)if(n[i]!=o[i])return n[i]>o[i]^e?1:-1;return u==l?0:u>l^e?1:-1},h.div=function(t){var e=this,r=e.constructor,n=e.c,o=(t=new r(t)).c,i=e.s==t.s?1:-1,u=r.DP;if(u!==~~u||u<0||u>a)throw Error(c);if(!o[0])throw Error(f);if(!n[0])return t.s=i,t.c=[t.e=0],t;var l,s,h,y,d,b=o.slice(),m=l=o.length,g=n.length,w=n.slice(0,l),O=w.length,S=t,_=S.c=[],j=0,A=u+(S.e=e.e-t.e)+1;for(S.s=i,i=A<0?0:A,b.unshift(0);O++<l;)w.push(0);do{for(h=0;h<10;h++){if(l!=(O=w.length))y=l>O?1:-1;else for(d=-1,y=0;++d<l;)if(o[d]!=w[d]){y=o[d]>w[d]?1:-1;break}if(!(y<0))break;for(s=O==l?o:b;O;){if(w[--O]<s[O]){for(d=O;d&&!w[--d];)w[d]=9;--w[d],w[O]+=10}w[O]-=s[O]}for(;!w[0];)w.shift()}_[j++]=y?h:++h,w[0]&&y?w[O]=n[m]||0:w=[n[m]]}while((m++<g||w[0]!==p)&&i--);return _[0]||1==j||(_.shift(),S.e--,A--),j>A&&v(S,A,r.RM,w[0]!==p),S},h.eq=function(t){return 0===this.cmp(t)},h.gt=function(t){return this.cmp(t)>0},h.gte=function(t){return this.cmp(t)>-1},h.lt=function(t){return this.cmp(t)<0},h.lte=function(t){return this.cmp(t)<1},h.minus=h.sub=function(t){var e,r,n,o,i=this,a=i.constructor,u=i.s,l=(t=new a(t)).s;if(u!=l)return t.s=-l,i.plus(t);var c=i.c.slice(),s=i.e,f=t.c,h=t.e;if(!c[0]||!f[0])return f[0]?t.s=-l:c[0]?t=new a(i):t.s=1,t;if(u=s-h){for((o=u<0)?(u=-u,n=c):(h=s,n=f),n.reverse(),l=u;l--;)n.push(0);n.reverse()}else for(r=((o=c.length<f.length)?c:f).length,u=l=0;l<r;l++)if(c[l]!=f[l]){o=c[l]<f[l];break}if(o&&(n=c,c=f,f=n,t.s=-t.s),(l=(r=f.length)-(e=c.length))>0)for(;l--;)c[e++]=0;for(l=e;r>u;){if(c[--r]<f[r]){for(e=r;e&&!c[--e];)c[e]=9;--c[e],c[r]+=10}c[r]-=f[r]}for(;0===c[--l];)c.pop();for(;0===c[0];)c.shift(),--h;return c[0]||(t.s=1,c=[h=0]),t.c=c,t.e=h,t},h.mod=function(t){var e,r=this,n=r.constructor,o=r.s,i=(t=new n(t)).s;if(!t.c[0])throw Error(f);return r.s=t.s=1,e=1==t.cmp(r),r.s=o,t.s=i,e?new n(r):(o=n.DP,i=n.RM,n.DP=n.RM=0,r=r.div(t),n.DP=o,n.RM=i,this.minus(r.times(t)))},h.neg=function(){var t=new this.constructor(this);return t.s=-t.s,t},h.plus=h.add=function(t){var e,r,n,o=this,i=o.constructor;if(t=new i(t),o.s!=t.s)return t.s=-t.s,o.minus(t);var a=o.e,u=o.c,l=t.e,c=t.c;if(!u[0]||!c[0])return c[0]||(u[0]?t=new i(o):t.s=o.s),t;if(u=u.slice(),e=a-l){for(e>0?(l=a,n=c):(e=-e,n=u),n.reverse();e--;)n.push(0);n.reverse()}for(u.length-c.length<0&&(n=c,c=u,u=n),e=c.length,r=0;e;u[e]%=10)r=(u[--e]=u[e]+c[e]+r)/10|0;for(r&&(u.unshift(r),++l),e=u.length;0===u[--e];)u.pop();return t.c=u,t.e=l,t},h.pow=function(t){var e=this,r=new e.constructor("1"),n=r,o=t<0;if(t!==~~t||t<-1e6||t>1e6)throw Error(l+"exponent");for(o&&(t=-t);1&t&&(n=n.times(e)),t>>=1;)e=e.times(e);return o?r.div(n):n},h.prec=function(t,e){if(t!==~~t||t<1||t>a)throw Error(l+"precision");return v(new this.constructor(this),t,e)},h.round=function(t,e){if(t===p)t=0;else if(t!==~~t||t<-a||t>a)throw Error(c);return v(new this.constructor(this),t+this.e+1,e)},h.sqrt=function(){var t,e,r,n=this,o=n.constructor,i=n.s,a=n.e,l=new o("0.5");if(!n.c[0])return new o(n);if(i<0)throw Error(u+"No square root");0===(i=Math.sqrt(n+""))||i===1/0?((e=n.c.join("")).length+a&1||(e+="0"),a=((a+1)/2|0)-(a<0||1&a),t=new o(((i=Math.sqrt(e))==1/0?"5e":(i=i.toExponential()).slice(0,i.indexOf("e")+1))+a)):t=new o(i+""),a=t.e+(o.DP+=4);do{r=t,t=l.times(r.plus(n.div(r)))}while(r.c.slice(0,a).join("")!==t.c.slice(0,a).join(""));return v(t,(o.DP-=4)+t.e+1,o.RM)},h.times=h.mul=function(t){var e,r=this,n=r.constructor,o=r.c,i=(t=new n(t)).c,a=o.length,u=i.length,l=r.e,c=t.e;if(t.s=r.s==t.s?1:-1,!o[0]||!i[0])return t.c=[t.e=0],t;for(t.e=l+c,a<u&&(e=o,o=i,i=e,c=a,a=u,u=c),e=new Array(c=a+u);c--;)e[c]=0;for(l=u;l--;){for(u=0,c=a+l;c>l;)u=e[c]+i[l]*o[c-l-1]+u,e[c--]=u%10,u=u/10|0;e[c]=u}for(u?++t.e:e.shift(),l=e.length;!e[--l];)e.pop();return t.c=e,t},h.toExponential=function(t,e){var r=this,n=r.c[0];if(t!==p){if(t!==~~t||t<0||t>a)throw Error(c);for(r=v(new r.constructor(r),++t,e);r.c.length<t;)r.c.push(0)}return d(r,!0,!!n)},h.toFixed=function(t,e){var r=this,n=r.c[0];if(t!==p){if(t!==~~t||t<0||t>a)throw Error(c);for(t=t+(r=v(new r.constructor(r),t+r.e+1,e)).e+1;r.c.length<t;)r.c.push(0)}return d(r,!1,!!n)},h[Symbol.for("nodejs.util.inspect.custom")]=h.toJSON=h.toString=function(){var t=this,e=t.constructor;return d(t,t.e<=e.NE||t.e>=e.PE,!!t.c[0])},h.toNumber=function(){var t=Number(d(this,!0,!0));if(!0===this.constructor.strict&&!this.eq(t.toString()))throw Error(u+"Imprecise conversion");return t},h.toPrecision=function(t,e){var r=this,n=r.constructor,o=r.c[0];if(t!==p){if(t!==~~t||t<1||t>a)throw Error(l+"precision");for(r=v(new n(r),t,e);r.c.length<t;)r.c.push(0)}return d(r,t<=r.e||r.e<=n.NE||r.e>=n.PE,!!o)},h.valueOf=function(){var t=this,e=t.constructor;if(!0===e.strict)throw Error(u+"valueOf disallowed");return d(t,t.e<=e.NE||t.e>=e.PE,!0)},function t(){function e(r){var n=this;if(!(n instanceof e))return r===p?t():new e(r);if(r instanceof e)n.s=r.s,n.e=r.e,n.c=r.c.slice();else{if("string"!=typeof r){if(!0===e.strict&&"bigint"!=typeof r)throw TypeError(l+"value");r=0===r&&1/r<0?"-0":String(r)}!function(t,e){var r,n,o;if(!y.test(e))throw Error(l+"number");for(t.s="-"==e.charAt(0)?(e=e.slice(1),-1):1,(r=e.indexOf("."))>-1&&(e=e.replace(".","")),(n=e.search(/e/i))>0?(r<0&&(r=n),r+=+e.slice(n+1),e=e.substring(0,n)):r<0&&(r=e.length),o=e.length,n=0;n<o&&"0"==e.charAt(n);)++n;if(n==o)t.c=[t.e=0];else{for(;o>0&&"0"==e.charAt(--o););for(t.e=r-n-1,t.c=[],r=0;n<=o;)t.c[r++]=+e.charAt(n++)}}(n,r)}n.constructor=e}return e.prototype=h,e.DP=20,e.RM=1,e.NE=-7,e.PE=21,e.strict=!1,e.roundDown=0,e.roundHalfUp=1,e.roundHalfEven=2,e.roundUp=3,e}();var S=function(t){function e(){var t,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Not enough data";return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),t=function(t,e,r){return e=O(e),function(t,e){if(e&&("object"==b(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,g()?Reflect.construct(e,r||[],O(t).constructor):e.apply(t,r))}(this,e,[r]),Object.setPrototypeOf(t,(this instanceof e?this.constructor:void 0).prototype),t.name="NotEnoughDataError",t}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&w(t,e)}(e,t),r=e,Object.defineProperty(r,"prototype",{writable:!1}),r;var r}(m(Error));function _(t){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_(t)}function j(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,P(n.key),n)}}function A(t,e,r){return(e=P(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function P(t){var e=function(t,e){if("object"!=_(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=_(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==_(e)?e:e+""}var E=function(){return t=function t(){(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")})(this,t),A(this,"previousHighest",void 0),A(this,"highest",void 0),A(this,"previousLowest",void 0),A(this,"lowest",void 0),A(this,"previousResult",void 0),A(this,"result",void 0)},(e=[{key:"isStable",get:function(){return void 0!==this.result}},{key:"getResult",value:function(){if(void 0===this.result)throw new S;return this.result}},{key:"setResult",value:function(t,e){return e&&(this.highest=this.previousHighest,this.lowest=this.previousLowest,this.result=this.previousResult),void 0===this.highest?this.highest=t:t>this.highest?(this.previousHighest=this.highest,this.highest=t):this.previousHighest=this.highest,void 0===this.lowest?this.lowest=t:t<this.lowest?(this.previousLowest=this.lowest,this.lowest=t):this.previousLowest=this.lowest,this.previousResult=this.result,this.result=t}},{key:"replace",value:function(t){return this.update(t,!0)}}])&&j(t.prototype,e),r&&j(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e,r}();function k(t){return k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k(t)}function I(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,C(n.key),n)}}function T(t,e,r){return e=x(e),function(t,e){if(e&&("object"==k(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,M()?Reflect.construct(e,r||[],x(t).constructor):e.apply(t,r))}function M(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(M=function(){return!!t})()}function x(t){return x=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},x(t)}function R(t,e){return R=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},R(t,e)}function C(t){var e=function(t,e){if("object"!=k(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=k(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==k(e)?e:e+""}var D=function(t){function e(t){var r,n,o,i;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),n=r=T(this,e),i=void 0,(o=C(o="interval"))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i,r.interval=t,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&R(t,e)}(e,t),r=e,(n=[{key:"updates",value:function(t){var e=this;return t.forEach((function(t){return e.update(t)})),this.result}},{key:"replace",value:function(t){return this.update(t,!0)}}])&&I(r.prototype,n),o&&I(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(E);function z(t){return z="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},z(t)}function B(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,$(n.key),n)}}function L(t,e,r){return e=H(e),function(t,e){if(e&&("object"==z(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,V()?Reflect.construct(e,r||[],H(t).constructor):e.apply(t,r))}function V(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(V=function(){return!!t})()}function H(t){return H=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},H(t)}function U(t,e){return U=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},U(t,e)}function $(t){var e=function(t,e){if("object"!=z(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=z(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==z(e)?e:e+""}var F=function(t){function e(){var t,r,n,o;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e);for(var i=arguments.length,a=new Array(i),u=0;u<i;u++)a[u]=arguments[u];return r=t=L(this,e,[].concat(a)),o=[],(n=$(n="prices"))in r?Object.defineProperty(r,n,{value:o,enumerable:!0,configurable:!0,writable:!0}):r[n]=o,t}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&U(t,e)}(e,t),r=e,n=[{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.prices.length&&e?this.prices[this.prices.length-1]=t:this.prices.push(t),this.prices.length>this.interval&&this.prices.shift(),this.prices.length===this.interval){var r=this.prices.reduce((function(t,e){return t+e}),0);return this.setResult(r/this.prices.length,e)}}}],n&&B(r.prototype,n),o&&B(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(D);function N(t){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},N(t)}function q(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Q(n.key),n)}}function G(t,e,r){return e=J(e),function(t,e){if(e&&("object"==N(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,K()?Reflect.construct(e,r||[],J(t).constructor):e.apply(t,r))}function K(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(K=function(){return!!t})()}function J(t){return J=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},J(t)}function Y(t,e){return Y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Y(t,e)}function W(t,e,r){return(e=Q(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Q(t){var e=function(t,e){if("object"!=N(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=N(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==N(e)?e:e+""}var X=function(t){function e(t){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),W(r=G(this,e),"interval",void 0),W(r,"indicator",void 0),W(r,"smoothingFactor",void 0),r.interval=t,r.indicator=new F(t),r.smoothingFactor=1/r.interval,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Y(t,e)}(e,t),r=e,n=[{key:"updates",value:function(t){var e=this;return t.forEach((function(t){return e.update(t)})),this.result}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.indicator.update(t);if(e&&void 0!==this.previousResult){var n=(t-this.previousResult)*this.smoothingFactor;return this.setResult(n+this.previousResult,e)}if(!e&&void 0!==this.result){var o=(t-this.result)*this.smoothingFactor;return this.setResult(o+this.result,e)}if(void 0===this.result&&void 0!==r)return this.setResult(r,e)}}],n&&q(r.prototype,n),o&&q(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(E);function Z(t){return t.length?t.reduce((function(t,e){return t+e}),0)/t.length:0}function tt(t){return tt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},tt(t)}function et(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,nt(n.key),n)}}function rt(t,e,r){return(e=nt(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function nt(t){var e=function(t,e){if("object"!=tt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=tt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==tt(e)?e:e+""}var ot=function(){return t=function t(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")})(this,t),rt(this,"interval",void 0),rt(this,"deviationMultiplier",void 0),rt(this,"prices",[]),rt(this,"result",void 0),this.interval=e,this.deviationMultiplier=r},(e=[{key:"update",value:function(t){if(this.prices.push(t),this.prices.length>this.interval){this.prices.shift();var e=Z(this.prices),r=function(t,e){var r=e||Z(t),n=Z(t.map((function(t){return t-r})).map((function(t){return t*t})));return Math.sqrt(n)}(this.prices,e);return this.result={lower:e-r*this.deviationMultiplier,middle:e,upper:e+r*this.deviationMultiplier}}}},{key:"getResult",value:function(){if(void 0===this.result)throw new S;return this.result}},{key:"isStable",get:function(){return void 0!==this.result}}])&&et(t.prototype,e),r&&et(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e,r}();function it(t){return it="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},it(t)}function at(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,ht(n.key),n)}}function ut(t,e,r){return e=ct(e),function(t,e){if(e&&("object"==it(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,lt()?Reflect.construct(e,r||[],ct(t).constructor):e.apply(t,r))}function lt(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(lt=function(){return!!t})()}function ct(t){return ct=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},ct(t)}function st(t,e){return st=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},st(t,e)}function ft(t,e,r){return(e=ht(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function ht(t){var e=function(t,e){if("object"!=it(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=it(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==it(e)?e:e+""}var pt=function(t){function e(t){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),ft(r=ut(this,e,[t]),"interval",void 0),ft(r,"pricesCounter",0),ft(r,"weightFactor",void 0),r.interval=t,r.weightFactor=2/(r.interval+1),r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&st(t,e)}(e,t),r=e,n=[{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return e?e&&0===this.pricesCounter&&this.pricesCounter++:this.pricesCounter++,e&&void 0!==this.previousResult?this.setResult(t*this.weightFactor+this.previousResult*(1-this.weightFactor),e):this.setResult(t*this.weightFactor+(void 0!==this.result?this.result:t)*(1-this.weightFactor),e)}},{key:"getResult",value:function(){if(this.pricesCounter<this.interval)throw new S;return this.result}},{key:"isStable",get:function(){try{return this.getResult(),!0}catch(t){return!1}}}],n&&at(r.prototype,n),o&&at(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(D);function yt(t){return yt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},yt(t)}function vt(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,bt(n.key),n)}}function dt(t,e,r){return(e=bt(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function bt(t){var e=function(t,e){if("object"!=yt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=yt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==yt(e)?e:e+""}var mt=function(){return t=function t(e,r,n){(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")})(this,t),dt(this,"short",void 0),dt(this,"long",void 0),dt(this,"signal",void 0),dt(this,"prices",[]),dt(this,"result",void 0),this.short=e,this.long=r,this.signal=n},e=[{key:"getResult",value:function(){if(void 0===this.result)throw new S;return this.result}},{key:"isStable",get:function(){return void 0!==this.result}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.prices.length&&e?this.prices[this.prices.length-1]=t:this.prices.push(t);var r=this.short.update(t,e),n=this.long.update(t,e);if(this.prices.length>this.long.interval&&this.prices.shift(),this.prices.length===this.long.interval){var o=r-n,i=this.signal.update(o,e);return this.result={histogram:o-i,macd:o,signal:i}}}}],e&&vt(t.prototype,e),r&&vt(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e,r}();function gt(t){return gt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},gt(t)}function wt(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Pt(n.key),n)}}function Ot(t,e,r){return e=_t(e),function(t,e){if(e&&("object"==gt(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,St()?Reflect.construct(e,r||[],_t(t).constructor):e.apply(t,r))}function St(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(St=function(){return!!t})()}function _t(t){return _t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_t(t)}function jt(t,e){return jt=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},jt(t,e)}function At(t,e,r){return(e=Pt(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Pt(t){var e=function(t,e){if("object"!=gt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=gt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==gt(e)?e:e+""}var Et=function(t){function e(t){var r,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:X;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),At(r=Ot(this,e),"interval",void 0),At(r,"previousPrices",[]),At(r,"avgGain",void 0),At(r,"avgLoss",void 0),At(r,"maxValue",100),r.interval=t,r.avgGain=new n(r.interval),r.avgLoss=new n(r.interval),r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&jt(t,e)}(e,t),r=e,n=[{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.previousPrices.length&&e?this.previousPrices[this.previousPrices.length-1]=t:this.previousPrices.push(t),!(this.previousPrices.length<2)){var r=t,n=this.previousPrices[this.previousPrices.length-2];if(r>n?(this.avgLoss.update(0,e),this.avgGain.update(t-n,e)):(this.avgLoss.update(n-r,e),this.avgGain.update(0,e)),this.avgGain.isStable){var o=this.avgLoss.getResult();if(0===o)return this.setResult(100,e);var i=this.avgGain.getResult()/o;return this.setResult(this.maxValue-this.maxValue/(i+1),e)}}}}],n&&wt(r.prototype,n),o&&wt(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(E);function kt(t){return kt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},kt(t)}function It(t){return function(t){if(Array.isArray(t))return Tt(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Tt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Tt(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Tt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Mt(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=kt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=kt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==kt(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function xt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Rt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Ct(t){return Ct="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ct(t)}function Dt(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=Ct(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=Ct(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Ct(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function zt(t){return function(t){if(Array.isArray(t))return Bt(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Bt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Bt(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Bt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Lt(t){return Lt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Lt(t)}function Vt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var Ht=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1.5,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5;if(null===t||null===e||null===r)return null;if(n<2)throw new Error("numLevels must be at least 2");for(var o=4*r/(n-1),i=[],a=0;a<n-1;a++)i.push(e-2*r+a*o);for(var u=i.length-1;u>=0;u--)if(t>i[u])return(u+1)/(n-1);return 0};function Ut(t){return Ut="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ut(t)}function $t(t){return function(t){if(Array.isArray(t))return Ft(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Ft(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ft(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ft(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Nt(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function qt(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?Nt(Object(r),!0).forEach((function(e){Gt(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):Nt(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}function Gt(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=Ut(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=Ut(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Ut(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Kt(t){return Kt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Kt(t)}function Jt(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=Wt(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function Yt(t){return function(t){if(Array.isArray(t))return Qt(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Wt(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Wt(t,e){if(t){if("string"==typeof t)return Qt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Qt(t,e):void 0}}function Qt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Xt(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Zt(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=Kt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=Kt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Kt(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function te(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function ee(t){return function(t){if(Array.isArray(t))return re(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return re(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?re(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function re(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function ne(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],l=!0,c=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);l=!0);}catch(t){c=!0,o=t}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}(t,e)||ie(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function oe(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=ie(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function ie(t,e){if(t){if("string"==typeof t)return ae(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ae(t,e):void 0}}function ae(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function ue(t){return ue="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},ue(t)}var le=function(t,e){if(0===e){var r=t.inputParams.filter((function(t){return"lag"===t.key}));if("object"!==ue(r))return;var n,o=r.map((function(t){return t.params})),i=oe(o);try{for(i.s();!(n=i.n()).done;){var a,u=ne(n.value,2),l=u[0],c=u[1],s=oe(l);try{for(s.s();!(a=s.n()).done;){var f=a.value;if(t.priceBased.includes(f))for(var h=1;h<=c;h++)t.priceBased.push("".concat(f,"_lag_").concat(h))}}catch(t){s.e(t)}finally{s.f()}}}catch(t){i.e(t)}finally{i.f()}t.instances.lag={lagParams:o}}var p,y,v=oe(t.instances.lag.lagParams);try{for(v.s();!(p=v.n()).done;){var d,b=ne(p.value,2),m=b[0],g=b[1],w=oe(m);try{for(w.s();!(d=w.n()).done;){var O=d.value,S=t.verticalOhlcv[O];if(0===e)for(var _=1;_<=g;_++){var j="".concat(O,"_lag_").concat(_);t.verticalOhlcv[j]=function(t){if(Array.isArray(t))return ae(t)}(y=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(y)||ie(y)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}for(var A=1;A<=g;A++){var P="".concat(O,"_lag_").concat(A),E=e-A;if(E<=0)break;t.pushToMain({index:e,key:P,value:S[E]})}}}catch(t){w.e(t)}finally{w.f()}}}catch(t){v.e(t)}finally{v.f()}return!0};function ce(t,e){if(t){if("string"==typeof t)return se(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?se(t,e):void 0}}function se(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function fe(t){return fe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},fe(t)}function he(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,pe(n.key),n)}}function pe(t){var e=function(t,e){if("object"!=fe(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=fe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==fe(e)?e:e+""}var ye=function(t,e){return t>e},ve=function(t,e){return t<e},de=function(){return t=function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),Object.assign(this,{interval:0,prevState:.5,prevFast:null,prevSlow:null,prevHigh:null,prevLow:null,areHighAndLowUndefined:!1,index:0,crossIndexes:{up:[],down:[]}})},(e=[{key:"update",value:function(t){var e=t.fast,r=t.high,n=t.slow,o=t.low,i=this.prevState;this.areHighAndLowUndefined||void 0!==r&&void 0!==o||(this.areHighAndLowUndefined=!0),null===e||null===n||function(t,e){return t===e}(e,n)?i=.5:ye(e,n)?i=this.areHighAndLowUndefined?1:[o,n,this.prevLow,this.prevSlow].every((function(t){return null!==t}))&&ve(o,n)&&ye(this.prevLow,this.prevSlow)?0:1:ve(e,n)&&(i=this.areHighAndLowUndefined?0:[r,n,this.prevHigh,this.prevSlow].every((function(t){return null!==t}))&&ye(r,n)&&ve(this.prevHigh,this.prevSlow)?1:0),.5===i?this.interval=0:1===i?this.prevState<=.5?this.interval=1:this.interval++:0===i&&(this.prevState>=.5?this.interval=-1:this.interval--),1===this.interval&&this.crossIndexes.up.push(this.index),-1===this.interval&&this.crossIndexes.down.push(this.index),Object.assign(this,{index:this.index+1,prevState:i,prevFast:e,prevSlow:n,prevHigh:r,prevLow:o})}},{key:"getResult",value:function(){return this.interval}}])&&he(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}(),be=function(t,e){if(0===e){var r=t.inputParams.filter((function(t){return"crossPairs"===t.key}));if("object"!==fe(r))return;t.instances.crossPairs={crossPairsList:r.flatMap((function(t){return t.params.flat()}))}}var n,o,i=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=ce(t))){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(t.instances.crossPairs.crossPairsList);try{for(i.s();!(n=i.n()).done;){var a=n.value,u=a.fast,l=a.slow;if(u&&l){var c="".concat(u,"_x_").concat(l);if(0===e){if("number"==typeof l&&(t.verticalOhlcv[l]=new Array(t.len).fill(l)),"price"!==u&&!t.verticalOhlcv.hasOwnProperty(u))throw Error('fast "'.concat(u,' not found in crossPairs"'));if(!t.verticalOhlcv.hasOwnProperty(l))throw Error('slow "'.concat(l,' not found in crossPairs"'));t.instances[c]=new de,t.verticalOhlcv[c]=function(t){if(Array.isArray(t))return se(t)}(o=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(o)||ce(o)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var s=void 0,f=void 0,h=void 0,p=void 0,y=void 0;"price"===u?(f=t.verticalOhlcv.close[e],h=t.verticalOhlcv.high[e],p=t.verticalOhlcv.low[e],y=t.verticalOhlcv[l][e],t.instances[c].update({fast:f,slow:y,high:h,low:p})):(s=t.verticalOhlcv[u][e],y=t.verticalOhlcv[l][e],t.instances[c].update({fast:s,slow:y})),t.pushToMain({index:e,key:c,value:t.instances[c].getResult()})}}}catch(t){i.e(t)}finally{i.f()}};function me(t){return function(t){if(Array.isArray(t))return ge(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ge(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ge(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ge(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function we(t){return function(t){if(Array.isArray(t))return Oe(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Oe(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Oe(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Oe(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var Se=["open","high","low","close","volume"];function _e(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=Pe(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function je(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r={};for(var n in t)if({}.hasOwnProperty.call(t,n)){if(e.includes(n))continue;r[n]=t[n]}return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)r=i[n],e.includes(r)||{}.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function Ae(t){return function(t){if(Array.isArray(t))return Ee(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Pe(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Pe(t,e){if(t){if("string"==typeof t)return Ee(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ee(t,e):void 0}}function Ee(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var ke=function(t){return t.replace(/(?!^-)[^0-9.]/g,"")},Ie={dateTime:function(t,e){if(0===e){if(!t.isValidDate)throw Error('dateTime method found and invalid "date" in input ohlcv');var r=t.verticalOhlcv.date[0].slice(0,10);Object.assign(t.instances,{dateTime:{prevDateStr:r,sessionDailyIndexCount:0,sessionIntradayIndexCount:0,cachedDayInfo:r}}),Object.assign(t.verticalOhlcv,{day_of_the_week:me(t.nullArray),day_of_the_month:me(t.nullArray),week_of_the_month:me(t.nullArray),hour:me(t.nullArray),month:me(t.nullArray),year:me(t.nullArray),session_daily_index:me(t.nullArray),session_intraday_index:me(t.nullArray)})}var n=t.verticalOhlcv.date[e],o=function(t){var e=new Date(t),r=e.getMonth(),n=e.getFullYear(),o=e.getHours(),i=e.getMinutes(),a=e.getDay(),u=e.getDate(),l=new Date(e.getFullYear(),e.getMonth(),1).getDay();return{month:r,year:n,hour:o,minute:i,day_of_the_week:a,day_of_the_month:u,week_of_the_month:Math.ceil((u+l)/7)}}(n),i=o.day_of_the_week,a=o.day_of_the_month,u=o.week_of_the_month,l=o.month,c=o.year,s=o.hour,f=n.slice(0,10);f!==t.instances.dateTime.prevDateStr&&(t.instances.dateTime.prevDateStr=f,t.instances.dateTime.sessionDailyIndexCount++,t.instances.dateTime.sessionIntradayIndexCount=0),t.pushToMain({index:e,key:"session_daily_index",value:t.instances.dateTime.sessionDailyIndexCount}),t.pushToMain({index:e,key:"session_intraday_index",value:t.instances.dateTime.sessionIntradayIndexCount}),t.pushToMain({index:e,key:"day_of_the_week",value:i}),t.pushToMain({index:e,key:"day_of_the_month",value:a}),t.pushToMain({index:e,key:"week_of_the_month",value:u}),t.pushToMain({index:e,key:"month",value:l}),t.pushToMain({index:e,key:"year",value:c}),t.pushToMain({index:e,key:"hour",value:s})},priceVariations:function(t,e){0===e&&(t.priceBased=we(new Set([].concat(we(t.priceBased),["mid_price_open_close","mid_price_high_low"]))),Object.assign(t.verticalOhlcv,{mid_price_open_close:we(t.nullArray),mid_price_high_low:we(t.nullArray)}));var r=t.verticalOhlcv.open[e],n=t.verticalOhlcv.high[e],o=t.verticalOhlcv.low[e],i=t.verticalOhlcv.close[e];t.pushToMain({index:e,key:"mid_price_open_close",value:(r+i)/2}),t.pushToMain({index:e,key:"mid_price_high_low",value:(n+o)/2})},rsi:function(t,e,r){var n,o,i=t.verticalOhlcv.close[e];0===e&&(t.crossPairsList.push({fast:"rsi_".concat(r),slow:"rsi_sma_".concat(r),isDefault:!0}),Object.assign(t.instances,Mt(Mt({},"rsi_".concat(r),new Et(r)),"rsi_sma_".concat(r),new F(r))),Object.assign(t.verticalOhlcv,Mt(Mt({},"rsi_".concat(r),It(t.nullArray)),"rsi_sma_".concat(r),It(t.nullArray)))),t.instances["rsi_".concat(r)].update(i,t.lastIndexReplace);try{n=t.instances["rsi_".concat(r)].getResult()}catch(t){n=null}n&&(t.pushToMain({index:e,key:"rsi_".concat(r),value:n}),t.instances["rsi_sma_".concat(r)].update(n,t.lastIndexReplace));try{o=t.instances["rsi_sma_".concat(r)].getResult()}catch(t){o=null}return o&&t.pushToMain({index:e,key:"rsi_sma_".concat(r),value:o}),!0},sma:function(t,e,r,n){var o,i,a=t.verticalOhlcv.close[e],u="string"==typeof n&&t.verticalOhlcv.hasOwnProperty(n)&&"close"!==n?"".concat(n,"_"):"",l="".concat(u,"sma_").concat(r);0===e&&(t.instances[l]=new F(r),t.verticalOhlcv[l]=function(t){if(Array.isArray(t))return xt(t)}(i=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(i)||function(t,e){if(t){if("string"==typeof t)return xt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?xt(t,e):void 0}}(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),t.instances[l].update(a,t.lastIndexReplace);try{o=t.instances[l].getResult()}catch(t){}o&&t.pushToMain({index:e,key:l,value:o})},ema:function(t,e,r,n){var o,i,a=t.verticalOhlcv.close[e],u="string"==typeof n&&t.verticalOhlcv.hasOwnProperty(n)&&"close"!==n?"".concat(n,"_"):"",l="".concat(u,"ema_").concat(r);0===e&&(t.instances[l]=new pt(r),t.verticalOhlcv[l]=function(t){if(Array.isArray(t))return Rt(t)}(i=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(i)||function(t,e){if(t){if("string"==typeof t)return Rt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Rt(t,e):void 0}}(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),t.instances[l].update(a,t.lastIndexReplace);try{o=t.instances[l].getResult()}catch(t){o=null}o&&t.pushToMain({index:e,key:l,value:o})},macd:function(t,e,r,n,o,i){var a=i.target,u="close"===a?"":"_".concat(a),l="".concat(r,"_").concat(n,"_").concat(o).concat(u);if(0===e){if(!t.verticalOhlcv.hasOwnProperty(a))throw new Error("Target property ".concat(a," not found in verticalOhlcv for macd."));var c=t.inputParams.filter((function(t){return"macd"===t.key})).length,s=c>1?"macd_".concat(l):"macd".concat(u);t.crossPairsList.push({fast:"".concat(s,"_diff"),slow:"".concat(s,"_dea"),isDefault:!0}),t.instances.hasOwnProperty("macd")||(t.instances.macd={numberOfIndicators:c,settings:{}}),t.instances.macd.settings[l]=new mt(new pt(r),new pt(n),new pt(o)),Object.assign(t.verticalOhlcv,Dt(Dt(Dt({},"".concat(s,"_diff"),zt(t.nullArray)),"".concat(s,"_dea"),zt(t.nullArray)),"".concat(s,"_histogram"),zt(t.nullArray)))}var f,h=t.instances.macd.numberOfIndicators>1?"macd_".concat(l):"macd".concat(u),p=t.instances.macd.settings[l],y=t.verticalOhlcv[a][e];p.update(y,t.lastIndexReplace);try{f=p.getResult()}catch(t){}return f&&(t.pushToMain({index:e,key:"".concat(h,"_diff"),value:f.macd}),t.pushToMain({index:e,key:"".concat(h,"_dea"),value:f.signal}),t.pushToMain({index:e,key:"".concat(h,"_histogram"),value:f.histogram})),!0},relativeVolume:function(t,e){var r,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10,o="relative_volume_".concat(n);0===e&&(t.instances[o]={instance:new F(n),prevRelativeVolumeSma:null},Object.assign(t.verticalOhlcv,function(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=Lt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=Lt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Lt(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}({},o,function(t){if(Array.isArray(t))return Vt(t)}(r=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(r)||function(t,e){if(t){if("string"==typeof t)return Vt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Vt(t,e):void 0}}(r)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())));var i,a=t.verticalOhlcv.volume[e],u=t.instances[o].instance;u.update(a,t.lastIndexReplace);try{i=u.getResult()}catch(t){}var l=t.instances[o].prevRelativeVolumeSma;return t.pushToMain({index:e,key:o,value:null!==i&&null!==l?a/l:null}),t.instances[o].prevRelativeVolumeSma=i,!0},donchianChannels:function(t,e,r,n,o){var i=o.height,a=o.range,u="".concat(r,"_").concat(n);if(0===e){var l=t.inputParams.filter((function(t){return"donchianChannels"===t.key})).length,c=l>1?"donchian_channel_".concat(u):"donchian_channel";Object.assign(t.verticalOhlcv,qt(qt(Gt(Gt(Gt({},"".concat(c,"_upper"),$t(t.nullArray)),"".concat(c,"_basis"),$t(t.nullArray)),"".concat(c,"_lower"),$t(t.nullArray)),i&&Gt({},"".concat(c,"_height"),$t(t.nullArray))),a&&Gt({},"".concat(c,"_range"),$t(t.nullArray)))),t.instances.hasOwnProperty("donchian_channel")||(t.instances.donchian_channel={numberOfIndicators:l,settings:{}}),t.instances.donchian_channel.settings[u]={heightInstance:i?new F("number"==typeof i&&i>0?i:r):null,maxDeque:[],minDeque:[]}}var s=t.instances.donchian_channel.numberOfIndicators>1?"donchian_channel_".concat(u):"donchian_channel",f=t.instances.donchian_channel.settings[u],h=f.heightInstance,p=f.maxDeque,y=f.minDeque,v=e-n,d=v+1,b=d-r;if(b<0||d>t.len)return!0;for(var m=t.verticalOhlcv.high,g=t.verticalOhlcv.low;p.length&&p[0]<b;)p.shift();for(;p.length&&m[p[p.length-1]]<=m[v];)p.pop();for(p.push(v);y.length&&y[0]<b;)y.shift();for(;y.length&&g[y[y.length-1]]>=g[v];)y.pop();y.push(v);var w=m[p[0]],O=g[y[0]],S=(w+O)/2,_=(t.verticalOhlcv.close[e]-O)/(w-O),j=w-O;if(i&&h&&h.update(j,t.lastIndexReplace),t.pushToMain({index:e,key:"".concat(s,"_upper"),value:w}),t.pushToMain({index:e,key:"".concat(s,"_basis"),value:S}),t.pushToMain({index:e,key:"".concat(s,"_lower"),value:O}),a&&t.pushToMain({index:e,key:"".concat(s,"_range"),value:_}),i&&h){var A;try{A=h.getResult()}catch(t){}A&&t.pushToMain({index:e,key:"".concat(s,"_height"),value:Ht(j,A,1.5)})}return!0},bollingerBands:function(t,e,r,n,o){var i,a=o.height,u=o.range,l=void 0===u?[]:u,c=o.zScore,s=void 0===c?[]:c,f=o.target,h="close"===f?"":"_".concat(f),p="".concat(r,"_").concat(n).concat(h);if(0===e){if(!(f in t.verticalOhlcv))throw new Error('bollingerBands could not find target "'.concat(f,'"'));var y=t.inputParams.filter((function(t){return"bollingerBands"===t.key})).length;i=y>1?"bollinger_bands_".concat(p):"bollinger_bands".concat(h),t.instances.bollinger_bands||(t.instances.bollinger_bands={numberOfIndicators:y,settings:{}}),t.instances.bollinger_bands.settings[p]={instance:new ot(r,n),heightInstance:a>=r?new F(a):null};var v,d=function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?Xt(Object(r),!0).forEach((function(e){Zt(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):Xt(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}(Zt(Zt(Zt({},"".concat(i,"_upper"),Yt(t.nullArray)),"".concat(i,"_middle"),Yt(t.nullArray)),"".concat(i,"_lower"),Yt(t.nullArray)),a>=r&&Zt({},"".concat(i,"_height"),Yt(t.nullArray))),b=Jt(l);try{for(b.s();!(v=b.n()).done;){var m=v.value;if(!(m in t.verticalOhlcv)||!t.priceBased.includes(m))throw new Error('Invalid range item value "'.concat(m,'" property for bollingerBands. Only price based key names are accepted:\n').concat(JSON.stringify(t.priceBased)));d["".concat(i,"_range_").concat(m)]=Yt(t.nullArray)}}catch(t){b.e(t)}finally{b.f()}var g,w=Jt(s);try{for(w.s();!(g=w.n()).done;){var O=g.value;if(!(O in t.verticalOhlcv)||!t.priceBased.includes(O))throw new Error('Invalid zScore item value "'.concat(O,'" for bollingerBands. Only price based key names are accepted:\n').concat(JSON.stringify(t.priceBased)));d["".concat(i,"_zscore_").concat(O)]=Yt(t.nullArray)}}catch(t){w.e(t)}finally{w.f()}Object.assign(t.verticalOhlcv,d)}i||(i=t.instances.bollinger_bands.numberOfIndicators>1?"bollinger_bands_".concat(p):"bollinger_bands".concat(h));var S,_=i,j=t.instances.bollinger_bands.settings[p],A=j.instance,P=j.heightInstance,E=t.verticalOhlcv[f][e];A.update(E,t.lastIndexReplace);try{S=A.getResult()}catch(t){}if(!S)return!0;var k=S,I=k.upper,T=k.middle,M=k.lower;if(t.pushToMain({index:e,key:"".concat(_,"_upper"),value:I}),t.pushToMain({index:e,key:"".concat(_,"_middle"),value:T}),t.pushToMain({index:e,key:"".concat(_,"_lower"),value:M}),!a&&!l)return!0;if(P){var x,R=I-M;P.update(R,t.lastIndexReplace);try{x=P.getResult()}catch(t){}x&&t.pushToMain({index:e,key:"".concat(_,"_height"),value:Ht(R,x,.5,7)})}var C,D=Jt(l);try{for(D.s();!(C=D.n()).done;){var z=C.value,B=(t.verticalOhlcv[z][e]-M)/(I-M);t.pushToMain({index:e,key:"".concat(_,"_range_").concat(z),value:B})}}catch(t){D.e(t)}finally{D.f()}var L,V=Jt(s);try{for(V.s();!(L=V.n()).done;){var H=L.value,U=I-M,$=0!==U?2*n*(t.verticalOhlcv[H][e]-T)/U:0;t.pushToMain({index:e,key:"".concat(_,"_zscore_").concat(H),value:$})}}catch(t){V.e(t)}finally{V.f()}return!0},volumeOscillator:function(t,e,r,n){var o,i=t.verticalOhlcv.volume[e],a="volume_oscillator";0===e&&(Object.assign(t.instances,{volume_oscillator:{fastEMA:new pt(r),slowEMA:new pt(n)}}),t.verticalOhlcv[a]=function(t){if(Array.isArray(t))return te(t)}(o=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(o)||function(t,e){if(t){if("string"==typeof t)return te(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?te(t,e):void 0}}(o)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),t.crossPairsList.push({fast:a,slow:0,isDefault:!0}));var u=t.instances[a],l=u.fastEMA,c=u.slowEMA;l.update(i,t.lastIndexReplace),c.update(i,t.lastIndexReplace);var s=null,f=null;try{s=l.getResult()}catch(t){s=null}try{f=c.getResult()}catch(t){f=null}return"number"==typeof s&&"number"==typeof f&&0!==f?t.pushToMain({index:e,key:a,value:100*(s-f)/f}):t.pushToMain({index:e,key:a,value:null}),!0},candleStudies:function(t,e,r){var n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},i=o.changeLevel,a=void 0===i?7:i,u=o.sizeLevel,l=void 0===u?5:u;0===e&&Object.assign(t.verticalOhlcv,{candle_gap_size:ee(t.nullArray),candle_body_size:ee(t.nullArray),candle_top_size:ee(t.nullArray),candle_bottom_size:ee(t.nullArray),candle_shadow_size:ee(t.nullArray),candle_close_direction:ee(t.nullArray),candle_high_direction:ee(t.nullArray),candle_low_direction:ee(t.nullArray),candle_open_direction:ee(t.nullArray)}),n&&0===e&&Object.assign(t.instances,{candleStudies:{topInstance:new F(r),bottomInstance:new F(r),gapInstance:new F(r),bodySizeInstance:new F(r),shadowSizeInstance:new F(r),closeDirectionInstance:new F(r),highDirectionInstance:new F(r),lowDirectionInstance:new F(r),openDirectionInstance:new F(r)}});var c=t.verticalOhlcv.open[e-1],s=t.verticalOhlcv.high[e-1],f=t.verticalOhlcv.low[e-1],h=t.verticalOhlcv.close[e-1];if(0===e)return!0;var p=t.verticalOhlcv.open[e],y=t.verticalOhlcv.high[e],v=t.verticalOhlcv.low[e],d=t.verticalOhlcv.close[e],b=d>p,m=Math.abs(d-p),g=Math.abs(y-v),w=y-Math.max(p,d),O=Math.min(p,d)-v,S=Math.abs(h-p),_=Math.abs(d-h),j=Math.abs(y-s),A=Math.abs(v-f),P=Math.abs(p-c),E=null,k=null,I=null,T=null,M=null,x=null,R=null,C=null,D=null;if(n){var z=t.instances.candleStudies,B=z.topInstance,L=z.bottomInstance,V=z.gapInstance,H=z.bodySizeInstance,U=z.shadowSizeInstance,$=z.closeDirectionInstance,N=z.highDirectionInstance,q=z.lowDirectionInstance,G=z.openDirectionInstance;B.update(Math.abs(w),t.lastIndexReplace),L.update(Math.abs(O),t.lastIndexReplace),U.update(Math.abs(g),t.lastIndexReplace),V.update(S,t.lastIndexReplace),H.update(m,t.lastIndexReplace),$.update(_,t.lastIndexReplace),N.update(j,t.lastIndexReplace),q.update(A,t.lastIndexReplace),G.update(P,t.lastIndexReplace);try{I=B.getResult(),k=L.getResult(),E=V.getResult(),T=H.getResult(),M=U.getResult(),x=$.getResult(),R=N.getResult(),C=q.getResult(),D=G.getResult()}catch(t){}t.pushToMain({index:e,key:"candle_body_size",value:b?Ht(m,T,2,a):-Math.abs(Ht(m,T,2,a))||0}),t.pushToMain({index:e,key:"candle_gap_size",value:b?Ht(S,E,2,a):-Math.abs(Ht(S,E,2,a))||0}),t.pushToMain({index:e,key:"candle_close_direction",value:b?Ht(_,x,2,a):-Math.abs(Ht(_,x,2,a))||0}),t.pushToMain({index:e,key:"candle_high_direction",value:b?Ht(j,R,2,a):-Math.abs(Ht(j,R,2,a))||0}),t.pushToMain({index:e,key:"candle_low_direction",value:b?Ht(A,C,2,a):-Math.abs(Ht(A,C,2,a))||0}),t.pushToMain({index:e,key:"candle_open_direction",value:b?Ht(P,D,2,a):-Math.abs(Ht(P,D,2,a))||0}),t.pushToMain({index:e,key:"candle_top_size",value:Ht(w,I,.5,l)}),t.pushToMain({index:e,key:"candle_bottom_size",value:Ht(O,k,.5,l)}),t.pushToMain({index:e,key:"candle_shadow_size",value:Ht(g,M,.5,l)})}else t.pushToMain({index:e,key:"candle_body_size",value:b?m:-m}),t.pushToMain({index:e,key:"candle_gap_size",value:b?S:-S}),t.pushToMain({index:e,key:"candle_close_direction",value:b?_:-_}),t.pushToMain({index:e,key:"candle_high_direction",value:b?j:-j}),t.pushToMain({index:e,key:"candle_low_direction",value:b?A:-A}),t.pushToMain({index:e,key:"candle_open_direction",value:b?P:-P}),t.pushToMain({index:e,key:"candle_top_size",value:w}),t.pushToMain({index:e,key:"candle_bottom_size",value:O}),t.pushToMain({index:e,key:"candle_shadow_size",value:g});return!0}},Te=function(t,e,r){var n=function(t){return r>1?t*r:t};if("number"===e)return n(t);if("string"===e){var o=ke(t);return n(Number(o))}return 0},Me=function(t,e){return"number"===e?t:"string"===e?Number(ke(t)):0},xe=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=e.len,i=e.inputParams;e.nullArray=new Array(o).fill(null);var a=["open","high","low","close","volume"],u=new Set(a);if(0===n){!function(t){var e,n=t.inputParams,o=t.len,i=r(n);try{for(i.s();!(e=i.n()).done;){var a,u=r(e.value.params);try{for(u.s();!(a=u.n()).done;){var l=a.value;if("number"==typeof l&&l>o)throw console.log(l,o),new Error("At least one of the params of the indicator is greater than the input OHLCV length. Make sure to have enough datapoints in the input OHLCV.")}}catch(t){u.e(t)}finally{u.f()}}}catch(t){i.e(t)}finally{i.f()}}(e),a.forEach((function(t){e.verticalOhlcv[t]=Ae(e.nullArray)}));var l=Object.keys(t[0]).filter((function(t){return!u.has(t)}));l.forEach((function(t){e.verticalOhlcv[t]=Ae(e.nullArray)})),e.otherKeys=l,function(t,e){for(var r=0,n=Object.keys(e.inputTypes);r<n.length;r++){var o=n[r];if(!(o in t))throw new Error('Property "'.concat(o,'" not found in ohlcv array. ').concat(e.ticker));var i=t[o];if("number"==typeof i&&i>0)e.inputTypes[o]="number";else{if("string"!=typeof i||!/^(\d+(\.\d*)?|\.\d+)$/.test(i))throw new Error('Invalid property "'.concat(o,'" in ohlcv array. ').concat(e.ticker));e.inputTypes[o]="string",i=ke(i)}if(0===e.precisionMultiplier&&!0===e.precision){var a=(c=String(i).split("."),s=2,function(t){if(Array.isArray(t))return t}(c)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],l=!0,c=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);l=!0);}catch(t){c=!0,o=t}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}(c,s)||Pe(c,s)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[1],u=void 0===a?"":a,l=Math.max(4,u.length);e.precisionMultiplier=l>1?Math.pow(10,l-1):1}}var c,s}(t[0],e)}else if(!e.otherKeys)throw new Error("otherKeys not found in main. Ensure you run with startIndex=0 first to initialize.");for(var c=function(t){return Array.isArray(t)?t.map((function(t){var e=t.key,r=t.params;return{key:e,fn:Ie[e],args:r}})):[]}(i),s=n;s<o;s++){var f=t[s],h=f.open,p=f.high,y=f.low,v=f.close,d=f.volume,b=je(f,Se),m=e.precisionMultiplier,g=Te(h,e.inputTypes.open,m),w=Te(p,e.inputTypes.high,m),O=Te(y,e.inputTypes.low,m),S=Te(v,e.inputTypes.close,m),_=Me(d,e.inputTypes.volume);e.pushToMain({index:s,key:"open",value:g}),e.pushToMain({index:s,key:"high",value:w}),e.pushToMain({index:s,key:"low",value:O}),e.pushToMain({index:s,key:"close",value:S}),e.pushToMain({index:s,key:"volume",value:_});var j,A=_e(e.otherKeys);try{for(A.s();!(j=A.n()).done;){var P=j.value;e.pushToMain({index:s,key:P,value:b[P]})}}catch(t){A.e(t)}finally{A.f()}var E,k=_e(c);try{for(k.s();!(E=k.n()).done;){var I=E.value,T=I.key,M=I.fn,x=I.args;["crossPairs","lag"].includes(T)||M.apply(void 0,[e,s].concat(Ae(x)))}}catch(t){k.e(t)}finally{k.f()}le(e,s),be(e,s),e.lastComputedIndex++}},Re=function(t,e){for(var r=t.length,n=new F(e),o=new Array(r),i=0,a=0,u=0,l=0;l<r;l++)if(n.update(t[l]),n.isStable){var c=n.getResult();o[l]=c,i+=c,a+=c*c,u++}else o[l]=null;var s=i/u,f=a/u-s*s,h=Math.sqrt(f);return o.map((function(t){return null!==t?(t-s)/h:null}))},Ce=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:5;if(t.length!==e.length)throw new Error("Both arrays must have the same length");for(var n=Re(t,r),o=Re(e,r),i=t.length,a=[],u=0,l=0,c=0,s=0,f=0,h=0,p=-1,y=0;y<i;y++){if(null!==n[y]&&null!==o[y]){p=y;break}a.push(0)}if(-1===p)return new Array(i).fill(0);for(var v=p;v<i;v++){var d=n[v],b=o[v];if(null!==d&&null!==b)if(u+=d,l+=b,c+=d*b,s+=d*d,f+=b*b,++h<2)a.push(0);else{var m=h*c-u*l,g=Math.sqrt((h*s-u*u)*(h*f-l*l)),w=0===g?0:m/g;a.push(w)}else u=l=c=s=f=h=0,a.push(0)}return a};function De(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var ze=function(t){for(var e=t.input,r=t.inputParams,n=new(0,t.OHLCV_INDICATORS)({input:e}),o=0;o<r.length;o++){var i=r[o],a=i.key,u=i.params;Array.isArray(u)&&(u.length>0?(Array.isArray(u)&&"crossPairs"===a&&Array.isArray(u[0])&&(u[0]=u[0].filter((function(t){return!t.isDefault}))),n[a].apply(n,function(t){if(Array.isArray(t))return De(t)}(l=u)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(l)||function(t,e){if(t){if("string"==typeof t)return De(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?De(t,e):void 0}}(l)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())):n[a]())}var l;return n};function Be(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var Le=function(t){for(var e=t.row,r=t.precisionMultiplier,n=t.priceBased,o={},i=0,a=Object.entries(e);i<a.length;i++){var u=(s=a[i],f=2,function(t){if(Array.isArray(t))return t}(s)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],l=!0,c=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);l=!0);}catch(t){c=!0,o=t}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}(s,f)||function(t,e){if(t){if("string"==typeof t)return Be(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Be(t,e):void 0}}(s,f)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),l=u[0],c=u[1];n.includes(l)&&(c/=r),o[l]=c}var s,f;return o};function Ve(t){return function(t){if(Array.isArray(t))return Fe(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||$e(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function He(t){return He="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},He(t)}function Ue(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],l=!0,c=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;l=!1}else for(;!(l=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);l=!0);}catch(t){c=!0,o=t}finally{try{if(!l&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(c)throw o}}return u}}(t,e)||$e(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $e(t,e){if(t){if("string"==typeof t)return Fe(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Fe(t,e):void 0}}function Fe(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Ne(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function qe(t,e,r){return(e=Ke(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Ge(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Ke(n.key),n)}}function Ke(t){var e=function(t,e){if("object"!=He(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=He(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==He(e)?e:e+""}var Je=function(){return t=function t(e){var r=e.input,n=e.ticker,o=void 0===n?null:n,i=e.precision,a=void 0===i||i;if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),!Array.isArray(r))throw Error("input OHLCV must be an array: "+o);if(0===r.length)throw Error("input OHLCV must not be empty: "+o);if(!r[0].hasOwnProperty("close"))throw Error("input OHLCV array objects require at least close property: "+o);return this.isComputed=!1,this.lastComputedIndex=0,this.input=r,this.inputTypes={open:"",high:"",low:"",close:"",volume:""},this.priceBased=["open","high","low","close"],this.len=r.length,this.lastIndexReplace=!1,this.instances={},this.crossPairsList=[],this.verticalOhlcv={},this.horizontalOhlcv=Array.from({length:this.len},(function(){return{}})),this.inputParams=[],this.studies={},this.utilities={correlation:Ce},this.precision=a,this.precisionMultiplier=!0===this.precision?0:1,this.setIndicatorsFromInputParams=ze,this},e=[{key:"pushToMain",value:function(t){var e=t.index,r=t.key,n=t.value;this.verticalOhlcv[r][e]=n,this.horizontalOhlcv[e][r]=n}},{key:"getDataAsCols",value:function(){this.compute();var t=this.precisionMultiplier,e=this.precision,r=function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?Ne(Object(r),!0).forEach((function(e){qe(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):Ne(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}({},this.verticalOhlcv);if(e)for(var n=0,o=Object.entries(r);n<o.length;n++){var i=Ue(o[n],2),a=i[0],u=i[1];this.priceBased.includes(a)&&(this.precision?r[a]=u.map((function(e){return e/t})):r[a]=u)}return r}},{key:"getData",value:function(){this.compute();var t=this.precisionMultiplier,e=this.priceBased;return this.precision?this.horizontalOhlcv.filter((function(t){return!Object.values(t).some((function(t){return null==t}))})).map((function(r){return Le({row:r,precisionMultiplier:t,priceBased:e})})):this.horizontalOhlcv.filter((function(t){return!Object.values(t).some((function(t){return null==t}))}))}},{key:"getLastValues",value:function(){this.compute();var t=this.precisionMultiplier,e=this.priceBased;return this.precision?Le({row:this.horizontalOhlcv[this.horizontalOhlcv.length-1],precisionMultiplier:t,priceBased:e}):this.horizontalOhlcv[this.horizontalOhlcv.length-1]}},{key:"compute",value:function(t){if(!0===this.isComputed&&!t)return this;if(this.isComputed=!1,this.isValidDate=this.input[0].hasOwnProperty("date")&&o(this.input[0].date),this.len>this.lastComputedIndex&&!t&&xe(this.input,this,0),t&&"object"===He(t)){var e;if(!["open","high","low","close","volume","date"].every((function(e){return Object.keys(t).includes(e)})))throw Error('Invalid OHLCV object sent in "compute". Correct usage: .compute({open: 108.25, high: 108.410004, low: 108.25, close: 99999999, volume: 875903, date: "2024-12-16 15:45:00" || "2024-12-16"})');if(!this.isValidDate)throw Error('All the OHLCV rows require a valid date property to access the compute change method. Correct date format: "2024-12-16 15:45:00" or "2024-12-16"');if(!o(t.date))throw Error('The date in the new OHLCV row is invalid. Correct date format: "2024-12-16 15:45:00" or "2024-12-16"');var r=t.date,n=this.len-1,i=null===(e=this.input[n])||void 0===e?void 0:e.date;0===this.lastComputedIndex&&this.compute(),i!==r?(this.len++,this.input.push(t),xe(this.input,this,this.len)):(this.input[n]=t,xe(this.input,this,n))}return this}},{key:"crossPairs",value:function(t){return i(this),this.crossPairsList=[].concat(Ve(this.crossPairsList),Ve(t)),this.inputParams.push({key:"crossPairs",params:[this.crossPairsList]}),this}},{key:"lag",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["close"],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;i(this),this.inputParams.push({key:"lag",params:[e,r]});for(var n=function(){var r=e[o];t.priceBased.find((function(t){return r.startsWith(t)}))&&t.priceBased.push(r)},o=0;o<e.length;o++)n();return this}},{key:"relativeVolume",value:function(t){return i(this),this.inputParams.push({key:"relativeVolume",params:[t]}),this}},{key:"ema",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i(this),!e||"object"!==He(e))throw new Error('"options" must be an object in ema. eg: {target, height, range}');var r=e.target,n=void 0===r?"close":r;if("number"!=typeof t||t<=0)throw new Error('"size" must be a positive number in ema.');return this.inputParams.push({key:"ema",params:[t,n]}),this.priceBased.push("ema_".concat(t)),this}},{key:"sma",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i(this),!e||"object"!==He(e))throw new Error('"options" must be an object in sma. eg: {target, height, range}');var r=e.target,n=void 0===r?"close":r;if("number"!=typeof t||t<=0)throw new Error('"size" must be a positive number in sma.');return this.inputParams.push({key:"sma",params:[t,n]}),this.priceBased.push("sma_".concat(t)),this}},{key:"macd",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:12,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:26,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:9,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(i(this),"number"!=typeof t||t<=0)throw new Error('"fast" must be a positive number in macd.');if("number"!=typeof e||e<=t)throw new Error('"slow" must be a positive number greater than "fast" in macd.');if("number"!=typeof r||r<=0)throw new Error('"signal" must be a positive number in macd.');if("object"!==He(n))throw new Error('"options" must be an object in macd. eg: {target}');var o=n.target,a=void 0===o?"close":o;return this.inputParams.push({key:"macd",params:[t,e,r,{target:a}]}),this}},{key:"bollingerBands",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(i(this),!r||"object"!==He(r))throw new Error('"options" must be an object in bollingerBands. eg: {target, height, range}');var n=r.target,o=void 0===n?"close":n,a=r.height,u=void 0===a?0:a,l=r.range,c=void 0===l?[]:l,s=r.zScore,f=void 0===s?[]:s;if("number"!=typeof t||t<=0)throw new Error('"size" must be a positive number in bollingerBands.');if("number"!=typeof e||e<=0)throw new Error('"stdDev" must be a positive number in bollingerBands.');if(!Array.isArray(c))throw new Error('If set, "range" must be a array of column names in bollingerBands.');if(!Array.isArray(f))throw new Error('If set, "zScore" must be a array of column names in bollingerBands.');if("number"!=typeof u||"number"==typeof u&&u>0&&u<t)throw new Error('"height" must be a "0" or any number greater than or equal to "size" in bollingerBands.');return this.inputParams.push({key:"bollingerBands",params:[t,e,{target:o,height:u,range:c,zScore:f}]}),this.priceBased.push("bollinger_bands_middle","bollinger_bands_upper","bollinger_bands_lower"),this}},{key:"rsi",value:function(t){if(i(this),"number"!=typeof t||t<=0)throw new Error('"size" must be a positive number in rsi.');return this.inputParams.push({key:"rsi",params:[t]}),this}},{key:"donchianChannels",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(i(this),"number"!=typeof t||t<=0)throw new Error('"size" must be a positive number or 0 in donchianChannels.');if("number"!=typeof e||e<=0)throw new Error('"offset" must be a positive number or 0 in donchianChannels.');var n=r.height,o=void 0!==n&&n,a=r.range,u=void 0!==a&&a;return this.inputParams.push({key:"donchianChannels",params:[t,e,{height:o,range:u}]}),this.priceBased.push("donchian_channel_upper","donchian_channel_lower","donchian_channel_basis"),this}},{key:"candleStudies",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20,e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],r=arguments.length>2?arguments[2]:void 0;if(i(this),"number"!=typeof t||t<=0)throw new Error('"size" must be a positive number or 0 in candleStudies.');if("boolean"!=typeof e)throw new Error('"classify" must be a true or false in candleStudies.');return this.inputParams.push({key:"candleStudies",params:[t,e,r]}),this}},{key:"volumeOscillator",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:5,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;if(i(this),"number"!=typeof t||t<=0)throw new Error('fastSize" must be a positive number in volumeOscillator.');if("number"!=typeof e||e<=t)throw new Error('"slowSize" must be a positive number greater than the "fastSize" in volumeOscillator.');return this.inputParams.push({key:"volumeOscillator",params:[t,e]}),this}},{key:"dateTime",value:function(){return i(this),this.inputParams.push({key:"dateTime",params:[]}),this}},{key:"priceVariations",value:function(){return i(this),this.inputParams.push({key:"priceVariations",params:[]}),this}}],e&&Ge(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}()})(),OHLCV_INDICATORS=e})();
1
+ var OHLCV_INDICATORS;(()=>{"use strict";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};(()=>{function r(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return n(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var o=0,i=function(){};return{s:i,n:function(){return o>=t.length?{done:!0}:{done:!1,value:t[o++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,u=!0,c=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return u=t.done,t},e:function(t){c=!0,a=t},f:function(){try{u||null==r.return||r.return()}finally{if(c)throw a}}}}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}t.r(e),t.d(e,{default:()=>We});var o=function(t){return"string"==typeof t&&/^\d{4}-\d{2}-\d{2}/.test(t)},i=function(t){if(0!==t.lastComputedIndex)throw Error('ohlcv is already computed, you can not add new indicators after "compute", "getLastValues" , "getDataAsCols" or "getData" methods are called.')},a=1e6,u="[big.js] ",c=u+"Invalid ",l=c+"decimal places",s=c+"rounding mode",f=u+"Division by zero",h={},p=void 0,y=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;function v(t,e,r,n){var o=t.c;if(r===p&&(r=t.constructor.RM),0!==r&&1!==r&&2!==r&&3!==r)throw Error(s);if(e<1)n=3===r&&(n||!!o[0])||0===e&&(1===r&&o[0]>=5||2===r&&(o[0]>5||5===o[0]&&(n||o[1]!==p))),o.length=1,n?(t.e=t.e-e+1,o[0]=1):o[0]=t.e=0;else if(e<o.length){if(n=1===r&&o[e]>=5||2===r&&(o[e]>5||5===o[e]&&(n||o[e+1]!==p||1&o[e-1]))||3===r&&(n||!!o[0]),o.length=e,n)for(;++o[--e]>9;)if(o[e]=0,0===e){++t.e,o.unshift(1);break}for(e=o.length;!o[--e];)o.pop()}return t}function d(t,e,r){var n=t.e,o=t.c.join(""),i=o.length;if(e)o=o.charAt(0)+(i>1?"."+o.slice(1):"")+(n<0?"e":"e+")+n;else if(n<0){for(;++n;)o="0"+o;o="0."+o}else if(n>0)if(++n>i)for(n-=i;n--;)o+="0";else n<i&&(o=o.slice(0,n)+"."+o.slice(n));else i>1&&(o=o.charAt(0)+"."+o.slice(1));return t.s<0&&r?"-"+o:o}function b(t){return b="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},b(t)}function m(t){var e="function"==typeof Map?new Map:void 0;return m=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,r)}function r(){return function(t,e,r){if(g())return Reflect.construct.apply(null,arguments);var n=[null];n.push.apply(n,e);var o=new(t.bind.apply(t,n));return r&&w(o,r.prototype),o}(t,arguments,O(this).constructor)}return r.prototype=Object.create(t.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),w(r,t)},m(t)}function g(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(g=function(){return!!t})()}function w(t,e){return w=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},w(t,e)}function O(t){return O=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},O(t)}h.abs=function(){var t=new this.constructor(this);return t.s=1,t},h.cmp=function(t){var e,r=this,n=r.c,o=(t=new r.constructor(t)).c,i=r.s,a=t.s,u=r.e,c=t.e;if(!n[0]||!o[0])return n[0]?i:o[0]?-a:0;if(i!=a)return i;if(e=i<0,u!=c)return u>c^e?1:-1;for(a=(u=n.length)<(c=o.length)?u:c,i=-1;++i<a;)if(n[i]!=o[i])return n[i]>o[i]^e?1:-1;return u==c?0:u>c^e?1:-1},h.div=function(t){var e=this,r=e.constructor,n=e.c,o=(t=new r(t)).c,i=e.s==t.s?1:-1,u=r.DP;if(u!==~~u||u<0||u>a)throw Error(l);if(!o[0])throw Error(f);if(!n[0])return t.s=i,t.c=[t.e=0],t;var c,s,h,y,d,b=o.slice(),m=c=o.length,g=n.length,w=n.slice(0,c),O=w.length,S=t,_=S.c=[],j=0,A=u+(S.e=e.e-t.e)+1;for(S.s=i,i=A<0?0:A,b.unshift(0);O++<c;)w.push(0);do{for(h=0;h<10;h++){if(c!=(O=w.length))y=c>O?1:-1;else for(d=-1,y=0;++d<c;)if(o[d]!=w[d]){y=o[d]>w[d]?1:-1;break}if(!(y<0))break;for(s=O==c?o:b;O;){if(w[--O]<s[O]){for(d=O;d&&!w[--d];)w[d]=9;--w[d],w[O]+=10}w[O]-=s[O]}for(;!w[0];)w.shift()}_[j++]=y?h:++h,w[0]&&y?w[O]=n[m]||0:w=[n[m]]}while((m++<g||w[0]!==p)&&i--);return _[0]||1==j||(_.shift(),S.e--,A--),j>A&&v(S,A,r.RM,w[0]!==p),S},h.eq=function(t){return 0===this.cmp(t)},h.gt=function(t){return this.cmp(t)>0},h.gte=function(t){return this.cmp(t)>-1},h.lt=function(t){return this.cmp(t)<0},h.lte=function(t){return this.cmp(t)<1},h.minus=h.sub=function(t){var e,r,n,o,i=this,a=i.constructor,u=i.s,c=(t=new a(t)).s;if(u!=c)return t.s=-c,i.plus(t);var l=i.c.slice(),s=i.e,f=t.c,h=t.e;if(!l[0]||!f[0])return f[0]?t.s=-c:l[0]?t=new a(i):t.s=1,t;if(u=s-h){for((o=u<0)?(u=-u,n=l):(h=s,n=f),n.reverse(),c=u;c--;)n.push(0);n.reverse()}else for(r=((o=l.length<f.length)?l:f).length,u=c=0;c<r;c++)if(l[c]!=f[c]){o=l[c]<f[c];break}if(o&&(n=l,l=f,f=n,t.s=-t.s),(c=(r=f.length)-(e=l.length))>0)for(;c--;)l[e++]=0;for(c=e;r>u;){if(l[--r]<f[r]){for(e=r;e&&!l[--e];)l[e]=9;--l[e],l[r]+=10}l[r]-=f[r]}for(;0===l[--c];)l.pop();for(;0===l[0];)l.shift(),--h;return l[0]||(t.s=1,l=[h=0]),t.c=l,t.e=h,t},h.mod=function(t){var e,r=this,n=r.constructor,o=r.s,i=(t=new n(t)).s;if(!t.c[0])throw Error(f);return r.s=t.s=1,e=1==t.cmp(r),r.s=o,t.s=i,e?new n(r):(o=n.DP,i=n.RM,n.DP=n.RM=0,r=r.div(t),n.DP=o,n.RM=i,this.minus(r.times(t)))},h.neg=function(){var t=new this.constructor(this);return t.s=-t.s,t},h.plus=h.add=function(t){var e,r,n,o=this,i=o.constructor;if(t=new i(t),o.s!=t.s)return t.s=-t.s,o.minus(t);var a=o.e,u=o.c,c=t.e,l=t.c;if(!u[0]||!l[0])return l[0]||(u[0]?t=new i(o):t.s=o.s),t;if(u=u.slice(),e=a-c){for(e>0?(c=a,n=l):(e=-e,n=u),n.reverse();e--;)n.push(0);n.reverse()}for(u.length-l.length<0&&(n=l,l=u,u=n),e=l.length,r=0;e;u[e]%=10)r=(u[--e]=u[e]+l[e]+r)/10|0;for(r&&(u.unshift(r),++c),e=u.length;0===u[--e];)u.pop();return t.c=u,t.e=c,t},h.pow=function(t){var e=this,r=new e.constructor("1"),n=r,o=t<0;if(t!==~~t||t<-1e6||t>1e6)throw Error(c+"exponent");for(o&&(t=-t);1&t&&(n=n.times(e)),t>>=1;)e=e.times(e);return o?r.div(n):n},h.prec=function(t,e){if(t!==~~t||t<1||t>a)throw Error(c+"precision");return v(new this.constructor(this),t,e)},h.round=function(t,e){if(t===p)t=0;else if(t!==~~t||t<-a||t>a)throw Error(l);return v(new this.constructor(this),t+this.e+1,e)},h.sqrt=function(){var t,e,r,n=this,o=n.constructor,i=n.s,a=n.e,c=new o("0.5");if(!n.c[0])return new o(n);if(i<0)throw Error(u+"No square root");0===(i=Math.sqrt(n+""))||i===1/0?((e=n.c.join("")).length+a&1||(e+="0"),a=((a+1)/2|0)-(a<0||1&a),t=new o(((i=Math.sqrt(e))==1/0?"5e":(i=i.toExponential()).slice(0,i.indexOf("e")+1))+a)):t=new o(i+""),a=t.e+(o.DP+=4);do{r=t,t=c.times(r.plus(n.div(r)))}while(r.c.slice(0,a).join("")!==t.c.slice(0,a).join(""));return v(t,(o.DP-=4)+t.e+1,o.RM)},h.times=h.mul=function(t){var e,r=this,n=r.constructor,o=r.c,i=(t=new n(t)).c,a=o.length,u=i.length,c=r.e,l=t.e;if(t.s=r.s==t.s?1:-1,!o[0]||!i[0])return t.c=[t.e=0],t;for(t.e=c+l,a<u&&(e=o,o=i,i=e,l=a,a=u,u=l),e=new Array(l=a+u);l--;)e[l]=0;for(c=u;c--;){for(u=0,l=a+c;l>c;)u=e[l]+i[c]*o[l-c-1]+u,e[l--]=u%10,u=u/10|0;e[l]=u}for(u?++t.e:e.shift(),c=e.length;!e[--c];)e.pop();return t.c=e,t},h.toExponential=function(t,e){var r=this,n=r.c[0];if(t!==p){if(t!==~~t||t<0||t>a)throw Error(l);for(r=v(new r.constructor(r),++t,e);r.c.length<t;)r.c.push(0)}return d(r,!0,!!n)},h.toFixed=function(t,e){var r=this,n=r.c[0];if(t!==p){if(t!==~~t||t<0||t>a)throw Error(l);for(t=t+(r=v(new r.constructor(r),t+r.e+1,e)).e+1;r.c.length<t;)r.c.push(0)}return d(r,!1,!!n)},h[Symbol.for("nodejs.util.inspect.custom")]=h.toJSON=h.toString=function(){var t=this,e=t.constructor;return d(t,t.e<=e.NE||t.e>=e.PE,!!t.c[0])},h.toNumber=function(){var t=Number(d(this,!0,!0));if(!0===this.constructor.strict&&!this.eq(t.toString()))throw Error(u+"Imprecise conversion");return t},h.toPrecision=function(t,e){var r=this,n=r.constructor,o=r.c[0];if(t!==p){if(t!==~~t||t<1||t>a)throw Error(c+"precision");for(r=v(new n(r),t,e);r.c.length<t;)r.c.push(0)}return d(r,t<=r.e||r.e<=n.NE||r.e>=n.PE,!!o)},h.valueOf=function(){var t=this,e=t.constructor;if(!0===e.strict)throw Error(u+"valueOf disallowed");return d(t,t.e<=e.NE||t.e>=e.PE,!0)},function t(){function e(r){var n=this;if(!(n instanceof e))return r===p?t():new e(r);if(r instanceof e)n.s=r.s,n.e=r.e,n.c=r.c.slice();else{if("string"!=typeof r){if(!0===e.strict&&"bigint"!=typeof r)throw TypeError(c+"value");r=0===r&&1/r<0?"-0":String(r)}!function(t,e){var r,n,o;if(!y.test(e))throw Error(c+"number");for(t.s="-"==e.charAt(0)?(e=e.slice(1),-1):1,(r=e.indexOf("."))>-1&&(e=e.replace(".","")),(n=e.search(/e/i))>0?(r<0&&(r=n),r+=+e.slice(n+1),e=e.substring(0,n)):r<0&&(r=e.length),o=e.length,n=0;n<o&&"0"==e.charAt(n);)++n;if(n==o)t.c=[t.e=0];else{for(;o>0&&"0"==e.charAt(--o););for(t.e=r-n-1,t.c=[],r=0;n<=o;)t.c[r++]=+e.charAt(n++)}}(n,r)}n.constructor=e}return e.prototype=h,e.DP=20,e.RM=1,e.NE=-7,e.PE=21,e.strict=!1,e.roundDown=0,e.roundHalfUp=1,e.roundHalfEven=2,e.roundUp=3,e}();var S=function(t){function e(){var t,r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"Not enough data";return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),t=function(t,e,r){return e=O(e),function(t,e){if(e&&("object"==b(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,g()?Reflect.construct(e,r||[],O(t).constructor):e.apply(t,r))}(this,e,[r]),Object.setPrototypeOf(t,(this instanceof e?this.constructor:void 0).prototype),t.name="NotEnoughDataError",t}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&w(t,e)}(e,t),r=e,Object.defineProperty(r,"prototype",{writable:!1}),r;var r}(m(Error));function _(t){return _="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},_(t)}function j(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,P(n.key),n)}}function A(t,e,r){return(e=P(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function P(t){var e=function(t,e){if("object"!=_(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=_(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==_(e)?e:e+""}var E=function(){return t=function t(){(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")})(this,t),A(this,"previousHighest",void 0),A(this,"highest",void 0),A(this,"previousLowest",void 0),A(this,"lowest",void 0),A(this,"previousResult",void 0),A(this,"result",void 0)},(e=[{key:"isStable",get:function(){return void 0!==this.result}},{key:"getResult",value:function(){if(void 0===this.result)throw new S;return this.result}},{key:"setResult",value:function(t,e){return e&&(this.highest=this.previousHighest,this.lowest=this.previousLowest,this.result=this.previousResult),void 0===this.highest?this.highest=t:t>this.highest?(this.previousHighest=this.highest,this.highest=t):this.previousHighest=this.highest,void 0===this.lowest?this.lowest=t:t<this.lowest?(this.previousLowest=this.lowest,this.lowest=t):this.previousLowest=this.lowest,this.previousResult=this.result,this.result=t}},{key:"replace",value:function(t){return this.update(t,!0)}}])&&j(t.prototype,e),r&&j(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e,r}();function k(t){return k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},k(t)}function T(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,C(n.key),n)}}function I(t,e,r){return e=M(e),function(t,e){if(e&&("object"==k(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,x()?Reflect.construct(e,r||[],M(t).constructor):e.apply(t,r))}function x(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(x=function(){return!!t})()}function M(t){return M=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},M(t)}function R(t,e){return R=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},R(t,e)}function C(t){var e=function(t,e){if("object"!=k(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=k(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==k(e)?e:e+""}var D=function(t){function e(t){var r,n,o,i;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),n=r=I(this,e),i=void 0,(o=C(o="interval"))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i,r.interval=t,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&R(t,e)}(e,t),r=e,(n=[{key:"updates",value:function(t){var e=this;return t.forEach((function(t){return e.update(t)})),this.result}},{key:"replace",value:function(t){return this.update(t,!0)}}])&&T(r.prototype,n),o&&T(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(E);function B(t){return B="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},B(t)}function L(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,N(n.key),n)}}function V(t,e,r){return e=z(e),function(t,e){if(e&&("object"==B(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,H()?Reflect.construct(e,r||[],z(t).constructor):e.apply(t,r))}function H(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(H=function(){return!!t})()}function z(t){return z=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},z(t)}function U(t,e){return U=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},U(t,e)}function N(t){var e=function(t,e){if("object"!=B(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=B(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==B(e)?e:e+""}var $=function(t){function e(){var t,r,n,o;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e);for(var i=arguments.length,a=new Array(i),u=0;u<i;u++)a[u]=arguments[u];return r=t=V(this,e,[].concat(a)),o=[],(n=N(n="prices"))in r?Object.defineProperty(r,n,{value:o,enumerable:!0,configurable:!0,writable:!0}):r[n]=o,t}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&U(t,e)}(e,t),r=e,n=[{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.prices.length&&e?this.prices[this.prices.length-1]=t:this.prices.push(t),this.prices.length>this.interval&&this.prices.shift(),this.prices.length===this.interval){var r=this.prices.reduce((function(t,e){return t+e}),0);return this.setResult(r/this.prices.length,e)}}}],n&&L(r.prototype,n),o&&L(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(D);function F(t){return F="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},F(t)}function q(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Q(n.key),n)}}function G(t,e,r){return e=K(e),function(t,e){if(e&&("object"==F(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,J()?Reflect.construct(e,r||[],K(t).constructor):e.apply(t,r))}function J(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(J=function(){return!!t})()}function K(t){return K=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},K(t)}function Y(t,e){return Y=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},Y(t,e)}function W(t,e,r){return(e=Q(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Q(t){var e=function(t,e){if("object"!=F(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=F(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==F(e)?e:e+""}var X=function(t){function e(t){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),W(r=G(this,e),"interval",void 0),W(r,"indicator",void 0),W(r,"smoothingFactor",void 0),r.interval=t,r.indicator=new $(t),r.smoothingFactor=1/r.interval,r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&Y(t,e)}(e,t),r=e,n=[{key:"updates",value:function(t){var e=this;return t.forEach((function(t){return e.update(t)})),this.result}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.indicator.update(t);if(e&&void 0!==this.previousResult){var n=(t-this.previousResult)*this.smoothingFactor;return this.setResult(n+this.previousResult,e)}if(!e&&void 0!==this.result){var o=(t-this.result)*this.smoothingFactor;return this.setResult(o+this.result,e)}if(void 0===this.result&&void 0!==r)return this.setResult(r,e)}}],n&&q(r.prototype,n),o&&q(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(E);function Z(t){return t.length?t.reduce((function(t,e){return t+e}),0)/t.length:0}function tt(t){return tt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},tt(t)}function et(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,nt(n.key),n)}}function rt(t,e,r){return(e=nt(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function nt(t){var e=function(t,e){if("object"!=tt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=tt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==tt(e)?e:e+""}var ot=function(){return t=function t(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2;(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")})(this,t),rt(this,"interval",void 0),rt(this,"deviationMultiplier",void 0),rt(this,"prices",[]),rt(this,"result",void 0),this.interval=e,this.deviationMultiplier=r},(e=[{key:"update",value:function(t){if(this.prices.push(t),this.prices.length>this.interval){this.prices.shift();var e=Z(this.prices),r=function(t,e){var r=e||Z(t),n=Z(t.map((function(t){return t-r})).map((function(t){return t*t})));return Math.sqrt(n)}(this.prices,e);return this.result={lower:e-r*this.deviationMultiplier,middle:e,upper:e+r*this.deviationMultiplier}}}},{key:"getResult",value:function(){if(void 0===this.result)throw new S;return this.result}},{key:"isStable",get:function(){return void 0!==this.result}}])&&et(t.prototype,e),r&&et(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e,r}();function it(t){return it="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},it(t)}function at(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,ht(n.key),n)}}function ut(t,e,r){return e=lt(e),function(t,e){if(e&&("object"==it(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,ct()?Reflect.construct(e,r||[],lt(t).constructor):e.apply(t,r))}function ct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(ct=function(){return!!t})()}function lt(t){return lt=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},lt(t)}function st(t,e){return st=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},st(t,e)}function ft(t,e,r){return(e=ht(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function ht(t){var e=function(t,e){if("object"!=it(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=it(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==it(e)?e:e+""}var pt=function(t){function e(t){var r;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),ft(r=ut(this,e,[t]),"interval",void 0),ft(r,"pricesCounter",0),ft(r,"weightFactor",void 0),r.interval=t,r.weightFactor=2/(r.interval+1),r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&st(t,e)}(e,t),r=e,n=[{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return e?e&&0===this.pricesCounter&&this.pricesCounter++:this.pricesCounter++,e&&void 0!==this.previousResult?this.setResult(t*this.weightFactor+this.previousResult*(1-this.weightFactor),e):this.setResult(t*this.weightFactor+(void 0!==this.result?this.result:t)*(1-this.weightFactor),e)}},{key:"getResult",value:function(){if(this.pricesCounter<this.interval)throw new S;return this.result}},{key:"isStable",get:function(){try{return this.getResult(),!0}catch(t){return!1}}}],n&&at(r.prototype,n),o&&at(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(D);function yt(t){return yt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},yt(t)}function vt(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,bt(n.key),n)}}function dt(t,e,r){return(e=bt(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function bt(t){var e=function(t,e){if("object"!=yt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=yt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==yt(e)?e:e+""}var mt=function(){return t=function t(e,r,n){(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")})(this,t),dt(this,"short",void 0),dt(this,"long",void 0),dt(this,"signal",void 0),dt(this,"prices",[]),dt(this,"result",void 0),this.short=e,this.long=r,this.signal=n},e=[{key:"getResult",value:function(){if(void 0===this.result)throw new S;return this.result}},{key:"isStable",get:function(){return void 0!==this.result}},{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];this.prices.length&&e?this.prices[this.prices.length-1]=t:this.prices.push(t);var r=this.short.update(t,e),n=this.long.update(t,e);if(this.prices.length>this.long.interval&&this.prices.shift(),this.prices.length===this.long.interval){var o=r-n,i=this.signal.update(o,e);return this.result={histogram:o-i,macd:o,signal:i}}}}],e&&vt(t.prototype,e),r&&vt(t,r),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e,r}();function gt(t){return gt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},gt(t)}function wt(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Pt(n.key),n)}}function Ot(t,e,r){return e=_t(e),function(t,e){if(e&&("object"==gt(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}(t)}(t,St()?Reflect.construct(e,r||[],_t(t).constructor):e.apply(t,r))}function St(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],(function(){})))}catch(t){}return(St=function(){return!!t})()}function _t(t){return _t=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_t(t)}function jt(t,e){return jt=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},jt(t,e)}function At(t,e,r){return(e=Pt(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Pt(t){var e=function(t,e){if("object"!=gt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=gt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==gt(e)?e:e+""}var Et=function(t){function e(t){var r,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:X;return function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,e),At(r=Ot(this,e),"interval",void 0),At(r,"previousPrices",[]),At(r,"avgGain",void 0),At(r,"avgLoss",void 0),At(r,"maxValue",100),r.interval=t,r.avgGain=new n(r.interval),r.avgLoss=new n(r.interval),r}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&jt(t,e)}(e,t),r=e,n=[{key:"update",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(this.previousPrices.length&&e?this.previousPrices[this.previousPrices.length-1]=t:this.previousPrices.push(t),!(this.previousPrices.length<2)){var r=t,n=this.previousPrices[this.previousPrices.length-2];if(r>n?(this.avgLoss.update(0,e),this.avgGain.update(t-n,e)):(this.avgLoss.update(n-r,e),this.avgGain.update(0,e)),this.avgGain.isStable){var o=this.avgLoss.getResult();if(0===o)return this.setResult(100,e);var i=this.avgGain.getResult()/o;return this.setResult(this.maxValue-this.maxValue/(i+1),e)}}}}],n&&wt(r.prototype,n),o&&wt(r,o),Object.defineProperty(r,"prototype",{writable:!1}),r;var r,n,o}(E);function kt(t){return kt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},kt(t)}function Tt(t){return function(t){if(Array.isArray(t))return It(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return It(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?It(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function It(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function xt(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=kt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=kt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==kt(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Mt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Rt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Ct(t){return Ct="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ct(t)}function Dt(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=Ct(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=Ct(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Ct(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Bt(t){return function(t){if(Array.isArray(t))return Lt(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Lt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Lt(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Lt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Vt(t){return Vt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Vt(t)}function Ht(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function zt(t){return zt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},zt(t)}function Ut(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=$t(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function Nt(t){return function(t){if(Array.isArray(t))return Ft(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||$t(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function $t(t,e){if(t){if("string"==typeof t)return Ft(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ft(t,e):void 0}}function Ft(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function qt(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Gt(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=zt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=zt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==zt(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Jt(t){return Jt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Jt(t)}function Kt(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=Wt(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function Yt(t){return function(t){if(Array.isArray(t))return Qt(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Wt(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Wt(t,e){if(t){if("string"==typeof t)return Qt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Qt(t,e):void 0}}function Qt(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Xt(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Zt(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=Jt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=Jt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Jt(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function te(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var ee=function(t,e){var r=t.value,n=t.positive,o=void 0===n||n;if(null==r||null==e)return null;var i=e.upper,a=e.middle,u=e.lower;if(r<u)return 0;if(r>i)return o?1:-1;var c=Number.EPSILON*Math.max(Math.abs(r),Math.abs(a));if(Math.abs(r-a)<c)return o?.5:-.5;if(i===u)return null;var l=(r-u)/(i-u),s=Math.round(10*l)/10;return o?s:-s};function re(t){return function(t){if(Array.isArray(t))return ne(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return ne(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ne(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ne(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var oe=function(t,e){var r=t-e;return{value:Math.abs(r),positive:r>=0}};function ie(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,l=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){l=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return u}}(t,e)||ue(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ae(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=ue(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function ue(t,e){if(t){if("string"==typeof t)return ce(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?ce(t,e):void 0}}function ce(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function le(t){return le="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},le(t)}var se=function(t,e){if(0===e){var r=t.inputParams.filter((function(t){return"lag"===t.key}));if("object"!==le(r))return;var n,o=r.map((function(t){return t.params})),i=ae(o);try{for(i.s();!(n=i.n()).done;){var a,u=ie(n.value,2),c=u[0],l=u[1],s=ae(c);try{for(s.s();!(a=s.n()).done;){var f=a.value;if(t.priceBased.includes(f))for(var h=1;h<=l;h++)t.priceBased.push("".concat(f,"_lag_").concat(h))}}catch(t){s.e(t)}finally{s.f()}}}catch(t){i.e(t)}finally{i.f()}t.instances.lag={lagParams:o}}var p,y,v=ae(t.instances.lag.lagParams);try{for(v.s();!(p=v.n()).done;){var d,b=ie(p.value,2),m=b[0],g=b[1],w=ae(m);try{for(w.s();!(d=w.n()).done;){var O=d.value,S=t.verticalOhlcv[O];if(0===e)for(var _=1;_<=g;_++){var j="".concat(O,"_lag_").concat(_);t.verticalOhlcv[j]=function(t){if(Array.isArray(t))return ce(t)}(y=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(y)||ue(y)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}for(var A=1;A<=g;A++){var P="".concat(O,"_lag_").concat(A),E=e-A;if(E<=0)break;t.pushToMain({index:e,key:P,value:S[E]})}}}catch(t){w.e(t)}finally{w.f()}}}catch(t){v.e(t)}finally{v.f()}return!0};function fe(t,e){if(t){if("string"==typeof t)return he(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?he(t,e):void 0}}function he(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function pe(t){return pe="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},pe(t)}function ye(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,ve(n.key),n)}}function ve(t){var e=function(t,e){if("object"!=pe(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=pe(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==pe(e)?e:e+""}var de=function(t,e){return t>e},be=function(t,e){return t<e},me=function(){return t=function t(){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),Object.assign(this,{interval:0,prevState:.5,prevFast:null,prevSlow:null,prevHigh:null,prevLow:null,areHighAndLowUndefined:!1,index:0,crossIndexes:{up:[],down:[]}})},(e=[{key:"update",value:function(t){var e=t.fast,r=t.high,n=t.slow,o=t.low,i=this.prevState;this.areHighAndLowUndefined||void 0!==r&&void 0!==o||(this.areHighAndLowUndefined=!0),null===e||null===n||function(t,e){return t===e}(e,n)?i=.5:de(e,n)?i=this.areHighAndLowUndefined?1:[o,n,this.prevLow,this.prevSlow].every((function(t){return null!==t}))&&be(o,n)&&de(this.prevLow,this.prevSlow)?0:1:be(e,n)&&(i=this.areHighAndLowUndefined?0:[r,n,this.prevHigh,this.prevSlow].every((function(t){return null!==t}))&&de(r,n)&&be(this.prevHigh,this.prevSlow)?1:0),.5===i?this.interval=0:1===i?this.prevState<=.5?this.interval=1:this.interval++:0===i&&(this.prevState>=.5?this.interval=-1:this.interval--),1===this.interval&&this.crossIndexes.up.push(this.index),-1===this.interval&&this.crossIndexes.down.push(this.index),Object.assign(this,{index:this.index+1,prevState:i,prevFast:e,prevSlow:n,prevHigh:r,prevLow:o})}},{key:"getResult",value:function(){return this.interval}}])&&ye(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}(),ge=function(t,e){if(0===e){var r=t.inputParams.filter((function(t){return"crossPairs"===t.key}));if("object"!==pe(r))return;t.instances.crossPairs={crossPairsList:r.flatMap((function(t){return t.params.flat()}))}}var n,o,i=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=fe(t))){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(t.instances.crossPairs.crossPairsList);try{for(i.s();!(n=i.n()).done;){var a=n.value,u=a.fast,c=a.slow;if(u&&c){var l="".concat(u,"_x_").concat(c);if(0===e){if("number"==typeof c&&(t.verticalOhlcv[c]=new Array(t.len).fill(c)),"price"!==u&&!t.verticalOhlcv.hasOwnProperty(u))throw Error('fast "'.concat(u,' not found in crossPairs"'));if(!t.verticalOhlcv.hasOwnProperty(c))throw Error('slow "'.concat(c,' not found in crossPairs"'));t.instances[l]=new me,t.verticalOhlcv[l]=function(t){if(Array.isArray(t))return he(t)}(o=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(o)||fe(o)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var s=void 0,f=void 0,h=void 0,p=void 0,y=void 0;"price"===u?(f=t.verticalOhlcv.close[e],h=t.verticalOhlcv.high[e],p=t.verticalOhlcv.low[e],y=t.verticalOhlcv[c][e],t.instances[l].update({fast:f,slow:y,high:h,low:p})):(s=t.verticalOhlcv[u][e],y=t.verticalOhlcv[c][e],t.instances[l].update({fast:s,slow:y})),t.pushToMain({index:e,key:l,value:t.instances[l].getResult()})}}}catch(t){i.e(t)}finally{i.f()}};function we(t){return function(t){if(Array.isArray(t))return Oe(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return Oe(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Oe(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Oe(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Se(t){return function(t){if(Array.isArray(t))return _e(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||function(t,e){if(t){if("string"==typeof t)return _e(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_e(t,e):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _e(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var je=["open","high","low","close","volume"];function Ae(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!r){if(Array.isArray(t)||(r=ke(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,o=function(){};return{s:o,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(t)},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,i=t},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}function Pe(t,e){if(null==t)return{};var r,n,o=function(t,e){if(null==t)return{};var r={};for(var n in t)if({}.hasOwnProperty.call(t,n)){if(e.includes(n))continue;r[n]=t[n]}return r}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(n=0;n<i.length;n++)r=i[n],e.includes(r)||{}.propertyIsEnumerable.call(t,r)&&(o[r]=t[r])}return o}function Ee(t){return function(t){if(Array.isArray(t))return Te(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||ke(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ke(t,e){if(t){if("string"==typeof t)return Te(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Te(t,e):void 0}}function Te(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var Ie=function(t){return t.replace(/(?!^-)[^0-9.]/g,"")},xe={dateTime:function(t,e){if(0===e){if(!t.isValidDate)throw Error('dateTime method found and invalid "date" in input ohlcv');var r=t.verticalOhlcv.date[0].slice(0,10);Object.assign(t.instances,{dateTime:{prevDateStr:r,sessionDailyIndexCount:0,sessionIntradayIndexCount:0,cachedDayInfo:r}}),Object.assign(t.verticalOhlcv,{day_of_the_week:we(t.nullArray),day_of_the_month:we(t.nullArray),week_of_the_month:we(t.nullArray),hour:we(t.nullArray),month:we(t.nullArray),year:we(t.nullArray),session_daily_index:we(t.nullArray),session_intraday_index:we(t.nullArray)})}var n=t.verticalOhlcv.date[e],o=function(t){var e=new Date(t),r=e.getMonth(),n=e.getFullYear(),o=e.getHours(),i=e.getMinutes(),a=e.getDay(),u=e.getDate(),c=new Date(e.getFullYear(),e.getMonth(),1).getDay();return{month:r,year:n,hour:o,minute:i,day_of_the_week:a,day_of_the_month:u,week_of_the_month:Math.ceil((u+c)/7)}}(n),i=o.day_of_the_week,a=o.day_of_the_month,u=o.week_of_the_month,c=o.month,l=o.year,s=o.hour,f=n.slice(0,10);f!==t.instances.dateTime.prevDateStr&&(t.instances.dateTime.prevDateStr=f,t.instances.dateTime.sessionDailyIndexCount++,t.instances.dateTime.sessionIntradayIndexCount=0),t.pushToMain({index:e,key:"session_daily_index",value:t.instances.dateTime.sessionDailyIndexCount}),t.pushToMain({index:e,key:"session_intraday_index",value:t.instances.dateTime.sessionIntradayIndexCount}),t.pushToMain({index:e,key:"day_of_the_week",value:i}),t.pushToMain({index:e,key:"day_of_the_month",value:a}),t.pushToMain({index:e,key:"week_of_the_month",value:u}),t.pushToMain({index:e,key:"month",value:c}),t.pushToMain({index:e,key:"year",value:l}),t.pushToMain({index:e,key:"hour",value:s})},priceVariations:function(t,e){0===e&&(t.priceBased=Se(new Set([].concat(Se(t.priceBased),["mid_price_open_close","mid_price_high_low"]))),Object.assign(t.verticalOhlcv,{mid_price_open_close:Se(t.nullArray),mid_price_high_low:Se(t.nullArray)}));var r=t.verticalOhlcv.open[e],n=t.verticalOhlcv.high[e],o=t.verticalOhlcv.low[e],i=t.verticalOhlcv.close[e];t.pushToMain({index:e,key:"mid_price_open_close",value:(r+i)/2}),t.pushToMain({index:e,key:"mid_price_high_low",value:(n+o)/2})},rsi:function(t,e,r){var n,o,i=t.verticalOhlcv.close[e];0===e&&(t.crossPairsList.push({fast:"rsi_".concat(r),slow:"rsi_sma_".concat(r),isDefault:!0}),Object.assign(t.instances,xt(xt({},"rsi_".concat(r),new Et(r)),"rsi_sma_".concat(r),new $(r))),Object.assign(t.verticalOhlcv,xt(xt({},"rsi_".concat(r),Tt(t.nullArray)),"rsi_sma_".concat(r),Tt(t.nullArray)))),t.instances["rsi_".concat(r)].update(i,t.lastIndexReplace);try{n=t.instances["rsi_".concat(r)].getResult()}catch(t){n=null}n&&(t.pushToMain({index:e,key:"rsi_".concat(r),value:n}),t.instances["rsi_sma_".concat(r)].update(n,t.lastIndexReplace));try{o=t.instances["rsi_sma_".concat(r)].getResult()}catch(t){o=null}return o&&t.pushToMain({index:e,key:"rsi_sma_".concat(r),value:o}),!0},sma:function(t,e,r,n){var o,i,a=t.verticalOhlcv.close[e],u="string"==typeof n&&t.verticalOhlcv.hasOwnProperty(n)&&"close"!==n?"".concat(n,"_"):"",c="".concat(u,"sma_").concat(r);0===e&&(t.instances[c]=new $(r),t.verticalOhlcv[c]=function(t){if(Array.isArray(t))return Mt(t)}(i=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(i)||function(t,e){if(t){if("string"==typeof t)return Mt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Mt(t,e):void 0}}(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),t.instances[c].update(a,t.lastIndexReplace);try{o=t.instances[c].getResult()}catch(t){}o&&t.pushToMain({index:e,key:c,value:o})},ema:function(t,e,r,n){var o,i,a=t.verticalOhlcv.close[e],u="string"==typeof n&&t.verticalOhlcv.hasOwnProperty(n)&&"close"!==n?"".concat(n,"_"):"",c="".concat(u,"ema_").concat(r);0===e&&(t.instances[c]=new pt(r),t.verticalOhlcv[c]=function(t){if(Array.isArray(t))return Rt(t)}(i=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(i)||function(t,e){if(t){if("string"==typeof t)return Rt(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Rt(t,e):void 0}}(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),t.instances[c].update(a,t.lastIndexReplace);try{o=t.instances[c].getResult()}catch(t){o=null}o&&t.pushToMain({index:e,key:c,value:o})},macd:function(t,e,r,n,o,i){var a=i.target,u="close"===a?"":"_".concat(a),c="".concat(r,"_").concat(n,"_").concat(o).concat(u);if(0===e){if(!t.verticalOhlcv.hasOwnProperty(a))throw new Error("Target property ".concat(a," not found in verticalOhlcv for macd."));var l=t.inputParams.filter((function(t){return"macd"===t.key})).length,s=l>1?"macd_".concat(c):"macd".concat(u);t.crossPairsList.push({fast:"".concat(s,"_diff"),slow:"".concat(s,"_dea"),isDefault:!0}),t.instances.hasOwnProperty("macd")||(t.instances.macd={numberOfIndicators:l,settings:{}}),t.instances.macd.settings[c]=new mt(new pt(r),new pt(n),new pt(o)),Object.assign(t.verticalOhlcv,Dt(Dt(Dt({},"".concat(s,"_diff"),Bt(t.nullArray)),"".concat(s,"_dea"),Bt(t.nullArray)),"".concat(s,"_histogram"),Bt(t.nullArray)))}var f,h=t.instances.macd.numberOfIndicators>1?"macd_".concat(c):"macd".concat(u),p=t.instances.macd.settings[c],y=t.verticalOhlcv[a][e];p.update(y,t.lastIndexReplace);try{f=p.getResult()}catch(t){}return f&&(t.pushToMain({index:e,key:"".concat(h,"_diff"),value:f.macd}),t.pushToMain({index:e,key:"".concat(h,"_dea"),value:f.signal}),t.pushToMain({index:e,key:"".concat(h,"_histogram"),value:f.histogram})),!0},relativeVolume:function(t,e){var r,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10,o="relative_volume_".concat(n);0===e&&(t.instances[o]={instance:new $(n),prevRelativeVolumeSma:null},Object.assign(t.verticalOhlcv,function(t,e,r){return(e=function(t){var e=function(t,e){if("object"!=Vt(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=Vt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Vt(e)?e:e+""}(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}({},o,function(t){if(Array.isArray(t))return Ht(t)}(r=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(r)||function(t,e){if(t){if("string"==typeof t)return Ht(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Ht(t,e):void 0}}(r)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())));var i,a=t.verticalOhlcv.volume[e],u=t.instances[o].instance;u.update(a,t.lastIndexReplace);try{i=u.getResult()}catch(t){}var c=t.instances[o].prevRelativeVolumeSma;return t.pushToMain({index:e,key:o,value:null!==i&&null!==c?a/c:null}),t.instances[o].prevRelativeVolumeSma=i,!0},donchianChannels:function(t,e,r,n,o){var i=o.height,a=o.range,u="".concat(r,"_").concat(n);if(0===e){var c=t.inputParams.filter((function(t){return"donchianChannels"===t.key})).length,l=c>1?"donchian_channel_".concat(u):"donchian_channel";Object.assign(t.verticalOhlcv,function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?qt(Object(r),!0).forEach((function(e){Gt(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):qt(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}(Gt(Gt(Gt({},"".concat(l,"_upper"),Nt(t.nullArray)),"".concat(l,"_basis"),Nt(t.nullArray)),"".concat(l,"_lower"),Nt(t.nullArray)),i&&Gt({},"".concat(l,"_height"),Nt(t.nullArray)))),t.instances.hasOwnProperty("donchian_channel")||(t.instances.donchian_channel={numberOfIndicators:c,settings:{}});var s,f=Ut(a);try{for(f.s();!(s=f.n()).done;){var h=s.value;if(!(h in t.verticalOhlcv)||!t.priceBased.includes(h))throw new Error('Invalid range item value "'.concat(h,'" property for donchianChannels. Only price based key names are accepted:\n').concat(JSON.stringify(t.priceBased)));t.verticalOhlcv["".concat(l,"_range_").concat(h)]=Nt(t.nullArray)}}catch(t){f.e(t)}finally{f.f()}t.instances.donchian_channel.settings[u]={maxDeque:[],minDeque:[]}}var p=t.instances.donchian_channel.numberOfIndicators>1?"donchian_channel_".concat(u):"donchian_channel",y=t.instances.donchian_channel.settings[u],v=y.maxDeque,d=y.minDeque,b=e-n,m=b+1,g=m-r;if(g<0||m>t.len)return!0;for(var w=t.verticalOhlcv.high,O=t.verticalOhlcv.low;v.length&&v[0]<g;)v.shift();for(;v.length&&w[v[v.length-1]]<=w[b];)v.pop();for(v.push(b);d.length&&d[0]<g;)d.shift();for(;d.length&&O[d[d.length-1]]>=O[b];)d.pop();d.push(b);var S=w[v[0]],_=O[d[0]],j=(S+_)/2;if(t.pushToMain({index:e,key:"".concat(p,"_upper"),value:S}),t.pushToMain({index:e,key:"".concat(p,"_basis"),value:j}),t.pushToMain({index:e,key:"".concat(p,"_lower"),value:_}),i){var A=(S-_)/_*100;t.pushToMain({index:e,key:"".concat(p,"_height"),value:A})}var P,E=Ut(a);try{for(E.s();!(P=E.n()).done;){var k=P.value,T=(t.verticalOhlcv[k][e]-_)/(S-_);t.pushToMain({index:e,key:"".concat(p,"_range_").concat(k),value:T})}}catch(t){E.e(t)}finally{E.f()}return!0},bollingerBands:function(t,e,r,n,o){var i,a=t.verticalOhlcv,u=t.instances,c=t.lastIndexReplace,l=o.height,s=o.range,f=void 0===s?[]:s,h=o.zScore,p=void 0===h?[]:h,y=o.target,v="close"===y?"":"_".concat(y),d="".concat(r,"_").concat(n).concat(v);if(0===e){var b=t.nullArray,m=t.priceBased,g=t.inputParams;if(!(y in a))throw new Error('bollingerBands could not find target "'.concat(y,'"'));var w=g.filter((function(t){return"bollingerBands"===t.key})).length;i=w>1?"bollinger_bands_".concat(d):"bollinger_bands".concat(v),u.bollinger_bands||(u.bollinger_bands={numberOfIndicators:w,settings:{}}),u.bollinger_bands.settings[d]={instance:new ot(r,n)};var O,S=function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?Xt(Object(r),!0).forEach((function(e){Zt(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):Xt(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}(Zt(Zt(Zt({},"".concat(i,"_upper"),Yt(b)),"".concat(i,"_middle"),Yt(b)),"".concat(i,"_lower"),Yt(b)),l&&Zt({},"".concat(i,"_height"),Yt(b))),_=Kt(f);try{for(_.s();!(O=_.n()).done;){var j=O.value;if(!(j in a)||!m.includes(j))throw new Error('Invalid range item value "'.concat(j,'" property for bollingerBands. Only price based key names are accepted:\n').concat(JSON.stringify(t.priceBased)));S["".concat(i,"_range_").concat(j)]=Yt(b)}}catch(t){_.e(t)}finally{_.f()}var A,P=Kt(p);try{for(P.s();!(A=P.n()).done;){var E=A.value;if(!(E in a)||!m.includes(E))throw new Error('Invalid zScore item value "'.concat(E,'" for bollingerBands. Only price based key names are accepted:\n').concat(JSON.stringify(t.priceBased)));S["".concat(i,"_zscore_").concat(E)]=Yt(b)}}catch(t){P.e(t)}finally{P.f()}Object.assign(a,S)}i||(i=u.bollinger_bands.numberOfIndicators>1?"bollinger_bands_".concat(d):"bollinger_bands".concat(v));var k,T=i,I=u.bollinger_bands.settings[d].instance,x=a[y][e];I.update(x,c);try{k=I.getResult()}catch(t){}if(!k)return!0;var M=k,R=M.upper,C=M.middle,D=M.lower;if(t.pushToMain({index:e,key:"".concat(T,"_upper"),value:R}),t.pushToMain({index:e,key:"".concat(T,"_middle"),value:C}),t.pushToMain({index:e,key:"".concat(T,"_lower"),value:D}),l){var B=(R-D)/D*100;t.pushToMain({index:e,key:"".concat(T,"_height"),value:B})}var L,V=Kt(f);try{for(V.s();!(L=V.n()).done;){var H=L.value,z=(a[H][e]-D)/(R-D);t.pushToMain({index:e,key:"".concat(T,"_range_").concat(H),value:z})}}catch(t){V.e(t)}finally{V.f()}var U,N=Kt(p);try{for(N.s();!(U=N.n()).done;){var $=U.value,F=R-D,q=0!==F?2*n*(a[$][e]-C)/F:0;t.pushToMain({index:e,key:"".concat(T,"_zscore_").concat($),value:q})}}catch(t){N.e(t)}finally{N.f()}return!0},volumeOscillator:function(t,e,r,n){var o,i=t.verticalOhlcv.volume[e],a="volume_oscillator";0===e&&(Object.assign(t.instances,{volume_oscillator:{fastEMA:new pt(r),slowEMA:new pt(n)}}),t.verticalOhlcv[a]=function(t){if(Array.isArray(t))return te(t)}(o=t.nullArray)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(o)||function(t,e){if(t){if("string"==typeof t)return te(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?te(t,e):void 0}}(o)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),t.crossPairsList.push({fast:a,slow:0,isDefault:!0}));var u=t.instances[a],c=u.fastEMA,l=u.slowEMA;c.update(i,t.lastIndexReplace),l.update(i,t.lastIndexReplace);var s=null,f=null;try{s=c.getResult()}catch(t){s=null}try{f=l.getResult()}catch(t){f=null}return"number"==typeof s&&"number"==typeof f&&0!==f?t.pushToMain({index:e,key:a,value:100*(s-f)/f}):t.pushToMain({index:e,key:a,value:null}),!0},candleStudies:function(t,e,r,n,o){var i=t.verticalOhlcv,a=t.instances,u=t.lastIndexReplace;if(0===e){var c=t.nullArray;Object.assign(i,{candle_gap:re(c),candle_body:re(c),candle_top:re(c),candle_bottom:re(c),candle_close:re(c),candle_high:re(c),candle_low:re(c),candle_open:re(c)}),Object.assign(a,{candleStudies:{bodyInstance:new ot(r,n),closeInstance:new ot(r,n),highInstance:new ot(r,n),lowInstance:new ot(r,n),openInstance:new ot(r,n)}}),o>0&&t.lag(["candle_body","candle_gap","candle_close","candle_high","candle_low","candle_open","candle_top","candle_bottom"],o)}var l=i.open[e-1],s=i.high[e-1],f=i.low[e-1],h=i.close[e-1];if(0===e)return!0;var p=i.open[e],y=i.high[e],v=i.low[e],d=i.close[e],b=oe(d,p),m=oe(y,Math.max(p,d)),g=oe(Math.min(p,d),v),w=oe(h,p),O=oe(d,h),S=oe(y,s),_=oe(v,f),j=oe(p,l),A=null,P=null,E=null,k=null,T=null,I=a.candleStudies,x=I.bodyInstance,M=I.closeInstance,R=I.highInstance,C=I.lowInstance,D=I.openInstance;x.update(b.value,u),M.update(O.value,u),R.update(S.value,u),C.update(_.value,u),D.update(j.value,u);try{A=x.getResult(),P=M.getResult(),E=R.getResult(),k=C.getResult(),T=D.getResult()}catch(t){}return t.pushToMain({index:e,key:"candle_close",value:ee(O,P)}),t.pushToMain({index:e,key:"candle_high",value:ee(S,E)}),t.pushToMain({index:e,key:"candle_low",value:ee(_,k)}),t.pushToMain({index:e,key:"candle_open",value:ee(j,T)}),t.pushToMain({index:e,key:"candle_body",value:ee(b,A)}),t.pushToMain({index:e,key:"candle_gap",value:ee(w,A)}),t.pushToMain({index:e,key:"candle_top",value:ee(m,A)}),t.pushToMain({index:e,key:"candle_bottom",value:ee(g,A)}),!0}},Me=function(t,e,r){var n=function(t){return r>1?t*r:t};if("number"===e)return n(t);if("string"===e){var o=Ie(t);return n(Number(o))}return 0},Re=function(t,e){return"number"===e?t:"string"===e?Number(Ie(t)):0},Ce=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=e.len,i=e.inputParams;e.nullArray=new Array(o).fill(null);var a=["open","high","low","close","volume"],u=new Set(a);if(0===n){!function(t){var e,n=t.inputParams,o=t.len,i=r(n);try{for(i.s();!(e=i.n()).done;){var a,u=r(e.value.params);try{for(u.s();!(a=u.n()).done;){var c=a.value;if("number"==typeof c&&c>o)throw console.log(c,o),new Error("At least one of the params of the indicator is greater than the input OHLCV length. Make sure to have enough datapoints in the input OHLCV.")}}catch(t){u.e(t)}finally{u.f()}}}catch(t){i.e(t)}finally{i.f()}}(e),a.forEach((function(t){e.verticalOhlcv[t]=Ee(e.nullArray)}));var c=Object.keys(t[0]).filter((function(t){return!u.has(t)}));c.forEach((function(t){e.verticalOhlcv[t]=Ee(e.nullArray)})),e.otherKeys=c,function(t,e){for(var r=0,n=Object.keys(e.inputTypes);r<n.length;r++){var o=n[r];if(!(o in t))throw new Error('Property "'.concat(o,'" not found in ohlcv array. ').concat(e.ticker));var i=t[o];if("number"==typeof i&&i>0)e.inputTypes[o]="number";else{if("string"!=typeof i||!/^(\d+(\.\d*)?|\.\d+)$/.test(i))throw new Error('Invalid property "'.concat(o,'" in ohlcv array. ').concat(e.ticker));e.inputTypes[o]="string",i=Ie(i)}if(0===e.precisionMultiplier&&!0===e.precision){var a=(l=String(i).split("."),s=2,function(t){if(Array.isArray(t))return t}(l)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,l=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){l=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return u}}(l,s)||ke(l,s)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[1],u=void 0===a?"":a,c=Math.max(4,u.length);e.precisionMultiplier=c>1?Math.pow(10,c-1):1}}var l,s}(t[0],e)}else if(!e.otherKeys)throw new Error("otherKeys not found in main. Ensure you run with startIndex=0 first to initialize.");for(var l=function(t){return Array.isArray(t)?t.map((function(t){var e=t.key,r=t.params;return{key:e,fn:xe[e],args:r}})):[]}(i),s=n;s<o;s++){var f=t[s],h=f.open,p=f.high,y=f.low,v=f.close,d=f.volume,b=Pe(f,je),m=e.precisionMultiplier,g=Me(h,e.inputTypes.open,m),w=Me(p,e.inputTypes.high,m),O=Me(y,e.inputTypes.low,m),S=Me(v,e.inputTypes.close,m),_=Re(d,e.inputTypes.volume);e.pushToMain({index:s,key:"open",value:g}),e.pushToMain({index:s,key:"high",value:w}),e.pushToMain({index:s,key:"low",value:O}),e.pushToMain({index:s,key:"close",value:S}),e.pushToMain({index:s,key:"volume",value:_});var j,A=Ae(e.otherKeys);try{for(A.s();!(j=A.n()).done;){var P=j.value;e.pushToMain({index:s,key:P,value:b[P]})}}catch(t){A.e(t)}finally{A.f()}var E,k=Ae(l);try{for(k.s();!(E=k.n()).done;){var T=E.value,I=T.key,x=T.fn,M=T.args;["crossPairs","lag"].includes(I)||x.apply(void 0,[e,s].concat(Ee(M)))}}catch(t){k.e(t)}finally{k.f()}se(e,s),ge(e,s),e.lastComputedIndex++}},De=function(t,e){for(var r=t.length,n=new $(e),o=new Array(r),i=0,a=0,u=0,c=0;c<r;c++)if(n.update(t[c]),n.isStable){var l=n.getResult();o[c]=l,i+=l,a+=l*l,u++}else o[c]=null;var s=i/u,f=a/u-s*s,h=Math.sqrt(f);return o.map((function(t){return null!==t?(t-s)/h:null}))},Be=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:5;if(t.length!==e.length)throw new Error("Both arrays must have the same length");for(var n=De(t,r),o=De(e,r),i=t.length,a=[],u=0,c=0,l=0,s=0,f=0,h=0,p=-1,y=0;y<i;y++){if(null!==n[y]&&null!==o[y]){p=y;break}a.push(0)}if(-1===p)return new Array(i).fill(0);for(var v=p;v<i;v++){var d=n[v],b=o[v];if(null!==d&&null!==b)if(u+=d,c+=b,l+=d*b,s+=d*d,f+=b*b,++h<2)a.push(0);else{var m=h*l-u*c,g=Math.sqrt((h*s-u*u)*(h*f-c*c)),w=0===g?0:m/g;a.push(w)}else u=c=l=s=f=h=0,a.push(0)}return a};function Le(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var Ve=function(t){for(var e=t.input,r=t.inputParams,n=new(0,t.OHLCV_INDICATORS)({input:e}),o=0;o<r.length;o++){var i=r[o],a=i.key,u=i.params;Array.isArray(u)&&(u.length>0?(Array.isArray(u)&&"crossPairs"===a&&Array.isArray(u[0])&&(u[0]=u[0].filter((function(t){return!t.isDefault}))),n[a].apply(n,function(t){if(Array.isArray(t))return Le(t)}(c=u)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(c)||function(t,e){if(t){if("string"==typeof t)return Le(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?Le(t,e):void 0}}(c)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())):n[a]())}var c;return n};function He(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}var ze=function(t){for(var e=t.row,r=t.precisionMultiplier,n=t.priceBased,o={},i=0,a=Object.entries(e);i<a.length;i++){var u=(s=a[i],f=2,function(t){if(Array.isArray(t))return t}(s)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,l=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){l=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return u}}(s,f)||function(t,e){if(t){if("string"==typeof t)return He(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?He(t,e):void 0}}(s,f)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),c=u[0],l=u[1];n.includes(c)&&(l/=r),o[c]=l}var s,f;return o};function Ue(t){return function(t){if(Array.isArray(t))return qe(t)}(t)||function(t){if("undefined"!=typeof Symbol&&null!=t[Symbol.iterator]||null!=t["@@iterator"])return Array.from(t)}(t)||Fe(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ne(t){return Ne="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Ne(t)}function $e(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var r=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,l=!1;try{if(i=(r=r.call(t)).next,0===e){if(Object(r)!==r)return;c=!1}else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==e);c=!0);}catch(t){l=!0,o=t}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return u}}(t,e)||Fe(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Fe(t,e){if(t){if("string"==typeof t)return qe(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?qe(t,e):void 0}}function qe(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=Array(e);r<e;r++)n[r]=t[r];return n}function Ge(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),r.push.apply(r,n)}return r}function Je(t,e,r){return(e=Ye(e))in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function Ke(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,Ye(n.key),n)}}function Ye(t){var e=function(t,e){if("object"!=Ne(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var n=r.call(t,"string");if("object"!=Ne(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==Ne(e)?e:e+""}var We=function(){return t=function t(e){var r=e.input,n=e.ticker,o=void 0===n?null:n,i=e.precision,a=void 0===i||i;if(function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),!Array.isArray(r))throw Error("input OHLCV must be an array: "+o);if(0===r.length)throw Error("input OHLCV must not be empty: "+o);if(!r[0].hasOwnProperty("close"))throw Error("input OHLCV array objects require at least close property: "+o);return this.isComputed=!1,this.lastComputedIndex=0,this.input=r,this.inputTypes={open:"",high:"",low:"",close:"",volume:""},this.priceBased=["open","high","low","close"],this.len=r.length,this.lastIndexReplace=!1,this.instances={},this.crossPairsList=[],this.verticalOhlcv={},this.horizontalOhlcv=Array.from({length:this.len},(function(){return{}})),this.inputParams=[],this.studies={},this.utilities={correlation:Be},this.precision=a,this.precisionMultiplier=!0===this.precision?0:1,this.setIndicatorsFromInputParams=Ve,this},e=[{key:"pushToMain",value:function(t){var e=t.index,r=t.key,n=t.value;this.verticalOhlcv[r][e]=n,this.horizontalOhlcv[e][r]=n}},{key:"getDataAsCols",value:function(){this.compute();var t=this.precisionMultiplier,e=this.precision,r=function(t){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?arguments[e]:{};e%2?Ge(Object(r),!0).forEach((function(e){Je(t,e,r[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):Ge(Object(r)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))}))}return t}({},this.verticalOhlcv);if(e)for(var n=0,o=Object.entries(r);n<o.length;n++){var i=$e(o[n],2),a=i[0],u=i[1];this.priceBased.includes(a)&&(this.precision?r[a]=u.map((function(e){return e/t})):r[a]=u)}return r}},{key:"getData",value:function(){this.compute();var t=this.precisionMultiplier,e=this.priceBased;return this.precision?this.horizontalOhlcv.filter((function(t){return!Object.values(t).some((function(t){return null==t}))})).map((function(r){return ze({row:r,precisionMultiplier:t,priceBased:e})})):this.horizontalOhlcv.filter((function(t){return!Object.values(t).some((function(t){return null==t}))}))}},{key:"getLastValues",value:function(){this.compute();var t=this.precisionMultiplier,e=this.priceBased;return this.precision?ze({row:this.horizontalOhlcv[this.horizontalOhlcv.length-1],precisionMultiplier:t,priceBased:e}):this.horizontalOhlcv[this.horizontalOhlcv.length-1]}},{key:"compute",value:function(t){if(!0===this.isComputed&&!t)return this;if(this.isComputed=!1,this.isValidDate=this.input[0].hasOwnProperty("date")&&o(this.input[0].date),this.len>this.lastComputedIndex&&!t&&Ce(this.input,this,0),t&&"object"===Ne(t)){var e;if(!["open","high","low","close","volume","date"].every((function(e){return Object.keys(t).includes(e)})))throw Error('Invalid OHLCV object sent in "compute". Correct usage: .compute({open: 108.25, high: 108.410004, low: 108.25, close: 99999999, volume: 875903, date: "2024-12-16 15:45:00" || "2024-12-16"})');if(!this.isValidDate)throw Error('All the OHLCV rows require a valid date property to access the compute change method. Correct date format: "2024-12-16 15:45:00" or "2024-12-16"');if(!o(t.date))throw Error('The date in the new OHLCV row is invalid. Correct date format: "2024-12-16 15:45:00" or "2024-12-16"');var r=t.date,n=this.len-1,i=null===(e=this.input[n])||void 0===e?void 0:e.date;0===this.lastComputedIndex&&this.compute(),i!==r?(this.len++,this.input.push(t),Ce(this.input,this,this.len)):(this.input[n]=t,Ce(this.input,this,n))}return this}},{key:"crossPairs",value:function(t){return i(this),this.crossPairsList=[].concat(Ue(this.crossPairsList),Ue(t)),this.inputParams.push({key:"crossPairs",params:[this.crossPairsList]}),this}},{key:"lag",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["close"],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;i(this),this.inputParams.push({key:"lag",params:[e,r]});for(var n=function(){var r=e[o];t.priceBased.find((function(t){return r.startsWith(t)}))&&t.priceBased.push(r)},o=0;o<e.length;o++)n();return this}},{key:"relativeVolume",value:function(t){return i(this),this.inputParams.push({key:"relativeVolume",params:[t]}),this}},{key:"ema",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i(this),!e||"object"!==Ne(e))throw new Error('"options" must be an object in ema. eg: {target, height, range}');var r=e.target,n=void 0===r?"close":r;if("number"!=typeof t||t<=0)throw new Error('"size" must be a positive number in ema.');return this.inputParams.push({key:"ema",params:[t,n]}),this.priceBased.push("ema_".concat(t)),this}},{key:"sma",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i(this),!e||"object"!==Ne(e))throw new Error('"options" must be an object in sma. eg: {target, height, range}');var r=e.target,n=void 0===r?"close":r;if("number"!=typeof t||t<=0)throw new Error('"size" must be a positive number in sma.');return this.inputParams.push({key:"sma",params:[t,n]}),this.priceBased.push("sma_".concat(t)),this}},{key:"macd",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:12,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:26,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:9,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(i(this),"number"!=typeof t||t<=0)throw new Error('"fast" must be a positive number in macd.');if("number"!=typeof e||e<=t)throw new Error('"slow" must be a positive number greater than "fast" in macd.');if("number"!=typeof r||r<=0)throw new Error('"signal" must be a positive number in macd.');if("object"!==Ne(n))throw new Error('"options" must be an object in macd. eg: {target}');var o=n.target,a=void 0===o?"close":o;return this.inputParams.push({key:"macd",params:[t,e,r,{target:a}]}),this}},{key:"bollingerBands",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:2,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(i(this),!r||"object"!==Ne(r))throw new Error('"options" must be an object in bollingerBands. eg: {target, height, range}');var n=r.target,o=void 0===n?"close":n,a=r.height,u=void 0!==a&&a,c=r.range,l=void 0===c?[]:c,s=r.zScore,f=void 0===s?[]:s;if("number"!=typeof t||t<=0)throw new Error('"size" must be a positive number in bollingerBands.');if("number"!=typeof e||e<=0)throw new Error('"stdDev" must be a positive number in bollingerBands.');if(!Array.isArray(l))throw new Error('If set, "range" must be a array of column names in bollingerBands.');if(!Array.isArray(f))throw new Error('If set, "zScore" must be a array of column names in bollingerBands.');if("boolean"!=typeof u)throw new Error('"height" must be a boolean in bollingerBands.');return this.inputParams.push({key:"bollingerBands",params:[t,e,{target:o,height:u,range:l,zScore:f}]}),this.priceBased.push("bollinger_bands_middle","bollinger_bands_upper","bollinger_bands_lower"),this}},{key:"rsi",value:function(t){if(i(this),"number"!=typeof t||t<=0)throw new Error('"size" must be a positive number in rsi.');return this.inputParams.push({key:"rsi",params:[t]}),this}},{key:"donchianChannels",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(i(this),"number"!=typeof t||t<=0)throw new Error('"size" must be a positive number or 0 in donchianChannels.');if("number"!=typeof e||e<0)throw new Error('"offset" must be a positive number or 0 in donchianChannels.');var n=r.height,o=void 0!==n&&n,a=r.range,u=void 0===a?[]:a;if(!Array.isArray(u))throw new Error('If set, "range" must be a array of column names in donchianChannels.');if("boolean"!=typeof o)throw new Error('"height" must be a boolean in donchianChannels.');return this.inputParams.push({key:"donchianChannels",params:[t,e,{height:o,range:u}]}),this.priceBased.push("donchian_channel_upper","donchian_channel_lower","donchian_channel_basis"),this}},{key:"candleStudies",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:20,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i(this),"number"!=typeof t||t<=0)throw new Error('"size" must be a positive number or 0 in candleStudies.');var r=e.stdDev,n=void 0===r?2:r,o=e.lag,a=void 0===o?0:o;if("number"!=typeof n||"number"==typeof n&&n<=0)throw new Error('"stdDev" must be a positive number greater than 0 in candleStudies.');return this.inputParams.push({key:"candleStudies",params:[t,n,a]}),this}},{key:"volumeOscillator",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:5,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;if(i(this),"number"!=typeof t||t<=0)throw new Error('fastSize" must be a positive number in volumeOscillator.');if("number"!=typeof e||e<=t)throw new Error('"slowSize" must be a positive number greater than the "fastSize" in volumeOscillator.');return this.inputParams.push({key:"volumeOscillator",params:[t,e]}),this}},{key:"dateTime",value:function(){return i(this),this.inputParams.push({key:"dateTime",params:[]}),this}},{key:"priceVariations",value:function(){return i(this),this.inputParams.push({key:"priceVariations",params:[]}),this}}],e&&Ke(t.prototype,e),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,e}()})(),OHLCV_INDICATORS=e})();
package/index.js CHANGED
@@ -300,7 +300,7 @@ export default class OHLCV_INDICATORS {
300
300
  throw new Error('"options" must be an object in bollingerBands. eg: {target, height, range}');
301
301
  }
302
302
 
303
- const {target = 'close', height = 0, range = [], zScore = []} = options
303
+ const {target = 'close', height = false, range = [], zScore = []} = options
304
304
 
305
305
  // Validate size and times
306
306
  if (typeof size !== 'number' || size <= 0) {
@@ -315,8 +315,8 @@ export default class OHLCV_INDICATORS {
315
315
  if (!Array.isArray(zScore)) {
316
316
  throw new Error('If set, "zScore" must be a array of column names in bollingerBands.');
317
317
  }
318
- if (typeof height !== 'number' || typeof height === 'number' && (height > 0 && height < size)) {
319
- throw new Error('"height" must be a "0" or any number greater than or equal to "size" in bollingerBands.');
318
+ if (typeof height !== 'boolean') {
319
+ throw new Error('"height" must be a boolean in bollingerBands.');
320
320
  }
321
321
 
322
322
  this.inputParams.push({key: 'bollingerBands', params: [size, stdDev, {target, height, range, zScore}]});
@@ -346,18 +346,26 @@ export default class OHLCV_INDICATORS {
346
346
  throw new Error('"size" must be a positive number or 0 in donchianChannels.');
347
347
  }
348
348
 
349
- if (typeof offset !== 'number' || offset <= 0) {
349
+ if (typeof offset !== 'number' || offset < 0) {
350
350
  throw new Error('"offset" must be a positive number or 0 in donchianChannels.');
351
351
  }
352
352
 
353
- const {height = false, range = false} = options
353
+ const {height = false, range = []} = options
354
+
355
+ if (!Array.isArray(range)) {
356
+ throw new Error('If set, "range" must be a array of column names in donchianChannels.');
357
+ }
358
+
359
+ if (typeof height !== 'boolean') {
360
+ throw new Error('"height" must be a boolean in donchianChannels.');
361
+ }
354
362
 
355
363
  this.inputParams.push({key: 'donchianChannels', params: [size, offset, {height, range}]})
356
364
  this.priceBased.push('donchian_channel_upper', 'donchian_channel_lower', 'donchian_channel_basis')
357
365
 
358
366
  return this
359
367
  }
360
- candleStudies(size = 20, classify = true, classificationLevels)
368
+ candleStudies(size = 20, options = {})
361
369
  {
362
370
 
363
371
  isAlreadyComputed(this)
@@ -366,11 +374,14 @@ export default class OHLCV_INDICATORS {
366
374
  throw new Error('"size" must be a positive number or 0 in candleStudies.');
367
375
  }
368
376
 
369
- if (typeof classify !== 'boolean') {
370
- throw new Error('"classify" must be a true or false in candleStudies.');
377
+ const {stdDev = 2, lag = 0} = options
378
+
379
+ if(typeof stdDev !== 'number' || (typeof stdDev === 'number' && stdDev <= 0))
380
+ {
381
+ throw new Error('"stdDev" must be a positive number greater than 0 in candleStudies.');
371
382
  }
372
383
 
373
- this.inputParams.push({key: 'candleStudies', params: [size, classify, classificationLevels]})
384
+ this.inputParams.push({key: 'candleStudies', params: [size, stdDev, lag]})
374
385
  return this
375
386
  }
376
387
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ohlcv-indicators",
3
- "version": "2.1.3",
3
+ "version": "2.1.5",
4
4
  "description": "A JavaScript library featuring optimized trading indicators for OHLCV arrays [{open, high, low, close, value}]. This library is optimized for backtesting and trading bot development.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -1,132 +1,121 @@
1
- import { FasterBollingerBands, FasterSMA } from 'trading-signals';
2
- import { classifySize } from '../utilities/classification.js';
1
+ import { FasterBollingerBands } from 'trading-signals'
3
2
 
4
- const defaultTarget = 'close';
3
+ const defaultTarget = 'close'
5
4
 
6
5
  export const bollingerBands = (main, index, size, stdDev, options) => {
7
- // Destructure options; ensure range and zScore default to empty arrays if not provided.
8
- const { height, range = [], zScore = [], target } = options;
9
- const suffix = target === defaultTarget ? '' : `_${target}`;
10
- const indicatorKey = `${size}_${stdDev}${suffix}`;
11
- let prefix; // Will be computed during initialization
6
+ // Destructure options ensure range and zScore default to empty arrays if not provided.
7
+
8
+ const { verticalOhlcv, instances, lastIndexReplace } = main;
9
+ const { height, range = [], zScore = [], target } = options
10
+ const suffix = target === defaultTarget ? '' : `_${target}`
11
+ const indicatorKey = `${size}_${stdDev}${suffix}`
12
+ let prefix // Will be computed during initialization
12
13
 
13
14
  // Initialize indicator instances and output arrays on the first call.
14
15
  if (index === 0) {
15
- if (!(target in main.verticalOhlcv)) {
16
- throw new Error(`bollingerBands could not find target "${target}"`);
16
+
17
+ const {nullArray, priceBased, inputParams} = main
18
+
19
+ if (!(target in verticalOhlcv)) {
20
+ throw new Error(`bollingerBands could not find target "${target}"`)
17
21
  }
18
22
 
19
- const numberOfIndicators = main.inputParams.filter(o => o.key === 'bollingerBands').length;
23
+ const numberOfIndicators = inputParams.filter(o => o.key === 'bollingerBands').length
20
24
  // Choose a prefix based on the number of indicators.
21
25
  prefix = numberOfIndicators > 1
22
26
  ? `bollinger_bands_${indicatorKey}`
23
- : `bollinger_bands${suffix}`;
27
+ : `bollinger_bands${suffix}`
24
28
 
25
29
  // Ensure the container exists.
26
- if (!main.instances.bollinger_bands) {
27
- main.instances.bollinger_bands = {
30
+ if (!instances.bollinger_bands) {
31
+ instances.bollinger_bands = {
28
32
  numberOfIndicators,
29
33
  settings: {}
30
- };
34
+ }
31
35
  }
32
36
 
33
37
  // Create the Bollinger Bands (and optional height) indicator instance.
34
- main.instances.bollinger_bands.settings[indicatorKey] = {
35
- instance: new FasterBollingerBands(size, stdDev),
36
- heightInstance: height >= size ? new FasterSMA(height) : null
37
- };
38
+ instances.bollinger_bands.settings[indicatorKey] = {
39
+ instance: new FasterBollingerBands(size, stdDev)
40
+ }
38
41
 
39
42
  // Build the base output arrays.
40
43
  const ohlcvSetup = {
41
- [`${prefix}_upper`]: [...main.nullArray],
42
- [`${prefix}_middle`]: [...main.nullArray],
43
- [`${prefix}_lower`]: [...main.nullArray],
44
- ...(height >= size && { [`${prefix}_height`]: [...main.nullArray] })
45
- };
46
-
47
-
48
-
44
+ [`${prefix}_upper`]: [...nullArray],
45
+ [`${prefix}_middle`]: [...nullArray],
46
+ [`${prefix}_lower`]: [...nullArray],
47
+ ...(height && { [`${prefix}_height`]: [...nullArray] })
48
+ }
49
49
 
50
50
  // Set up additional arrays for each range property.
51
51
  for (const rangeKey of range) {
52
- if (!(rangeKey in main.verticalOhlcv) || !main.priceBased.includes(rangeKey)) {
53
- throw new Error(`Invalid range item value "${rangeKey}" property for bollingerBands. Only price based key names are accepted:\n${JSON.stringify(main.priceBased)}`);
52
+ if (!(rangeKey in verticalOhlcv) || !priceBased.includes(rangeKey)) {
53
+ throw new Error(`Invalid range item value "${rangeKey}" property for bollingerBands. Only price based key names are accepted:\n${JSON.stringify(main.priceBased)}`)
54
54
  }
55
- ohlcvSetup[`${prefix}_range_${rangeKey}`] = [...main.nullArray];
55
+ ohlcvSetup[`${prefix}_range_${rangeKey}`] = [...nullArray]
56
56
  }
57
57
 
58
58
  // Set up additional arrays for each zScore property.
59
59
  for (const zScoreKey of zScore) {
60
- if (!(zScoreKey in main.verticalOhlcv) || !main.priceBased.includes(zScoreKey)) {
61
- throw new Error(`Invalid zScore item value "${zScoreKey}" for bollingerBands. Only price based key names are accepted:\n${JSON.stringify(main.priceBased)}`);
60
+ if (!(zScoreKey in verticalOhlcv) || !priceBased.includes(zScoreKey)) {
61
+ throw new Error(`Invalid zScore item value "${zScoreKey}" for bollingerBands. Only price based key names are accepted:\n${JSON.stringify(main.priceBased)}`)
62
62
  }
63
- ohlcvSetup[`${prefix}_zscore_${zScoreKey}`] = [...main.nullArray];
63
+ ohlcvSetup[`${prefix}_zscore_${zScoreKey}`] = [...nullArray]
64
64
  }
65
65
 
66
66
  // Merge the new arrays into verticalOhlcv.
67
- Object.assign(main.verticalOhlcv, ohlcvSetup);
67
+ Object.assign(verticalOhlcv, ohlcvSetup)
68
68
  }
69
69
 
70
70
  // For subsequent calls, if prefix wasn’t computed (i.e. index > 0), derive it.
71
71
  if (!prefix) {
72
- const num = main.instances.bollinger_bands.numberOfIndicators;
73
- prefix = num > 1 ? `bollinger_bands_${indicatorKey}` : `bollinger_bands${suffix}`;
72
+ const num = instances.bollinger_bands.numberOfIndicators
73
+ prefix = num > 1 ? `bollinger_bands_${indicatorKey}` : `bollinger_bands${suffix}`
74
74
  }
75
75
  // Use the same prefix for output keys.
76
- const subPrefix = prefix;
76
+ const subPrefix = prefix
77
77
 
78
78
  // Retrieve the indicator instance(s) and update with the current value.
79
- const { instance, heightInstance } = main.instances.bollinger_bands.settings[indicatorKey];
80
- const value = main.verticalOhlcv[target][index];
81
- instance.update(value, main.lastIndexReplace);
79
+ const { instance } = instances.bollinger_bands.settings[indicatorKey]
80
+ const value = verticalOhlcv[target][index]
81
+ instance.update(value, lastIndexReplace)
82
82
 
83
- let result;
83
+ let result
84
84
  try {
85
- result = instance.getResult();
85
+ result = instance.getResult()
86
86
  } catch (err) {
87
87
  // If the result is not available yet, simply exit.
88
88
  }
89
- if (!result) return true;
89
+ if (!result) return true
90
90
 
91
- const { upper, middle, lower } = result;
91
+ const { upper, middle, lower } = result
92
+
92
93
  main.pushToMain({index, key: `${subPrefix}_upper`, value: upper})
93
94
  main.pushToMain({index, key: `${subPrefix}_middle`, value: middle})
94
95
  main.pushToMain({index, key: `${subPrefix}_lower`, value: lower})
95
96
 
96
- // Exit early if neither height nor range are requested.
97
- if (!height && !range) return true;
98
97
 
99
98
  // Process height if a height instance exists.
100
- if (heightInstance) {
101
- const heightValue = upper - lower;
102
- heightInstance.update(heightValue, main.lastIndexReplace);
103
- let heightMean;
104
- try {
105
- heightMean = heightInstance.getResult();
106
- } catch (err) {
107
- // Swallow error if the height result is not ready.
108
- }
109
- if (heightMean) {
110
- main.pushToMain({index, key: `${subPrefix}_height`, value: classifySize(heightValue, heightMean, 0.5, 7)})
111
- }
99
+ if (height) {
100
+ const heightValue = ((upper - lower) / lower) * 100
101
+ main.pushToMain({index, key: `${subPrefix}_height`, value: heightValue})
112
102
  }
113
103
 
114
104
  // Process each range property.
115
105
  for (const rangeKey of range) {
116
- const rangeValue = (main.verticalOhlcv[rangeKey][index] - lower) / (upper - lower);
106
+ const rangeValue = (verticalOhlcv[rangeKey][index] - lower) / (upper - lower)
117
107
  main.pushToMain({index, key: `${subPrefix}_range_${rangeKey}`, value: rangeValue})
118
108
  }
119
109
 
120
110
  // Process each zScore property.
121
111
  for (const zScoreKey of zScore) {
122
- const denominator = upper - lower;
112
+ const denominator = upper - lower
123
113
  const zScoreValue = denominator !== 0
124
- ? (2 * stdDev * (main.verticalOhlcv[zScoreKey][index] - middle)) / denominator
125
- : 0;
126
-
114
+ ? (2 * stdDev * (verticalOhlcv[zScoreKey][index] - middle)) / denominator
115
+ : 0
127
116
 
128
117
  main.pushToMain({index, key: `${subPrefix}_zscore_${zScoreKey}`, value: zScoreValue})
129
118
  }
130
119
 
131
- return true;
132
- };
120
+ return true
121
+ }
@@ -1,112 +1,100 @@
1
- import { FasterSMA } from 'trading-signals';
2
- import { classifySize } from '../utilities/classification.js';
3
1
 
4
2
  export const donchianChannels = (main, index, size, offset, options) => {
5
- const { height, range } = options;
6
- const indicatorKey = `${size}_${offset}`;
3
+ const { height, range } = options
4
+ const indicatorKey = `${size}_${offset}`
7
5
 
8
6
  // Initialization: create output arrays and indicator instance on the first call.
9
7
  if (index === 0) {
10
- const numberOfIndicators = main.inputParams.filter(o => o.key === 'donchianChannels').length;
11
- const prefix = numberOfIndicators > 1 ? `donchian_channel_${indicatorKey}` : 'donchian_channel';
8
+ const numberOfIndicators = main.inputParams.filter(o => o.key === 'donchianChannels').length
9
+ const prefix = numberOfIndicators > 1 ? `donchian_channel_${indicatorKey}` : 'donchian_channel'
12
10
 
13
11
  Object.assign(main.verticalOhlcv, {
14
12
  [`${prefix}_upper`]: [...main.nullArray],
15
13
  [`${prefix}_basis`]: [...main.nullArray],
16
14
  [`${prefix}_lower`]: [...main.nullArray],
17
- ...(height && { [`${prefix}_height`]: [...main.nullArray] }),
18
- ...(range && { [`${prefix}_range`]: [...main.nullArray] })
19
- });
15
+ ...(height && { [`${prefix}_height`]: [...main.nullArray] })
16
+ })
20
17
 
21
18
  if (!main.instances.hasOwnProperty('donchian_channel')) {
22
- main.instances.donchian_channel = { numberOfIndicators, settings: {} };
19
+ main.instances.donchian_channel = { numberOfIndicators, settings: {} }
20
+ }
21
+
22
+ // Set up additional arrays for each range property.
23
+ for (const rangeKey of range) {
24
+ if (!(rangeKey in main.verticalOhlcv) || !main.priceBased.includes(rangeKey)) {
25
+ throw new Error(`Invalid range item value "${rangeKey}" property for donchianChannels. Only price based key names are accepted:\n${JSON.stringify(main.priceBased)}`)
26
+ }
27
+ main.verticalOhlcv[`${prefix}_range_${rangeKey}`] = [...main.nullArray]
23
28
  }
24
29
 
25
- // In addition to your heightInstance, also initialize deques for highs and lows.
26
30
  main.instances.donchian_channel.settings[indicatorKey] = {
27
- heightInstance: height
28
- ? new FasterSMA(typeof height === 'number' && height > 0 ? height : size)
29
- : null,
30
31
  maxDeque: [], // will hold indices for highs in descending order
31
32
  minDeque: [] // will hold indices for lows in ascending order
32
- };
33
+ }
33
34
  }
34
35
 
35
- const numberOfIndicators = main.instances.donchian_channel.numberOfIndicators;
36
- const subPrefix = numberOfIndicators > 1 ? `donchian_channel_${indicatorKey}` : 'donchian_channel';
37
- const state = main.instances.donchian_channel.settings[indicatorKey];
38
- const { heightInstance, maxDeque, minDeque } = state;
36
+ const numberOfIndicators = main.instances.donchian_channel.numberOfIndicators
37
+ const subPrefix = numberOfIndicators > 1 ? `donchian_channel_${indicatorKey}` : 'donchian_channel'
38
+ const state = main.instances.donchian_channel.settings[indicatorKey]
39
+ const { maxDeque, minDeque } = state
39
40
 
40
41
  // Compute the “current bar index” for the window.
41
42
  // Note: We use index - offset so that the window is built on the proper part of the array.
42
- const currentBarIdx = index - offset;
43
- const endIdx = currentBarIdx + 1; // currentBarIdx is inclusive
44
- const startIdx = endIdx - size; // window: [startIdx, endIdx)
43
+ const currentBarIdx = index - offset
44
+ const endIdx = currentBarIdx + 1 // currentBarIdx is inclusive
45
+ const startIdx = endIdx - size // window: [startIdx, endIdx)
45
46
 
46
47
  // If the window is not fully available, exit early.
47
- if (startIdx < 0 || endIdx > main.len) return true;
48
+ if (startIdx < 0 || endIdx > main.len) return true
48
49
 
49
- const highs = main.verticalOhlcv.high;
50
- const lows = main.verticalOhlcv.low;
50
+ const highs = main.verticalOhlcv.high
51
+ const lows = main.verticalOhlcv.low
51
52
 
52
53
  // **Update the maximum deque:**
53
54
  // Remove indices that are out of the current window.
54
55
  while (maxDeque.length && maxDeque[0] < startIdx) {
55
- maxDeque.shift();
56
+ maxDeque.shift()
56
57
  }
57
58
  // Remove indices whose corresponding high value is less than or equal to the current high.
58
59
  while (maxDeque.length && highs[maxDeque[maxDeque.length - 1]] <= highs[currentBarIdx]) {
59
- maxDeque.pop();
60
+ maxDeque.pop()
60
61
  }
61
62
  // Add the current index.
62
- maxDeque.push(currentBarIdx);
63
+ maxDeque.push(currentBarIdx)
63
64
 
64
65
  // **Update the minimum deque:**
65
66
  // Remove indices that are out of the current window.
66
67
  while (minDeque.length && minDeque[0] < startIdx) {
67
- minDeque.shift();
68
+ minDeque.shift()
68
69
  }
69
70
  // Remove indices whose corresponding low value is greater than or equal to the current low.
70
71
  while (minDeque.length && lows[minDeque[minDeque.length - 1]] >= lows[currentBarIdx]) {
71
- minDeque.pop();
72
+ minDeque.pop()
72
73
  }
73
74
  // Add the current index.
74
- minDeque.push(currentBarIdx);
75
+ minDeque.push(currentBarIdx)
75
76
 
76
77
  // Now the maximum high is at the front of maxDeque and the minimum low is at the front of minDeque.
77
- const upper = highs[maxDeque[0]];
78
- const lower = lows[minDeque[0]];
79
- const basis = (upper + lower) / 2;
80
- const close = main.verticalOhlcv.close[index];
81
- const rangeValue = (close - lower) / (upper - lower);
82
- const heightValue = upper - lower;
83
-
84
- // Update the height indicator if requested.
85
- if (height && heightInstance) {
86
- heightInstance.update(heightValue, main.lastIndexReplace);
87
- }
88
-
78
+ const upper = highs[maxDeque[0]]
79
+ const lower = lows[minDeque[0]]
80
+ const basis = (upper + lower) / 2
81
+
89
82
  // Update the computed values in the output arrays.
90
83
 
91
84
  main.pushToMain({index, key: `${subPrefix}_upper`, value: upper})
92
85
  main.pushToMain({index, key: `${subPrefix}_basis`, value: basis})
93
86
  main.pushToMain({index, key: `${subPrefix}_lower`, value: lower})
94
87
 
95
- if (range) {
96
- main.pushToMain({index, key: `${subPrefix}_range`, value: rangeValue})
88
+ if (height) {
89
+ const heightValue = ((upper - lower) / lower) * 100
90
+ main.pushToMain({index, key: `${subPrefix}_height`, value: heightValue})
97
91
  }
98
- if (height && heightInstance) {
99
- let heightMean;
100
- try {
101
- heightMean = heightInstance.getResult();
102
- } catch (err) {
103
- // Ignore errors if the result isn't ready.
104
- }
105
- if (heightMean) {
106
92
 
107
- main.pushToMain({index, key: `${subPrefix}_height`, value: classifySize(heightValue, heightMean, 1.5)})
108
- }
93
+ // Process each range property.
94
+ for (const rangeKey of range) {
95
+ const rangeValue = (main.verticalOhlcv[rangeKey][index] - lower) / (upper - lower)
96
+ main.pushToMain({index, key: `${subPrefix}_range_${rangeKey}`, value: rangeValue})
109
97
  }
110
98
 
111
- return true;
112
- };
99
+ return true
100
+ }
@@ -1,166 +1,115 @@
1
- import { FasterSMA } from 'trading-signals';
2
- import { classifySize } from '../utilities/classification.js';
1
+ import { FasterSMA, FasterBollingerBands } from 'trading-signals'
2
+ import { classifyBoll } from '../utilities/classification.js'
3
3
 
4
- export const candleStudies = (main, index, size, classify = true, classificationLevels = {}) => {
4
+ const diff = (a, b) => {
5
+ const value = a - b
6
+ return {value: Math.abs(value), positive: value >= 0}
7
+ }
5
8
 
6
- const { changeLevel = 7, sizeLevel = 5 } = classificationLevels;
9
+ export const candleStudies = (main, index, size, stdDev, lag) => {
10
+
11
+ const { verticalOhlcv, instances, lastIndexReplace } = main
7
12
 
8
13
  if(index === 0)
9
14
  {
10
- Object.assign(main.verticalOhlcv, {
11
- candle_gap_size: [...main.nullArray],
12
- candle_body_size: [...main.nullArray],
13
- candle_top_size: [...main.nullArray],
14
- candle_bottom_size: [...main.nullArray],
15
- candle_shadow_size: [...main.nullArray],
16
- candle_close_direction: [...main.nullArray],
17
- candle_high_direction: [...main.nullArray],
18
- candle_low_direction: [...main.nullArray],
19
- candle_open_direction: [...main.nullArray],
15
+ const {nullArray} = main
16
+
17
+ Object.assign(verticalOhlcv, {
18
+ candle_gap: [...nullArray],
19
+ candle_body: [...nullArray],
20
+ candle_top: [...nullArray],
21
+ candle_bottom: [...nullArray],
22
+ candle_close: [...nullArray],
23
+ candle_high: [...nullArray],
24
+ candle_low: [...nullArray],
25
+ candle_open: [...nullArray],
20
26
  })
21
- }
22
27
 
23
- // Ensure instances exist if classification is enabled
24
- if (classify && index === 0) {
25
-
26
- Object.assign(main.instances, {
28
+ Object.assign(instances, {
27
29
  candleStudies: {
28
- topInstance: new FasterSMA(size),
29
- bottomInstance: new FasterSMA(size),
30
- gapInstance: new FasterSMA(size),
31
- bodySizeInstance: new FasterSMA(size),
32
- shadowSizeInstance: new FasterSMA(size),
33
- closeDirectionInstance: new FasterSMA(size),
34
- highDirectionInstance: new FasterSMA(size),
35
- lowDirectionInstance: new FasterSMA(size),
36
- openDirectionInstance: new FasterSMA(size)
30
+ bodyInstance: new FasterBollingerBands(size, stdDev),
31
+ closeInstance: new FasterBollingerBands(size, stdDev),
32
+ highInstance: new FasterBollingerBands(size, stdDev),
33
+ lowInstance: new FasterBollingerBands(size, stdDev),
34
+ openInstance: new FasterBollingerBands(size, stdDev)
37
35
  }
38
36
  })
39
- }
40
37
 
41
- // If we do not have a previous candle, we cannot compute differences
42
- const prevOpen = main.verticalOhlcv.open[index-1]
43
- const prevHigh = main.verticalOhlcv.high[index-1]
44
- const prevLow = main.verticalOhlcv.low[index-1]
45
- const prevClose = main.verticalOhlcv.close[index-1]
46
-
47
- if (index === 0) return true;
48
-
49
- const currOpen = main.verticalOhlcv.open[index]
50
- const currHigh = main.verticalOhlcv.high[index]
51
- const currLow = main.verticalOhlcv.low[index]
52
- const currClose = main.verticalOhlcv.close[index]
53
-
54
- // Determine candle direction and sizes
55
- const isUp = currClose > currOpen;
56
- const candleBodySize = Math.abs(currClose - currOpen);
57
- const shadowSize = Math.abs(currHigh - currLow);
58
-
59
- const topSize = currHigh - Math.max(currOpen, currClose);
60
- const bottomSize = Math.min(currOpen, currClose) - currLow;
61
- const gapSize = Math.abs(prevClose - currOpen);
62
- const closeDirection = Math.abs(currClose - prevClose);
63
- const highDirection = Math.abs(currHigh - prevHigh);
64
- const lowDirection = Math.abs(currLow - prevLow);
65
- const openDirection = Math.abs(currOpen - prevOpen);
66
-
67
- let gapMean = null;
68
- let bottomSizeMean = null;
69
- let topSizeMean = null;
70
- let bodySizeMean = null;
71
- let shadowSizeMean = null;
72
- let closeDirectionMean = null;
73
- let highDirectionMean = null;
74
- let lowDirectionMean = null;
75
- let openDirectionMean = null;
76
-
77
- if (classify) {
78
- const {
79
- topInstance,
80
- bottomInstance,
81
- gapInstance,
82
- bodySizeInstance,
83
- shadowSizeInstance,
84
- closeDirectionInstance,
85
- highDirectionInstance,
86
- lowDirectionInstance,
87
- openDirectionInstance
88
- } = main.instances.candleStudies;
89
-
90
- // Update instances with current absolute values
91
- topInstance.update(Math.abs(topSize), main.lastIndexReplace);
92
- bottomInstance.update(Math.abs(bottomSize), main.lastIndexReplace);
93
- shadowSizeInstance.update(Math.abs(shadowSize), main.lastIndexReplace);
94
- gapInstance.update(gapSize, main.lastIndexReplace);
95
- bodySizeInstance.update(candleBodySize, main.lastIndexReplace);
96
- closeDirectionInstance.update(closeDirection, main.lastIndexReplace);
97
- highDirectionInstance.update(highDirection, main.lastIndexReplace);
98
- lowDirectionInstance.update(lowDirection, main.lastIndexReplace);
99
- openDirectionInstance.update(openDirection, main.lastIndexReplace);
100
-
101
- try {
102
- topSizeMean = topInstance.getResult();
103
- bottomSizeMean = bottomInstance.getResult();
104
- gapMean = gapInstance.getResult();
105
- bodySizeMean = bodySizeInstance.getResult();
106
- shadowSizeMean = shadowSizeInstance.getResult();
107
- closeDirectionMean = closeDirectionInstance.getResult();
108
- highDirectionMean = highDirectionInstance.getResult();
109
- lowDirectionMean = lowDirectionInstance.getResult();
110
- openDirectionMean = openDirectionInstance.getResult();
111
- } catch (err) {
112
- // If there's not enough data, means remain null
38
+ if(lag > 0)
39
+ {
40
+ const keyNames = ['candle_body', 'candle_gap', 'candle_close', 'candle_high', 'candle_low', 'candle_open', 'candle_top', 'candle_bottom']
41
+ main.lag(keyNames, lag)
113
42
  }
114
-
115
- main.pushToMain({
116
- index,
117
- key: 'candle_body_size',
118
- value: isUp
119
- ? classifySize(candleBodySize, bodySizeMean, 2, changeLevel)
120
- : -Math.abs(classifySize(candleBodySize, bodySizeMean, 2, changeLevel)) || 0
121
- })
122
-
123
43
 
44
+ }
124
45
 
125
- main.pushToMain({index, key: 'candle_gap_size', value: isUp
126
- ? classifySize(gapSize, gapMean, 2, changeLevel)
127
- : -Math.abs(classifySize(gapSize, gapMean, 2, changeLevel)) || 0})
128
-
129
-
130
- main.pushToMain({index, key: 'candle_close_direction', value: isUp
131
- ? classifySize(closeDirection, closeDirectionMean, 2, changeLevel)
132
- : -Math.abs(classifySize(closeDirection, closeDirectionMean, 2, changeLevel)) || 0})
133
-
134
-
135
- main.pushToMain({index, key: 'candle_high_direction', value: isUp
136
- ? classifySize(highDirection, highDirectionMean, 2, changeLevel)
137
- : -Math.abs(classifySize(highDirection, highDirectionMean, 2, changeLevel)) || 0})
46
+ // If we do not have a previous candle, we cannot compute differences
47
+ const prevOpen = verticalOhlcv.open[index-1]
48
+ const prevHigh = verticalOhlcv.high[index-1]
49
+ const prevLow = verticalOhlcv.low[index-1]
50
+ const prevClose = verticalOhlcv.close[index-1]
51
+
52
+ if (index === 0) return true
53
+
54
+ const currOpen = verticalOhlcv.open[index]
55
+ const currHigh = verticalOhlcv.high[index]
56
+ const currLow = verticalOhlcv.low[index]
57
+ const currClose = verticalOhlcv.close[index]
58
+
59
+
60
+ //sizes
61
+ const bodySize = diff(currClose, currOpen)
62
+ const topSize = diff(currHigh, Math.max(currOpen, currClose))
63
+ const bottomSize = diff(Math.min(currOpen, currClose), currLow)
64
+ const gapSize = diff(prevClose, currOpen)
65
+ const closeChange = diff(currClose, prevClose)
66
+ const highChange = diff(currHigh, prevHigh)
67
+ const lowChange = diff(currLow, prevLow)
68
+ const openChange = diff(currOpen, prevOpen)
69
+
70
+ let bodyBoll = null
71
+ let closeBoll = null
72
+ let highBoll = null
73
+ let lowBoll = null
74
+ let openBoll = null
75
+
76
+ const {
77
+ bodyInstance,
78
+ closeInstance,
79
+ highInstance,
80
+ lowInstance,
81
+ openInstance
82
+ } = instances.candleStudies
83
+
84
+ // Update instances with current absolute values
85
+ bodyInstance.update(bodySize.value, lastIndexReplace)
86
+ closeInstance.update(closeChange.value, lastIndexReplace)
87
+ highInstance.update(highChange.value, lastIndexReplace)
88
+ lowInstance.update(lowChange.value, lastIndexReplace)
89
+ openInstance.update(openChange.value, lastIndexReplace)
90
+
91
+ try {
92
+ bodyBoll = bodyInstance.getResult()
93
+ closeBoll = closeInstance.getResult()
94
+ highBoll = highInstance.getResult()
95
+ lowBoll = lowInstance.getResult()
96
+ openBoll = openInstance.getResult()
97
+ } catch (err) {
98
+ // If there's not enough data, means remain null
99
+ }
138
100
 
139
- main.pushToMain({index, key: 'candle_low_direction', value: isUp
140
- ? classifySize(lowDirection, lowDirectionMean, 2, changeLevel)
141
- : -Math.abs(classifySize(lowDirection, lowDirectionMean, 2, changeLevel)) || 0})
142
101
 
143
- main.pushToMain({index, key: 'candle_open_direction', value: isUp
144
- ? classifySize(openDirection, openDirectionMean, 2, changeLevel)
145
- : -Math.abs(classifySize(openDirection, openDirectionMean, 2, changeLevel)) || 0})
102
+ main.pushToMain({index, key: 'candle_close', value: classifyBoll(closeChange, closeBoll)})
103
+ main.pushToMain({index, key: 'candle_high', value: classifyBoll(highChange, highBoll)})
104
+ main.pushToMain({index, key: 'candle_low', value: classifyBoll(lowChange, lowBoll)})
105
+ main.pushToMain({index, key: 'candle_open', value: classifyBoll(openChange, openBoll)})
146
106
 
147
- main.pushToMain({index, key: 'candle_top_size', value: classifySize(topSize, topSizeMean, 0.5, sizeLevel)})
148
- main.pushToMain({index, key: 'candle_bottom_size', value: classifySize(bottomSize, bottomSizeMean, 0.5, sizeLevel)})
149
- main.pushToMain({index, key: 'candle_shadow_size', value: classifySize(shadowSize, shadowSizeMean, 0.5, sizeLevel)})
107
+ main.pushToMain({index, key: 'candle_body', value: classifyBoll(bodySize, bodyBoll)})
108
+ main.pushToMain({index, key: 'candle_gap', value: classifyBoll(gapSize, bodyBoll)})
109
+ main.pushToMain({index, key: 'candle_top', value: classifyBoll(topSize, bodyBoll)})
110
+ main.pushToMain({index, key: 'candle_bottom', value: classifyBoll(bottomSize, bodyBoll)})
150
111
 
151
- } else {
152
- // Without classification, just store raw values
112
+ return true
113
+ }
153
114
 
154
- main.pushToMain({index, key: 'candle_body_size', value: isUp ? candleBodySize : -candleBodySize})
155
- main.pushToMain({index, key: 'candle_gap_size', value: isUp ? gapSize : -gapSize})
156
- main.pushToMain({index, key: 'candle_close_direction', value: isUp ? closeDirection : -closeDirection})
157
- main.pushToMain({index, key: 'candle_high_direction', value: isUp ? highDirection : -highDirection})
158
- main.pushToMain({index, key: 'candle_low_direction', value: isUp ? lowDirection : -lowDirection})
159
- main.pushToMain({index, key: 'candle_open_direction', value: isUp ? openDirection : -openDirection})
160
- main.pushToMain({index, key: 'candle_top_size', value: topSize})
161
- main.pushToMain({index, key: 'candle_bottom_size', value: bottomSize})
162
- main.pushToMain({index, key: 'candle_shadow_size', value: shadowSize})
163
- }
164
115
 
165
- return true;
166
- };
@@ -1,21 +1,36 @@
1
- export const classifySize = (value, mean, standardDeviation = 1.5, numLevels = 5) => {
2
- if (value === null || mean === null || standardDeviation === null) return null
3
- if (numLevels < 2) throw new Error("numLevels must be at least 2")
4
-
5
- // Calculate the range for each level
6
- const step = (4 * standardDeviation) / (numLevels - 1)
7
- const thresholds = []
8
-
9
- for (let i = 0; i < numLevels - 1; i++) {
10
- thresholds.push(mean - (2 * standardDeviation) + (i * step))
11
- }
12
-
13
- // Classify the value based on calculated thresholds
14
- for (let i = thresholds.length - 1; i >= 0; i--) {
15
- if (value > thresholds[i]) {
16
- return (i + 1) / (numLevels - 1)
17
- }
18
- }
19
-
20
- return 0
21
- }
1
+ /**
2
+ * Classifies a given value relative to the Bollinger bands.
3
+ *
4
+ * @param {Object} params - Parameters object.
5
+ * @param {number} params.value - The value to classify.
6
+ * @param {boolean} [params.positive=true] - Flag to determine if the result should be positive.
7
+ * @param {Object} bollingerBands - Object containing the Bollinger band thresholds.
8
+ * @param {number} bollingerBands.upper - The upper band threshold.
9
+ * @param {number} bollingerBands.middle - The middle band value.
10
+ * @param {number} bollingerBands.lower - The lower band threshold.
11
+ * @returns {number|null} The classified value, or null if inputs are invalid.
12
+ */
13
+ export const classifyBoll = ({ value, positive = true }, bollingerBands) => {
14
+ // Validate that value and bollingerBands are not null/undefined
15
+ if (value == null || bollingerBands == null) return null;
16
+
17
+ const { upper, middle, lower } = bollingerBands;
18
+
19
+
20
+ // Handle values outside the Bollinger bands
21
+ if (value < lower) return 0;
22
+ if (value > upper) return positive ? 1 : -1;
23
+
24
+ // Use a tolerance for floating point comparisons
25
+ const epsilon = Number.EPSILON * Math.max(Math.abs(value), Math.abs(middle));
26
+ if (Math.abs(value - middle) < epsilon) return positive ? 0.5 : -0.5;
27
+
28
+ // Prevent division by zero if upper and lower are equal
29
+ if (upper === lower) return null;
30
+
31
+ const rangeValue = (value - lower) / (upper - lower);
32
+ const magnitude = Math.round(rangeValue * 10) / 10;
33
+
34
+ return positive ? magnitude : -magnitude;
35
+ };
36
+