UNPKG

highcharts

Version:
14 lines 6.72 kB
!/** * Highcharts Stock JS v12.6.0 (2026-04-13) * @module highcharts/indicators/klinger * @requires highcharts * @requires highcharts/modules/stock * * Indicator series type for Highcharts Stock * * (c) 2010-2026 Highsoft AS * Author: Karol Kołodziej * * 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/klinger",["highcharts/highcharts"],function(e){return t(e,e.SeriesRegistry)}):"object"==typeof exports?exports["highcharts/indicators/klinger"]=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,o={512:e=>{e.exports=t},944:t=>{t.exports=e}},i={};function a(e){var t=i[e];if(void 0!==t)return t.exports;var r=i[e]={exports:{}};return o[e](r,r.exports,a),r.exports}a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var r in t)a.o(t,r)&&!a.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var n={};a.d(n,{default:()=>M});var s=a(944),l=a.n(s),p=a(512),h=a.n(p);let{doc:c,win:u}=l();function g(e,t){return e>1e14?e:parseFloat(e.toPrecision(t||14))}function f(e){return y(e)&&"number"==typeof e.nodeType}function d(e){let t=Object.prototype.toString.call(e);return"[object Array]"===t||"[object Array Iterator]"===t}function y(e,t){return!!e&&"object"==typeof e&&(!t||!d(e))}function m(e,...t){let r,o=[e,...t],i={},a=function(e,t){return"object"!=typeof e&&(e={}),function(e,t,r){for(let r in e)Object.hasOwnProperty.call(e,r)&&t.call((0,e[r]),e[r],r,e)}(t,function(r,o){if("__proto__"!==o&&"constructor"!==o){let i;!y(r,!0)||(i=r?.constructor,y(r,!0)&&!f(r)&&i?.name&&"Object"!==i.name)||f(r)?e[o]=t[o]:e[o]=a(e[o]||{},r)}}),e};!0===e&&(i=o[1],o=Array.prototype.slice.call(o,2));let n=o.length;for(r=0;r<n;r++)i=a(i,o[r]);return i}Array.prototype.find;let{sma:{prototype:A}}=h().seriesTypes;!function(e){let t=["bottomLine"],r=["top","bottom"],o=["top"];function i(e){return"plot"+e.charAt(0).toUpperCase()+e.slice(1)}function a(e,t){let r=[];return(e.pointArrayMap||[]).forEach(e=>{e!==t&&r.push(i(e))}),r}function n(){let e=this,t=e.pointValKey,r=e.linesApiNames,o=e.areaLinesNames,n=e.points,l=e.options,p=e.graph,h={options:{gapSize:l.gapSize}},c=[],u=a(e,t),g=n.length,f;if(u.forEach((e,t)=>{for(c[t]=[];g--;)f=n[g],c[t].push({x:f.x,plotX:f.plotX,plotY:f[e],isNull:null==f[e]});g=n.length}),e.userOptions.fillColor&&o.length){let t=c[u.indexOf(i(o[0]))],r=1===o.length?n:c[u.indexOf(i(o[1]))],a=e.color;e.points=r,e.nextPoints=t,e.color=e.userOptions.fillColor,e.options=m(n,h),e.graph=e.area,e.fillGraph=!0,A.drawGraph.call(e),e.area=e.graph,delete e.nextPoints,delete e.fillGraph,e.color=a}r.forEach((t,r)=>{c[r]?(e.points=c[r],l[t]?e.options=m(l[t].styles,h):(0,s.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],A.drawGraph.call(e),e["graph"+t]=e.graph):(0,s.error)('Error: "'+t+" doesn't have equivalent in pointArrayMap. To many elements in linesApiNames relative to pointArrayMap.\"")}),e.points=n,e.options=l,e.graph=p,A.drawGraph.call(e)}function l(e){let t,r=[],o=[];if(e=e||this.points,this.fillGraph&&this.nextPoints){if((t=A.getGraphPath.call(this,this.nextPoints))&&t.length){t[0][0]="L",r=A.getGraphPath.call(this,e),o=t.slice(0,r.length);for(let e=o.length-1;e>=0;e--)r.push(o[e])}}else r=A.getGraphPath.apply(this,arguments);return r}function p(e){let t=[];return(this.pointArrayMap||[]).forEach(r=>{t.push(e[r])}),t}function h(){let e=this.pointArrayMap,t=[],r;t=a(this),A.translate.apply(this,arguments),this.points.forEach(o=>{e.forEach((e,i)=>{r=o[e],this.dataModify&&(r=this.dataModify.modifyValue(r)),null!==r&&(o[t[i]]=this.yAxis.toPixels(r,!0))})})}e.compose=function(e){let i=e.prototype;return i.linesApiNames=i.linesApiNames||t.slice(),i.pointArrayMap=i.pointArrayMap||r.slice(),i.pointValKey=i.pointValKey||"top",i.areaLinesNames=i.areaLinesNames||o.slice(),i.drawGraph=n,i.getGraphPath=l,i.toYData=p,i.translate=h,e}}(r||(r={}));let v=r,{ema:P,sma:x}=h().seriesTypes;class b extends x{calculateTrend(e,t){return e[t][1]+e[t][2]+e[t][3]>e[t-1][1]+e[t-1][2]+e[t-1][3]?1:-1}isValidData(e){let t=this.chart,r=this.options,o=this.linkedParent,i=d(e)&&4===e.length,a=this.volumeSeries||(this.volumeSeries=t.get(r.params.volumeSeriesID));return a||(0,s.error)("Series "+r.params.volumeSeriesID+" not found! Check `volumeSeriesID`.",!0,o.chart),!!([o,a].every(function(e){return e&&e.dataTable.rowCount>=r.params.slowAvgPeriod})&&i)}getCM(e,t,r,o,i){return g(t+(r===o?e:i))}getDM(e,t){return g(e-t)}getVolumeForce(e){let t=[],r=0,o,i=1,a=0,n=e[0][1]-e[0][2],s=0,l;for(;i<e.length;i++)l=this.calculateTrend(e,i),o=this.getDM(e[i][1],e[i][2]),r=this.getCM(a,o,l,s,n),t.push([this.volumeSeries.getColumn("y")[i]*l*Math.abs(2*(o/r-1))*100]),s=l,a=r,n=o;return t}getEMA(e,t,r,o,i,a,n){return P.prototype.calculateEma(n||[],e,void 0===a?1:a,o,t,void 0===i?-1:i,r)}getSMA(e,t,r){return P.prototype.accumulatePeriodPoints(e,t,r)/e}getValues(e,t){let r=[],o=e.xData,i=e.yData,a=[],n=[],s=[],l,p=0,h=0,c,u,f,d=null;if(!this.isValidData(i[0]))return;let y=this.getVolumeForce(i),m=this.getSMA(t.fastAvgPeriod,0,y),A=this.getSMA(t.slowAvgPeriod,0,y),v=2/(t.fastAvgPeriod+1),P=2/(t.slowAvgPeriod+1);for(;p<i.length;p++)p>=t.fastAvgPeriod&&(u=h=this.getEMA(y,u,m,v,0,p,o)[1]),p>=t.slowAvgPeriod&&(f=c=this.getEMA(y,f,A,P,0,p,o)[1],s.push(l=g(h-c)),s.length>=t.signalPeriod&&(d=s.slice(-t.signalPeriod).reduce((e,t)=>e+t)/t.signalPeriod),r.push([o[p],l,d]),a.push(o[p]),n.push([l,d]));return{values:r,xData:a,yData:n}}}b.defaultOptions=m(x.defaultOptions,{params:{fastAvgPeriod:34,slowAvgPeriod:55,signalPeriod:13,volumeSeriesID:"volume"},signalLine:{styles:{lineWidth:1,lineColor:"#ff0000"}},dataGrouping:{approximation:"averages"},tooltip:{pointFormat:'<span style="color: {point.color}">●</span><b> {series.name}</b><br/><span style="color: {point.color}">Klinger</span>: {point.y}<br/><span style="color: {point.series.options.signalLine.styles.lineColor}">Signal</span>: {point.signal}<br/>'}}),function(e,t){let r;for(r in e||(e={}),t)e[r]=t[r]}(b.prototype,{areaLinesNames:[],linesApiNames:["signalLine"],nameBase:"Klinger",nameComponents:["fastAvgPeriod","slowAvgPeriod"],pointArrayMap:["y","signal"],parallelArrays:["x","y","signal"],pointValKey:"y"}),v.compose(b),h().registerSeriesType("klinger",b);let M=l();return n.default})());