hqchart 1.1.12429 → 1.1.12433

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2070,7 +2070,7 @@ return fixValue;}function ToFixedRect(value){// With a bitwise or.
2070
2070
  // Finally, a left bitwise shift.
2071
2071
  //value*=GetDevicePixelRatio();
2072
2072
  var rounded;return rounded=0.5+value<<0;}//深拷贝
2073
- function CloneData(data){if(!data)return null;var strData=(0,_stringify2.default)(data);var item=JSON.parse(strData);return item;}function Point(){this.X;this.Y;}function SelectRectData(){this.Data;//主数据
2073
+ function CloneData(data){if(!data)return null;var strData=(0,_stringify2.default)(data);var item=JSON.parse(strData);return item;}function IsRecvOverlap(rect1,rect2){return Math.max(rect1.Left,rect2.Left)<Math.min(rect1.Right,rect2.Right)&&Math.max(rect1.Top,rect2.Top)<Math.min(rect1.Bottom,rect2.Bottom);}function Point(){this.X;this.Y;}function SelectRectData(){this.Data;//主数据
2074
2074
  this.JSChartContainer;//行情控件
2075
2075
  this.Start;//数据起始位子
2076
2076
  this.End;//数据结束位置
@@ -4155,16 +4155,16 @@ this.EnableTooltip=true;this.TooltipRect=[];this.ExcludeArea=null;//排除区域
4155
4155
  this.AutoPosition=null;//{ Direction:0, MaxYOffset:40 } //自动调整Y轴偏移,防止文字重叠
4156
4156
  this.AryDrawRect=[];//已经绘制的区域
4157
4157
  this.AutoYOffset=0;//this.Data; 存K线数据
4158
- this.Draw=function(){this.TooltipRect=[];this.AryDrawRect=[];this.AutoYOffset=0;if(!this.IsShow||this.ChartFrame.IsMinSize||!this.IsVisible)return;if(this.IsShowIndexTitleOnly())return;if(this.IsHideScriptIndex())return;this.DrawSVG();};this.DrawDetail=function(rtSVG,data){if(!IFrameSplitOperator.IsNonEmptyArray(data.Content))return;var lefMargin=2;var rightMargin=2;var itemSpace=2;var rtBorder={Left:rtSVG.Right,Right:rtSVG.Right,Bottom:rtSVG.Bottom};var rightBorder=0;//右边的边界 0=div的宽度 1=图形框架边框
4158
+ this.Draw=function(){this.TooltipRect=[];this.AryDrawRect=[];this.AutoYOffset=0;if(!this.IsShow||this.ChartFrame.IsMinSize||!this.IsVisible)return;if(this.IsShowIndexTitleOnly())return;if(this.IsHideScriptIndex())return;this.DrawSVG();};this.DrawDetail=function(rtSVG,data,svgItem){if(!IFrameSplitOperator.IsNonEmptyArray(data.Content))return;var lefMargin=2;var rightMargin=2;var itemSpace=2;var rtBorder={Left:rtSVG.Right,Right:rtSVG.Right,Bottom:rtSVG.Bottom};var rightBorder=0;//右边的边界 0=div的宽度 1=图形框架边框
4159
4159
  if(IFrameSplitOperator.IsNumber(data.ItemSpace))itemSpace=data.ItemSpace;if(IFrameSplitOperator.IsNumber(data.YOffset))rtBorder.Bottom+=data.YOffset;if(IFrameSplitOperator.IsNumber(data.XOffset))rtBorder.Left+=data.XOffset;if(IFrameSplitOperator.IsNumber(data.LeftMargin))lefMargin=data.LeftMargin;if(IFrameSplitOperator.IsNumber(data.RightMargin))rightMargin=data.RightMargin;if(IFrameSplitOperator.IsNumber(data.RightBorder))rightBorder=data.RightBorder;if(data.Font)this.Canvas.font=data.Font;else this.Canvas.font=this.TextFont;this.Canvas.textBaseline='bottom';this.Canvas.textAlign='left';var textHeight=this.Canvas.measureText("擎").width+2;rtBorder.Height=textHeight+5;var yText=rtBorder.Bottom-(rtBorder.Height-textHeight)/2;var xText=rtBorder.Left+lefMargin;var aryText=[];for(var i=0;i<data.Content.length;++i){if(aryText.length>0)xText+=itemSpace;var item=data.Content[i];if(!item.Text)continue;var textWidth=this.Canvas.measureText(item.Text).width+2;aryText.push({X:xText,Y:yText,Width:textWidth,Data:item});xText+=textWidth;rtBorder.Right=xText;}rtBorder.Right+=rightMargin;rtBorder.Width=rtBorder.Right-rtBorder.Left;rtBorder.Top=rtBorder.Bottom-rtBorder.Height;var right=this.ChartBorder.GetChartWidth()-1;if(rightBorder==1)right=this.ChartBorder.GetRight();if(rtBorder.Right>right)//右边显示不下,显示在左边
4160
- {rtBorder.Right=rtSVG.Left;if(IFrameSplitOperator.IsNumber(data.XOffset))rtBorder.Right-=data.XOffset;rtBorder.Left=rtBorder.Right-rtBorder.Width;var xText=rtBorder.Left+lefMargin;for(var i=0;i<aryText.length;++i){if(i>0)xText+=itemSpace;var item=aryText[i];item.X=xText;xText+=item.Width;}}if(data.BGColor){this.Canvas.fillStyle=data.BGColor;this.Canvas.fillRect(rtBorder.Left,rtBorder.Top,rtBorder.Width,rtBorder.Height);}if(data.BorderColor){this.Canvas.strokeStyle=data.BorderColor;this.Canvas.strokeRect(ToFixedPoint(rtBorder.Left),ToFixedPoint(rtBorder.Top),ToFixedRect(rtBorder.Width),ToFixedRect(rtBorder.Height));}for(var i=0;i<aryText.length;++i){var item=aryText[i];this.Canvas.fillStyle=item.Data.Color;this.Canvas.fillText(item.Data.Text,item.X,item.Y);}this.AryDrawRect.push({Left:rtBorder.Left,Top:rtBorder.Top,Right:rtBorder.Right,Bottom:rtBorder.Bottom,Type:"Detail"});};this.GetDetailPosition=function(rtSVG,data){if(!IFrameSplitOperator.IsNonEmptyArray(data.Content))return null;var lefMargin=2;var rightMargin=2;var itemSpace=2;var rtBorder={Left:rtSVG.Right,Right:rtSVG.Right,Bottom:rtSVG.Bottom};var rightBorder=0;//右边的边界 0=div的宽度 1=图形框架边框
4160
+ {rtBorder.Right=rtSVG.Left;if(IFrameSplitOperator.IsNumber(data.XOffset))rtBorder.Right-=data.XOffset;rtBorder.Left=rtBorder.Right-rtBorder.Width;var xText=rtBorder.Left+lefMargin;for(var i=0;i<aryText.length;++i){if(i>0)xText+=itemSpace;var item=aryText[i];item.X=xText;xText+=item.Width;}}if(data.BGColor){this.Canvas.fillStyle=data.BGColor;this.Canvas.fillRect(rtBorder.Left,rtBorder.Top,rtBorder.Width,rtBorder.Height);}if(data.BorderColor){this.Canvas.strokeStyle=data.BorderColor;this.Canvas.strokeRect(ToFixedPoint(rtBorder.Left),ToFixedPoint(rtBorder.Top),ToFixedRect(rtBorder.Width),ToFixedRect(rtBorder.Height));}for(var i=0;i<aryText.length;++i){var item=aryText[i];this.Canvas.fillStyle=item.Data.Color;this.Canvas.fillText(item.Data.Text,item.X,item.Y);}this.AryDrawRect.push({Left:rtBorder.Left,Top:rtBorder.Top,Right:rtBorder.Right,Bottom:rtBorder.Bottom,Type:"Detail",Data:svgItem});};this.GetDetailPosition=function(rtSVG,data){if(!IFrameSplitOperator.IsNonEmptyArray(data.Content))return null;var lefMargin=2;var rightMargin=2;var itemSpace=2;var rtBorder={Left:rtSVG.Right,Right:rtSVG.Right,Bottom:rtSVG.Bottom};var rightBorder=0;//右边的边界 0=div的宽度 1=图形框架边框
4161
4161
  if(IFrameSplitOperator.IsNumber(data.ItemSpace))itemSpace=data.ItemSpace;if(IFrameSplitOperator.IsNumber(data.YOffset))rtBorder.Bottom+=data.YOffset;if(IFrameSplitOperator.IsNumber(data.XOffset))rtBorder.Left+=data.XOffset;if(IFrameSplitOperator.IsNumber(data.LeftMargin))lefMargin=data.LeftMargin;if(IFrameSplitOperator.IsNumber(data.RightMargin))rightMargin=data.RightMargin;if(IFrameSplitOperator.IsNumber(data.RightBorder))rightBorder=data.RightBorder;if(data.Font)this.Canvas.font=data.Font;else this.Canvas.font=this.TextFont;var textHeight=this.Canvas.measureText("擎").width+2;rtBorder.Height=textHeight+5;var yText=rtBorder.Bottom-(rtBorder.Height-textHeight)/2;var xText=rtBorder.Left+lefMargin;var bFrist=true;for(var i=0;i<data.Content.length;++i){if(!bFrist)xText+=itemSpace;var item=data.Content[i];if(!item.Text)continue;var textWidth=this.Canvas.measureText(item.Text).width+2;xText+=textWidth;rtBorder.Right=xText;bFrist=false;}rtBorder.Right+=rightMargin;rtBorder.Width=rtBorder.Right-rtBorder.Left;rtBorder.Top=rtBorder.Bottom-rtBorder.Height;var right=this.ChartBorder.GetChartWidth()-1;if(rightBorder==1)right=this.ChartBorder.GetRight();if(rtBorder.Right>right)//右边显示不下,显示在左边
4162
4162
  {rtBorder.Right=rtSVG.Left;if(IFrameSplitOperator.IsNumber(data.XOffset))rtBorder.Right-=data.XOffset;rtBorder.Left=rtBorder.Right-rtBorder.Width;}return rtBorder;};this.CalculateShowPosition=function(item,pt){var x=pt.X,y=pt.Y;var svgItem=item.SVG;if(IFrameSplitOperator.IsNumber(svgItem.YOffset))y+=svgItem.YOffset;var fontSVG=svgItem.Size+'px '+this.Family;this.Canvas.font=fontSVG;var halfSize=svgItem.Size/2;var rtSVG={Left:x-halfSize,Right:x+halfSize,Top:y-svgItem.Size,Bottom:y,Height:svgItem.Size,Width:svgItem.Size};if(svgItem.VAlign===0)//top
4163
4163
  {rtSVG.Top=y;rtSVG.Bottom=rtSVG.Top+svgItem.Size;}else if(svgItem.VAlign===1)//middle
4164
4164
  {rtSVG.Top=y-svgItem.Size/2;rtSVG.Bottom=rtSVG.Top+svgItem.Size;}if(rtSVG.Top<0){rtSVG.Top=0;rtSVG.Bottom=svgItem.Size;y=rtSVG.Bottom;}var rtContent=null;if(item.Detail)rtContent=this.GetDetailPosition(rtSVG,item.Detail);var yOffset=0,yMoveStep=-5;if(IFrameSplitOperator.IsNumber(this.AutoPosition.MoveYStep))yMoveStep=-Math.abs(this.AutoPosition.MoveYStep);for(var i=0;i<20;++i){if(rtSVG&&!rtContent){if(!this.IsRectOverlap(rtSVG))break;}else if(rtSVG&&rtContent){if(!this.IsRectOverlap(rtSVG)&&!this.IsRectOverlap(rtContent))break;}yOffset+=yMoveStep;if(Math.abs(yOffset)>=this.AutoPosition.MaxYOffset)break;rtSVG.Top+=yMoveStep;rtSVG.Bottom+=yMoveStep;if(rtContent){rtContent.Top+=yMoveStep;rtContent.Bottom+=yMoveStep;}}pt.X=x;pt.Y=y+yOffset;};this.IsRectOverlap=function(rect){for(var i=0;i<this.AryDrawRect.length;++i){var item=this.AryDrawRect[i];if((rect.Left>=item.Left&&rect.Left<=item.Right||rect.Right>=item.Left&&rect.Right<=item.Right)&&(rect.Top>=item.Top&&rect.Top<=item.Bottom||rect.Bottom>=item.Top&&rect.Bottom<=item.Bottom)){return true;}}return false;};this.DrawSVG=function(){if(!this.IsShow||this.ChartFrame.IsMinSize)return;if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return;if(!IFrameSplitOperator.IsNonEmptyArray(this.Texts))return;if(!this.Family)return;this.IsHScreen=this.ChartFrame.IsHScreen===true;var xPointCount=this.ChartFrame.XPointCount;var offset=this.Data.DataOffset;var top=this.ChartBorder.GetTopEx();var bottom=this.ChartBorder.GetBottomEx();var pixelRatio=GetDevicePixelRatio();var x=0,y=0;for(var i=0;i<this.Texts.length;++i){var item=this.Texts[i];if(!item.SVG||!item.SVG.Symbol)continue;if(!IFrameSplitOperator.IsNumber(item.Index))continue;var isMinuteFrame=this.IsMinuteFrame();var index=item.Index-offset;var kItem=this.Data.Data[item.Index];if(index<0||index>=xPointCount)continue;x=this.ChartFrame.GetXFromIndex(index);if(item.Value=="Top")y=top;else if(item.Value=="Bottom")y=bottom;else y=this.ChartFrame.GetYFromData(item.Value);if(IFrameSplitOperator.IsNumber(item.YOffset))y+=item.YOffset;//Y轴偏移
4165
4165
  var svgItem=item.SVG;if(IFrameSplitOperator.IsNumber(svgItem.YOffset))y+=svgItem.YOffset;if(this.AutoPosition){var pt={X:x,Y:y};this.CalculateShowPosition(item,pt);//重新计算位置
4166
- x=pt.X;y=pt.Y;}var fontSVG=svgItem.Size+'px '+this.Family;this.Canvas.font=fontSVG;var halfSize=svgItem.Size/2;var textBaseline='bottom';var rtSVG={Left:x-halfSize,Right:x+halfSize,Top:y-svgItem.Size,Bottom:y,Height:svgItem.Size,Width:svgItem.Size};if(svgItem.VAlign===0){textBaseline="top";rtSVG.Top=y;rtSVG.Bottom=rtSVG.Top+svgItem.Size;}else if(svgItem.VAlign===1){textBaseline='middle';rtSVG.Top=y-svgItem.Size/2;rtSVG.Bottom=rtSVG.Top+svgItem.Size;}if(rtSVG.Top<0){rtSVG.Top=0;rtSVG.Bottom=svgItem.Size;y=rtSVG.Bottom;}this.Canvas.textBaseline=textBaseline;this.Canvas.textAlign='center';this.Canvas.fillStyle=svgItem.Color;this.Canvas.fillText(svgItem.Symbol,x,y);this.AryDrawRect.push({Left:rtSVG.Left,Top:rtSVG.Top,Right:rtSVG.Right,Bottom:rtSVG.Bottom,Type:"SVG"});if(this.EnableTooltip)this.TooltipRect.push({Rect:rtSVG,Index:i});//文字
4167
- if(item.Text&&item.Text.Content&&this.TextFont){var textItem=item.Text;this.Canvas.font=this.TextFont;this.Canvas.fillStyle=textItem.Color;var yText=y;if(IFrameSplitOperator.IsNumber(textItem.YOffset))yText+=textItem.YOffset;this.Canvas.fillText(textItem.Content,x,yText);}if(item.Detail){this.DrawDetail(rtSVG,item.Detail);}//连线
4166
+ x=pt.X;y=pt.Y;}var fontSVG=svgItem.Size+'px '+this.Family;this.Canvas.font=fontSVG;var halfSize=svgItem.Size/2;var textBaseline='bottom';var rtSVG={Left:x-halfSize,Right:x+halfSize,Top:y-svgItem.Size,Bottom:y,Height:svgItem.Size,Width:svgItem.Size};if(svgItem.VAlign===0){textBaseline="top";rtSVG.Top=y;rtSVG.Bottom=rtSVG.Top+svgItem.Size;}else if(svgItem.VAlign===1){textBaseline='middle';rtSVG.Top=y-svgItem.Size/2;rtSVG.Bottom=rtSVG.Top+svgItem.Size;}if(rtSVG.Top<0){rtSVG.Top=0;rtSVG.Bottom=svgItem.Size;y=rtSVG.Bottom;}this.Canvas.textBaseline=textBaseline;this.Canvas.textAlign='center';this.Canvas.fillStyle=svgItem.Color;this.Canvas.fillText(svgItem.Symbol,x,y);this.AryDrawRect.push({Left:rtSVG.Left,Top:rtSVG.Top,Right:rtSVG.Right,Bottom:rtSVG.Bottom,Type:"SVG",Data:item});if(this.EnableTooltip)this.TooltipRect.push({Rect:rtSVG,Index:i});//文字
4167
+ if(item.Text&&item.Text.Content&&this.TextFont){var textItem=item.Text;this.Canvas.font=this.TextFont;this.Canvas.fillStyle=textItem.Color;var yText=y;if(IFrameSplitOperator.IsNumber(textItem.YOffset))yText+=textItem.YOffset;this.Canvas.fillText(textItem.Content,x,yText);}if(item.Detail){this.DrawDetail(rtSVG,item.Detail,item);}//连线
4168
4168
  if(item.Line){var lineItem=item.Line;var price;var kItem=this.Data.Data[item.Index];switch(lineItem.Value){case"C":price=kItem.Close;break;case"H":price=kItem.High;break;case"L":price=kItem.Low;break;}if(!IFrameSplitOperator.IsNumber(price))continue;var yPrice=this.ChartFrame.GetYFromData(price);if(yPrice>=rtSVG.Top&&yPrice<=rtSVG.Bottom)continue;var yText;if(yPrice<rtSVG.Top){yText=rtSVG.Top;if(IFrameSplitOperator.IsNumber(lineItem.SVGBlank)){//yPrice+=lineItem.Blank;
4169
4169
  yText-=lineItem.SVGBlank;}}else{yText=rtSVG.Bottom;if(IFrameSplitOperator.IsNumber(lineItem.SVGBlank)){//yPrice-=lineItem.Blank;
4170
4170
  yText+=lineItem.SVGBlank;}}if(lineItem.Dash)this.Canvas.setLineDash(lineItem.Dash);//虚线
@@ -9431,8 +9431,9 @@ var result=[];for(var _i80 in data){if(data[_i80]){if(isNumber2)result[_i80]=tru
9431
9431
  //用法: REF(X,A),引用A周期前的X值.A可以是变量.
9432
9432
  //平滑处理:当引用不到数据时进行的操作.此函数中,平滑时使用上一个周期的引用值.
9433
9433
  //例如: REF(CLOSE,BARSCOUNT(C)-1)表示第二根K线的收盘价.
9434
- this.REF=function(data,n){var result=[];if(typeof n=='number'){if(data.length<=0)return result;if(n>=data.length)return result;result=data.slice(0,data.length-n);//平滑处理
9435
- var firstData=data[0];for(var _i81=0;_i81<n;++_i81){result.unshift(firstData);}}else//n 为数组的情况
9434
+ this.REF=function(data,n){var result=[];if(typeof n=='number'){if(IFrameSplitOperator.IsNumber(data))//单数值
9435
+ {if(n<0)return result;var kData=this.SymbolData.Data.Data;if(!kData||kData.length<=0)return result;var count=kData.length;for(var i=n;i<count;++i){result[i]=data;}}else{if(data.length<=0)return result;if(n>=data.length)return result;result=data.slice(0,data.length-n);//平滑处理
9436
+ var firstData=data[0];for(var _i81=0;_i81<n;++_i81){result.unshift(firstData);}}}else//n 为数组的情况
9436
9437
  {for(var _i82=0;_i82<data.length;++_i82){result[_i82]=null;if(_i82>=n.length)continue;var value=n[_i82];if(value>=0&&value<=_i82)result[_i82]=data[_i82-value];else if(_i82)result[_i82]=result[_i82-1];else result[_i82]=data[_i82];}}return result;};//引用若干周期前的数据(未作平滑处理).
9437
9438
  //用法: REFV(X,A),引用A周期前的X值.A可以是变量.
9438
9439
  //平滑处理:当引用不到数据时进行的操作.
@@ -9574,7 +9575,8 @@ this.CROSS=function(data,data2){var result=[];if(Array.isArray(data)&&Array.isAr
9574
9575
  CROSSUP(MA5,MA10),ICON(1,'ICO4');//MA5上穿MA10,标注红箭头。
9575
9576
  //CROSSUP(MA5,MA10),ICON(1,'ICO4'); 与 CROSSUP(MA5,MA10)=1,ICON(1,'ICO4');表达同等意义
9576
9577
  */this.CROSSUP=function(data,data2){return this.CROSS(data,data2);};//累乘
9577
- this.MULAR=function(data,n){var result=[];if(!Array.isArray(n)){if(data.length<n)return result;if(n==0){var index=n;for(;index<data.length;++index){if(this.IsNumber(data[index])){result[index]=data[index];break;}}for(++index;index<data.length;++index){result[index]=result[index-1]*data[index];}}else{for(var i=n-1,j=0;i<data.length;++i,++j){for(var k=0;k<n;++k){if(k==0)result[i]=data[k+j];else result[i]*=data[k+j];}}}}else{for(var i=0;i<data.length;++i){result[i]=null;var totalCount=n[i];if(!this.IsNumber(totalCount))continue;totalCount=parseInt(totalCount);if(totalCount<0)continue;for(var j=i,k=0;j>=0&&k<totalCount;--j,++k){if(k==0)result[i]=data[j];else result[i]*=data[j];}}}return result;};this.SUM=function(data,n){var result=[];if(!Array.isArray(n)){if(n==0){result[0]=data[0];for(var i=1;i<data.length;++i){result[i]=result[i-1]+data[i];}}else{for(var i=n-1,j=0;i<data.length;++i,++j){for(var k=0;k<n;++k){if(k==0)result[i]=data[k+j];else result[i]+=data[k+j];}}}}else{for(var i=0;i<data.length;++i){result[i]=null;var totalCount=n[i];if(!(totalCount>0))continue;for(var j=i,k=0;j>=0&&k<totalCount;--j,++k){if(k==0)result[i]=data[j];else result[i]+=data[j];}}}return result;};/*
9578
+ this.MULAR=function(data,n){var result=[];if(!Array.isArray(n)){if(data.length<n)return result;if(n==0){var index=n;for(;index<data.length;++index){if(this.IsNumber(data[index])){result[index]=data[index];break;}}for(++index;index<data.length;++index){result[index]=result[index-1]*data[index];}}else{for(var i=n-1,j=0;i<data.length;++i,++j){for(var k=0;k<n;++k){if(k==0)result[i]=data[k+j];else result[i]*=data[k+j];}}}}else{for(var i=0;i<data.length;++i){result[i]=null;var totalCount=n[i];if(!this.IsNumber(totalCount))continue;totalCount=parseInt(totalCount);if(totalCount<0)continue;for(var j=i,k=0;j>=0&&k<totalCount;--j,++k){if(k==0)result[i]=data[j];else result[i]*=data[j];}}}return result;};this.SUM=function(data,n){var result=[];if(!Array.isArray(n)){if(n==0){var start=-1;for(var i=0;i<data.length;++i)//取第1个有效数
9579
+ {if(IFrameSplitOperator.IsNumber(data[i])){start=i;break;}}if(start<0)return result;result[start]=data[start];for(var i=start+1;i<data.length;++i){result[i]=result[i-1]+data[i];}}else{for(var i=n-1,j=0;i<data.length;++i,++j){for(var k=0;k<n;++k){if(k==0)result[i]=data[k+j];else result[i]+=data[k+j];}}}}else{for(var i=0;i<data.length;++i){result[i]=null;var totalCount=n[i];if(!(totalCount>0))continue;for(var j=i,k=0;j>=0&&k<totalCount;--j,++k){if(k==0)result[i]=data[j];else result[i]+=data[j];}}}return result;};/*
9578
9580
  BARSCOUNT 有效数据周期数
9579
9581
  求总的周期数。
9580
9582
  用法: BARSCOUNT(X) 第一个有效数据到当前的天数。
@@ -12466,7 +12468,7 @@ this.AreaColor=g_JSChartResource.ScrollBar.BGChart.AreaColor;//面积图颜色
12466
12468
  };this.Draw=function(){if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return;this.Canvas.save();if(this.LineWidth>0)this.Canvas.lineWidth=this.LineWidth*GetDevicePixelRatio();var bottom=this.ChartBorder.GetBottom();this.Canvas.strokeStyle=this.Color;var bFirstPoint=true;var drawCount=0,x,y;var firstPoint={};for(var i=0;i<this.Data.Data.length;++i){var item=this.Data.Data[i];var value=item.Close;if(!IFrameSplitOperator.IsNumber(value))continue;x=this.ChartFrame.GetXFromIndex(i);y=this.ChartFrame.GetYFromData(value);if(bFirstPoint){this.Canvas.beginPath();this.Canvas.moveTo(x,y);bFirstPoint=false;firstPoint={X:x,Y:y};}else{this.Canvas.lineTo(x,y);}++drawCount;}if(drawCount>0){this.Canvas.stroke();this.Canvas.lineTo(x,bottom);this.Canvas.lineTo(firstPoint.X,bottom);this.Canvas.closePath();this.Canvas.fillStyle=this.AreaColor;this.Canvas.fill();}this.Canvas.restore();};this.GetMaxMin=function(){var range={Max:null,Min:null};if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return range;for(var i=0;i<this.Data.Data.length;++i){var item=this.Data.Data[i];var value=item.Close;if(!IFrameSplitOperator.IsNumber(value))continue;if(range.Max==null||range.Max<value)range.Max=value;if(range.Min==null||range.Min>value)range.Min=value;}return range;};}/********************************************************************************
12467
12469
  * 版本信息输出
12468
12470
  *
12469
- */var HQCHART_VERSION="1.1.12428";function PrintHQChartVersion(){var log='*************************************************************************************************************\n*\n* HQChart Ver: '+HQCHART_VERSION+' \n* \n* License: Apache License 2.0 \n* Source: https://github.com/jones2000/HQChart\n*\n*************************************************************************************************************\n';console.log(log);}PrintHQChartVersion();//把给外界调用的方法暴露出来
12471
+ */var HQCHART_VERSION="1.1.12432";function PrintHQChartVersion(){var log='*************************************************************************************************************\n*\n* HQChart Ver: '+HQCHART_VERSION+' \n* \n* License: Apache License 2.0 \n* Source: https://github.com/jones2000/HQChart\n*\n*************************************************************************************************************\n';console.log(log);}PrintHQChartVersion();//把给外界调用的方法暴露出来
12470
12472
  exports.default=(_jsChartInit$jsChartS={jsChartInit:JSChart.Init,jsChartStyle:JSChart.SetStyle,// IsIndexSymbol:IsIndexSymbol,
12471
12473
  // BaseIndex:BaseIndex,
12472
12474
  // ChartLine:ChartLine,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "hqchart",
3
3
  "description": "stock chart",
4
4
  "author": "jones2000",
5
- "version": "1.1.12429",
5
+ "version": "1.1.12433",
6
6
  "main": "lib/main.js",
7
7
  "private": false,
8
8
  "license": "Apache License 2.0",
@@ -2844,15 +2844,29 @@ function JSAlgorithm(errorHandler,symbolData)
2844
2844
  let result=[];
2845
2845
  if (typeof(n)=='number')
2846
2846
  {
2847
- if (data.length<=0) return result;
2848
- if (n>=data.length) return result;
2849
-
2850
- result=data.slice(0,data.length-n);
2851
-
2852
- //平滑处理
2853
- var firstData=data[0];
2854
- for(let i=0;i<n;++i)
2855
- result.unshift(firstData);
2847
+ if (IFrameSplitOperator.IsNumber(data)) //单数值
2848
+ {
2849
+ if (n<0) return result;
2850
+ var kData=this.SymbolData.Data.Data;
2851
+ if (!kData || kData.length<=0) return result;
2852
+ var count=kData.length;
2853
+ for(var i=n;i<count;++i)
2854
+ {
2855
+ result[i]=data;
2856
+ }
2857
+ }
2858
+ else
2859
+ {
2860
+ if (data.length<=0) return result;
2861
+ if (n>=data.length) return result;
2862
+
2863
+ result=data.slice(0,data.length-n);
2864
+
2865
+ //平滑处理
2866
+ var firstData=data[0];
2867
+ for(let i=0;i<n;++i)
2868
+ result.unshift(firstData);
2869
+ }
2856
2870
  }
2857
2871
  else //n 为数组的情况
2858
2872
  {
@@ -4130,9 +4144,21 @@ function JSAlgorithm(errorHandler,symbolData)
4130
4144
  {
4131
4145
  if (n==0)
4132
4146
  {
4133
- result[0]=data[0];
4147
+ var start=-1;
4148
+ for(var i=0; i<data.length; ++i) //取第1个有效数
4149
+ {
4150
+ if (IFrameSplitOperator.IsNumber(data[i]))
4151
+ {
4152
+ start=i;
4153
+ break;
4154
+ }
4155
+ }
4156
+
4157
+ if (start<0) return result;
4158
+
4159
+ result[start]=data[start];
4134
4160
 
4135
- for (var i=1; i<data.length; ++i)
4161
+ for (var i=start+1; i<data.length; ++i)
4136
4162
  {
4137
4163
  result[i] = result[i-1]+data[i];
4138
4164
  }
@@ -8571,6 +8571,10 @@ function CloneData(data)
8571
8571
  return item;
8572
8572
  }
8573
8573
 
8574
+ function IsRecvOverlap(rect1, rect2)
8575
+ {
8576
+ return Math.max(rect1.Left,rect2.Left) < Math.min(rect1.Right,rect2.Right) && Math.max(rect1.Top,rect2.Top) < Math.min(rect1.Bottom,rect2.Bottom);
8577
+ }
8574
8578
 
8575
8579
 
8576
8580
  function Point()
@@ -35117,7 +35121,7 @@ function ChartDrawSVG()
35117
35121
  this.DrawSVG();
35118
35122
  }
35119
35123
 
35120
- this.DrawDetail=function(rtSVG, data)
35124
+ this.DrawDetail=function(rtSVG, data, svgItem)
35121
35125
  {
35122
35126
  if (!IFrameSplitOperator.IsNonEmptyArray(data.Content)) return;
35123
35127
 
@@ -35202,7 +35206,7 @@ function ChartDrawSVG()
35202
35206
  this.Canvas.fillText(item.Data.Text, item.X, item.Y);
35203
35207
  }
35204
35208
 
35205
- this.AryDrawRect.push( {Left:rtBorder.Left, Top:rtBorder.Top, Right:rtBorder.Right, Bottom:rtBorder.Bottom, Type:"Detail" } );
35209
+ this.AryDrawRect.push( {Left:rtBorder.Left, Top:rtBorder.Top, Right:rtBorder.Right, Bottom:rtBorder.Bottom, Type:"Detail", Data:svgItem } );
35206
35210
  }
35207
35211
 
35208
35212
  this.GetDetailPosition=function(rtSVG, data)
@@ -35418,7 +35422,7 @@ function ChartDrawSVG()
35418
35422
  this.Canvas.fillStyle = svgItem.Color;
35419
35423
  this.Canvas.fillText(svgItem.Symbol, x, y);
35420
35424
 
35421
- this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG" } );
35425
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
35422
35426
 
35423
35427
  if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG,Index:i });
35424
35428
 
@@ -35435,7 +35439,7 @@ function ChartDrawSVG()
35435
35439
 
35436
35440
  if (item.Detail)
35437
35441
  {
35438
- this.DrawDetail(rtSVG,item.Detail);
35442
+ this.DrawDetail(rtSVG,item.Detail, item);
35439
35443
  }
35440
35444
 
35441
35445
  //连线
@@ -12651,6 +12651,10 @@ function CloneData(data)
12651
12651
  return item;
12652
12652
  }
12653
12653
 
12654
+ function IsRecvOverlap(rect1, rect2)
12655
+ {
12656
+ return Math.max(rect1.Left,rect2.Left) < Math.min(rect1.Right,rect2.Right) && Math.max(rect1.Top,rect2.Top) < Math.min(rect1.Bottom,rect2.Bottom);
12657
+ }
12654
12658
 
12655
12659
 
12656
12660
  function Point()
@@ -39197,7 +39201,7 @@ function ChartDrawSVG()
39197
39201
  this.DrawSVG();
39198
39202
  }
39199
39203
 
39200
- this.DrawDetail=function(rtSVG, data)
39204
+ this.DrawDetail=function(rtSVG, data, svgItem)
39201
39205
  {
39202
39206
  if (!IFrameSplitOperator.IsNonEmptyArray(data.Content)) return;
39203
39207
 
@@ -39282,7 +39286,7 @@ function ChartDrawSVG()
39282
39286
  this.Canvas.fillText(item.Data.Text, item.X, item.Y);
39283
39287
  }
39284
39288
 
39285
- this.AryDrawRect.push( {Left:rtBorder.Left, Top:rtBorder.Top, Right:rtBorder.Right, Bottom:rtBorder.Bottom, Type:"Detail" } );
39289
+ this.AryDrawRect.push( {Left:rtBorder.Left, Top:rtBorder.Top, Right:rtBorder.Right, Bottom:rtBorder.Bottom, Type:"Detail", Data:svgItem } );
39286
39290
  }
39287
39291
 
39288
39292
  this.GetDetailPosition=function(rtSVG, data)
@@ -39498,7 +39502,7 @@ function ChartDrawSVG()
39498
39502
  this.Canvas.fillStyle = svgItem.Color;
39499
39503
  this.Canvas.fillText(svgItem.Symbol, x, y);
39500
39504
 
39501
- this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG" } );
39505
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
39502
39506
 
39503
39507
  if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG,Index:i });
39504
39508
 
@@ -39515,7 +39519,7 @@ function ChartDrawSVG()
39515
39519
 
39516
39520
  if (item.Detail)
39517
39521
  {
39518
- this.DrawDetail(rtSVG,item.Detail);
39522
+ this.DrawDetail(rtSVG,item.Detail, item);
39519
39523
  }
39520
39524
 
39521
39525
  //连线
@@ -94929,15 +94933,29 @@ function JSAlgorithm(errorHandler,symbolData)
94929
94933
  let result=[];
94930
94934
  if (typeof(n)=='number')
94931
94935
  {
94932
- if (data.length<=0) return result;
94933
- if (n>=data.length) return result;
94934
-
94935
- result=data.slice(0,data.length-n);
94936
-
94937
- //平滑处理
94938
- var firstData=data[0];
94939
- for(let i=0;i<n;++i)
94940
- result.unshift(firstData);
94936
+ if (IFrameSplitOperator.IsNumber(data)) //单数值
94937
+ {
94938
+ if (n<0) return result;
94939
+ var kData=this.SymbolData.Data.Data;
94940
+ if (!kData || kData.length<=0) return result;
94941
+ var count=kData.length;
94942
+ for(var i=n;i<count;++i)
94943
+ {
94944
+ result[i]=data;
94945
+ }
94946
+ }
94947
+ else
94948
+ {
94949
+ if (data.length<=0) return result;
94950
+ if (n>=data.length) return result;
94951
+
94952
+ result=data.slice(0,data.length-n);
94953
+
94954
+ //平滑处理
94955
+ var firstData=data[0];
94956
+ for(let i=0;i<n;++i)
94957
+ result.unshift(firstData);
94958
+ }
94941
94959
  }
94942
94960
  else //n 为数组的情况
94943
94961
  {
@@ -96215,9 +96233,21 @@ function JSAlgorithm(errorHandler,symbolData)
96215
96233
  {
96216
96234
  if (n==0)
96217
96235
  {
96218
- result[0]=data[0];
96236
+ var start=-1;
96237
+ for(var i=0; i<data.length; ++i) //取第1个有效数
96238
+ {
96239
+ if (IFrameSplitOperator.IsNumber(data[i]))
96240
+ {
96241
+ start=i;
96242
+ break;
96243
+ }
96244
+ }
96245
+
96246
+ if (start<0) return result;
96247
+
96248
+ result[start]=data[start];
96219
96249
 
96220
- for (var i=1; i<data.length; ++i)
96250
+ for (var i=start+1; i<data.length; ++i)
96221
96251
  {
96222
96252
  result[i] = result[i-1]+data[i];
96223
96253
  }
@@ -127607,7 +127637,7 @@ function ScrollBarBGChart()
127607
127637
 
127608
127638
 
127609
127639
 
127610
- var HQCHART_VERSION="1.1.12428";
127640
+ var HQCHART_VERSION="1.1.12432";
127611
127641
 
127612
127642
  function PrintHQChartVersion()
127613
127643
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.12428";
8
+ var HQCHART_VERSION="1.1.12432";
9
9
 
10
10
  function PrintHQChartVersion()
11
11
  {
@@ -12695,6 +12695,10 @@ function CloneData(data)
12695
12695
  return item;
12696
12696
  }
12697
12697
 
12698
+ function IsRecvOverlap(rect1, rect2)
12699
+ {
12700
+ return Math.max(rect1.Left,rect2.Left) < Math.min(rect1.Right,rect2.Right) && Math.max(rect1.Top,rect2.Top) < Math.min(rect1.Bottom,rect2.Bottom);
12701
+ }
12698
12702
 
12699
12703
 
12700
12704
  function Point()
@@ -39241,7 +39245,7 @@ function ChartDrawSVG()
39241
39245
  this.DrawSVG();
39242
39246
  }
39243
39247
 
39244
- this.DrawDetail=function(rtSVG, data)
39248
+ this.DrawDetail=function(rtSVG, data, svgItem)
39245
39249
  {
39246
39250
  if (!IFrameSplitOperator.IsNonEmptyArray(data.Content)) return;
39247
39251
 
@@ -39326,7 +39330,7 @@ function ChartDrawSVG()
39326
39330
  this.Canvas.fillText(item.Data.Text, item.X, item.Y);
39327
39331
  }
39328
39332
 
39329
- this.AryDrawRect.push( {Left:rtBorder.Left, Top:rtBorder.Top, Right:rtBorder.Right, Bottom:rtBorder.Bottom, Type:"Detail" } );
39333
+ this.AryDrawRect.push( {Left:rtBorder.Left, Top:rtBorder.Top, Right:rtBorder.Right, Bottom:rtBorder.Bottom, Type:"Detail", Data:svgItem } );
39330
39334
  }
39331
39335
 
39332
39336
  this.GetDetailPosition=function(rtSVG, data)
@@ -39542,7 +39546,7 @@ function ChartDrawSVG()
39542
39546
  this.Canvas.fillStyle = svgItem.Color;
39543
39547
  this.Canvas.fillText(svgItem.Symbol, x, y);
39544
39548
 
39545
- this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG" } );
39549
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
39546
39550
 
39547
39551
  if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG,Index:i });
39548
39552
 
@@ -39559,7 +39563,7 @@ function ChartDrawSVG()
39559
39563
 
39560
39564
  if (item.Detail)
39561
39565
  {
39562
- this.DrawDetail(rtSVG,item.Detail);
39566
+ this.DrawDetail(rtSVG,item.Detail, item);
39563
39567
  }
39564
39568
 
39565
39569
  //连线
@@ -94973,15 +94977,29 @@ function JSAlgorithm(errorHandler,symbolData)
94973
94977
  let result=[];
94974
94978
  if (typeof(n)=='number')
94975
94979
  {
94976
- if (data.length<=0) return result;
94977
- if (n>=data.length) return result;
94978
-
94979
- result=data.slice(0,data.length-n);
94980
-
94981
- //平滑处理
94982
- var firstData=data[0];
94983
- for(let i=0;i<n;++i)
94984
- result.unshift(firstData);
94980
+ if (IFrameSplitOperator.IsNumber(data)) //单数值
94981
+ {
94982
+ if (n<0) return result;
94983
+ var kData=this.SymbolData.Data.Data;
94984
+ if (!kData || kData.length<=0) return result;
94985
+ var count=kData.length;
94986
+ for(var i=n;i<count;++i)
94987
+ {
94988
+ result[i]=data;
94989
+ }
94990
+ }
94991
+ else
94992
+ {
94993
+ if (data.length<=0) return result;
94994
+ if (n>=data.length) return result;
94995
+
94996
+ result=data.slice(0,data.length-n);
94997
+
94998
+ //平滑处理
94999
+ var firstData=data[0];
95000
+ for(let i=0;i<n;++i)
95001
+ result.unshift(firstData);
95002
+ }
94985
95003
  }
94986
95004
  else //n 为数组的情况
94987
95005
  {
@@ -96259,9 +96277,21 @@ function JSAlgorithm(errorHandler,symbolData)
96259
96277
  {
96260
96278
  if (n==0)
96261
96279
  {
96262
- result[0]=data[0];
96280
+ var start=-1;
96281
+ for(var i=0; i<data.length; ++i) //取第1个有效数
96282
+ {
96283
+ if (IFrameSplitOperator.IsNumber(data[i]))
96284
+ {
96285
+ start=i;
96286
+ break;
96287
+ }
96288
+ }
96289
+
96290
+ if (start<0) return result;
96291
+
96292
+ result[start]=data[start];
96263
96293
 
96264
- for (var i=1; i<data.length; ++i)
96294
+ for (var i=start+1; i<data.length; ++i)
96265
96295
  {
96266
96296
  result[i] = result[i-1]+data[i];
96267
96297
  }
@@ -127651,7 +127681,7 @@ function ScrollBarBGChart()
127651
127681
 
127652
127682
 
127653
127683
 
127654
- var HQCHART_VERSION="1.1.12428";
127684
+ var HQCHART_VERSION="1.1.12432";
127655
127685
 
127656
127686
  function PrintHQChartVersion()
127657
127687
  {