ohlcv-indicators 1.2.7 → 1.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- var OHLCV_INDICATORS;(()=>{"use strict";var t={d:(e,s)=>{for(var i in s)t.o(s,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:s[i]})},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={};(()=>{t.r(e),t.d(e,{default:()=>V});var s=1e6,i="[big.js] ",o=i+"Invalid ",h=o+"decimal places",r=o+"rounding mode",n=i+"Division by zero",l={},c=void 0,a=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;function u(t,e,s,i){var o=t.c;if(s===c&&(s=t.constructor.RM),0!==s&&1!==s&&2!==s&&3!==s)throw Error(r);if(e<1)i=3===s&&(i||!!o[0])||0===e&&(1===s&&o[0]>=5||2===s&&(o[0]>5||5===o[0]&&(i||o[1]!==c))),o.length=1,i?(t.e=t.e-e+1,o[0]=1):o[0]=t.e=0;else if(e<o.length){if(i=1===s&&o[e]>=5||2===s&&(o[e]>5||5===o[e]&&(i||o[e+1]!==c||1&o[e-1]))||3===s&&(i||!!o[0]),o.length=e,i)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 p(t,e,s){var i=t.e,o=t.c.join(""),h=o.length;if(e)o=o.charAt(0)+(h>1?"."+o.slice(1):"")+(i<0?"e":"e+")+i;else if(i<0){for(;++i;)o="0"+o;o="0."+o}else if(i>0)if(++i>h)for(i-=h;i--;)o+="0";else i<h&&(o=o.slice(0,i)+"."+o.slice(i));else h>1&&(o=o.charAt(0)+"."+o.slice(1));return t.s<0&&s?"-"+o:o}l.abs=function(){var t=new this.constructor(this);return t.s=1,t},l.cmp=function(t){var e,s=this,i=s.c,o=(t=new s.constructor(t)).c,h=s.s,r=t.s,n=s.e,l=t.e;if(!i[0]||!o[0])return i[0]?h:o[0]?-r:0;if(h!=r)return h;if(e=h<0,n!=l)return n>l^e?1:-1;for(r=(n=i.length)<(l=o.length)?n:l,h=-1;++h<r;)if(i[h]!=o[h])return i[h]>o[h]^e?1:-1;return n==l?0:n>l^e?1:-1},l.div=function(t){var e=this,i=e.constructor,o=e.c,r=(t=new i(t)).c,l=e.s==t.s?1:-1,a=i.DP;if(a!==~~a||a<0||a>s)throw Error(h);if(!r[0])throw Error(n);if(!o[0])return t.s=l,t.c=[t.e=0],t;var p,g,v,f,d,m=r.slice(),w=p=r.length,M=o.length,b=o.slice(0,p),x=b.length,R=t,B=R.c=[],y=0,P=a+(R.e=e.e-t.e)+1;for(R.s=l,l=P<0?0:P,m.unshift(0);x++<p;)b.push(0);do{for(v=0;v<10;v++){if(p!=(x=b.length))f=p>x?1:-1;else for(d=-1,f=0;++d<p;)if(r[d]!=b[d]){f=r[d]>b[d]?1:-1;break}if(!(f<0))break;for(g=x==p?r:m;x;){if(b[--x]<g[x]){for(d=x;d&&!b[--d];)b[d]=9;--b[d],b[x]+=10}b[x]-=g[x]}for(;!b[0];)b.shift()}B[y++]=f?v:++v,b[0]&&f?b[x]=o[w]||0:b=[o[w]]}while((w++<M||b[0]!==c)&&l--);return B[0]||1==y||(B.shift(),R.e--,P--),y>P&&u(R,P,i.RM,b[0]!==c),R},l.eq=function(t){return 0===this.cmp(t)},l.gt=function(t){return this.cmp(t)>0},l.gte=function(t){return this.cmp(t)>-1},l.lt=function(t){return this.cmp(t)<0},l.lte=function(t){return this.cmp(t)<1},l.minus=l.sub=function(t){var e,s,i,o,h=this,r=h.constructor,n=h.s,l=(t=new r(t)).s;if(n!=l)return t.s=-l,h.plus(t);var c=h.c.slice(),a=h.e,u=t.c,p=t.e;if(!c[0]||!u[0])return u[0]?t.s=-l:c[0]?t=new r(h):t.s=1,t;if(n=a-p){for((o=n<0)?(n=-n,i=c):(p=a,i=u),i.reverse(),l=n;l--;)i.push(0);i.reverse()}else for(s=((o=c.length<u.length)?c:u).length,n=l=0;l<s;l++)if(c[l]!=u[l]){o=c[l]<u[l];break}if(o&&(i=c,c=u,u=i,t.s=-t.s),(l=(s=u.length)-(e=c.length))>0)for(;l--;)c[e++]=0;for(l=e;s>n;){if(c[--s]<u[s]){for(e=s;e&&!c[--e];)c[e]=9;--c[e],c[s]+=10}c[s]-=u[s]}for(;0===c[--l];)c.pop();for(;0===c[0];)c.shift(),--p;return c[0]||(t.s=1,c=[p=0]),t.c=c,t.e=p,t},l.mod=function(t){var e,s=this,i=s.constructor,o=s.s,h=(t=new i(t)).s;if(!t.c[0])throw Error(n);return s.s=t.s=1,e=1==t.cmp(s),s.s=o,t.s=h,e?new i(s):(o=i.DP,h=i.RM,i.DP=i.RM=0,s=s.div(t),i.DP=o,i.RM=h,this.minus(s.times(t)))},l.neg=function(){var t=new this.constructor(this);return t.s=-t.s,t},l.plus=l.add=function(t){var e,s,i,o=this,h=o.constructor;if(t=new h(t),o.s!=t.s)return t.s=-t.s,o.minus(t);var r=o.e,n=o.c,l=t.e,c=t.c;if(!n[0]||!c[0])return c[0]||(n[0]?t=new h(o):t.s=o.s),t;if(n=n.slice(),e=r-l){for(e>0?(l=r,i=c):(e=-e,i=n),i.reverse();e--;)i.push(0);i.reverse()}for(n.length-c.length<0&&(i=c,c=n,n=i),e=c.length,s=0;e;n[e]%=10)s=(n[--e]=n[e]+c[e]+s)/10|0;for(s&&(n.unshift(s),++l),e=n.length;0===n[--e];)n.pop();return t.c=n,t.e=l,t},l.pow=function(t){var e=this,s=new e.constructor("1"),i=s,h=t<0;if(t!==~~t||t<-1e6||t>1e6)throw Error(o+"exponent");for(h&&(t=-t);1&t&&(i=i.times(e)),t>>=1;)e=e.times(e);return h?s.div(i):i},l.prec=function(t,e){if(t!==~~t||t<1||t>s)throw Error(o+"precision");return u(new this.constructor(this),t,e)},l.round=function(t,e){if(t===c)t=0;else if(t!==~~t||t<-s||t>s)throw Error(h);return u(new this.constructor(this),t+this.e+1,e)},l.sqrt=function(){var t,e,s,o=this,h=o.constructor,r=o.s,n=o.e,l=new h("0.5");if(!o.c[0])return new h(o);if(r<0)throw Error(i+"No square root");0===(r=Math.sqrt(o+""))||r===1/0?((e=o.c.join("")).length+n&1||(e+="0"),n=((n+1)/2|0)-(n<0||1&n),t=new h(((r=Math.sqrt(e))==1/0?"5e":(r=r.toExponential()).slice(0,r.indexOf("e")+1))+n)):t=new h(r+""),n=t.e+(h.DP+=4);do{s=t,t=l.times(s.plus(o.div(s)))}while(s.c.slice(0,n).join("")!==t.c.slice(0,n).join(""));return u(t,(h.DP-=4)+t.e+1,h.RM)},l.times=l.mul=function(t){var e,s=this,i=s.constructor,o=s.c,h=(t=new i(t)).c,r=o.length,n=h.length,l=s.e,c=t.e;if(t.s=s.s==t.s?1:-1,!o[0]||!h[0])return t.c=[t.e=0],t;for(t.e=l+c,r<n&&(e=o,o=h,h=e,c=r,r=n,n=c),e=new Array(c=r+n);c--;)e[c]=0;for(l=n;l--;){for(n=0,c=r+l;c>l;)n=e[c]+h[l]*o[c-l-1]+n,e[c--]=n%10,n=n/10|0;e[c]=n}for(n?++t.e:e.shift(),l=e.length;!e[--l];)e.pop();return t.c=e,t},l.toExponential=function(t,e){var i=this,o=i.c[0];if(t!==c){if(t!==~~t||t<0||t>s)throw Error(h);for(i=u(new i.constructor(i),++t,e);i.c.length<t;)i.c.push(0)}return p(i,!0,!!o)},l.toFixed=function(t,e){var i=this,o=i.c[0];if(t!==c){if(t!==~~t||t<0||t>s)throw Error(h);for(t=t+(i=u(new i.constructor(i),t+i.e+1,e)).e+1;i.c.length<t;)i.c.push(0)}return p(i,!1,!!o)},l[Symbol.for("nodejs.util.inspect.custom")]=l.toJSON=l.toString=function(){var t=this,e=t.constructor;return p(t,t.e<=e.NE||t.e>=e.PE,!!t.c[0])},l.toNumber=function(){var t=Number(p(this,!0,!0));if(!0===this.constructor.strict&&!this.eq(t.toString()))throw Error(i+"Imprecise conversion");return t},l.toPrecision=function(t,e){var i=this,h=i.constructor,r=i.c[0];if(t!==c){if(t!==~~t||t<1||t>s)throw Error(o+"precision");for(i=u(new h(i),t,e);i.c.length<t;)i.c.push(0)}return p(i,t<=i.e||i.e<=h.NE||i.e>=h.PE,!!r)},l.valueOf=function(){var t=this,e=t.constructor;if(!0===e.strict)throw Error(i+"valueOf disallowed");return p(t,t.e<=e.NE||t.e>=e.PE,!0)};const g=function t(){function e(s){var i=this;if(!(i instanceof e))return s===c?t():new e(s);if(s instanceof e)i.s=s.s,i.e=s.e,i.c=s.c.slice();else{if("string"!=typeof s){if(!0===e.strict&&"bigint"!=typeof s)throw TypeError(o+"value");s=0===s&&1/s<0?"-0":String(s)}!function(t,e){var s,i,h;if(!a.test(e))throw Error(o+"number");for(t.s="-"==e.charAt(0)?(e=e.slice(1),-1):1,(s=e.indexOf("."))>-1&&(e=e.replace(".","")),(i=e.search(/e/i))>0?(s<0&&(s=i),s+=+e.slice(i+1),e=e.substring(0,i)):s<0&&(s=e.length),h=e.length,i=0;i<h&&"0"==e.charAt(i);)++i;if(i==h)t.c=[t.e=0];else{for(;h>0&&"0"==e.charAt(--h););for(t.e=s-i-1,t.c=[],s=0;i<=h;)t.c[s++]=+e.charAt(i++)}}(i,s)}i.constructor=e}return e.prototype=l,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}();class v extends Error{constructor(t="Not enough data"){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name="NotEnoughDataError"}}class f{previousHighest;highest;previousLowest;lowest;previousResult;result;get isStable(){return void 0!==this.result}getResult(){if(void 0===this.result)throw new v;return this.result}setResult(t,e){return e&&(this.highest=this.previousHighest,this.lowest=this.previousLowest,this.result=this.previousResult),void 0===this.highest?this.highest=t:t.gt(this.highest)?(this.previousHighest=this.highest,this.highest=t):this.previousHighest=this.highest,void 0===this.lowest?this.lowest=t:t.lt(this.lowest)?(this.previousLowest=this.lowest,this.lowest=t):this.previousLowest=this.lowest,this.previousResult=this.result,this.result=t}replace(t){return this.update(t,!0)}}class d extends f{interval;constructor(t){super(),this.interval=t}updates(t){return t.forEach((t=>this.update(t))),this.result}replace(t){return this.update(t,!0)}}class m extends d{prices=[];update(t,e=!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)return this.setResult(m.getResultFromBatch(this.prices),e)}static getResultFromBatch(t){return t.reduce(((t,e)=>t.plus(e)),new g("0")).div(t.length||1)}}class w extends d{interval;indicator;smoothingFactor;constructor(t){super(t),this.interval=t,this.indicator=new m(t),this.smoothingFactor=new g(1).div(this.interval)}updates(t){return t.forEach((t=>this.update(t))),this.result}update(t,e=!1){const s=this.indicator.update(t,e);if(e&&this.previousResult){const s=new g(t).minus(this.previousResult).mul(this.smoothingFactor);return this.setResult(s.plus(this.previousResult),e)}if(!e&&this.result){const s=new g(t).minus(this.result).mul(this.smoothingFactor);return this.setResult(s.plus(this.result),e)}if(void 0===this.result&&s)return this.setResult(s,e)}}function M(t){return t.reduce(((t,e)=>t.add(e)),new g(0)).div(t.length||1)}class b{interval;deviationMultiplier;prices=[];result;constructor(t,e=2){this.interval=t,this.deviationMultiplier=e}get isStable(){return void 0!==this.result}update(t){if(this.prices.push(new g(t)),this.prices.length>this.interval){this.prices.shift();const t=m.getResultFromBatch(this.prices),e=function(t,e){const s=e||M(t);return M(t.map((t=>new g(t).sub(s).pow(2)))).sqrt()}(this.prices,t);return this.result={lower:t.sub(e.times(this.deviationMultiplier)),middle:t,upper:t.add(e.times(this.deviationMultiplier))}}}getResult(){if(void 0===this.result)throw new v;return this.result}}class x extends d{interval;pricesCounter=0;weightFactor;constructor(t){super(t),this.interval=t,this.weightFactor=2/(this.interval+1)}update(t,e=!1){e?e&&0===this.pricesCounter&&this.pricesCounter++:this.pricesCounter++;const s=new g(t);return e&&this.previousResult?this.setResult(s.times(this.weightFactor).add(this.previousResult.times(1-this.weightFactor)),e):this.setResult(s.times(this.weightFactor).add((this.result??s).times(1-this.weightFactor)),e)}getResult(){if(this.pricesCounter<this.interval)throw new v;return this.result}get isStable(){try{return this.getResult(),!0}catch{return!1}}}class R{prices=[];long;short;signal;result;constructor(t){this.long=new t.indicator(t.longInterval),this.short=new t.indicator(t.shortInterval),this.signal=new t.indicator(t.signalInterval)}get isStable(){return void 0!==this.result}update(t,e=!1){const s=new g(t);this.prices.length&&e?this.prices[this.prices.length-1]=s:this.prices.push(s);const i=this.short.update(s,e),o=this.long.update(s,e);if(this.prices.length>this.long.interval&&this.prices.shift(),this.prices.length===this.long.interval){const t=i.sub(o),e=this.signal.update(t);return this.result={histogram:t.sub(e),macd:t,signal:e}}}getResult(){if(!this.isStable||void 0===this.result)throw new v;return this.result}}class B extends f{interval;previousPrices=[];avgGain;avgLoss;maxValue=new g(100);constructor(t,e=w){super(),this.interval=t,this.avgGain=new e(this.interval),this.avgLoss=new e(this.interval)}update(t,e=!1){if(this.previousPrices.length&&e?this.previousPrices[this.previousPrices.length-1]=t:this.previousPrices.push(t),this.previousPrices.length<2)return;const s=new g(t),i=new g(this.previousPrices[this.previousPrices.length-2]);if(s.gt(i)?(this.avgLoss.update(new g(0),e),this.avgGain.update(s.sub(i),e)):(this.avgLoss.update(i.sub(s),e),this.avgGain.update(new g(0),e)),this.avgGain.isStable){const t=this.avgLoss.getResult();if(t.eq(0))return this.setResult(new g(100),e);const s=this.avgGain.getResult().div(t);return this.setResult(this.maxValue.minus(this.maxValue.div(s.add(1))),e)}}}const y=(t,e)=>{const s=[],i=new x(e),o=t.length;for(let e=0;e<o;e++){let o=null;i.update(t[e]);try{o=i.getResult()}catch(t){o=null}s.push(o)}return s},P=(t,e)=>{const s=[],i=new m(e),o=t.length;for(let e=0;e<o;e++){let o=null;i.update(t[e]);try{o=i.getResult()}catch(t){o=null}s.push(o)}return s},E=(t,e)=>{t=t.filter((t=>t instanceof g)),e=e.filter((t=>t instanceof g));const s=Math.min(t.length,e.length);t=t.slice(-s),e=e.slice(-s);let i=t.map(((t,s)=>{if(t.eq(e[s]))return"neutral";if(t.gt(e[s]))return"up";if(t.lt(e[s]))return"down";throw Error("undefined error in findCrosses")}));const o=_(i),h=o.map((t=>t.length));return o.map(((t,e)=>{let s=h[e];return t.map(((t,e)=>{let i=s-e;return"neutral"===t&&(i=0),"up"===t&&(i*=1),"down"===t&&(i*=-1),i})).reverse()})).flat()},_=t=>0===t.length?[]:t.reduce(((t,e,s,i)=>{if(0===s)t.push([e]);else{const o=i[s-1],h=t[t.length-1];e!==o?t.push([e]):h.push(e)}return t}),[]),S=(t,e)=>{const{upper:s,lower:i}=e,o=new Array(t.length);for(let e=0;e<t.length;e++)if(null!=s[e]&&null!=i[e]&&null!=t[e]){const h=new g(s[e]),r=new g(i[e]),n=new g(t[e]),l=h.minus(r);o[e]=n.minus(r).div(l).times(100).toNumber()}else o[e]=null;return o},C={getSMA:P,getEMA:y},D=t=>{if(!t||0===t.length)throw new Error("Bins array is empty or not provided");let e=t[0],s=t[0];return t.forEach((t=>{t.grossVolume>e.grossVolume&&(e=t),t.grossVolume<s.grossVolume&&(s=t)})),{high:e,low:s}};class A{constructor(t,e=100){const s=["open","high","low","close"];this.ohlcv={};for(let i of Object.keys(t))s.includes(i)&&(this.ohlcv[i]=t[i].slice(-e))}init(){if(this.ohlcv.close.length<50)return console.log("PatternRecognizer requires at least 50 datapoints"),{chart_pattern:"Neutral",chart_score:0};const t=[{name:"Bullish Flag",condition:this.isBullishFlag.bind(this),score:2},{name:"Bearish Flag",condition:this.isBearishFlag.bind(this),score:-2},{name:"Bullish Pennant",condition:this.isBullishPennant.bind(this),score:2},{name:"Bearish Pennant",condition:this.isBearishPennant.bind(this),score:-2},{name:"Bearish Double Top",condition:this.isDoubleTop.bind(this),score:-1},{name:"Bullish Double Bottom",condition:this.isDoubleBottom.bind(this),score:1},{name:"Bearish Triple Top",condition:this.isTripleTop.bind(this),score:-1},{name:"Bullish Triple Bottom",condition:this.isTripleBottom.bind(this),score:1},{name:"Bearish Head And Shoulders",condition:this.isHeadAndShoulders.bind(this),score:-1},{name:"Bullish Inverse Head And Shoulders",condition:this.isInverseHeadAndShoulders.bind(this),score:1},{name:"Bearish Rising Wedge",condition:this.isRisingWedge.bind(this),score:-1},{name:"Bullish Falling Wedge",condition:this.isFallingWedge.bind(this),score:1},{name:"Bullish Triangle",condition:this.isBullishTriangle.bind(this),score:1},{name:"Bearish Triangle",condition:this.isBearishTriangle.bind(this),score:-1},{name:"Bullish Rectangle",condition:this.isBullishRectangle.bind(this),score:1},{name:"Bearish Rectangle",condition:this.isBearishRectangle.bind(this),score:-1}];for(const{name:e,condition:s,score:i}of t)if(s())return{chart_pattern:e,chart_score:i};return{chart_pattern:"Neutral",chart_score:0}}isBullishFlag(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=(Math.floor(e/2),this.ohlcv.close[t-2*e]);if((this.ohlcv.close[t-e]-s)/s<.15)return!1;const i=this.ohlcv.close[t-e];if((i-this.ohlcv.close[t-1])/i>.05)return!1;for(let s=t-e;s<t-1;s++)if(this.ohlcv.high[s]>this.ohlcv.high[s+1]||this.ohlcv.low[s]>this.ohlcv.low[s+1])return!1;return!0}isBearishFlag(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=(Math.floor(e/2),this.ohlcv.close[t-2*e]);if((s-this.ohlcv.close[t-e])/s<.15)return!1;const i=this.ohlcv.close[t-e];if((this.ohlcv.close[t-1]-i)/i>.05)return!1;for(let s=t-e;s<t-1;s++)if(this.ohlcv.high[s]<this.ohlcv.high[s+1]||this.ohlcv.low[s]<this.ohlcv.low[s+1])return!1;return!0}isBullishPennant(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.floor(e/2),i=this.ohlcv.close[t-2*e];if((this.ohlcv.close[t-e]-i)/i<.15)return!1;const o=this.ohlcv.close[t-e];if((o-this.ohlcv.close[t-1])/o>.05)return!1;for(let e=t-s;e<t-1;e++)if(this.ohlcv.high[e]<this.ohlcv.high[e+1]&&this.ohlcv.low[e]<this.ohlcv.low[e+1]||this.ohlcv.high[e]>this.ohlcv.high[e+1]&&this.ohlcv.low[e]>this.ohlcv.low[e+1])return!1;return!0}isBearishPennant(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.floor(e/2),i=this.ohlcv.close[t-2*e];if((i-this.ohlcv.close[t-e])/i<.15)return!1;const o=this.ohlcv.close[t-e];if((this.ohlcv.close[t-1]-o)/o>.05)return!1;for(let e=t-s;e<t-1;e++)if(this.ohlcv.high[e]>this.ohlcv.high[e+1]&&this.ohlcv.low[e]>this.ohlcv.low[e+1]||this.ohlcv.high[e]<this.ohlcv.high[e+1]&&this.ohlcv.low[e]<this.ohlcv.low[e+1])return!1;return!0}isDoubleTop(){const t=this.ohlcv.close.length,e=Math.floor(t/2),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e));if(s<=0||i<=0)return!1;const o=Math.min(...this.ohlcv.close.slice(0,e)),h=Math.min(...this.ohlcv.close.slice(e));return!((s-o)/s<.1||(i-h)/i<.1)&&Math.abs(s-i)/s<.03}isDoubleBottom(){const t=this.ohlcv.close.length,e=Math.floor(t/2),s=Math.min(...this.ohlcv.close.slice(0,e)),i=Math.min(...this.ohlcv.close.slice(e));if(s<=0||i<=0)return!1;const o=Math.max(...this.ohlcv.close.slice(0,e)),h=Math.max(...this.ohlcv.close.slice(e));return!((o-s)/s<.1||(h-i)/i<.1)&&Math.abs(s-i)/s<.03}isTripleTop(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e,2*e)),o=Math.max(...this.ohlcv.close.slice(2*e));if(s<=0||i<=0||o<=0)return!1;const h=(s-Math.min(...this.ohlcv.close.slice(0,e)))/s,r=(i-Math.min(...this.ohlcv.close.slice(e,2*e)))/i,n=(o-Math.min(...this.ohlcv.close.slice(2*e)))/o;return!(h<.1||r<.1||n<.1)&&Math.abs(s-i)/s<.03&&Math.abs(s-o)/s<.03}isTripleBottom(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.min(...this.ohlcv.close.slice(0,e)),i=Math.min(...this.ohlcv.close.slice(e,2*e)),o=Math.min(...this.ohlcv.close.slice(2*e));if(s<=0||i<=0||o<=0)return!1;const h=(Math.max(...this.ohlcv.close.slice(0,e))-s)/s,r=(Math.max(...this.ohlcv.close.slice(e,2*e))-i)/i,n=(Math.max(...this.ohlcv.close.slice(2*e))-o)/o;return!(h<.1||r<.1||n<.1)&&Math.abs(s-i)/s<.03&&Math.abs(s-o)/s<.03}isHeadAndShoulders(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e,2*e)),o=Math.max(...this.ohlcv.close.slice(2*e));if(s<=0||i<=0||o<=0)return!1;const h=Math.min(...this.ohlcv.close.slice(0,e)),r=Math.min(...this.ohlcv.close.slice(e,2*e)),n=Math.min(...this.ohlcv.close.slice(2*e)),l=(i-r)/i,c=(Math.max(h,n)-Math.min(h,n))/Math.min(h,n);return l>.15&&c<.03}isInverseHeadAndShoulders(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.min(...this.ohlcv.close.slice(0,e)),i=Math.min(...this.ohlcv.close.slice(e,2*e)),o=Math.min(...this.ohlcv.close.slice(2*e));if(s<=0||i<=0||o<=0)return!1;const h=Math.max(...this.ohlcv.close.slice(0,e)),r=Math.max(...this.ohlcv.close.slice(e,2*e)),n=Math.max(...this.ohlcv.close.slice(2*e)),l=(r-i)/i,c=(Math.min(h,n)-Math.max(h,n))/Math.max(h,n);return l>.15&&c<.03}isRisingWedge(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e,2*e)),o=Math.max(...this.ohlcv.close.slice(2*e)),h=Math.min(...this.ohlcv.close.slice(0,e)),r=Math.min(...this.ohlcv.close.slice(e,2*e)),n=Math.min(...this.ohlcv.close.slice(2*e));return s<i&&i<o&&h<r&&r<n}isFallingWedge(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e,2*e)),o=Math.max(...this.ohlcv.close.slice(2*e)),h=Math.min(...this.ohlcv.close.slice(0,e)),r=Math.min(...this.ohlcv.close.slice(e,2*e)),n=Math.min(...this.ohlcv.close.slice(2*e));return s>i&&i>o&&h>r&&r>n}isBullishTriangle(){const t=this.ohlcv.close.length,e=Math.floor(t/2),s=Math.max(...this.ohlcv.high.slice(0,e)),i=Math.max(...this.ohlcv.high.slice(e)),o=Math.min(...this.ohlcv.low.slice(0,e)),h=Math.min(...this.ohlcv.low.slice(e));return s>i&&o<h}isBearishTriangle(){const t=this.ohlcv.close.length,e=Math.floor(t/2),s=Math.max(...this.ohlcv.high.slice(0,e)),i=Math.max(...this.ohlcv.high.slice(e));return Math.min(...this.ohlcv.low.slice(0,e))<Math.min(...this.ohlcv.low.slice(e))&&s>i}isBullishRectangle(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.high.slice(0,e)),i=Math.max(...this.ohlcv.high.slice(e,2*e)),o=Math.max(...this.ohlcv.high.slice(2*e)),h=Math.min(...this.ohlcv.low.slice(0,e)),r=Math.min(...this.ohlcv.low.slice(e,2*e)),n=Math.min(...this.ohlcv.low.slice(2*e)),l=Math.abs(s-i)/s<.03&&Math.abs(i-o)/i<.03,c=Math.abs(h-r)/h<.03&&Math.abs(r-n)/r<.03;return l&&c}isBearishRectangle(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.high.slice(0,e)),i=Math.max(...this.ohlcv.high.slice(e,2*e)),o=Math.max(...this.ohlcv.high.slice(2*e)),h=Math.min(...this.ohlcv.low.slice(0,e)),r=Math.min(...this.ohlcv.low.slice(e,2*e)),n=Math.min(...this.ohlcv.low.slice(2*e)),l=Math.abs(s-i)/s<.03&&Math.abs(i-o)/i<.03,c=Math.abs(h-r)/h<.03&&Math.abs(r-n)/r<.03;return l&&c}}class V{constructor(){this.ChartPatterns=t=>new A(t).init()}init(t){return this.ohlcv=t.reduce(((t,{open:e,high:s,low:i,close:o,volume:h,...r})=>{t.open.push(e),t.high.push(s),t.low.push(i),t.close.push(o),t.volume.push(h);for(const e of Object.keys(r))t[e]||(t[e]=[]),t[e].push(r[e]);return t}),{open:[],high:[],low:[],close:[],volume:[]}),this}getHeaders(){return Object.keys(this.ohlcv)}getData(){const{ohlcv:t}=this,e=Object.keys(t),s=e.length;return t.open.map(((i,o)=>{const h={};for(let i=0;i<s;i++){const s=e[i],r=t[s][o];h[s]=r instanceof g?r.toNumber():r}return h}))}getLastValues(){const t={};for(const[e,s]of Object.entries(this.ohlcv)){let i=s[s.length-1];t[e]=i instanceof g?i.toNumber():i}return t}addColumn(t,e){const s=this.ohlcv.open.length;if(e.length>s)throw new Error("Invalid column data: The length of the new column exceeds the length of the OHLCV data");e=[...new Array(s-e.length).fill(null),...e],this.ohlcv[t]=e}crossPairs(t){const e=this.ohlcv,s={},i=t=>{if(!e.hasOwnProperty(t)&&"string"==typeof t){const[e,...s]=t.split("_");this[e]&&s.length>0&&this[e](...s)}};for(const{fast:o,slow:h}of t)if(o&&h)if(i(o),i(h),"number"!=typeof h||s[h]||(s[h]=e.close.map((()=>h))),e[o]&&e[h]){const t=E(e[o],e[h]);this.addColumn(`${o}_x_${h}`,t)}else if(e[o]&&s[h]){const t=E(e[o],s[h]);this.addColumn(`${o}_x_${h}`,t)}else console.error(`Missing ohlcv properties for ${o} or ${h}`)}ema(t){return((t,e)=>{const{ohlcv:s}=t,i=s.close,o=y(i,e);t.addColumn(`ema_${e}`,o)})(this,t),this}sma(t){return((t,e)=>{const{ohlcv:s}=t,i=s.close,o=P(i,e);t.addColumn(`sma_${e}`,o)})(this,t),this}macd(t,e,s){return((t,e=12,s=26,i=9)=>{const{ohlcv:o}=t,h=((t,e=12,s=26,i=9)=>{const o=[],h=[],r=[],n=new R({indicator:x,shortInterval:e,longInterval:s,signalInterval:i}),l=t.length;for(let e=0;e<l;e++){let s={};n.update(t[e]);try{s=n.getResult()}catch(t){s={macd:null,signal:null,histogram:null}}o.push(s.macd),h.push(s.signal),r.push(s.histogram)}return{macd_diff:o,macd_dea:h,macd_histogram:r,macd_diff_x_macd_dea:E(o,h)}})(o.close,e,s,i);for(let e in h)t.addColumn(e,h[e])})(this,t,e,s),this}bollingerBands(t,e,s){return((t,e,s)=>{const{ohlcv:i}=t,o=((t,e=20,s=2)=>{const i=t.length,o={upper:[],middle:[],lower:[]},h=new b(e,s);for(let e=0;e<i;e++){let s={};h.update(t[e]);try{s=h.getResult()}catch(t){s={upper:null,middle:null,lower:null}}o.upper.push(s.upper),o.middle.push(s.middle),o.lower.push(s.lower)}const r=S(t,{upper:o.upper,lower:o.lower});return{...o,range:r}})(i.close,e,s);for(let e in o)t.addColumn(`bollinger_bands_${e}`,o[e])})(this,t,e),this}rsi(t,e,s){return((t,e,s,i)=>{const{ohlcv:o}=t;"number"==typeof e&&void 0===i&&(i=e);const h=((t,e=14,s="SMA",i=14)=>{if(t.length<e)return[];let o=[];e=parseInt(e),i=parseInt(i);const h=new B(e),r=t.length;for(let e=0;e<r;e++){let s=null;h.update(t[e]);try{s=h.getResult()}catch(t){s=null}o.push(s)}o=o.filter((t=>t));let n={[`rsi_${e}`]:o};if("string"==typeof s&&"number"==typeof i&&C.hasOwnProperty(`get${s}`)){const t=C[`get${s}`](o,i);n[`rsi_${s}_${i}`]=t,n[`rsi_${e}_x_rsi_${s}_${i}`]=E(o,t)}return n})(o.close,e,s,i);for(let e in h)t.addColumn(`${e}`.toLowerCase(),h[e])})(this,t,e,s),this}candles(){return(t=>{const{ohlcv:e}=t,s=(t=>{const{open:e,high:s,low:i,close:o}=t,h=e.length;if(![e,s,i,o].every((t=>Array.isArray(t)&&t.length>1&&t.length===h)))return{pattern:Array(h).fill("Neutral"),name:Array(h).fill("No Pattern"),score:Array(h).fill(0)};const r=(t,e,s=1e-4)=>Math.abs(t-e)<s,n={bullish:[{name:"Marubozu",condition:(t,e)=>r(e.open,e.low)&&r(e.close,e.high),score:2},{name:"Engulfing",condition:(t,e)=>e.open<t.close&&e.close>t.open&&e.low<t.low&&e.high>t.high,score:2},{name:"Kicker",condition:(t,e)=>e.open<t.open&&e.close>e.open&&t.close<t.open,score:2},{name:"Morning Star",condition:(t,e)=>e.close>t.close&&e.open<t.open&&t.close<t.open,score:2},{name:"Piercing Line",condition:(t,e)=>e.close>t.close&&e.open<t.open&&e.close>(t.open+t.close)/2,score:1},{name:"Belt Hold",condition:(t,e)=>e.open>t.open&&r(e.close,e.high)&&r(t.close,t.low),score:1},{name:"Harami",condition:(t,e)=>e.open>t.close&&e.close<t.open&&e.open<t.open&&e.close>t.close,score:1},{name:"Doji",condition:(t,e)=>r(e.close,e.open)&&e.high-e.low>Math.abs(e.close-e.open),score:0}],bearish:[{name:"Marubozu",condition:(t,e)=>r(e.open,e.high)&&r(e.close,e.low),score:-2},{name:"Engulfing",condition:(t,e)=>e.open>t.close&&e.close<t.open&&e.high>t.high&&e.low<t.low,score:-2},{name:"Kicker",condition:(t,e)=>e.open>t.open&&e.close<e.open&&t.close>t.open,score:-2},{name:"Evening Star",condition:(t,e)=>e.close<t.close&&e.open>t.open&&t.close<t.open,score:-2},{name:"Dark Cloud Cover",condition:(t,e)=>e.close<t.close&&e.open>t.open&&e.close<(t.open+t.close)/2,score:-1},{name:"Belt Hold",condition:(t,e)=>e.open<t.open&&r(e.close,e.low)&&r(t.close,t.high),score:-1},{name:"Harami",condition:(t,e)=>e.open<t.close&&e.close>t.open&&e.open>t.open&&e.close<t.close,score:-1},{name:"Doji",condition:(t,e)=>r(e.close,e.open)&&e.high-e.low>Math.abs(e.close-e.open),score:0}]},l=(t,e,s)=>{for(const{name:i,condition:o,score:h}of s)if(o(t,e))return{name:i,score:h};return null},c=["Neutral"],a=["No Pattern"],u=[0];for(let t=1;t<h;t++){const h={open:e[t-1],high:s[t-1],low:i[t-1],close:o[t-1]},r={open:e[t],high:s[t],low:i[t],close:o[t]},p=l(h,r,n.bullish)||l(h,r,n.bearish);p?(c.push(p.score>0?"Bullish":"Bearish"),a.push(p.name),u.push(p.score)):(c.push("Neutral"),a.push("No Pattern"),u.push(0))}return{pattern:c,name:a,score:u}})(e);for(let e in s)t.addColumn(`candle_${e}`.toLowerCase(),s[e])})(this),this}volumeProfile(t,e,s){return((t,e,s=1,i)=>{let{ohlcv:o}=t;const h=((t,e,s)=>{const i=new Date(t[s][t[s].length-1]),o=new Date(i);o.setDate(o.getDate()-e),o.setHours(0,0,0,0);const h={open:[],high:[],low:[],close:[],volume:[],[s]:[]};for(let e=0;e<t[s].length;e++)new Date(t[s][e])>=o&&(h.open.push(t.open[e]),h.high.push(t.high[e]),h.low.push(t.low[e]),h.close.push(t.close[e]),h.volume.push(t.volume[e]),h[s].push(t[s][e]));return h})(o,s,i),r=((t,e=5)=>{const{open:s,high:i,low:o,close:h,volume:r}=t,n=Math.min(...o),l=(Math.max(...i)-n)/e,c={upVolume:0,downVolume:0,grossVolume:0},a=Array.from({length:e},((t,e)=>({price:n+l*e,upVolume:0,downVolume:0,grossVolume:0}))),u=1/l;for(let t=0;t<h.length;t++){const l=h[t],c=s[t],p=i[t],g=o[t],v=r[t],f=l>=c?v:0,d=l<c?v:0,m=Math.max(0,Math.floor((g-n)*u)),w=Math.min(e,Math.ceil((p-n)*u));for(let t=m;t<w;t++)a[t].upVolume+=f,a[t].downVolume+=d,a[t].grossVolume+=f+d}for(const{upVolume:t,downVolume:e,grossVolume:s}of a)c.upVolume+=t,c.downVolume+=e,c.grossVolume+=s;return{bins:a,nodes:D(a)}})(h,e),n=r.nodes.high.price,l=r.nodes.low.price;t.addColumn("volume_profile_high",[n]),t.addColumn("volume_profile_low",[l])})(this,t,e,s),this}}})(),OHLCV_INDICATORS=e})();
1
+ var OHLCV_INDICATORS;(()=>{"use strict";var t={d:(e,s)=>{for(var i in s)t.o(s,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:s[i]})},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={};(()=>{t.r(e),t.d(e,{default:()=>V});var s=1e6,i="[big.js] ",o=i+"Invalid ",h=o+"decimal places",r=o+"rounding mode",n=i+"Division by zero",l={},c=void 0,a=/^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;function u(t,e,s,i){var o=t.c;if(s===c&&(s=t.constructor.RM),0!==s&&1!==s&&2!==s&&3!==s)throw Error(r);if(e<1)i=3===s&&(i||!!o[0])||0===e&&(1===s&&o[0]>=5||2===s&&(o[0]>5||5===o[0]&&(i||o[1]!==c))),o.length=1,i?(t.e=t.e-e+1,o[0]=1):o[0]=t.e=0;else if(e<o.length){if(i=1===s&&o[e]>=5||2===s&&(o[e]>5||5===o[e]&&(i||o[e+1]!==c||1&o[e-1]))||3===s&&(i||!!o[0]),o.length=e,i)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 p(t,e,s){var i=t.e,o=t.c.join(""),h=o.length;if(e)o=o.charAt(0)+(h>1?"."+o.slice(1):"")+(i<0?"e":"e+")+i;else if(i<0){for(;++i;)o="0"+o;o="0."+o}else if(i>0)if(++i>h)for(i-=h;i--;)o+="0";else i<h&&(o=o.slice(0,i)+"."+o.slice(i));else h>1&&(o=o.charAt(0)+"."+o.slice(1));return t.s<0&&s?"-"+o:o}l.abs=function(){var t=new this.constructor(this);return t.s=1,t},l.cmp=function(t){var e,s=this,i=s.c,o=(t=new s.constructor(t)).c,h=s.s,r=t.s,n=s.e,l=t.e;if(!i[0]||!o[0])return i[0]?h:o[0]?-r:0;if(h!=r)return h;if(e=h<0,n!=l)return n>l^e?1:-1;for(r=(n=i.length)<(l=o.length)?n:l,h=-1;++h<r;)if(i[h]!=o[h])return i[h]>o[h]^e?1:-1;return n==l?0:n>l^e?1:-1},l.div=function(t){var e=this,i=e.constructor,o=e.c,r=(t=new i(t)).c,l=e.s==t.s?1:-1,a=i.DP;if(a!==~~a||a<0||a>s)throw Error(h);if(!r[0])throw Error(n);if(!o[0])return t.s=l,t.c=[t.e=0],t;var p,g,v,f,d,m=r.slice(),w=p=r.length,M=o.length,b=o.slice(0,p),x=b.length,R=t,B=R.c=[],y=0,P=a+(R.e=e.e-t.e)+1;for(R.s=l,l=P<0?0:P,m.unshift(0);x++<p;)b.push(0);do{for(v=0;v<10;v++){if(p!=(x=b.length))f=p>x?1:-1;else for(d=-1,f=0;++d<p;)if(r[d]!=b[d]){f=r[d]>b[d]?1:-1;break}if(!(f<0))break;for(g=x==p?r:m;x;){if(b[--x]<g[x]){for(d=x;d&&!b[--d];)b[d]=9;--b[d],b[x]+=10}b[x]-=g[x]}for(;!b[0];)b.shift()}B[y++]=f?v:++v,b[0]&&f?b[x]=o[w]||0:b=[o[w]]}while((w++<M||b[0]!==c)&&l--);return B[0]||1==y||(B.shift(),R.e--,P--),y>P&&u(R,P,i.RM,b[0]!==c),R},l.eq=function(t){return 0===this.cmp(t)},l.gt=function(t){return this.cmp(t)>0},l.gte=function(t){return this.cmp(t)>-1},l.lt=function(t){return this.cmp(t)<0},l.lte=function(t){return this.cmp(t)<1},l.minus=l.sub=function(t){var e,s,i,o,h=this,r=h.constructor,n=h.s,l=(t=new r(t)).s;if(n!=l)return t.s=-l,h.plus(t);var c=h.c.slice(),a=h.e,u=t.c,p=t.e;if(!c[0]||!u[0])return u[0]?t.s=-l:c[0]?t=new r(h):t.s=1,t;if(n=a-p){for((o=n<0)?(n=-n,i=c):(p=a,i=u),i.reverse(),l=n;l--;)i.push(0);i.reverse()}else for(s=((o=c.length<u.length)?c:u).length,n=l=0;l<s;l++)if(c[l]!=u[l]){o=c[l]<u[l];break}if(o&&(i=c,c=u,u=i,t.s=-t.s),(l=(s=u.length)-(e=c.length))>0)for(;l--;)c[e++]=0;for(l=e;s>n;){if(c[--s]<u[s]){for(e=s;e&&!c[--e];)c[e]=9;--c[e],c[s]+=10}c[s]-=u[s]}for(;0===c[--l];)c.pop();for(;0===c[0];)c.shift(),--p;return c[0]||(t.s=1,c=[p=0]),t.c=c,t.e=p,t},l.mod=function(t){var e,s=this,i=s.constructor,o=s.s,h=(t=new i(t)).s;if(!t.c[0])throw Error(n);return s.s=t.s=1,e=1==t.cmp(s),s.s=o,t.s=h,e?new i(s):(o=i.DP,h=i.RM,i.DP=i.RM=0,s=s.div(t),i.DP=o,i.RM=h,this.minus(s.times(t)))},l.neg=function(){var t=new this.constructor(this);return t.s=-t.s,t},l.plus=l.add=function(t){var e,s,i,o=this,h=o.constructor;if(t=new h(t),o.s!=t.s)return t.s=-t.s,o.minus(t);var r=o.e,n=o.c,l=t.e,c=t.c;if(!n[0]||!c[0])return c[0]||(n[0]?t=new h(o):t.s=o.s),t;if(n=n.slice(),e=r-l){for(e>0?(l=r,i=c):(e=-e,i=n),i.reverse();e--;)i.push(0);i.reverse()}for(n.length-c.length<0&&(i=c,c=n,n=i),e=c.length,s=0;e;n[e]%=10)s=(n[--e]=n[e]+c[e]+s)/10|0;for(s&&(n.unshift(s),++l),e=n.length;0===n[--e];)n.pop();return t.c=n,t.e=l,t},l.pow=function(t){var e=this,s=new e.constructor("1"),i=s,h=t<0;if(t!==~~t||t<-1e6||t>1e6)throw Error(o+"exponent");for(h&&(t=-t);1&t&&(i=i.times(e)),t>>=1;)e=e.times(e);return h?s.div(i):i},l.prec=function(t,e){if(t!==~~t||t<1||t>s)throw Error(o+"precision");return u(new this.constructor(this),t,e)},l.round=function(t,e){if(t===c)t=0;else if(t!==~~t||t<-s||t>s)throw Error(h);return u(new this.constructor(this),t+this.e+1,e)},l.sqrt=function(){var t,e,s,o=this,h=o.constructor,r=o.s,n=o.e,l=new h("0.5");if(!o.c[0])return new h(o);if(r<0)throw Error(i+"No square root");0===(r=Math.sqrt(o+""))||r===1/0?((e=o.c.join("")).length+n&1||(e+="0"),n=((n+1)/2|0)-(n<0||1&n),t=new h(((r=Math.sqrt(e))==1/0?"5e":(r=r.toExponential()).slice(0,r.indexOf("e")+1))+n)):t=new h(r+""),n=t.e+(h.DP+=4);do{s=t,t=l.times(s.plus(o.div(s)))}while(s.c.slice(0,n).join("")!==t.c.slice(0,n).join(""));return u(t,(h.DP-=4)+t.e+1,h.RM)},l.times=l.mul=function(t){var e,s=this,i=s.constructor,o=s.c,h=(t=new i(t)).c,r=o.length,n=h.length,l=s.e,c=t.e;if(t.s=s.s==t.s?1:-1,!o[0]||!h[0])return t.c=[t.e=0],t;for(t.e=l+c,r<n&&(e=o,o=h,h=e,c=r,r=n,n=c),e=new Array(c=r+n);c--;)e[c]=0;for(l=n;l--;){for(n=0,c=r+l;c>l;)n=e[c]+h[l]*o[c-l-1]+n,e[c--]=n%10,n=n/10|0;e[c]=n}for(n?++t.e:e.shift(),l=e.length;!e[--l];)e.pop();return t.c=e,t},l.toExponential=function(t,e){var i=this,o=i.c[0];if(t!==c){if(t!==~~t||t<0||t>s)throw Error(h);for(i=u(new i.constructor(i),++t,e);i.c.length<t;)i.c.push(0)}return p(i,!0,!!o)},l.toFixed=function(t,e){var i=this,o=i.c[0];if(t!==c){if(t!==~~t||t<0||t>s)throw Error(h);for(t=t+(i=u(new i.constructor(i),t+i.e+1,e)).e+1;i.c.length<t;)i.c.push(0)}return p(i,!1,!!o)},l[Symbol.for("nodejs.util.inspect.custom")]=l.toJSON=l.toString=function(){var t=this,e=t.constructor;return p(t,t.e<=e.NE||t.e>=e.PE,!!t.c[0])},l.toNumber=function(){var t=Number(p(this,!0,!0));if(!0===this.constructor.strict&&!this.eq(t.toString()))throw Error(i+"Imprecise conversion");return t},l.toPrecision=function(t,e){var i=this,h=i.constructor,r=i.c[0];if(t!==c){if(t!==~~t||t<1||t>s)throw Error(o+"precision");for(i=u(new h(i),t,e);i.c.length<t;)i.c.push(0)}return p(i,t<=i.e||i.e<=h.NE||i.e>=h.PE,!!r)},l.valueOf=function(){var t=this,e=t.constructor;if(!0===e.strict)throw Error(i+"valueOf disallowed");return p(t,t.e<=e.NE||t.e>=e.PE,!0)};const g=function t(){function e(s){var i=this;if(!(i instanceof e))return s===c?t():new e(s);if(s instanceof e)i.s=s.s,i.e=s.e,i.c=s.c.slice();else{if("string"!=typeof s){if(!0===e.strict&&"bigint"!=typeof s)throw TypeError(o+"value");s=0===s&&1/s<0?"-0":String(s)}!function(t,e){var s,i,h;if(!a.test(e))throw Error(o+"number");for(t.s="-"==e.charAt(0)?(e=e.slice(1),-1):1,(s=e.indexOf("."))>-1&&(e=e.replace(".","")),(i=e.search(/e/i))>0?(s<0&&(s=i),s+=+e.slice(i+1),e=e.substring(0,i)):s<0&&(s=e.length),h=e.length,i=0;i<h&&"0"==e.charAt(i);)++i;if(i==h)t.c=[t.e=0];else{for(;h>0&&"0"==e.charAt(--h););for(t.e=s-i-1,t.c=[],s=0;i<=h;)t.c[s++]=+e.charAt(i++)}}(i,s)}i.constructor=e}return e.prototype=l,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}();class v extends Error{constructor(t="Not enough data"){super(t),Object.setPrototypeOf(this,new.target.prototype),this.name="NotEnoughDataError"}}class f{previousHighest;highest;previousLowest;lowest;previousResult;result;get isStable(){return void 0!==this.result}getResult(){if(void 0===this.result)throw new v;return this.result}setResult(t,e){return e&&(this.highest=this.previousHighest,this.lowest=this.previousLowest,this.result=this.previousResult),void 0===this.highest?this.highest=t:t.gt(this.highest)?(this.previousHighest=this.highest,this.highest=t):this.previousHighest=this.highest,void 0===this.lowest?this.lowest=t:t.lt(this.lowest)?(this.previousLowest=this.lowest,this.lowest=t):this.previousLowest=this.lowest,this.previousResult=this.result,this.result=t}replace(t){return this.update(t,!0)}}class d extends f{interval;constructor(t){super(),this.interval=t}updates(t){return t.forEach((t=>this.update(t))),this.result}replace(t){return this.update(t,!0)}}class m extends d{prices=[];update(t,e=!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)return this.setResult(m.getResultFromBatch(this.prices),e)}static getResultFromBatch(t){return t.reduce(((t,e)=>t.plus(e)),new g("0")).div(t.length||1)}}class w extends d{interval;indicator;smoothingFactor;constructor(t){super(t),this.interval=t,this.indicator=new m(t),this.smoothingFactor=new g(1).div(this.interval)}updates(t){return t.forEach((t=>this.update(t))),this.result}update(t,e=!1){const s=this.indicator.update(t,e);if(e&&this.previousResult){const s=new g(t).minus(this.previousResult).mul(this.smoothingFactor);return this.setResult(s.plus(this.previousResult),e)}if(!e&&this.result){const s=new g(t).minus(this.result).mul(this.smoothingFactor);return this.setResult(s.plus(this.result),e)}if(void 0===this.result&&s)return this.setResult(s,e)}}function M(t){return t.reduce(((t,e)=>t.add(e)),new g(0)).div(t.length||1)}class b{interval;deviationMultiplier;prices=[];result;constructor(t,e=2){this.interval=t,this.deviationMultiplier=e}get isStable(){return void 0!==this.result}update(t){if(this.prices.push(new g(t)),this.prices.length>this.interval){this.prices.shift();const t=m.getResultFromBatch(this.prices),e=function(t,e){const s=e||M(t);return M(t.map((t=>new g(t).sub(s).pow(2)))).sqrt()}(this.prices,t);return this.result={lower:t.sub(e.times(this.deviationMultiplier)),middle:t,upper:t.add(e.times(this.deviationMultiplier))}}}getResult(){if(void 0===this.result)throw new v;return this.result}}class x extends d{interval;pricesCounter=0;weightFactor;constructor(t){super(t),this.interval=t,this.weightFactor=2/(this.interval+1)}update(t,e=!1){e?e&&0===this.pricesCounter&&this.pricesCounter++:this.pricesCounter++;const s=new g(t);return e&&this.previousResult?this.setResult(s.times(this.weightFactor).add(this.previousResult.times(1-this.weightFactor)),e):this.setResult(s.times(this.weightFactor).add((this.result??s).times(1-this.weightFactor)),e)}getResult(){if(this.pricesCounter<this.interval)throw new v;return this.result}get isStable(){try{return this.getResult(),!0}catch{return!1}}}class R{prices=[];long;short;signal;result;constructor(t){this.long=new t.indicator(t.longInterval),this.short=new t.indicator(t.shortInterval),this.signal=new t.indicator(t.signalInterval)}get isStable(){return void 0!==this.result}update(t,e=!1){const s=new g(t);this.prices.length&&e?this.prices[this.prices.length-1]=s:this.prices.push(s);const i=this.short.update(s,e),o=this.long.update(s,e);if(this.prices.length>this.long.interval&&this.prices.shift(),this.prices.length===this.long.interval){const t=i.sub(o),e=this.signal.update(t);return this.result={histogram:t.sub(e),macd:t,signal:e}}}getResult(){if(!this.isStable||void 0===this.result)throw new v;return this.result}}class B extends f{interval;previousPrices=[];avgGain;avgLoss;maxValue=new g(100);constructor(t,e=w){super(),this.interval=t,this.avgGain=new e(this.interval),this.avgLoss=new e(this.interval)}update(t,e=!1){if(this.previousPrices.length&&e?this.previousPrices[this.previousPrices.length-1]=t:this.previousPrices.push(t),this.previousPrices.length<2)return;const s=new g(t),i=new g(this.previousPrices[this.previousPrices.length-2]);if(s.gt(i)?(this.avgLoss.update(new g(0),e),this.avgGain.update(s.sub(i),e)):(this.avgLoss.update(i.sub(s),e),this.avgGain.update(new g(0),e)),this.avgGain.isStable){const t=this.avgLoss.getResult();if(t.eq(0))return this.setResult(new g(100),e);const s=this.avgGain.getResult().div(t);return this.setResult(this.maxValue.minus(this.maxValue.div(s.add(1))),e)}}}const y=(t,e)=>{const s=[],i=new x(e),o=t.length;for(let e=0;e<o;e++){let o=null;i.update(t[e]);try{o=i.getResult()}catch(t){o=null}s.push(o)}return s},P=(t,e)=>{const s=[],i=new m(e),o=t.length;for(let e=0;e<o;e++){let o=null;i.update(t[e]);try{o=i.getResult()}catch(t){o=null}s.push(o)}return s},E=(t,e)=>{t=t.filter((t=>t instanceof g)),e=e.filter((t=>t instanceof g));const s=Math.min(t.length,e.length);t=t.slice(-s),e=e.slice(-s);let i=t.map(((t,s)=>{if(t.eq(e[s]))return"neutral";if(t.gt(e[s]))return"up";if(t.lt(e[s]))return"down";throw Error("undefined error in findCrosses")}));const o=_(i),h=o.map((t=>t.length));return o.map(((t,e)=>{let s=h[e];return t.map(((t,e)=>{let i=s-e;return"neutral"===t&&(i=0),"up"===t&&(i*=1),"down"===t&&(i*=-1),i})).reverse()})).flat()},_=t=>0===t.length?[]:t.reduce(((t,e,s,i)=>{if(0===s)t.push([e]);else{const o=i[s-1],h=t[t.length-1];e!==o?t.push([e]):h.push(e)}return t}),[]),S=(t,e)=>{const{upper:s,lower:i}=e,o=new Array(t.length);for(let e=0;e<t.length;e++)if(null!=s[e]&&null!=i[e]&&null!=t[e]){const h=new g(s[e]),r=new g(i[e]),n=new g(t[e]),l=h.minus(r);o[e]=n.minus(r).div(l).times(100).toNumber()}else o[e]=null;return o},C={getSMA:P,getEMA:y},D=t=>{if(!t||0===t.length)throw new Error("Bins array is empty or not provided");let e=t[0],s=t[0];return t.forEach((t=>{t.grossVolume>e.grossVolume&&(e=t),t.grossVolume<s.grossVolume&&(s=t)})),{high:e,low:s}};class A{constructor(t,e=100){const s=["open","high","low","close"];this.ohlcv={};for(let i of Object.keys(t))s.includes(i)&&(this.ohlcv[i]=t[i].slice(-e))}init(){if(this.ohlcv.close.length<50)return console.log("PatternRecognizer requires at least 50 datapoints"),{chart_pattern:"Neutral",chart_score:0};const t=[{name:"Bullish Flag",condition:this.isBullishFlag.bind(this),score:2},{name:"Bearish Flag",condition:this.isBearishFlag.bind(this),score:-2},{name:"Bullish Pennant",condition:this.isBullishPennant.bind(this),score:2},{name:"Bearish Pennant",condition:this.isBearishPennant.bind(this),score:-2},{name:"Bearish Double Top",condition:this.isDoubleTop.bind(this),score:-1},{name:"Bullish Double Bottom",condition:this.isDoubleBottom.bind(this),score:1},{name:"Bearish Triple Top",condition:this.isTripleTop.bind(this),score:-1},{name:"Bullish Triple Bottom",condition:this.isTripleBottom.bind(this),score:1},{name:"Bearish Head And Shoulders",condition:this.isHeadAndShoulders.bind(this),score:-1},{name:"Bullish Inverse Head And Shoulders",condition:this.isInverseHeadAndShoulders.bind(this),score:1},{name:"Bearish Rising Wedge",condition:this.isRisingWedge.bind(this),score:-1},{name:"Bullish Falling Wedge",condition:this.isFallingWedge.bind(this),score:1},{name:"Bullish Triangle",condition:this.isBullishTriangle.bind(this),score:1},{name:"Bearish Triangle",condition:this.isBearishTriangle.bind(this),score:-1},{name:"Bullish Rectangle",condition:this.isBullishRectangle.bind(this),score:1},{name:"Bearish Rectangle",condition:this.isBearishRectangle.bind(this),score:-1}];for(const{name:e,condition:s,score:i}of t)if(s())return{chart_pattern:e,chart_score:i};return{chart_pattern:"Neutral",chart_score:0}}isBullishFlag(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=(Math.floor(e/2),this.ohlcv.close[t-2*e]);if((this.ohlcv.close[t-e]-s)/s<.15)return!1;const i=this.ohlcv.close[t-e];if((i-this.ohlcv.close[t-1])/i>.05)return!1;for(let s=t-e;s<t-1;s++)if(this.ohlcv.high[s]>this.ohlcv.high[s+1]||this.ohlcv.low[s]>this.ohlcv.low[s+1])return!1;return!0}isBearishFlag(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=(Math.floor(e/2),this.ohlcv.close[t-2*e]);if((s-this.ohlcv.close[t-e])/s<.15)return!1;const i=this.ohlcv.close[t-e];if((this.ohlcv.close[t-1]-i)/i>.05)return!1;for(let s=t-e;s<t-1;s++)if(this.ohlcv.high[s]<this.ohlcv.high[s+1]||this.ohlcv.low[s]<this.ohlcv.low[s+1])return!1;return!0}isBullishPennant(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.floor(e/2),i=this.ohlcv.close[t-2*e];if((this.ohlcv.close[t-e]-i)/i<.15)return!1;const o=this.ohlcv.close[t-e];if((o-this.ohlcv.close[t-1])/o>.05)return!1;for(let e=t-s;e<t-1;e++)if(this.ohlcv.high[e]<this.ohlcv.high[e+1]&&this.ohlcv.low[e]<this.ohlcv.low[e+1]||this.ohlcv.high[e]>this.ohlcv.high[e+1]&&this.ohlcv.low[e]>this.ohlcv.low[e+1])return!1;return!0}isBearishPennant(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.floor(e/2),i=this.ohlcv.close[t-2*e];if((i-this.ohlcv.close[t-e])/i<.15)return!1;const o=this.ohlcv.close[t-e];if((this.ohlcv.close[t-1]-o)/o>.05)return!1;for(let e=t-s;e<t-1;e++)if(this.ohlcv.high[e]>this.ohlcv.high[e+1]&&this.ohlcv.low[e]>this.ohlcv.low[e+1]||this.ohlcv.high[e]<this.ohlcv.high[e+1]&&this.ohlcv.low[e]<this.ohlcv.low[e+1])return!1;return!0}isDoubleTop(){const t=this.ohlcv.close.length,e=Math.floor(t/2),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e));if(s<=0||i<=0)return!1;const o=Math.min(...this.ohlcv.close.slice(0,e)),h=Math.min(...this.ohlcv.close.slice(e));return!((s-o)/s<.1||(i-h)/i<.1)&&Math.abs(s-i)/s<.03}isDoubleBottom(){const t=this.ohlcv.close.length,e=Math.floor(t/2),s=Math.min(...this.ohlcv.close.slice(0,e)),i=Math.min(...this.ohlcv.close.slice(e));if(s<=0||i<=0)return!1;const o=Math.max(...this.ohlcv.close.slice(0,e)),h=Math.max(...this.ohlcv.close.slice(e));return!((o-s)/s<.1||(h-i)/i<.1)&&Math.abs(s-i)/s<.03}isTripleTop(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e,2*e)),o=Math.max(...this.ohlcv.close.slice(2*e));if(s<=0||i<=0||o<=0)return!1;const h=(s-Math.min(...this.ohlcv.close.slice(0,e)))/s,r=(i-Math.min(...this.ohlcv.close.slice(e,2*e)))/i,n=(o-Math.min(...this.ohlcv.close.slice(2*e)))/o;return!(h<.1||r<.1||n<.1)&&Math.abs(s-i)/s<.03&&Math.abs(s-o)/s<.03}isTripleBottom(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.min(...this.ohlcv.close.slice(0,e)),i=Math.min(...this.ohlcv.close.slice(e,2*e)),o=Math.min(...this.ohlcv.close.slice(2*e));if(s<=0||i<=0||o<=0)return!1;const h=(Math.max(...this.ohlcv.close.slice(0,e))-s)/s,r=(Math.max(...this.ohlcv.close.slice(e,2*e))-i)/i,n=(Math.max(...this.ohlcv.close.slice(2*e))-o)/o;return!(h<.1||r<.1||n<.1)&&Math.abs(s-i)/s<.03&&Math.abs(s-o)/s<.03}isHeadAndShoulders(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e,2*e)),o=Math.max(...this.ohlcv.close.slice(2*e));if(s<=0||i<=0||o<=0)return!1;const h=Math.min(...this.ohlcv.close.slice(0,e)),r=Math.min(...this.ohlcv.close.slice(e,2*e)),n=Math.min(...this.ohlcv.close.slice(2*e)),l=(i-r)/i,c=(Math.max(h,n)-Math.min(h,n))/Math.min(h,n);return l>.15&&c<.03}isInverseHeadAndShoulders(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.min(...this.ohlcv.close.slice(0,e)),i=Math.min(...this.ohlcv.close.slice(e,2*e)),o=Math.min(...this.ohlcv.close.slice(2*e));if(s<=0||i<=0||o<=0)return!1;const h=Math.max(...this.ohlcv.close.slice(0,e)),r=Math.max(...this.ohlcv.close.slice(e,2*e)),n=Math.max(...this.ohlcv.close.slice(2*e)),l=(r-i)/i,c=(Math.min(h,n)-Math.max(h,n))/Math.max(h,n);return l>.15&&c<.03}isRisingWedge(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e,2*e)),o=Math.max(...this.ohlcv.close.slice(2*e)),h=Math.min(...this.ohlcv.close.slice(0,e)),r=Math.min(...this.ohlcv.close.slice(e,2*e)),n=Math.min(...this.ohlcv.close.slice(2*e));return s<i&&i<o&&h<r&&r<n}isFallingWedge(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.close.slice(0,e)),i=Math.max(...this.ohlcv.close.slice(e,2*e)),o=Math.max(...this.ohlcv.close.slice(2*e)),h=Math.min(...this.ohlcv.close.slice(0,e)),r=Math.min(...this.ohlcv.close.slice(e,2*e)),n=Math.min(...this.ohlcv.close.slice(2*e));return s>i&&i>o&&h>r&&r>n}isBullishTriangle(){const t=this.ohlcv.close.length,e=Math.floor(t/2),s=Math.max(...this.ohlcv.high.slice(0,e)),i=Math.max(...this.ohlcv.high.slice(e)),o=Math.min(...this.ohlcv.low.slice(0,e)),h=Math.min(...this.ohlcv.low.slice(e));return s>i&&o<h}isBearishTriangle(){const t=this.ohlcv.close.length,e=Math.floor(t/2),s=Math.max(...this.ohlcv.high.slice(0,e)),i=Math.max(...this.ohlcv.high.slice(e));return Math.min(...this.ohlcv.low.slice(0,e))<Math.min(...this.ohlcv.low.slice(e))&&s>i}isBullishRectangle(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.high.slice(0,e)),i=Math.max(...this.ohlcv.high.slice(e,2*e)),o=Math.max(...this.ohlcv.high.slice(2*e)),h=Math.min(...this.ohlcv.low.slice(0,e)),r=Math.min(...this.ohlcv.low.slice(e,2*e)),n=Math.min(...this.ohlcv.low.slice(2*e)),l=Math.abs(s-i)/s<.03&&Math.abs(i-o)/i<.03,c=Math.abs(h-r)/h<.03&&Math.abs(r-n)/r<.03;return l&&c}isBearishRectangle(){const t=this.ohlcv.close.length,e=Math.floor(t/3),s=Math.max(...this.ohlcv.high.slice(0,e)),i=Math.max(...this.ohlcv.high.slice(e,2*e)),o=Math.max(...this.ohlcv.high.slice(2*e)),h=Math.min(...this.ohlcv.low.slice(0,e)),r=Math.min(...this.ohlcv.low.slice(e,2*e)),n=Math.min(...this.ohlcv.low.slice(2*e)),l=Math.abs(s-i)/s<.03&&Math.abs(i-o)/i<.03,c=Math.abs(h-r)/h<.03&&Math.abs(r-n)/r<.03;return l&&c}}class V{constructor(){this.ChartPatterns=t=>new A(t).init()}init(t){return this.ohlcv=t.reduce(((t,{open:e,high:s,low:i,close:o,volume:h,...r})=>{t.open.push(e),t.high.push(s),t.low.push(i),t.close.push(o),t.volume.push(h);for(const e of Object.keys(r))t[e]||(t[e]=[]),t[e].push(r[e]);return t}),{open:[],high:[],low:[],close:[],volume:[]}),this}getHeaders(){return Object.keys(this.ohlcv)}getData(){const{ohlcv:t}=this,e=Object.keys(t),s=e.length;return t.open.map(((i,o)=>{const h={};for(let i=0;i<s;i++){const s=e[i],r=t[s][o];h[s]=r instanceof g?r.toNumber():r}return h}))}getLastValues(){const t={};for(const[e,s]of Object.entries(this.ohlcv)){let i=s[s.length-1];t[e]=i instanceof g?i.toNumber():i}return t}addColumn(t,e){const s=this.ohlcv.open.length;if(e.length>s)throw new Error("Invalid column data: The length of the new column exceeds the length of the OHLCV data");e=[...new Array(s-e.length).fill(null),...e],this.ohlcv[t]=e}crossPairs(t){const e=this.ohlcv,s={},i=t=>{if(!e.hasOwnProperty(t)&&"string"==typeof t){const[e,...s]=t.split("_");this[e]&&s.length>0&&this[e](...s)}};for(const{fast:o,slow:h}of t)if(o&&h)if(i(o),i(h),"number"!=typeof h||s[h]||(s[h]=e.close.map((()=>new g(h)))),e[o]&&e[h]){const t=E(e[o],e[h]);this.addColumn(`${o}_x_${h}`,t)}else if(e[o]&&s[h]){const t=E(e[o],s[h]);this.addColumn(`${o}_x_${h}`,t)}else console.error(`Missing ohlcv properties for ${o} or ${h}`)}ema(t){return((t,e)=>{const{ohlcv:s}=t,i=s.close,o=y(i,e);t.addColumn(`ema_${e}`,o)})(this,t),this}sma(t){return((t,e)=>{const{ohlcv:s}=t,i=s.close,o=P(i,e);t.addColumn(`sma_${e}`,o)})(this,t),this}macd(t,e,s){return((t,e=12,s=26,i=9)=>{const{ohlcv:o}=t,h=((t,e=12,s=26,i=9)=>{const o=[],h=[],r=[],n=new R({indicator:x,shortInterval:e,longInterval:s,signalInterval:i}),l=t.length;for(let e=0;e<l;e++){let s={};n.update(t[e]);try{s=n.getResult()}catch(t){s={macd:null,signal:null,histogram:null}}o.push(s.macd),h.push(s.signal),r.push(s.histogram)}return{macd_diff:o,macd_dea:h,macd_histogram:r,macd_diff_x_macd_dea:E(o,h)}})(o.close,e,s,i);for(let e in h)t.addColumn(e,h[e])})(this,t,e,s),this}bollingerBands(t,e,s){return((t,e,s)=>{const{ohlcv:i}=t,o=((t,e=20,s=2)=>{const i=t.length,o={upper:[],middle:[],lower:[]},h=new b(e,s);for(let e=0;e<i;e++){let s={};h.update(t[e]);try{s=h.getResult()}catch(t){s={upper:null,middle:null,lower:null}}o.upper.push(s.upper),o.middle.push(s.middle),o.lower.push(s.lower)}const r=S(t,{upper:o.upper,lower:o.lower});return{...o,range:r}})(i.close,e,s);for(let e in o)t.addColumn(`bollinger_bands_${e}`,o[e])})(this,t,e),this}rsi(t,e,s){return((t,e,s,i)=>{const{ohlcv:o}=t;"number"==typeof e&&void 0===i&&(i=e);const h=((t,e=14,s="SMA",i=14)=>{if(t.length<e)return[];let o=[];e=parseInt(e),i=parseInt(i);const h=new B(e),r=t.length;for(let e=0;e<r;e++){let s=null;h.update(t[e]);try{s=h.getResult()}catch(t){s=null}o.push(s)}o=o.filter((t=>t));let n={[`rsi_${e}`]:o};if("string"==typeof s&&"number"==typeof i&&C.hasOwnProperty(`get${s}`)){const t=C[`get${s}`](o,i);n[`rsi_${s}_${i}`]=t,n[`rsi_${e}_x_rsi_${s}_${i}`]=E(o,t)}return n})(o.close,e,s,i);for(let e in h)t.addColumn(`${e}`.toLowerCase(),h[e])})(this,t,e,s),this}candles(){return(t=>{const{ohlcv:e}=t,s=(t=>{const{open:e,high:s,low:i,close:o}=t,h=e.length;if(![e,s,i,o].every((t=>Array.isArray(t)&&t.length>1&&t.length===h)))return{pattern:Array(h).fill("Neutral"),name:Array(h).fill("No Pattern"),score:Array(h).fill(0)};const r=(t,e,s=1e-4)=>Math.abs(t-e)<s,n={bullish:[{name:"Marubozu",condition:(t,e)=>r(e.open,e.low)&&r(e.close,e.high),score:2},{name:"Engulfing",condition:(t,e)=>e.open<t.close&&e.close>t.open&&e.low<t.low&&e.high>t.high,score:2},{name:"Kicker",condition:(t,e)=>e.open<t.open&&e.close>e.open&&t.close<t.open,score:2},{name:"Morning Star",condition:(t,e)=>e.close>t.close&&e.open<t.open&&t.close<t.open,score:2},{name:"Piercing Line",condition:(t,e)=>e.close>t.close&&e.open<t.open&&e.close>(t.open+t.close)/2,score:1},{name:"Belt Hold",condition:(t,e)=>e.open>t.open&&r(e.close,e.high)&&r(t.close,t.low),score:1},{name:"Harami",condition:(t,e)=>e.open>t.close&&e.close<t.open&&e.open<t.open&&e.close>t.close,score:1},{name:"Doji",condition:(t,e)=>r(e.close,e.open)&&e.high-e.low>Math.abs(e.close-e.open),score:0}],bearish:[{name:"Marubozu",condition:(t,e)=>r(e.open,e.high)&&r(e.close,e.low),score:-2},{name:"Engulfing",condition:(t,e)=>e.open>t.close&&e.close<t.open&&e.high>t.high&&e.low<t.low,score:-2},{name:"Kicker",condition:(t,e)=>e.open>t.open&&e.close<e.open&&t.close>t.open,score:-2},{name:"Evening Star",condition:(t,e)=>e.close<t.close&&e.open>t.open&&t.close<t.open,score:-2},{name:"Dark Cloud Cover",condition:(t,e)=>e.close<t.close&&e.open>t.open&&e.close<(t.open+t.close)/2,score:-1},{name:"Belt Hold",condition:(t,e)=>e.open<t.open&&r(e.close,e.low)&&r(t.close,t.high),score:-1},{name:"Harami",condition:(t,e)=>e.open<t.close&&e.close>t.open&&e.open>t.open&&e.close<t.close,score:-1},{name:"Doji",condition:(t,e)=>r(e.close,e.open)&&e.high-e.low>Math.abs(e.close-e.open),score:0}]},l=(t,e,s)=>{for(const{name:i,condition:o,score:h}of s)if(o(t,e))return{name:i,score:h};return null},c=["Neutral"],a=["No Pattern"],u=[0];for(let t=1;t<h;t++){const h={open:e[t-1],high:s[t-1],low:i[t-1],close:o[t-1]},r={open:e[t],high:s[t],low:i[t],close:o[t]},p=l(h,r,n.bullish)||l(h,r,n.bearish);p?(c.push(p.score>0?"Bullish":"Bearish"),a.push(p.name),u.push(p.score)):(c.push("Neutral"),a.push("No Pattern"),u.push(0))}return{pattern:c,name:a,score:u}})(e);for(let e in s)t.addColumn(`candle_${e}`.toLowerCase(),s[e])})(this),this}volumeProfile(t,e,s){return((t,e,s=1,i)=>{let{ohlcv:o}=t;const h=((t,e,s)=>{const i=new Date(t[s][t[s].length-1]),o=new Date(i);o.setDate(o.getDate()-e),o.setHours(0,0,0,0);const h={open:[],high:[],low:[],close:[],volume:[],[s]:[]};for(let e=0;e<t[s].length;e++)new Date(t[s][e])>=o&&(h.open.push(t.open[e]),h.high.push(t.high[e]),h.low.push(t.low[e]),h.close.push(t.close[e]),h.volume.push(t.volume[e]),h[s].push(t[s][e]));return h})(o,s,i),r=((t,e=5)=>{const{open:s,high:i,low:o,close:h,volume:r}=t,n=Math.min(...o),l=(Math.max(...i)-n)/e,c={upVolume:0,downVolume:0,grossVolume:0},a=Array.from({length:e},((t,e)=>({price:n+l*e,upVolume:0,downVolume:0,grossVolume:0}))),u=1/l;for(let t=0;t<h.length;t++){const l=h[t],c=s[t],p=i[t],g=o[t],v=r[t],f=l>=c?v:0,d=l<c?v:0,m=Math.max(0,Math.floor((g-n)*u)),w=Math.min(e,Math.ceil((p-n)*u));for(let t=m;t<w;t++)a[t].upVolume+=f,a[t].downVolume+=d,a[t].grossVolume+=f+d}for(const{upVolume:t,downVolume:e,grossVolume:s}of a)c.upVolume+=t,c.downVolume+=e,c.grossVolume+=s;return{bins:a,nodes:D(a)}})(h,e),n=r.nodes.high.price,l=r.nodes.low.price;t.addColumn("volume_profile_high",[n]),t.addColumn("volume_profile_low",[l])})(this,t,e,s),this}}})(),OHLCV_INDICATORS=e})();
package/index.js CHANGED
@@ -111,7 +111,7 @@ export default class OHLCV_INDICATORS {
111
111
 
112
112
  // Prepare slowNumArr if 'slow' is a number
113
113
  if (typeof slow === 'number' && !slowNumArrCache[slow]) {
114
- slowNumArrCache[slow] = ohlcv.close.map(() => slow);
114
+ slowNumArrCache[slow] = ohlcv.close.map(() => new Big(slow));
115
115
  }
116
116
 
117
117
  // Find and add crosses
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ohlcv-indicators",
3
- "version": "1.2.7",
3
+ "version": "1.2.8",
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",