UNPKG

highcharts

Version:
14 lines 5.32 kB
!/** * Highstock JS v13.0.1 (2026-08-17) * @module highcharts/indicators/keltner-channels * @requires highcharts * @requires highcharts/modules/stock * * Indicator series type for Highcharts Stock * * (c) 2010-2026 Highsoft AS * Author: Daniel Studencki * * 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/keltner-channels",["highcharts/highcharts"],function(e){return t(e,e.SeriesRegistry)}):"object"==typeof exports?exports["highcharts/indicators/keltner-channels"]=t(e._Highcharts,e._Highcharts.SeriesRegistry):e.Highcharts=t(e.Highcharts,e.Highcharts.SeriesRegistry)}("u"<typeof window?this:window,(e,t)=>(()=>{"use strict";var r,i={512(e){e.exports=t},944(t){t.exports=e}};let o={};function s(e){let t=o[e];if(void 0!==t)return t.exports;let r=o[e]={exports:{}};return i[e](r,r.exports,s),r.exports}s.n=e=>{let t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{if(Array.isArray(t))for(var r=0;r<t.length;){var i=t[r++],o=t[r++];s.o(e,i)?0===o&&r++:0===o?Object.defineProperty(e,i,{enumerable:!0,value:t[r++]}):Object.defineProperty(e,i,{enumerable:!0,get:o})}else for(var i in t)s.o(t,i)&&!s.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let a={};s.d(a,{default:()=>y});var n=s(944),p=s.n(n),l=s(512),h=s.n(l);let{sma:{prototype:c}}=h().seriesTypes;!function(e){let t=["bottomLine"],r=["top","bottom"],i=["top"];function o(e){return"plot"+e.charAt(0).toUpperCase()+e.slice(1)}function s(e,t){let r=[];return(e.pointArrayMap||[]).forEach(e=>{e!==t&&r.push(o(e))}),r}function a(){let e=this,t=e.pointValKey,r=e.linesApiNames,i=e.areaLinesNames,a=e.points,p=e.options,l=e.graph,h={options:{gapSize:p.gapSize}},d=[],u=s(e,t),f=a.length,y;if(u.forEach((e,t)=>{for(d[t]=[];f--;)y=a[f],d[t].push({x:y.x,plotX:y.plotX,plotY:y[e],isNull:!(0,n.defined)(y[e])});f=a.length}),e.userOptions.fillColor&&i.length){let t=d[u.indexOf(o(i[0]))],r=1===i.length?a:d[u.indexOf(o(i[1]))],s=e.color;e.points=r,e.nextPoints=t,e.color=e.userOptions.fillColor,e.options=(0,n.merge)(a,h),e.graph=e.area,e.fillGraph=!0,c.drawGraph.call(e),e.area=e.graph,delete e.nextPoints,delete e.fillGraph,e.color=s}r.forEach((t,r)=>{d[r]?(e.points=d[r],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],c.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=a,e.options=p,e.graph=l,c.drawGraph.call(e)}function p(e){let t,r=[],i=[];if(e=e||this.points,this.fillGraph&&this.nextPoints){if((t=c.getGraphPath.call(this,this.nextPoints))&&t.length){t[0][0]="L",r=c.getGraphPath.call(this,e),i=t.slice(0,r.length);for(let e=i.length-1;e>=0;e--)r.push(i[e])}}else r=c.getGraphPath.apply(this,arguments);return r}function l(e){let t=[];return(this.pointArrayMap||[]).forEach(r=>{t.push(e[r])}),t}function h(){let e=this.pointArrayMap,t=[],r;t=s(this),c.translate.apply(this,arguments),this.points.forEach(i=>{e.forEach((e,o)=>{r=i[e],this.dataModify&&(r=this.dataModify.modifyValue(r)),null!==r&&(i[t[o]]=this.yAxis.toPixels(r,!0))})})}e.compose=function(e){let o=e.prototype;return o.linesApiNames=o.linesApiNames||t.slice(),o.pointArrayMap=o.pointArrayMap||r.slice(),o.pointValKey=o.pointValKey||"top",o.areaLinesNames=o.areaLinesNames||i.slice(),o.drawGraph=a,o.getGraphPath=p,o.toYData=l,o.translate=h,e}}(r||(r={}));let d=r,{sma:u}=h().seriesTypes;class f extends u{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 r,i,o,s,a,p,l,c=t.period,d=t.periodATR,u=t.multiplierATR,f=t.index,y=e.yData,m=y?y.length:0,g=[],x=h().seriesTypes.ema.prototype.getValues(e,{period:c,index:f}),b=h().seriesTypes.atr.prototype.getValues(e,{period:d}),A=[],v=[];if(!(m<c)){for(l=c;l<=m;l++)a=x.values[l-c],p=b.values[l-d],s=a[0],i=(0,n.correctFloat)(a[1]+u*p[1]),o=(0,n.correctFloat)(a[1]-u*p[1]),r=a[1],g.push([s,i,r,o]),A.push(s),v.push([i,r,o]);return{values:g,xData:A,yData:v}}}}f.defaultOptions=(0,n.merge)(u.defaultOptions,{params:{index:0,period:20,periodATR:10,multiplierATR:2},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/>Upper Channel: {point.top}<br/>EMA({series.options.params.period}): {point.middle}<br/>Lower Channel: {point.bottom}<br/>'},marker:{enabled:!1},dataGrouping:{approximation:"averages"},lineWidth:1}),(0,n.extend)(f.prototype,{nameBase:"Keltner Channels",areaLinesNames:["top","bottom"],nameComponents:["period","periodATR","multiplierATR"],linesApiNames:["topLine","bottomLine"],pointArrayMap:["top","middle","bottom"],pointValKey:"middle"}),d.compose(f),h().registerSeriesType("keltnerchannels",f);let y=p();return a.default})());