highcharts
Version:
JavaScript charting framework
106 lines (103 loc) • 57.5 kB
JavaScript
/*
Highcharts JS v7.1.2 (2019-06-03)
All technical indicators for Highstock
(c) 2010-2019 Pawel Fus
License: www.highcharts.com/license
*/
(function(f){"object"===typeof module&&module.exports?(f["default"]=f,module.exports=f):"function"===typeof define&&define.amd?define("highcharts/indicators/indicators-all",["highcharts","highcharts/modules/stock"],function(u){f(u);f.Highcharts=u;return f}):f("undefined"!==typeof Highcharts?Highcharts:void 0)})(function(f){function u(d,n,q,h){d.hasOwnProperty(n)||(d[n]=h.apply(null,q))}f=f?f._modules:{};u(f,"mixins/indicator-required.js",[f["parts/Globals.js"]],function(d){var n=d.error;return{isParentLoaded:function(d,
h,a,c,e){if(d)return c?c(d):!0;n(e||this.generateMessage(a,h));return!1},generateMessage:function(d,h){return'Error: "'+d+'" indicator type requires "'+h+'" indicator loaded before. Please read docs: https://api.highcharts.com/highstock/plotOptions.'+d}}});u(f,"indicators/indicators.src.js",[f["parts/Globals.js"],f["mixins/indicator-required.js"]],function(d,n){var q=d.pick,h=d.error,a=d.Series,c=d.isArray,e=d.addEvent,b=d.seriesType,g=d.seriesTypes,r=d.seriesTypes.ohlc.prototype,t=n.generateMessage;
e(d.Series,"init",function(b){b=b.options;b.useOhlcData&&"highcharts-navigator-series"!==b.id&&d.extend(this,{pointValKey:r.pointValKey,keys:r.keys,pointArrayMap:r.pointArrayMap,toYData:r.toYData})});e(a,"afterSetOptions",function(b){b=b.options;var c=b.dataGrouping;c&&b.useOhlcData&&"highcharts-navigator-series"!==b.id&&(c.approximation="ohlc")});b("sma","line",{name:void 0,tooltip:{valueDecimals:4},linkedTo:void 0,compareToMain:!1,params:{index:0,period:14}},{processData:function(){var b=this.options.compareToMain,
c=this.linkedParent;a.prototype.processData.apply(this,arguments);c&&c.compareValue&&b&&(this.compareValue=c.compareValue)},bindTo:{series:!0,eventName:"updatedData"},hasDerivedData:!0,useCommonDataGrouping:!0,nameComponents:["period"],nameSuffixes:[],calculateOn:"init",requiredIndicators:[],requireIndicators:function(){var b={allLoaded:!0};this.requiredIndicators.forEach(function(c){g[c]?g[c].prototype.requireIndicators():(b.allLoaded=!1,b.needed=c)});return b},init:function(b,c){function g(){var b=
k.points||[],c=(k.xData||[]).length,a=k.getValues(k.linkedParent,k.options.params)||{values:[],xData:[],yData:[]},e=[],g=!0,r,l;if(c&&!k.hasGroupedData&&k.visible&&k.points)if(k.cropped){k.xAxis&&(r=k.xAxis.min,l=k.xAxis.max);c=k.cropData(a.xData,a.yData,r,l);for(r=0;r<c.xData.length;r++)e.push([c.xData[r]].concat(d.splat(c.yData[r])));c=a.xData.indexOf(k.xData[0]);r=a.xData.indexOf(k.xData[k.xData.length-1]);-1===c&&r===a.xData.length-2&&e[0][0]===b[0].x&&e.shift();k.updateData(e)}else a.xData.length!==
c-1&&a.xData.length!==c+1&&(g=!1,k.updateData(a.values));g&&(k.xData=a.xData,k.yData=a.yData,k.options.data=a.values);!1===k.bindTo.series&&(delete k.processedXData,k.isDirty=!0,k.redraw());k.isDirtyData=!1}var k=this,r=k.requireIndicators();if(!r.allLoaded)return h(t(k.type,r.needed));a.prototype.init.call(k,b,c);b.linkSeries();k.dataEventsToUnbind=[];if(!k.linkedParent)return h("Series "+k.options.linkedTo+" not found! Check `linkedTo`.",!1,b);k.dataEventsToUnbind.push(e(k.bindTo.series?k.linkedParent:
k.linkedParent.xAxis,k.bindTo.eventName,g));if("init"===k.calculateOn)g();else var m=e(k.chart,k.calculateOn,function(){g();m()});return k},getName:function(){var b=this.name,c=[];b||((this.nameComponents||[]).forEach(function(b,a){c.push(this.options.params[b]+q(this.nameSuffixes[a],""))},this),b=(this.nameBase||this.type.toUpperCase())+(this.nameComponents?" ("+c.join(", ")+")":""));return b},getValues:function(b,a){var e=a.period,k=b.xData;b=b.yData;var g=b.length,r=0,t=0,h=[],m=[],d=[],p=-1,n;
if(k.length<e)return!1;for(c(b[0])&&(p=a.index?a.index:0);r<e-1;)t+=0>p?b[r]:b[r][p],r++;for(a=r;a<g;a++)t+=0>p?b[a]:b[a][p],n=[k[a],t/e],h.push(n),m.push(n[0]),d.push(n[1]),t-=0>p?b[a-r]:b[a-r][p];return{values:h,xData:m,yData:d}},destroy:function(){this.dataEventsToUnbind.forEach(function(b){b()});a.prototype.destroy.call(this)}})});u(f,"indicators/accumulation-distribution.src.js",[f["parts/Globals.js"]],function(d){var n=d.seriesType;n("ad","sma",{params:{volumeSeriesID:"volume"}},{nameComponents:!1,
nameBase:"Accumulation/Distribution",getValues:function(n,h){var a=h.period,c=n.xData,e=n.yData,b=h.volumeSeriesID,g=n.chart.get(b);h=g&&g.yData;var r=e?e.length:0,t=[],m=[],p=[];if(c.length<=a&&r&&4!==e[0].length)return!1;if(!g)return d.error("Series "+b+" not found! Check `volumeSeriesID`.",!0,n.chart);for(;a<r;a++){n=t.length;var b=e[a][1],g=e[a][2],l=e[a][3],k=h[a],b=[c[a],l===b&&l===g||b===g?0:(2*l-g-b)/(b-g)*k];0<n&&(b[1]+=t[n-1][1]);t.push(b);m.push(b[0]);p.push(b[1])}return{values:t,xData:m,
yData:p}}})});u(f,"indicators/ao.src.js",[f["parts/Globals.js"]],function(d){var n=d.correctFloat,q=d.isArray;d.seriesType("ao","sma",{greaterBarColor:"#06B535",lowerBarColor:"#F21313",threshold:0,groupPadding:.2,pointPadding:.2,states:{hover:{halo:{size:0}}}},{nameBase:"AO",nameComponents:!1,markerAttribs:d.noop,getColumnMetrics:d.seriesTypes.column.prototype.getColumnMetrics,crispCol:d.seriesTypes.column.prototype.crispCol,translate:d.seriesTypes.column.prototype.translate,drawPoints:d.seriesTypes.column.prototype.drawPoints,
drawGraph:function(){var h=this.options,a=this.points,c=h.greaterBarColor,h=h.lowerBarColor,e=a[0];if(!this.userOptions.color&&e)for(e.color=c,e=1;e<a.length;e++)a[e].color=a[e].y>a[e-1].y?c:a[e].y<a[e-1].y?h:a[e-1].color},getValues:function(h){var a=h.xData||[];h=h.yData||[];var c=h.length,e=[],b=[],g=[],r=0,t=0,m,p,l;if(34>=a.length||!q(h[0])||4!==h[0].length)return!1;for(l=0;33>l;l++)m=(h[l][1]+h[l][2])/2,29<=l&&(r=n(r+m)),t=n(t+m);for(l=33;l<c;l++)m=(h[l][1]+h[l][2])/2,r=n(r+m),t=n(t+m),m=r/5,
p=t/34,m=n(m-p),e.push([a[l],m]),b.push(a[l]),g.push(m),m=l+1-5,p=l+1-34,r=n(r-(h[m][1]+h[m][2])/2),t=n(t-(h[p][1]+h[p][2])/2);return{values:e,xData:b,yData:g}}})});u(f,"mixins/multipe-lines.js",[f["parts/Globals.js"]],function(d){var n=d.each,q=d.merge,h=d.error,a=d.defined,c=d.seriesTypes.sma;return{pointArrayMap:["top","bottom"],pointValKey:"top",linesApiNames:["bottomLine"],getTranslatedLinesNames:function(c){var b=[];n(this.pointArrayMap,function(a){a!==c&&b.push("plot"+a.charAt(0).toUpperCase()+
a.slice(1))});return b},toYData:function(c){var b=[];n(this.pointArrayMap,function(a){b.push(c[a])});return b},translate:function(){var a=this,b=a.pointArrayMap,g=[],r,g=a.getTranslatedLinesNames();c.prototype.translate.apply(a,arguments);n(a.points,function(c){n(b,function(b,e){r=c[b];null!==r&&(c[g[e]]=a.yAxis.toPixels(r,!0))})})},drawGraph:function(){var e=this,b=e.linesApiNames,g=e.points,r=g.length,t=e.options,m=e.graph,p={options:{gapSize:t.gapSize}},l=[],k=e.getTranslatedLinesNames(e.pointValKey),
y;n(k,function(b,c){for(l[c]=[];r--;)y=g[r],l[c].push({x:y.x,plotX:y.plotX,plotY:y[b],isNull:!a(y[b])});r=g.length});n(b,function(b,a){l[a]?(e.points=l[a],t[b]?e.options=q(t[b].styles,p):h('Error: "There is no '+b+' in DOCS options declared. Check if linesApiNames are consistent with your DOCS line names." at mixin/multiple-line.js:34'),e.graph=e["graph"+b],c.prototype.drawGraph.call(e),e["graph"+b]=e.graph):h('Error: "'+b+" doesn't have equivalent in pointArrayMap. To many elements in linesApiNames relative to pointArrayMap.\"")});
e.points=g;e.options=t;e.graph=m;c.prototype.drawGraph.call(e)}}});u(f,"indicators/aroon.src.js",[f["parts/Globals.js"],f["mixins/multipe-lines.js"]],function(d,n){function q(h,a){var c=h[0],e=0,b;for(b=1;b<h.length;b++)if("max"===a&&h[b]>=c||"min"===a&&h[b]<=c)c=h[b],e=b;return e}d.seriesType("aroon","sma",{params:{period:25},marker:{enabled:!1},tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e\x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eAroon Up: {point.y}\x3cbr/\x3eAroon Down: {point.aroonDown}\x3cbr/\x3e'},
aroonDown:{styles:{lineWidth:1,lineColor:void 0}},dataGrouping:{approximation:"averages"}},d.merge(n,{nameBase:"Aroon",pointArrayMap:["y","aroonDown"],pointValKey:"y",linesApiNames:["aroonDown"],getValues:function(h,a){a=a.period;var c=h.xData,e=(h=h.yData)?h.length:0,b=[],g=[],r=[],t,m,p;for(p=a-1;p<e;p++)t=h.slice(p-a+1,p+2),m=q(t.map(function(b){return d.pick(b[2],b)}),"min"),t=q(t.map(function(b){return d.pick(b[1],b)}),"max"),t=t/a*100,m=m/a*100,c[p+1]&&(b.push([c[p+1],t,m]),g.push(c[p+1]),r.push([t,
m]));return{values:b,xData:g,yData:r}}}))});u(f,"indicators/aroon-oscillator.src.js",[f["parts/Globals.js"],f["mixins/multipe-lines.js"],f["mixins/indicator-required.js"]],function(d,n,q){var h=d.seriesTypes.aroon;d.seriesType("aroonoscillator","aroon",{params:{period:25},tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e\x3cb\x3e {series.name}\x3c/b\x3e: {point.y}'}},d.merge(n,{nameBase:"Aroon Oscillator",pointArrayMap:["y"],pointValKey:"y",linesApiNames:[],init:function(){var a=
arguments,c=this;q.isParentLoaded(h,"aroon",c.type,function(e){e.prototype.init.apply(c,a)})},getValues:function(a,c){var e=[],b=[],g=[],r,t;a=h.prototype.getValues.call(this,a,c);for(c=0;c<a.yData.length;c++)r=a.yData[c][0],t=a.yData[c][1],r-=t,e.push([a.xData[c],r]),b.push(a.xData[c]),g.push(r);return{values:e,xData:b,yData:g}}}))});u(f,"indicators/atr.src.js",[f["parts/Globals.js"]],function(d){function n(a,c){return Math.max(a[1]-a[2],c===h?0:Math.abs(a[1]-c[3]),c===h?0:Math.abs(a[2]-c[3]))}var q=
d.isArray;d=d.seriesType;var h;d("atr","sma",{params:{period:14}},{getValues:function(a,c){c=c.period;var e=a.xData,b=(a=a.yData)?a.length:0,g=1,r=0,t=0,h=[],p=[],l=[],k,y,d;d=[[e[0],a[0]]];if(e.length<=c||!q(a[0])||4!==a[0].length)return!1;for(y=1;y<=b;y++)if(d.push([e[y],a[y]]),c<g){k=c;var C=e[y-1],v=n(a[y-1],a[y-2]);k=[C,(r*(k-1)+v)/k];r=k[1];h.push(k);p.push(k[0]);l.push(k[1])}else c===g?(r=t/(y-1),h.push([e[y-1],r]),p.push(e[y-1]),l.push(r)):t+=n(a[y-1],a[y-2]),g++;return{values:h,xData:p,yData:l}}})});
u(f,"indicators/bollinger-bands.src.js",[f["parts/Globals.js"],f["mixins/multipe-lines.js"]],function(d,n){var q=d.merge,h=d.isArray,a=d.seriesTypes.sma;d.seriesType("bb","sma",{params:{period:20,standardDeviation:2,index:3},bottomLine:{styles:{lineWidth:1,lineColor:void 0}},topLine:{styles:{lineWidth:1,lineColor:void 0}},tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e\x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eTop: {point.top}\x3cbr/\x3eMiddle: {point.middle}\x3cbr/\x3eBottom: {point.bottom}\x3cbr/\x3e'},
marker:{enabled:!1},dataGrouping:{approximation:"averages"}},d.merge(n,{pointArrayMap:["top","middle","bottom"],pointValKey:"middle",nameComponents:["period","standardDeviation"],linesApiNames:["topLine","bottomLine"],init:function(){a.prototype.init.apply(this,arguments);this.options=q({topLine:{styles:{lineColor:this.color}},bottomLine:{styles:{lineColor:this.color}}},this.options)},getValues:function(c,e){var b=e.period,g=e.standardDeviation,r=c.xData,t=(c=c.yData)?c.length:0,m=[],d,l,k,y,E=[],
n=[],q,f;if(r.length<b)return!1;q=h(c[0]);for(f=b;f<=t;f++){y=r.slice(f-b,f);l=c.slice(f-b,f);d=a.prototype.getValues.call(this,{xData:y,yData:l},e);y=d.xData[0];d=d.yData[0];k=0;for(var w=l.length,x=0,A;x<w;x++)A=(q?l[x][e.index]:l[x])-d,k+=A*A;k=Math.sqrt(k/(w-1));l=d+g*k;k=d-g*k;m.push([y,l,d,k]);E.push(y);n.push([l,d,k])}return{values:m,xData:E,yData:n}}}))});u(f,"indicators/cci.src.js",[f["parts/Globals.js"]],function(d){function n(h){return h.reduce(function(a,c){return a+c},0)}var q=d.isArray;
d=d.seriesType;d("cci","sma",{params:{period:14}},{getValues:function(h,a){a=a.period;var c=h.xData,e=(h=h.yData)?h.length:0,b=[],g,r=1,t=[],d=[],p=[],l,k;if(c.length<=a||!q(h[0])||4!==h[0].length)return!1;for(;r<a;)l=h[r-1],b.push((l[1]+l[2]+l[3])/3),r++;for(r=a;r<=e;r++){l=h[r-1];l=(l[1]+l[2]+l[3])/3;k=b.push(l);g=b.slice(k-a);k=n(g)/a;var y=g.length,E=0,C;for(C=0;C<y;C++)E+=Math.abs(k-g[C]);g=E/a;l=(l-k)/(.015*g);t.push([c[r-1],l]);d.push(c[r-1]);p.push(l)}return{values:t,xData:d,yData:p}}})});
u(f,"indicators/cmf.src.js",[f["parts/Globals.js"]],function(d){d.seriesType("cmf","sma",{params:{period:14,volumeSeriesID:"volume"}},{nameBase:"Chaikin Money Flow",isValid:function(){var d=this.chart,q=this.options,h=this.linkedParent,d=this.volumeSeries||(this.volumeSeries=d.get(q.params.volumeSeriesID)),a=h&&h.yData&&4===h.yData[0].length;return!!(h&&d&&h.xData&&h.xData.length>=q.params.period&&d.xData&&d.xData.length>=q.params.period&&a)},getValues:function(d,q){return this.isValid()?this.getMoneyFlow(d.xData,
d.yData,this.volumeSeries.yData,q.period):!1},getMoneyFlow:function(d,q,h,a){function c(b,c){var a=b[1],e=b[2];b=b[3];return null!==c&&null!==a&&null!==e&&null!==b&&a!==e?(b-e-(a-b))/(a-e)*c:(y=l,null)}var e=q.length,b=[],g=0,r=0,t=[],m=[],p=[],l,k,y=-1;if(0<a&&a<=e){for(l=0;l<a;l++)b[l]=c(q[l],h[l]),g+=h[l],r+=b[l];t.push(d[l-1]);m.push(l-y>=a&&0!==g?r/g:null);for(p.push([t[0],m[0]]);l<e;l++)b[l]=c(q[l],h[l]),g-=h[l-a],g+=h[l],r-=b[l-a],r+=b[l],k=[d[l],l-y>=a?r/g:null],t.push(k[0]),m.push(k[1]),
p.push([k[0],k[1]])}return{values:p,xData:t,yData:m}}})});u(f,"indicators/dpo.src.js",[f["parts/Globals.js"]],function(d){function n(a,c,e,b,g){c=h(c[e][b],c[e]);return g?q(a-c):q(a+c)}var q=d.correctFloat,h=d.pick;d.seriesType("dpo","sma",{params:{period:21}},{nameBase:"DPO",getValues:function(a,c){var e=c.period;c=c.index;var b=e+Math.floor(e/2+1),g=a.xData||[];a=a.yData||[];var r=a.length,d=[],m=[],p=[],l=0,k,y,E;if(g.length<=b)return!1;for(y=0;y<e-1;y++)l=n(l,a,y,c);for(E=0;E<=r-b;E++)k=E+e-1,
y=E+b-1,l=n(l,a,k,c),k=h(a[y][c],a[y]),k-=l/e,l=n(l,a,E,c,!0),d.push([g[y],k]),m.push(g[y]),p.push(k);return{values:d,xData:m,yData:p}}})});u(f,"indicators/ema.src.js",[f["parts/Globals.js"]],function(d){var n=d.isArray,q=d.seriesType,h=d.correctFloat;q("ema","sma",{params:{index:3,period:9}},{accumulatePeriodPoints:function(a,c,e){for(var b=0,g=0,r;g<a;)r=0>c?e[g]:e[g][c],b+=r,g++;return b},calculateEma:function(a,c,e,b,g,r,d){a=a[e-1];c=0>r?c[e-1]:c[e-1][r];b=void 0===g?d:h(c*b+g*(1-b));return[a,
b]},getValues:function(a,c){var e=c.period,b=a.xData,g=(a=a.yData)?a.length:0,r=2/(e+1),d=[],h=[],p=[],l=-1,k;if(g<e)return!1;n(a[0])&&(l=c.index?c.index:0);for(c=this.accumulatePeriodPoints(e,l,a)/e;e<g+1;e++)k=this.calculateEma(b,a,e,r,k,l,c),d.push(k),h.push(k[0]),p.push(k[1]),k=k[1];return{values:d,xData:h,yData:p}}})});u(f,"indicators/chaikin.src.js",[f["parts/Globals.js"],f["mixins/indicator-required.js"]],function(d,n){var q=d.seriesTypes.ema,h=d.seriesTypes.ad,a=d.error,c=d.correctFloat;d.seriesType("chaikin",
"ema",{params:{volumeSeriesID:"volume",periods:[3,10]}},{nameBase:"Chaikin Osc",nameComponents:["periods"],init:function(){var c=arguments,b=this;n.isParentLoaded(q,"ema",b.type,function(a){a.prototype.init.apply(b,c)})},getValues:function(e,b){var g=b.periods,r=b.period,d=[],m=[],p=[],l;if(2!==g.length||g[1]<=g[0])return a('Error: "Chaikin requires two periods. Notice, first period should be lower than the second one."'),!1;b=h.prototype.getValues.call(this,e,{volumeSeriesID:b.volumeSeriesID,period:r});
if(!b)return!1;e=q.prototype.getValues.call(this,b,{period:g[0]});b=q.prototype.getValues.call(this,b,{period:g[1]});if(!e||!b)return!1;g=g[1]-g[0];for(l=0;l<b.yData.length;l++)r=c(e.yData[l+g]-b.yData[l]),d.push([b.xData[l],r]),m.push(b.xData[l]),p.push(r);return{values:d,xData:m,yData:p}}})});u(f,"indicators/dema.src.js",[f["parts/Globals.js"],f["mixins/indicator-required.js"]],function(d,n){var q=d.isArray,h=d.seriesTypes.ema,a=d.correctFloat;d.seriesType("dema","ema",{},{init:function(){var c=
arguments,a=this;n.isParentLoaded(h,"ema",a.type,function(b){b.prototype.init.apply(a,c)})},getEMA:function(c,a,b,g,r,d){return h.prototype.calculateEma(d||[],c,void 0===r?1:r,this.chart.series[0].EMApercent,a,void 0===g?-1:g,b)},getValues:function(c,e){var b=e.period,g=2*b,r=c.xData,d=c.yData,m=d?d.length:0,p=-1,l=[],k=[],y=[],E=0,n,v,f=[],w,x;c.EMApercent=2/(b+1);if(m<2*b-1)return!1;q(d[0])&&(p=e.index?e.index:0);c=h.prototype.accumulatePeriodPoints(b,p,d);e=c/b;c=0;for(w=b;w<m+2;w++)w<m+1&&(E=
this.getEMA(d,v,e,p,w)[1],f.push(E)),v=E,w<g?c+=E:(w===g&&(e=c/b),E=f[w-b-1],n=this.getEMA([E],n,e)[1],x=[r[w-2],a(2*E-n)],l.push(x),k.push(x[0]),y.push(x[1]));return{values:l,xData:k,yData:y}}})});u(f,"indicators/tema.src.js",[f["parts/Globals.js"],f["mixins/indicator-required.js"]],function(d,n){var q=d.isArray,h=d.seriesTypes.ema,a=d.correctFloat;d.seriesType("tema","ema",{},{init:function(){var c=arguments,a=this;n.isParentLoaded(h,"ema",a.type,function(b){b.prototype.init.apply(a,c)})},getEMA:function(c,
a,b,g,r,d){return h.prototype.calculateEma(d||[],c,void 0===r?1:r,this.chart.series[0].EMApercent,a,void 0===g?-1:g,b)},getPoint:function(c,e,b,g){return[c[g-3],a(3*b.level1-3*b.level2+b.level3)]},getValues:function(c,a){var b=a.period,g=2*b,e=3*b,d=c.xData,m=c.yData,p=m?m.length:0,l=-1,k=[],y=[],E=[],n,v,f=[],w=[],x,A,B={};c.EMApercent=2/(b+1);if(p<3*b-2)return!1;q(m[0])&&(l=a.index?a.index:0);c=h.prototype.accumulatePeriodPoints(b,l,m);a=c/b;c=0;for(x=b;x<p+3;x++)if(x<p+1&&(B.level1=this.getEMA(m,
n,a,l,x)[1],f.push(B.level1)),n=B.level1,x<g)c+=B.level1;else if(x===g&&(a=c/b,c=0),B.level1=f[x-b-1],B.level2=this.getEMA([B.level1],v,a)[1],w.push(B.level2),v=B.level2,x<e)c+=B.level2;else{x===e&&(a=c/b);x===p+1&&(B.level1=f[x-b-1],B.level2=this.getEMA([B.level1],v,a)[1],w.push(B.level2));B.level1=f[x-b-2];B.level2=w[x-2*b-1];B.level3=this.getEMA([B.level2],B.prevLevel3,a)[1];if(A=this.getPoint(d,e,B,x))k.push(A),y.push(A[0]),E.push(A[1]);B.prevLevel3=B.level3}return{values:k,xData:y,yData:E}}})});
u(f,"indicators/trix.src.js",[f["parts/Globals.js"],f["mixins/indicator-required.js"]],function(d,n){var q=d.correctFloat,h=d.seriesTypes.tema;d.seriesType("trix","tema",{},{init:function(){var a=arguments,c=this;n.isParentLoaded(h,"tema",c.type,function(e){e.prototype.init.apply(c,a)})},getPoint:function(a,c,e,b){if(b>c)var g=[a[b-3],0!==e.prevLevel3?q(e.level3-e.prevLevel3)/e.prevLevel3*100:null];return g}})});u(f,"indicators/apo.src.js",[f["parts/Globals.js"],f["mixins/indicator-required.js"]],
function(d,n){var q=d.seriesTypes.ema,h=d.error;d.seriesType("apo","ema",{params:{periods:[10,20]}},{nameBase:"APO",nameComponents:["periods"],init:function(){var a=arguments,c=this;n.isParentLoaded(q,"ema",c.type,function(e){e.prototype.init.apply(c,a)})},getValues:function(a,c){var e=c.periods,b=c.index;c=[];var g=[],r=[],d,m;if(2!==e.length||e[1]<=e[0])return h('Error: "APO requires two periods. Notice, first period should be lower than the second one."'),!1;d=q.prototype.getValues.call(this,a,
{index:b,period:e[0]});a=q.prototype.getValues.call(this,a,{index:b,period:e[1]});if(!d||!a)return!1;e=e[1]-e[0];for(m=0;m<a.yData.length;m++)b=d.yData[m+e]-a.yData[m],c.push([a.xData[m],b]),g.push(a.xData[m]),r.push(b);return{values:c,xData:g,yData:r}}})});u(f,"indicators/ichimoku-kinko-hyo.src.js",[f["parts/Globals.js"]],function(d){function n(b){return b.reduce(function(b,c){return Math.max(b,c[1])},-Infinity)}function q(b){return b.reduce(function(b,c){return Math.min(b,c[2])},Infinity)}function h(b){return{high:n(b),
low:q(b)}}function a(c){var a,e,k,g,r;c.series.forEach(function(c){if(c.xData)for(g=c.xData,r=e=c.xIncrement?1:g.length-1;0<r;r--)if(k=g[r]-g[r-1],a===b||k<a)a=k});return a}function c(b,c,a,e){if(b&&c&&a&&e){var g=c.plotX-b.plotX;c=c.plotY-b.plotY;var k=e.plotX-a.plotX;e=e.plotY-a.plotY;var r=b.plotX-a.plotX,d=b.plotY-a.plotY;a=(-c*r+g*d)/(-k*c+g*e);k=(k*d-e*r)/(-k*c+g*e);if(0<=a&&1>=a&&0<=k&&1>=k)return{plotX:b.plotX+k*g,plotY:b.plotY+k*c}}return!1}function e(b){var c=b.indicator;c.points=b.points;
c.nextPoints=b.nextPoints;c.color=b.color;c.options=r(b.options.senkouSpan.styles,b.gap);c.graph=b.graph;c.fillGraph=!0;l.prototype.drawGraph.call(c)}var b,g=d.seriesType,r=d.merge,t=d.color,m=d.isArray,p=d.defined,l=d.seriesTypes.sma;d.approximations["ichimoku-averages"]=function(){var b=[],c;[].forEach.call(arguments,function(a,e){b.push(d.approximations.average(a));c=!c&&void 0===b[e]});return c?void 0:b};g("ikh","sma",{params:{period:26,periodTenkan:9,periodSenkouSpanB:52},marker:{enabled:!1},
tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eTENKAN SEN: {point.tenkanSen:.3f}\x3cbr/\x3eKIJUN SEN: {point.kijunSen:.3f}\x3cbr/\x3eCHIKOU SPAN: {point.chikouSpan:.3f}\x3cbr/\x3eSENKOU SPAN A: {point.senkouSpanA:.3f}\x3cbr/\x3eSENKOU SPAN B: {point.senkouSpanB:.3f}\x3cbr/\x3e'},tenkanLine:{styles:{lineWidth:1,lineColor:void 0}},kijunLine:{styles:{lineWidth:1,lineColor:void 0}},chikouLine:{styles:{lineWidth:1,lineColor:void 0}},
senkouSpanA:{styles:{lineWidth:1,lineColor:void 0}},senkouSpanB:{styles:{lineWidth:1,lineColor:void 0}},senkouSpan:{styles:{fill:"rgba(255, 0, 0, 0.5)"}},dataGrouping:{approximation:"ichimoku-averages"}},{pointArrayMap:["tenkanSen","kijunSen","chikouSpan","senkouSpanA","senkouSpanB"],pointValKey:"tenkanSen",nameComponents:["periodSenkouSpanB","period","periodTenkan"],init:function(){l.prototype.init.apply(this,arguments);this.options=r({tenkanLine:{styles:{lineColor:this.color}},kijunLine:{styles:{lineColor:this.color}},
chikouLine:{styles:{lineColor:this.color}},senkouSpanA:{styles:{lineColor:this.color,fill:t(this.color).setOpacity(.5).get()}},senkouSpanB:{styles:{lineColor:this.color,fill:t(this.color).setOpacity(.5).get()}},senkouSpan:{styles:{fill:t(this.color).setOpacity(.2).get()}}},this.options)},toYData:function(b){return[b.tenkanSen,b.kijunSen,b.chikouSpan,b.senkouSpanA,b.senkouSpanB]},translate:function(){var b=this;l.prototype.translate.apply(b);b.points.forEach(function(c){b.pointArrayMap.forEach(function(a){p(c[a])&&
(c["plot"+a]=b.yAxis.toPixels(c[a],!0),c.plotY=c["plot"+a],c.tooltipPos=[c.plotX,c["plot"+a]],c.isNull=!1)})})},drawGraph:function(){var b=this,a=b.points,g=a.length,h=b.options,m=b.graph,t=b.color,n={options:{gapSize:h.gapSize}},q=b.pointArrayMap.length,f=[[],[],[],[],[],[]],B={tenkanLine:f[0],kijunLine:f[1],chikouLine:f[2],senkouSpanA:f[3],senkouSpanB:f[4],senkouSpan:f[5]},u=[],z=b.options.senkouSpan,M=z.color||z.styles.fill,L=z.negativeColor,D=[[],[]],J=[[],[]],N=0,F,I,O,K;for(b.ikhMap=B;g--;){F=
a[g];for(I=0;I<q;I++)z=b.pointArrayMap[I],p(F[z])&&f[I].push({plotX:F.plotX,plotY:F["plot"+z],isNull:!1});L&&g!==a.length-1&&(z=B.senkouSpanB.length-1,F=c(B.senkouSpanA[z-1],B.senkouSpanA[z],B.senkouSpanB[z-1],B.senkouSpanB[z]),I={plotX:F.plotX,plotY:F.plotY,isNull:!1,intersectPoint:!0},F&&(B.senkouSpanA.splice(z,0,I),B.senkouSpanB.splice(z,0,I),u.push(z)))}d.objectEach(B,function(c,a){h[a]&&"senkouSpan"!==a&&(b.points=f[N],b.options=r(h[a].styles,n),b.graph=b["graph"+a],b.fillGraph=!1,b.color=t,
l.prototype.drawGraph.call(b),b["graph"+a]=b.graph);N++});b.graphCollection&&b.graphCollection.forEach(function(c){b[c].destroy();delete b[c]});b.graphCollection=[];if(L&&B.senkouSpanA[0]&&B.senkouSpanB[0]){u.unshift(0);u.push(B.senkouSpanA.length-1);for(q=0;q<u.length-1;q++){z=u[q];F=u[q+1];g=B.senkouSpanB.slice(z,F+1);z=B.senkouSpanA.slice(z,F+1);if(1<=Math.floor(g.length/2))if(F=Math.floor(g.length/2),g[F].plotY===z[F].plotY){for(K=I=F=0;K<g.length;K++)F+=g[K].plotY,I+=z[K].plotY;F=F>I?0:1}else F=
g[F].plotY>z[F].plotY?0:1;else F=g[0].plotY>z[0].plotY?0:1;D[F]=D[F].concat(g);J[F]=J[F].concat(z)}["graphsenkouSpanColor","graphsenkouSpanNegativeColor"].forEach(function(c,a){D[a].length&&J[a].length&&(O=0===a?M:L,e({indicator:b,points:D[a],nextPoints:J[a],color:O,options:h,gap:n,graph:b[c]}),b[c]=b.graph,b.graphCollection.push(c))})}else e({indicator:b,points:B.senkouSpanB,nextPoints:B.senkouSpanA,color:M,options:h,gap:n,graph:b.graphsenkouSpan}),b.graphsenkouSpan=b.graph;delete b.nextPoints;delete b.fillGraph;
b.points=a;b.options=h;b.graph=m},getGraphPath:function(b){var c,a,g=[];b=b||this.points;if(this.fillGraph&&this.nextPoints){a=l.prototype.getGraphPath.call(this,this.nextPoints);a[0]="L";c=l.prototype.getGraphPath.call(this,b);a=a.slice(0,c.length);for(var e=a.length-1;0<e;e-=3)g.push(a[e-2],a[e-1],a[e]);c=c.concat(g)}else c=l.prototype.getGraphPath.apply(this,arguments);return c},getValues:function(c,g){var e=g.period,r=g.periodTenkan;g=g.periodSenkouSpanB;var d=c.xData,k=c.yData,l=k&&k.length||
0;c=a(c.xAxis);var t=[],p=[],y,n,q,f,u,D,J;if(d.length<=e||!m(k[0])||4!==k[0].length)return!1;y=d[0]-e*c;for(D=0;D<e;D++)p.push(y+D*c);for(D=0;D<l;D++)D>=r&&(q=k.slice(D-r,D),q=h(q),q=(q.high+q.low)/2),D>=e&&(f=k.slice(D-e,D),f=h(f),f=(f.high+f.low)/2,J=(q+f)/2),D>=g&&(u=k.slice(D-g,D),u=h(u),u=(u.high+u.low)/2),y=k[D][3],n=d[D],t[D]===b&&(t[D]=[]),t[D+e]===b&&(t[D+e]=[]),t[D+e][0]=q,t[D+e][1]=f,t[D+e][2]=b,t[D][2]=y,D<=e&&(t[D+e][3]=b,t[D+e][4]=b),t[D+2*e]===b&&(t[D+2*e]=[]),t[D+2*e][3]=J,t[D+2*
e][4]=u,p.push(n);for(D=1;D<=e;D++)p.push(n+D*c);return{values:t,xData:p,yData:t}}})});u(f,"indicators/keltner-channels.src.js",[f["parts/Globals.js"],f["mixins/multipe-lines.js"]],function(d,n){var q=d.seriesTypes.sma,h=d.seriesTypes.ema,a=d.seriesTypes.atr,c=d.merge,e=d.correctFloat;d.seriesType("keltnerchannels","sma",{params:{period:20,periodATR:10,multiplierATR:2},bottomLine:{styles:{lineWidth:1,lineColor:void 0}},topLine:{styles:{lineWidth:1,lineColor:void 0}},tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e\x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eUpper Channel: {point.top}\x3cbr/\x3eEMA({series.options.params.period}): {point.middle}\x3cbr/\x3eLower Channel: {point.bottom}\x3cbr/\x3e'},
marker:{enabled:!1},dataGrouping:{approximation:"averages"},lineWidth:1},c(n,{pointArrayMap:["top","middle","bottom"],pointValKey:"middle",nameBase:"Keltner Channels",nameComponents:["period","periodATR","multiplierATR"],linesApiNames:["topLine","bottomLine"],requiredIndicators:["ema","atr"],init:function(){q.prototype.init.apply(this,arguments);this.options=c({topLine:{styles:{lineColor:this.color}},bottomLine:{styles:{lineColor:this.color}}},this.options)},getValues:function(b,c){var g=c.period,
d=c.periodATR,m=c.multiplierATR,p=b.yData,p=p?p.length:0,l=[],k,y,n;c=h.prototype.getValues(b,{period:g,index:c.index});var q=a.prototype.getValues(b,{period:d}),f=[],u=[],w;if(p<g)return!1;for(w=g;w<=p;w++)k=c.values[w-g],y=q.values[w-d],n=k[0],b=e(k[1]+m*y[1]),y=e(k[1]-m*y[1]),k=k[1],l.push([n,b,k,y]),f.push(n),u.push([b,k,y]);return{values:l,xData:f,yData:u}}}))});u(f,"indicators/macd.src.js",[f["parts/Globals.js"]],function(d){var n=d.seriesType,q=d.merge,h=d.defined,a=d.seriesTypes.sma,c=d.seriesTypes.ema,
e=d.correctFloat;n("macd","sma",{params:{shortPeriod:12,longPeriod:26,signalPeriod:9,period:26},signalLine:{zones:[],styles:{lineWidth:1,lineColor:void 0}},macdLine:{zones:[],styles:{lineWidth:1,lineColor:void 0}},threshold:0,groupPadding:.1,pointPadding:.1,states:{hover:{halo:{size:0}}},tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eValue: {point.MACD}\x3cbr/\x3eSignal: {point.signal}\x3cbr/\x3eHistogram: {point.y}\x3cbr/\x3e'},
dataGrouping:{approximation:"averages"},minPointLength:0},{nameComponents:["longPeriod","shortPeriod","signalPeriod"],requiredIndicators:["ema"],pointArrayMap:["y","signal","MACD"],parallelArrays:["x","y","signal","MACD"],pointValKey:"y",markerAttribs:d.noop,getColumnMetrics:d.seriesTypes.column.prototype.getColumnMetrics,crispCol:d.seriesTypes.column.prototype.crispCol,init:function(){a.prototype.init.apply(this,arguments);this.options&&(this.options=q({signalLine:{styles:{lineColor:this.color}},
macdLine:{styles:{color:this.color}}},this.options),this.macdZones={zones:this.options.macdLine.zones,startIndex:0},this.signalZones={zones:this.macdZones.zones.concat(this.options.signalLine.zones),startIndex:this.macdZones.zones.length},this.resetZones=!0)},toYData:function(b){return[b.y,b.signal,b.MACD]},translate:function(){var b=this,c=["plotSignal","plotMACD"];d.seriesTypes.column.prototype.translate.apply(b);b.points.forEach(function(a){[a.signal,a.MACD].forEach(function(e,g){null!==e&&(a[c[g]]=
b.yAxis.toPixels(e,!0))})})},destroy:function(){this.graph=null;this.graphmacd=this.graphmacd&&this.graphmacd.destroy();this.graphsignal=this.graphsignal&&this.graphsignal.destroy();a.prototype.destroy.apply(this,arguments)},drawPoints:d.seriesTypes.column.prototype.drawPoints,drawGraph:function(){for(var b=this,c=b.points,e=c.length,d=b.options,m=b.zones,p={options:{gapSize:d.gapSize}},l=[[],[]],k;e--;)k=c[e],h(k.plotMACD)&&l[0].push({plotX:k.plotX,plotY:k.plotMACD,isNull:!h(k.plotMACD)}),h(k.plotSignal)&&
l[1].push({plotX:k.plotX,plotY:k.plotSignal,isNull:!h(k.plotMACD)});["macd","signal"].forEach(function(c,e){b.points=l[e];b.options=q(d[c+"Line"].styles,p);b.graph=b["graph"+c];b.currentLineZone=c+"Zones";b.zones=b[b.currentLineZone].zones;a.prototype.drawGraph.call(b);b["graph"+c]=b.graph});b.points=c;b.options=d;b.zones=m;b.currentLineZone=null},getZonesGraphs:function(b){var c=a.prototype.getZonesGraphs.call(this,b),e=c;this.currentLineZone&&(e=c.splice(this[this.currentLineZone].startIndex+1),
e.length?e.splice(0,0,b[0]):e=[b[0]]);return e},applyZones:function(){var b=this.zones;this.zones=this.signalZones.zones;a.prototype.applyZones.call(this);this.options.macdLine.zones.length&&this.graphmacd.hide();this.zones=b},getValues:function(b,a){var g=0,d=[],m=[],p=[],l,k;if(b.xData.length<a.longPeriod+a.signalPeriod)return!1;l=c.prototype.getValues(b,{period:a.shortPeriod});k=c.prototype.getValues(b,{period:a.longPeriod});l=l.values;k=k.values;for(b=1;b<=l.length;b++)h(k[b-1])&&h(k[b-1][1])&&
h(l[b+a.shortPeriod+1])&&h(l[b+a.shortPeriod+1][0])&&d.push([l[b+a.shortPeriod+1][0],0,null,l[b+a.shortPeriod+1][1]-k[b-1][1]]);for(b=0;b<d.length;b++)m.push(d[b][0]),p.push([0,null,d[b][3]]);a=c.prototype.getValues({xData:m,yData:p},{period:a.signalPeriod,index:2});a=a.values;for(b=0;b<d.length;b++)d[b][0]>=a[0][0]&&(d[b][2]=a[g][1],p[b]=[0,a[g][1],d[b][3]],null===d[b][3]?(d[b][1]=0,p[b][0]=0):(d[b][1]=e(d[b][3]-a[g][1]),p[b][0]=e(d[b][3]-a[g][1])),g++);return{values:d,xData:m,yData:p}}})});u(f,
"indicators/mfi.src.js",[f["parts/Globals.js"]],function(d){function n(a){return a.reduce(function(c,a){return c+a})}function q(a){return(a[1]+a[2]+a[3])/3}var h=d.isArray;d.seriesType("mfi","sma",{params:{period:14,volumeSeriesID:"volume",decimals:4}},{nameBase:"Money Flow Index",getValues:function(a,c){var e=c.period,b=a.xData,g=a.yData,r=g?g.length:0,t=c.decimals,m=1,p=a.chart.get(c.volumeSeriesID),l=p&&p.yData,k=[],y=[],f=[],C=[],v=[];if(!p)return d.error("Series "+c.volumeSeriesID+" not found! Check `volumeSeriesID`.",
!0,a.chart);if(b.length<=e||!h(g[0])||4!==g[0].length||!l)return!1;for(a=q(g[m]);m<e+1;)c=a,a=q(g[m]),c=a>=c,p=a*l[m],C.push(c?p:0),v.push(c?0:p),m++;for(e=m-1;e<r;e++)e>m-1&&(C.shift(),v.shift(),c=a,a=q(g[e]),c=a>c,p=a*l[e],C.push(c?p:0),v.push(c?0:p)),c=n(v),p=n(C),c=p/c,c=parseFloat((100-100/(1+c)).toFixed(t)),k.push([b[e],c]),y.push(b[e]),f.push(c);return{values:k,xData:y,yData:f}}})});u(f,"indicators/momentum.src.js",[f["parts/Globals.js"]],function(d){function n(d,a,c,e,b){c=c[e-1][3]-c[e-b-
1][3];a=a[e-1];d.shift();return[a,c]}var q=d.isArray;d=d.seriesType;d("momentum","sma",{params:{period:14}},{nameBase:"Momentum",getValues:function(d,a){a=a.period;var c=d.xData,e=(d=d.yData)?d.length:0,b=c[0],g=[],r=[],h=[],m,p;if(c.length<=a||!q(d[0]))return!1;m=[[b,d[0][3]]];for(b=a+1;b<e;b++)p=n(m,c,d,b,a,void 0),g.push(p),r.push(p[0]),h.push(p[1]);p=n(m,c,d,b,a,void 0);g.push(p);r.push(p[0]);h.push(p[1]);return{values:g,xData:r,yData:h}}})});u(f,"indicators/natr.src.js",[f["parts/Globals.js"]],
function(d){var n=d.seriesTypes.atr;d.seriesType("natr","sma",{tooltip:{valueSuffix:"%"}},{requiredIndicators:["atr"],getValues:function(d,h){for(var a=n.prototype.getValues.apply(this,arguments),c=a.values.length,e=h.period-1,b=d.yData,g=0;g<c;g++)a.yData[g]=a.values[g][1]/b[e][3]*100,a.values[g][1]=a.yData[g],e++;return a}})});u(f,"indicators/pivot-points.src.js",[f["parts/Globals.js"]],function(d){function n(c,e){var b=c.series.pointArrayMap,g=b.length;for(a.prototype.pointClass.prototype[e].call(c);g--;)e=
"dataLabel"+b[g],c[e]&&c[e].element&&c[e].destroy(),c[e]=null}var q=d.defined,h=d.isArray,a=d.seriesTypes.sma;d.seriesType("pivotpoints","sma",{params:{period:28,algorithm:"standard"},marker:{enabled:!1},enableMouseTracking:!1,dataLabels:{enabled:!0,format:"{point.pivotLine}"},dataGrouping:{approximation:"averages"}},{nameBase:"Pivot Points",pointArrayMap:"R4 R3 R2 R1 P S1 S2 S3 S4".split(" "),pointValKey:"P",toYData:function(c){return[c.P]},translate:function(){var c=this;a.prototype.translate.apply(c);
c.points.forEach(function(a){c.pointArrayMap.forEach(function(b){q(a[b])&&(a["plot"+b]=c.yAxis.toPixels(a[b],!0))})});c.plotEndPoint=c.xAxis.toPixels(c.endPoint,!0)},getGraphPath:function(c){for(var e=this,b=c.length,g=[[],[],[],[],[],[],[],[],[]],d=[],h=e.plotEndPoint,m=e.pointArrayMap.length,p,l,k;b--;){l=c[b];for(k=0;k<m;k++)p=e.pointArrayMap[k],q(l[p])&&g[k].push({plotX:l.plotX,plotY:l["plot"+p],isNull:!1},{plotX:h,plotY:l["plot"+p],isNull:!1},{plotX:h,plotY:null,isNull:!0});h=l.plotX}g.forEach(function(b){d=
d.concat(a.prototype.getGraphPath.call(e,b))});return d},drawDataLabels:function(){var c=this,e=c.pointArrayMap,b,g,d,h;c.options.dataLabels.enabled&&(g=c.points.length,e.concat([!1]).forEach(function(r,p){for(h=g;h--;)d=c.points[h],r?(d.y=d[r],d.pivotLine=r,d.plotY=d["plot"+r],b=d["dataLabel"+r],p&&(d["dataLabel"+e[p-1]]=d.dataLabel),d.dataLabels||(d.dataLabels=[]),d.dataLabels[0]=d.dataLabel=b=b&&b.element?b:null):d["dataLabel"+e[p-1]]=d.dataLabel;a.prototype.drawDataLabels.apply(c,arguments)}))},
getValues:function(c,a){var b=a.period,e=c.xData,d=(c=c.yData)?c.length:0;a=this[a.algorithm+"Placement"];var t=[],m,p=[],l=[],k,n,q,f;if(e.length<b||!h(c[0])||4!==c[0].length)return!1;for(f=b+1;f<=d+b;f+=b)n=e.slice(f-b-1,f),q=c.slice(f-b-1,f),k=n.length,m=n[k-1],q=this.getPivotAndHLC(q),q=a(q),q=t.push([m].concat(q)),p.push(m),l.push(t[q-1].slice(1));this.endPoint=n[0]+(m-n[0])/k*b;return{values:t,xData:p,yData:l}},getPivotAndHLC:function(c){var a=-Infinity,b=Infinity,d=c[c.length-1][3];c.forEach(function(c){a=
Math.max(a,c[1]);b=Math.min(b,c[2])});return[(a+b+d)/3,a,b,d]},standardPlacement:function(c){var a=c[1]-c[2];return[null,null,c[0]+a,2*c[0]-c[2],c[0],2*c[0]-c[1],c[0]-a,null,null]},camarillaPlacement:function(c){var a=c[1]-c[2];return[c[3]+1.5*a,c[3]+1.25*a,c[3]+1.1666*a,c[3]+1.0833*a,c[0],c[3]-1.0833*a,c[3]-1.1666*a,c[3]-1.25*a,c[3]-1.5*a]},fibonacciPlacement:function(a){var c=a[1]-a[2];return[null,a[0]+c,a[0]+.618*c,a[0]+.382*c,a[0],a[0]-.382*c,a[0]-.618*c,a[0]-c,null]}},{destroyElements:function(){n(this,
"destroyElements")},destroy:function(){n(this,"destroyElements")}})});u(f,"indicators/ppo.src.js",[f["parts/Globals.js"],f["mixins/indicator-required.js"]],function(d,n){var q=d.seriesTypes.ema,h=d.error,a=d.correctFloat;d.seriesType("ppo","ema",{params:{periods:[12,26]}},{nameBase:"PPO",nameComponents:["periods"],init:function(){var a=arguments,d=this;n.isParentLoaded(q,"ema",d.type,function(b){b.prototype.init.apply(d,a)})},getValues:function(c,d){var b=d.periods,e=d.index;d=[];var r=[],t=[],m,
p;if(2!==b.length||b[1]<=b[0])return h('Error: "PPO requires two periods. Notice, first period should be lower than the second one."'),!1;m=q.prototype.getValues.call(this,c,{index:e,period:b[0]});c=q.prototype.getValues.call(this,c,{index:e,period:b[1]});if(!m||!c)return!1;b=b[1]-b[0];for(p=0;p<c.yData.length;p++)e=a((m.yData[p+b]-c.yData[p])/c.yData[p]*100),d.push([c.xData[p],e]),r.push(c.xData[p]),t.push(e);return{values:d,xData:r,yData:t}}})});u(f,"mixins/reduce-array.js",[f["parts/Globals.js"]],
function(d){var n=d.reduce;return{minInArray:function(d,h){return n(d,function(a,c){return Math.min(a,c[h])},Number.MAX_VALUE)},maxInArray:function(d,h){return n(d,function(a,c){return Math.max(a,c[h])},-Number.MAX_VALUE)},getArrayExtremes:function(d,h,a){return n(d,function(c,d){return[Math.min(c[0],d[h]),Math.max(c[1],d[a])]},[Number.MAX_VALUE,-Number.MAX_VALUE])}}});u(f,"indicators/price-channel.src.js",[f["parts/Globals.js"],f["mixins/reduce-array.js"],f["mixins/multipe-lines.js"]],function(d,
n,f){var h=n.getArrayExtremes;n=d.merge;d.seriesType("pc","sma",{params:{period:20},lineWidth:1,topLine:{styles:{lineColor:"#90ed7d",lineWidth:1}},bottomLine:{styles:{lineColor:"#f45b5b",lineWidth:1}},dataGrouping:{approximation:"averages"}},n(f,{pointArrayMap:["top","middle","bottom"],pointValKey:"middle",nameBase:"Price Channel",nameComponents:["period"],linesApiNames:["topLine","bottomLine"],getValues:function(a,c){c=c.period;var d=a.xData,b=(a=a.yData)?a.length:0,g=[],r,t,m,p,l=[],k=[],n;if(b<
c)return!1;for(n=c;n<=b;n++)p=d[n-1],t=a.slice(n-c,n),r=h(t,2,1),t=r[1],m=r[0],r=(t+m)/2,g.push([p,t,r,m]),l.push(p),k.push([t,r,m]);return{values:g,xData:l,yData:k}}}))});u(f,"indicators/price-envelopes.src.js",[f["parts/Globals.js"]],function(d){var n=d.merge,f=d.isArray,h=d.seriesTypes.sma;d.seriesType("priceenvelopes","sma",{marker:{enabled:!1},tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e\x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eTop: {point.top}\x3cbr/\x3eMiddle: {point.middle}\x3cbr/\x3eBottom: {point.bottom}\x3cbr/\x3e'},
params:{period:20,topBand:.1,bottomBand:.1},bottomLine:{styles:{lineWidth:1,lineColor:void 0}},topLine:{styles:{lineWidth:1}},dataGrouping:{approximation:"averages"}},{nameComponents:["period","topBand","bottomBand"],nameBase:"Price envelopes",pointArrayMap:["top","middle","bottom"],parallelArrays:["x","y","top","bottom"],pointValKey:"middle",init:function(){h.prototype.init.apply(this,arguments);this.options=n({topLine:{styles:{lineColor:this.color}},bottomLine:{styles:{lineColor:this.color}}},this.options)},
toYData:function(a){return[a.top,a.middle,a.bottom]},translate:function(){var a=this,c=["plotTop","plotMiddle","plotBottom"];h.prototype.translate.apply(a);a.points.forEach(function(d){[d.top,d.middle,d.bottom].forEach(function(b,e){null!==b&&(d[c[e]]=a.yAxis.toPixels(b,!0))})})},drawGraph:function(){for(var a=this,c=a.points,d=c.length,b=a.options,g=a.graph,r={options:{gapSize:b.gapSize}},t=[[],[]],m;d--;)m=c[d],t[0].push({plotX:m.plotX,plotY:m.plotTop,isNull:m.isNull}),t[1].push({plotX:m.plotX,
plotY:m.plotBottom,isNull:m.isNull});["topLine","bottomLine"].forEach(function(c,d){a.points=t[d];a.options=n(b[c].styles,r);a.graph=a["graph"+c];h.prototype.drawGraph.call(a);a["graph"+c]=a.graph});a.points=c;a.options=b;a.graph=g;h.prototype.drawGraph.call(a)},getValues:function(a,c){var d=c.period,b=c.topBand,g=c.bottomBand,r=a.xData,t=(a=a.yData)?a.length:0,m=[],p,l,k,n,q=[],C=[],v;if(r.length<d||!f(a[0])||4!==a[0].length)return!1;for(v=d;v<=t;v++)n=r.slice(v-d,v),p=a.slice(v-d,v),p=h.prototype.getValues.call(this,
{xData:n,yData:p},c),n=p.xData[0],p=p.yData[0],l=p*(1+b),k=p*(1-g),m.push([n,l,p,k]),q.push(n),C.push([l,p,k]);return{values:m,xData:q,yData:C}}})});u(f,"indicators/psar.src.js",[f["parts/Globals.js"]],function(d){d.seriesType("psar","sma",{lineWidth:0,marker:{enabled:!0},states:{hover:{lineWidthPlus:0}},params:{initialAccelerationFactor:.02,maxAccelerationFactor:.2,increment:.02,index:2,decimals:4}},{nameComponents:!1,getValues:function(d,f){var h=d.xData;d=d.yData;var a=d[0][1],c=f.maxAccelerationFactor,
e=f.increment,b=f.initialAccelerationFactor,g=d[0][2],r=f.decimals,t=f.index,m=[],p=[],l=[],k=1,n,q,C,v,u,w,x,A;if(t>=d.length)return!1;for(A=0;A<t;A++)a=Math.max(d[A][1],a),g=Math.min(d[A][2],parseFloat(g.toFixed(r)));n=d[A][1]>g?1:-1;f=f.initialAccelerationFactor;q=f*(a-g);m.push([h[t],g]);p.push(h[t]);l.push(parseFloat(g.toFixed(r)));for(A=t+1;A<d.length;A++)t=d[A-1][2],v=d[A-2][2],u=d[A-1][1],w=d[A-2][1],C=d[A][1],x=d[A][2],null!==v&&null!==w&&null!==t&&null!==u&&null!==C&&null!==x&&(g=n===k?
1===n?g+q<Math.min(v,t)?g+q:Math.min(v,t):g+q>Math.max(w,u)?g+q:Math.max(w,u):a,t=1===n?C>a?C:a:x<a?x:a,C=1===k&&x>g||-1===k&&C>g?1:-1,k=C,q=t,x=e,v=c,u=b,f=k===n?1===k&&q>a?f===v?v:parseFloat((f+x).toFixed(2)):-1===k&&q<a?f===v?v:parseFloat((f+x).toFixed(2)):f:u,a=t-g,q=f*a,m.push([h[A],parseFloat(g.toFixed(r))]),p.push(h[A]),l.push(parseFloat(g.toFixed(r))),k=n,n=C,a=t);return{values:m,xData:p,yData:l}}})});u(f,"indicators/roc.src.js",[f["parts/Globals.js"]],function(d){var n=d.seriesType,f=d.isArray;
n("roc","sma",{params:{index:3,period:9}},{nameBase:"Rate of Change",getValues:function(d,a){var c=a.period,e=d.xData,b=(d=d.yData)?d.length:0,g=[],r=[],h=[],m=-1,p;if(e.length<=c)return!1;f(d[0])&&(m=a.index);for(a=c;a<b;a++)p=0>m?(p=d[a-c])?(d[a]-p)/p*100:null:(p=d[a-c][m])?(d[a][m]-p)/p*100:null,p=[e[a],p],g.push(p),r.push(p[0]),h.push(p[1]);return{values:g,xData:r,yData:h}}})});u(f,"indicators/rsi.src.js",[f["parts/Globals.js"]],function(d){var f=d.isArray;d.seriesType("rsi","sma",{params:{period:14,
decimals:4}},{getValues:function(d,h){var a=h.period,c=d.xData,e=(d=d.yData)?d.length:0;h=h.decimals;var b=1,g=[],r=[],t=[],m=0,p=0,l,k,n;if(c.length<a||!f(d[0])||4!==d[0].length)return!1;for(;b<a;)l=parseFloat((d[b][3]-d[b-1][3]).toFixed(h)),0<l?m+=l:p+=Math.abs(l),b++;k=parseFloat((m/(a-1)).toFixed(h));for(n=parseFloat((p/(a-1)).toFixed(h));b<e;b++)l=parseFloat((d[b][3]-d[b-1][3]).toFixed(h)),0<l?(m=l,p=0):(m=0,p=Math.abs(l)),k=parseFloat(((k*(a-1)+m)/a).toFixed(h)),n=parseFloat(((n*(a-1)+p)/a).toFixed(h)),
m=0===n?100:0===k?0:parseFloat((100-100/(1+k/n)).toFixed(h)),g.push([c[b],m]),r.push(c[b]),t.push(m);return{values:g,xData:r,yData:t}}})});u(f,"indicators/stochastic.src.js",[f["parts/Globals.js"],f["mixins/reduce-array.js"],f["mixins/multipe-lines.js"]],function(d,n,f){var h=d.merge,a=d.isArray,c=d.seriesTypes.sma,e=n.getArrayExtremes;d.seriesType("stochastic","sma",{params:{periods:[14,3]},marker:{enabled:!1},tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e\x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3e%K: {point.y}\x3cbr/\x3e%D: {point.smoothed}\x3cbr/\x3e'},
smoothedLine:{styles:{lineWidth:1,lineColor:void 0}},dataGrouping:{approximation:"averages"}},d.merge(f,{nameComponents:["periods"],nameBase:"Stochastic",pointArrayMap:["y","smoothed"],parallelArrays:["x","y","smoothed"],pointValKey:"y",linesApiNames:["smoothedLine"],init:function(){c.prototype.init.apply(this,arguments);this.options=h({smoothedLine:{styles:{lineColor:this.color}}},this.options)},getValues:function(b,d){var g=d.periods[0];d=d.periods[1];var h=b.xData,m=(b=b.yData)?b.length:0,p=[],
l=[],k=[],f,n,q=null,v,u;if(m<g||!a(b[0])||4!==b[0].length)return!1;for(u=g-1;u<m;u++)f=b.slice(u-g+1,u+1),v=e(f,2,1),n=v[0],f=b[u][3]-n,n=v[1]-n,f=f/n*100,l.push(h[u]),k.push([f,null]),u>=g-1+(d-1)&&(q=c.prototype.getValues.call(this,{xData:l.slice(-d),yData:k.slice(-d)},{period:d}),q=q.yData[0]),p.push([h[u],f,q]),k[k.length-1][1]=q;return{values:p,xData:l,yData:k}}}))});u(f,"indicators/supertrend.src.js",[f["parts/Globals.js"]],function(d){function f(b,a,c){return{index:a,close:b.yData[a][c],x:b.xData[a]}}
var q=d.seriesTypes.atr,h=d.seriesTypes.sma,a=d.isArray,c=d.merge,e=d.correctFloat;d.seriesType("supertrend","sma",{params:{multiplier:3,period:10},risingTrendColor:"#06B535",fallingTrendColor:"#F21313",changeTrendLine:{styles:{lineWidth:1,lineColor:"#333333",dashStyle:"LongDash"}}},{nameBase:"Supertrend",nameComponents:["multiplier","period"],requiredIndicators:["atr"],init:function(){var b;h.prototype.init.apply(this,arguments);b=this.options;b.cropThreshold=this.linkedParent.options.cropThreshold-
(b.params.period-1)},drawGraph:function(){for(var b=this,a=b.options,e=b.linkedParent,t=e?e.points:[],m=b.points,p=b.graph,l=m.length,k=t.length-l,k=0<k?k:0,n={options:{gapSize:a.gapSize}},q={top:[],bottom:[],intersect:[]},u={top:{styles:{lineWidth:a.lineWidth,lineColor:a.fallingTrendColor,dashStyle:a.dashStyle}},bottom:{styles:{lineWidth:a.lineWidth,lineColor:a.risingTrendColor,dashStyle:a.dashStyle}},intersect:a.changeTrendLine},v,G,w,x,A,B,H,z;l--;)v=m[l],G=m[l-1],w=t[l-1+k],x=t[l-2+k],A=t[l+k],
B=t[l+k+1],H=v.options.color,z={x:v.x,plotX:v.plotX,plotY:v.plotY,isNull:!1},!x&&w&&e.yData[w.index-1]&&(x=f(e,w.index-1,3)),!B&&A&&e.yData[A.index+1]&&(B=f(e,A.index+1,3)),!w&&x&&e.yData[x.index+1]?w=f(e,x.index+1,3):!w&&A&&e.yData[A.index-1]&&(w=f(e,A.index-1,3)),v&&w&&A&&x&&v.x!==w.x&&(v.x===A.x?(x=w,w=A):v.x===x.x?(w=x,x={close:e.yData[w.index-1][3],x:e.xData[w.index-1]}):B&&v.x===B.x&&(w=B,x=A)),G&&x&&w?(A={x:G.x,plotX:G.plotX,plotY:G.plotY,isNull:!1},v.y>=w.close&&G.y>=x.close?(v.color=H||a.fallingTrendColor,
q.top.push(z)):v.y<w.close&&G.y<x.close?(v.color=H||a.risingTrendColor,q.bottom.push(z)):(q.intersect.push(z),q.intersect.push(A),q.intersect.push(c(A,{isNull:!0})),v.y>=w.close&&G.y<x.close?(v.color=H||a.fallingTrendColor,G.color=H||a.risingTrendColor,q.top.push(z),q.top.push(c(A,{isNull:!0}))):v.y<w.close&&G.y>=x.close&&(v.color=H||a.risingTrendColor,G.color=H||a.fallingTrendColor,q.bottom.push(z),q.bottom.push(c(A,{isNull:!0}))))):w&&(v.y>=w.close?(v.color=H||a.fallingTrendColor,q.top.push(z)):
(v.color=H||a.risingTrendColor,q.bottom.push(z)));d.objectEach(q,function(a,d){b.points=a;b.options=c(u[d].styles,n);b.graph=b["graph"+d+"Line"];h.prototype.drawGraph.call(b);b["graph"+d+"Line"]=b.graph});b.points=m;b.options=a;b.graph=p},getValues:function(b,c){var d=c.period;c=c.multiplier;var g=b.xData,h=b.yData,p=[],l=[],k=[],f=0===d?0:d-1,n,u=[],v=[],G,w,x,A,B,H,z;if(g.length<=d||!a(h[0])||4!==h[0].length||0>d)return!1;b=q.prototype.getValues.call(this,b,{period:d}).yData;for(z=0;z<b.length;z++){H=
h[f+z];B=h[f+z-1]||[];w=u[z-1];x=v[z-1];A=k[z-1];0===z&&(w=x=A=0);d=e((H[1]+H[2])/2+c*b[z]);n=e((H[1]+H[2])/2-c*b[z]);u[z]=d<w||B[3]>w?d:w;v[z]=n>x||B[3]<x?n:x;if(A===w&&H[3]<u[z]||A===x&&H[3]<v[z])G=u[z];else if(A===w&&H[3]>u[z]||A===x&&H[3]>v[z])G=v[z];p.push([g[f+z],G]);l.push(g[f+z]);k.push(G)}return{values:p,xData:l,yData:k}}})});u(f,"indicators/volume-by-price.src.js",[f["parts/Globals.js"]],function(d){var f=Math.abs,q=d.noop,h=d.addEvent,a=d.correctFloat,c=d.seriesType,e=d.seriesTypes.column.prototype;
c("vbp","sma",{params:{ranges:12,volumeSeriesID:"volume"},zoneLines:{enabled:!0,styles:{color:"#0A9AC9",dashStyle:"LongDash",lineWidth:1}},volumeDivision:{enabled:!0,styles:{positiveColor:"rgba(144, 237, 125, 0.8)",negativeColor:"rgba(244, 91, 91, 0.8)"}},animationLimit:1E3,enableMouseTracking:!1,pointPadding:0,zIndex:-1,crisp:!0,dataGrouping:{enabled:!1},dataLabels:{allowOverlap:!0,enabled:!0,format:"P: {point.volumePos:.2f} | N: {point.volumeNeg:.2f}",padding:0,style:{fontSize:"7px"},verticalAlign:"top"}},
{nameBase:"Volume by Price",bindTo:{series:!1,eventName:"afterSetExtremes"},calculateOn:"render",markerAttribs:q,drawGraph:q,getColumnMetrics:e.getColumnMetrics,crispCol:e.crispCol,init:function(b){var a,c;d.seriesTypes.sma.prototype.init.apply(this,arguments);a=this.options.params;c=this.linkedParent;a=b.get(a.volumeSeriesID);this.addCustomEvents(c,a);return this},addCustomEvents:function(b,a){function c(){d.chart.redraw();d.setData([]);d.zoneStarts=[];d.zoneLinesSVG&&(d.zoneLinesSVG.destroy(),delete d.zoneLinesSVG)}
var d=this;d.dataEventsToUnbind.push(h(b,"remove",function(){c()}));a&&d.dataEventsToUnbind.push(h(a,"remove",function(){c()}));return d},animate:function(b){var a=this,c={};d.svg&&!b&&(c.translateX=a.yAxis.pos,a.group.animate(c,d.extend(d.animObject(a.options.animation),{step:function(b,c){a.group.attr({scaleX:Math.max(.001,c.pos)})}})),a.animate=null)},drawPoints:function(){this.options.volumeDivision.enabled&&(this.posNegVolume(!0,!0),e.drawPoints.apply(this,arguments),this.posNegVolume(!1,!1));
e.drawPoints.apply(this,arguments)},posNegVolume:function(b,a){var c=a?["positive","negative"]:["negative","positive"],d=this.options.volumeDivision,e=this.points.length,g=[],h=[],k=0,f,n,q,v;b?(this.posWidths=g,this.negWidths=h):(g=this.posWidths,h=this.negWidths);for(;k<e;k++)v=this.points[k],v[c[0]+"Graphic"]=v.graphic,v.graphic=v[c[1]+"Graphic"],b&&(f=v.shapeArgs.width,n=this.priceZones[k],(q=n.wholeVolumeData)?(g.push(f/q*n.positiveVolumeData),h.push(f/q*n.negativeVolumeData)):(g.push(0),h.push(0))),
v.color=a?d.styles.positiveColor:d.styles.negativeColor,v.shapeArgs.width=a?this.posWidths[k]:this.negWidths[k],v.shapeArgs.x=a?v.shapeArgs.x:this.posWidths[k]},translate:function(){var b=this,c=b.options,h=b.chart,n=b.yAxis,m=n.min,p=b.options.zoneLines,l=b.priceZones,k=0,q,u,C,v,G,w,x,A,B,H;e.translate.apply(b);q=b.points;q.length&&(x=.5>c.pointPadding?c.pointPadding:.1,c=b.volumeDataArray,u=d.arrayMax(c),C=h.plotWidth/2,A=h.plotTop,v=f(n.toPixels(m)-n.toPixels(m+b.rangeStep)),G=f(n.toPixels(m)-
n.toPixels(m+b.rangeStep)),x&&(m=f(v*(1-2*x)),k=f((v-m)/2),v=f(m)),q.forEach(function(c,d){B=c.barX=c.plotX=0;H=c.plotY=n.toPixels(l[d].start)-A-(n.reversed?v-G:v)-k;w=a(C*l[d].wholeVolumeData/u);c.pointWidth=w;c.shapeArgs=b.crispCol.apply(b,[B,H,w,v]);c.volumeNeg=l[d].negativeVolumeData;c.volumePos=l[d].positiveVolumeData;c.volumeAll=l[d].wholeVolumeData}),p.enabled&&b.drawZones(h,n,b.zoneStarts,p.styles))},getValues:function(b,a){var c=b.processedXData,e=b.processedYData,g=this.chart,h=a.ranges,
l=[],k=[],f=[],n;if(!b.chart)return d.error("Base series not found! In case it has been removed, add a new one.",!0,g);if(!(n=g.get(a.volumeSeriesID)))return d.error("Series "+a.volumeSeriesID+" not found! Check `volumeSeriesID`.",!0,g);if((a=d.isArray(e[0]))&&4!==e[0].length)return d.error("Type of "+b.name+" series is different than line, OHLC or candlestick.",!0,g);(this.priceZones=this.specifyZones(a,c,e,h,n)).forEach(function(b,a){l.push([b.x,b.end]);k.push(l[a][0]);f.push(l[a][1])});return{values:l,
xData:k,yData:f}},specifyZones:function(b,c,e,h,f){var g;if(b){g=e.length;for(var l=e[0][3],k=l,r=1,m;r<g;r++)m=e[r][3],m<l&&(l=m),m>k&&(k=m);g={min:l,max:k}}else g=!1;g=(l=g)?l.min:d.arrayMin(e);m=l?l.max:d.arrayMax(e);var l=this.zoneStarts=[],k=[],n=0,r=1,t;if(!g||!m)return this.points.length&&(this.setData([]),this.zoneStarts=[],this.zoneLinesSVG.destroy()),[];t=this.rangeStep=a(m-g)/h;for(l.