highcharts
Version:
JavaScript charting framework
14 lines • 5.27 kB
JavaScript
!/**
* Highstock JS v13.0.1 (2026-08-17)
* @module highcharts/indicators/bollinger-bands
* @requires highcharts
* @requires highcharts/modules/stock
*
* Indicator series type for Highcharts Stock
*
* (c) 2010-2026 Highsoft AS
* Author: Paweł Fus
*
* A commercial license may be required depending on use,
* see www.highcharts.com/license
*/function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(e._Highcharts,e._Highcharts.SeriesRegistry):"function"==typeof define&&define.amd?define("highcharts/indicators/bollinger-bands",["highcharts/highcharts"],function(e){return t(e,e.SeriesRegistry)}):"object"==typeof exports?exports["highcharts/indicators/bollinger-bands"]=t(e._Highcharts,e._Highcharts.SeriesRegistry):e.Highcharts=t(e.Highcharts,e.Highcharts.SeriesRegistry)}("u"<typeof window?this:window,(e,t)=>(()=>{"use strict";var i,o={512(e){e.exports=t},944(t){t.exports=e}};let r={};function a(e){let t=r[e];if(void 0!==t)return t.exports;let i=r[e]={exports:{}};return o[e](i,i.exports,a),i.exports}a.n=e=>{let t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{if(Array.isArray(t))for(var i=0;i<t.length;){var o=t[i++],r=t[i++];a.o(e,o)?0===r&&i++:0===r?Object.defineProperty(e,o,{enumerable:!0,value:t[i++]}):Object.defineProperty(e,o,{enumerable:!0,get:r})}else for(var o in t)a.o(t,o)&&!a.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let s={};a.d(s,{default:()=>y});var n=a(944),p=a.n(n),l=a(512),h=a.n(l);let{sma:{prototype:d}}=h().seriesTypes;!function(e){let t=["bottomLine"],i=["top","bottom"],o=["top"];function r(e){return"plot"+e.charAt(0).toUpperCase()+e.slice(1)}function a(e,t){let i=[];return(e.pointArrayMap||[]).forEach(e=>{e!==t&&i.push(r(e))}),i}function s(){let e=this,t=e.pointValKey,i=e.linesApiNames,o=e.areaLinesNames,s=e.points,p=e.options,l=e.graph,h={options:{gapSize:p.gapSize}},c=[],f=a(e,t),u=s.length,y;if(f.forEach((e,t)=>{for(c[t]=[];u--;)y=s[u],c[t].push({x:y.x,plotX:y.plotX,plotY:y[e],isNull:!(0,n.defined)(y[e])});u=s.length}),e.userOptions.fillColor&&o.length){let t=c[f.indexOf(r(o[0]))],i=1===o.length?s:c[f.indexOf(r(o[1]))],a=e.color;e.points=i,e.nextPoints=t,e.color=e.userOptions.fillColor,e.options=(0,n.merge)(s,h),e.graph=e.area,e.fillGraph=!0,d.drawGraph.call(e),e.area=e.graph,delete e.nextPoints,delete e.fillGraph,e.color=a}i.forEach((t,i)=>{c[i]?(e.points=c[i],p[t]?e.options=(0,n.merge)(p[t].styles,h):(0,n.error)('Error: "There is no '+t+' in DOCS options declared. Check if linesApiNames are consistent with your DOCS line names."'),e.graph=e["graph"+t],d.drawGraph.call(e),e["graph"+t]=e.graph):(0,n.error)('Error: "'+t+" doesn't have equivalent in pointArrayMap. To many elements in linesApiNames relative to pointArrayMap.\"")}),e.points=s,e.options=p,e.graph=l,d.drawGraph.call(e)}function p(e){let t,i=[],o=[];if(e=e||this.points,this.fillGraph&&this.nextPoints){if((t=d.getGraphPath.call(this,this.nextPoints))&&t.length){t[0][0]="L",i=d.getGraphPath.call(this,e),o=t.slice(0,i.length);for(let e=o.length-1;e>=0;e--)i.push(o[e])}}else i=d.getGraphPath.apply(this,arguments);return i}function l(e){let t=[];return(this.pointArrayMap||[]).forEach(i=>{t.push(e[i])}),t}function h(){let e=this.pointArrayMap,t=[],i;t=a(this),d.translate.apply(this,arguments),this.points.forEach(o=>{e.forEach((e,r)=>{i=o[e],this.dataModify&&(i=this.dataModify.modifyValue(i)),null!==i&&(o[t[r]]=this.yAxis.toPixels(i,!0))})})}e.compose=function(e){let r=e.prototype;return r.linesApiNames=r.linesApiNames||t.slice(),r.pointArrayMap=r.pointArrayMap||i.slice(),r.pointValKey=r.pointValKey||"top",r.areaLinesNames=r.areaLinesNames||o.slice(),r.drawGraph=s,r.getGraphPath=p,r.toYData=l,r.translate=h,e}}(i||(i={}));let c=i,{sma:f}=h().seriesTypes;class u extends f{init(){h().seriesTypes.sma.prototype.init.apply(this,arguments),this.options=(0,n.merge)({topLine:{styles:{lineColor:this.color}},bottomLine:{styles:{lineColor:this.color}}},this.options)}getValues(e,t){let i,o,r,a,s,p,l,d,c,f=t.period,u=t.standardDeviation,y=[],g=[],m=e.xData,b=e.yData,x=b?b.length:0,A=[];if(m.length<f)return;let v=(0,n.isArray)(b[0]);for(c=f;c<=x;c++)s=m.slice(c-f,c),p=b.slice(c-f,c),a=(d=h().seriesTypes.sma.prototype.getValues.call(this,{xData:s,yData:p},t)).xData[0],i=d.yData[0],l=function(e,t,i,o){let r=e.length,a=0,s,n=0;for(;a<r;a++)n+=(s=(i?e[a][t]:e[a])-o)*s;return Math.sqrt(n/=r-1)}(p,t.index,v,i),o=i+u*l,r=i-u*l,A.push([a,o,i,r]),y.push(a),g.push([o,i,r]);return{values:A,xData:y,yData:g}}}u.defaultOptions=(0,n.merge)(f.defaultOptions,{params:{period:20,standardDeviation:2,index:3},bottomLine:{styles:{lineWidth:1,lineColor:void 0}},topLine:{styles:{lineWidth:1,lineColor:void 0}},tooltip:{pointFormat:'<span style="color:{point.color}">●</span><b> {series.name}</b><br/>Top: {point.top}<br/>Middle: {point.middle}<br/>Bottom: {point.bottom}<br/>'},marker:{enabled:!1},dataGrouping:{approximation:"averages"}}),(0,n.extend)(u.prototype,{areaLinesNames:["top","bottom"],linesApiNames:["topLine","bottomLine"],nameComponents:["period","standardDeviation"],pointArrayMap:["top","middle","bottom"],pointValKey:"middle"}),c.compose(u),h().registerSeriesType("bb",u);let y=p();return s.default})());