highcharts
Version:
JavaScript charting framework
14 lines • 7.95 kB
JavaScript
!/**
* Highstock JS v13.0.1 (2026-08-17)
* @module highcharts/indicators/ichimoku-kinko-hyo
* @requires highcharts
* @requires highcharts/modules/stock
*
* Indicator series type for Highcharts Stock
*
* (c) 2010-2026 Highsoft AS
* Author: Sebastian Bochan
*
* A commercial license may be required depending on use,
* see www.highcharts.com/license
*/function(o,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(o._Highcharts,o._Highcharts.dataGrouping.approximations,o._Highcharts.Color,o._Highcharts.SeriesRegistry):"function"==typeof define&&define.amd?define("highcharts/indicators/ichimoku-kinko-hyo",["highcharts/highcharts"],function(o){return e(o,o.dataGrouping,["approximations"],o.Color,o.SeriesRegistry)}):"object"==typeof exports?exports["highcharts/indicators/ichimoku-kinko-hyo"]=e(o._Highcharts,o._Highcharts.dataGrouping.approximations,o._Highcharts.Color,o._Highcharts.SeriesRegistry):o.Highcharts=e(o.Highcharts,o.Highcharts.dataGrouping.approximations,o.Highcharts.Color,o.Highcharts.SeriesRegistry)}("u"<typeof window?this:window,(o,e,t,n)=>(()=>{"use strict";var i={620(o){o.exports=t},512(o){o.exports=n},956(o){o.exports=e},944(e){e.exports=o}};let s={};function r(o){let e=s[o];if(void 0!==e)return e.exports;let t=s[o]={exports:{}};return i[o](t,t.exports,r),t.exports}r.n=o=>{let e=o&&o.__esModule?()=>o.default:()=>o;return r.d(e,{a:e}),e},r.d=(o,e)=>{if(Array.isArray(e))for(var t=0;t<e.length;){var n=e[t++],i=e[t++];r.o(o,n)?0===i&&t++:0===i?Object.defineProperty(o,n,{enumerable:!0,value:e[t++]}):Object.defineProperty(o,n,{enumerable:!0,get:i})}else for(var n in e)r.o(e,n)&&!r.o(o,n)&&Object.defineProperty(o,n,{enumerable:!0,get:e[n]})},r.o=(o,e)=>Object.prototype.hasOwnProperty.call(o,e);let p={};r.d(p,{default:()=>v});var a=r(944),l=r.n(a),h=r(956),u=r.n(h),c=r(620),g=r.n(c),f=r(512),d=r.n(f);let{parse:k}=g(),{sma:S}=d().seriesTypes;function y(o){return{high:o.reduce(function(o,e){return Math.max(o,e[1])},-1/0),low:o.reduce(function(o,e){return Math.min(o,e[2])},1/0)}}function m(o){let e=o.indicator;e.points=o.points,e.nextPoints=o.nextPoints,e.color=o.color,e.options=(0,a.merge)(o.options.senkouSpan.styles,o.gap),e.graph=o.graph,e.fillGraph=!0,d().seriesTypes.sma.prototype.drawGraph.call(e)}class x extends S{constructor(){super(...arguments),this.data=[],this.options={},this.points=[],this.graphCollection=[]}init(){super.init.apply(this,arguments),this.options=(0,a.merge)({tenkanLine:{styles:{lineColor:this.color}},kijunLine:{styles:{lineColor:this.color}},chikouLine:{styles:{lineColor:this.color}},senkouSpanA:{styles:{lineColor:this.color,fill:k(this.color).setOpacity(.5).get()}},senkouSpanB:{styles:{lineColor:this.color,fill:k(this.color).setOpacity(.5).get()}},senkouSpan:{styles:{fill:k(this.color).setOpacity(.2).get()}}},this.options)}toYData(o){return[o.tenkanSen,o.kijunSen,o.chikouSpan,o.senkouSpanA,o.senkouSpanB]}translate(){for(let o of(d().seriesTypes.sma.prototype.translate.apply(this),this.points))for(let e of this.pointArrayMap){let t=o[e];(0,a.isNumber)(t)&&(o["plot"+e]=this.yAxis.toPixels(t,!0),o.plotY=o["plot"+e],o.tooltipPos=[o.plotX,o["plot"+e]],o.isNull=!1)}}drawGraph(){let o=this,e=o.points,t=o.options,n=o.graph,i=o.color,s={options:{gapSize:t.gapSize}},r=o.pointArrayMap.length,p=[[],[],[],[],[],[]],l={tenkanLine:p[0],kijunLine:p[1],chikouLine:p[2],senkouSpanA:p[3],senkouSpanB:p[4],senkouSpan:p[5]},h=[],u=o.options.senkouSpan,c=u.color||u.styles.fill,g=u.negativeColor,f=[[],[]],k=[[],[]],S=e.length,y=0,x,v,A,C,b,P,Y,B,G,N,j,H,O;for(o.ikhMap=l;S--;){for(A=0,v=e[S];A<r;A++)x=o.pointArrayMap[A],(0,a.defined)(v[x])&&p[A].push({plotX:v.plotX,plotY:v["plot"+x],isNull:!1});if(g&&S!==e.length-1){let o=l.senkouSpanB.length-1,e=function(o,e,t,n){if(o&&e&&t&&n){let i=e.plotX-o.plotX,s=e.plotY-o.plotY,r=n.plotX-t.plotX,p=n.plotY-t.plotY,a=o.plotX-t.plotX,l=o.plotY-t.plotY,h=(-s*a+i*l)/(-r*s+i*p),u=(r*l-p*a)/(-r*s+i*p);if(h>=0&&h<=1&&u>=0&&u<=1)return{plotX:o.plotX+u*i,plotY:o.plotY+u*s}}}(l.senkouSpanA[o-1],l.senkouSpanA[o],l.senkouSpanB[o-1],l.senkouSpanB[o]);if(e){let t={plotX:e.plotX,plotY:e.plotY,isNull:!1,intersectPoint:!0};l.senkouSpanA.splice(o,0,t),l.senkouSpanB.splice(o,0,t),h.push(o)}}}if((0,a.objectEach)(l,(e,n)=>{t[n]&&"senkouSpan"!==n&&(o.points=p[y],o.options=(0,a.merge)(t[n].styles,s),o.graph=o["graph"+n],o.fillGraph=!1,o.color=i,d().seriesTypes.sma.prototype.drawGraph.call(o),o["graph"+n]=o.graph),y++}),o.graphCollection)for(let e of o.graphCollection)o[e].destroy(),delete o[e];if(o.graphCollection=[],g&&l.senkouSpanA[0]&&l.senkouSpanB[0]){for(h.unshift(0),h.push(l.senkouSpanA.length-1),H=0;H<h.length-1;H++)if(C=h[H],b=h[H+1],P=l.senkouSpanB.slice(C,b+1),Y=l.senkouSpanA.slice(C,b+1),Math.floor(P.length/2)>=1){let o=Math.floor(P.length/2);if(P[o].plotY===Y[o].plotY){for(O=0,B=0,G=0;O<P.length;O++)B+=P[O].plotY,G+=Y[O].plotY;f[j=B>G?0:1]=f[j].concat(P),k[j]=k[j].concat(Y)}else f[j=P[o].plotY>Y[o].plotY?0:1]=f[j].concat(P),k[j]=k[j].concat(Y)}else f[j=P[0].plotY>Y[0].plotY?0:1]=f[j].concat(P),k[j]=k[j].concat(Y);["graphsenkouSpanColor","graphsenkouSpanNegativeColor"].forEach(function(e,n){f[n].length&&k[n].length&&(N=0===n?c:g,m({indicator:o,points:f[n],nextPoints:k[n],color:N,options:t,gap:s,graph:o[e]}),o[e]=o.graph,o.graphCollection.push(e))})}else m({indicator:o,points:l.senkouSpanB,nextPoints:l.senkouSpanA,color:c,options:t,gap:s,graph:o.graphsenkouSpan}),o.graphsenkouSpan=o.graph;delete o.nextPoints,delete o.fillGraph,o.points=e,o.options=t,o.graph=n,o.color=i}getGraphPath(o){let e=[],t,n=[];if(o=o||this.points,this.fillGraph&&this.nextPoints){if((t=d().seriesTypes.sma.prototype.getGraphPath.call(this,this.nextPoints))&&t.length){t[0][0]="L",e=d().seriesTypes.sma.prototype.getGraphPath.call(this,o),n=t.slice(0,e.length);for(let o=n.length-1;o>=0;o--)e.push(n[o])}}else e=d().seriesTypes.sma.prototype.getGraphPath.apply(this,arguments);return e}getValues(o,e){let t,n,i,s,r,p,l,h,u,c,g=e.period,f=e.periodTenkan,d=e.periodSenkouSpanB,k=o.xData,S=o.yData,m=o.xAxis,x=S&&S.length||0,v=(0,a.getClosestDistance)(m.series.map(o=>o.getColumn("x"))),A=[],C=[];if(k.length<=g||!(0,a.isArray)(S[0])||4!==S[0].length)return;let b=k[0]-g*v;for(r=0;r<g;r++)C.push(b+r*v);for(r=0;r<x;r++)r>=f&&(p=((n=y(S.slice(r-f,r))).high+n.low)/2),r>=g&&(u=(p+(l=((i=y(S.slice(r-g,r))).high+i.low)/2))/2),r>=d&&(c=((s=y(S.slice(r-d,r))).high+s.low)/2),h=S[r][3],t=k[r],void 0===A[r]&&(A[r]=[]),void 0===A[r+g-1]&&(A[r+g-1]=[]),A[r+g-1][0]=p,A[r+g-1][1]=l,A[r+g-1][2]=void 0,void 0===A[r+1]&&(A[r+1]=[]),A[r+1][2]=h,r<=g&&(A[r+g-1][3]=void 0,A[r+g-1][4]=void 0),void 0===A[r+2*g-2]&&(A[r+2*g-2]=[]),A[r+2*g-2][3]=u,A[r+2*g-2][4]=c,C.push(t);for(r=1;r<=g;r++)C.push(t+r*v);return{values:A,xData:C,yData:A}}}x.defaultOptions=(0,a.merge)(S.defaultOptions,{params:{index:void 0,period:26,periodTenkan:9,periodSenkouSpanB:52},marker:{enabled:!1},tooltip:{pointFormat:'<span style="color:{point.color}">●</span> <b> {series.name}</b><br/>TENKAN SEN: {point.tenkanSen:.3f}<br/>KIJUN SEN: {point.kijunSen:.3f}<br/>CHIKOU SPAN: {point.chikouSpan:.3f}<br/>SENKOU SPAN A: {point.senkouSpanA:.3f}<br/>SENKOU SPAN B: {point.senkouSpanB:.3f}<br/>'},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"}}),(0,a.extend)(x.prototype,{pointArrayMap:["tenkanSen","kijunSen","chikouSpan","senkouSpanA","senkouSpanB"],pointValKey:"tenkanSen",nameComponents:["periodSenkouSpanB","period","periodTenkan"]}),u()["ichimoku-averages"]=function(){let o,e=[];return[].forEach.call(arguments,function(t,n){e.push(u().average(t)),o=!o&&void 0===e[n]}),o?void 0:e},d().registerSeriesType("ikh",x);let v=l();return p.default})());