hqchart 1.1.12879 → 1.1.12884

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.
@@ -2335,9 +2335,9 @@ if(item.Message[0]!=null&&isDrawLeft){if(item.Font!=null)this.Canvas.font=item.F
2335
2335
  this.DrawVertical=function(){var border=this.GetBorder();var top=border.TopTitle;var bottom=border.Bottom;var right=border.RightEx;var pixelRatio=GetDevicePixelRatio();//获取设备的分辨率
2336
2336
  //JSConsole.Chart.Log('[AverageWidthFrame.DrawVertical] bottom',bottom);
2337
2337
  if(this.ChartBorder.Bottom<=5*GetDevicePixelRatio())return;//高度不够 不显示
2338
- var bottomTextExtend=null;if(this.XTextExtend){bottomTextExtend=this.XTextExtend[0];}var bottomLineExtend=null;if(this.XLineExtend){bottomLineExtend=this.XLineExtend[0];}var xPrev=null;//上一个坐标x的值
2338
+ var mapX=null;if(this.GetVerticalXCache)mapX=this.GetVerticalXCache();var bottomTextExtend=null;if(this.XTextExtend){bottomTextExtend=this.XTextExtend[0];}var bottomLineExtend=null;if(this.XLineExtend){bottomLineExtend=this.XLineExtend[0];}var xPrev=null;//上一个坐标x的值
2339
2339
  var textRightPrev=null;//上一次刻度输出右边x坐标
2340
- for(var i=0;i<this.VerticalInfo.length;++i){var x=this.GetXFromIndex(this.VerticalInfo[i].Value);if(x>right)break;if(xPrev!=null&&Math.abs(x-xPrev)<this.MinXDistance)continue;var item=this.VerticalInfo[i];var xFixed=ToFixedPoint(x);if(this.IsShowXLine){if(item.LineType==2)//虚线
2340
+ for(var i=0;i<this.VerticalInfo.length;++i){var item=this.VerticalInfo[i];var x=null;if(mapX&&mapX.has(item.Value))x=mapX.get(item.Value);else x=this.GetXFromIndex(item.Value);if(x>right)break;if(xPrev!=null&&Math.abs(x-xPrev)<this.MinXDistance)continue;var item=this.VerticalInfo[i];var xFixed=ToFixedPoint(x);if(this.IsShowXLine){if(item.LineType==2)//虚线
2341
2341
  {this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;if(item.LineDash)this.Canvas.setLineDash(item.LineDash);else this.Canvas.setLineDash([5*pixelRatio,5*pixelRatio]);this.Canvas.beginPath();this.Canvas.moveTo(xFixed,top);this.Canvas.lineTo(xFixed,bottom);this.Canvas.stroke();this.Canvas.setLineDash([]);}else if(item.LineType==3){}else if(item.LineType>0)//实线
2342
2342
  {if(g_JSChartResource.FrameXLineDash){this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;this.Canvas.setLineDash(g_JSChartResource.FrameXLineDash);//虚线
2343
2343
  this.Canvas.beginPath();this.Canvas.moveTo(xFixed,top);this.Canvas.lineTo(xFixed,bottom);this.Canvas.stroke();this.Canvas.setLineDash([]);}else{this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;this.Canvas.beginPath();this.Canvas.moveTo(xFixed,top);this.Canvas.lineTo(xFixed,bottom);this.Canvas.stroke();}}}if(item.BG&&item.BG.Color){var bgItem=item.BG;this.Canvas.fillStyle=bgItem.Color;var xStart=this.GetXFromIndex(bgItem.Index.Start);var xEnd=this.GetXFromIndex(bgItem.Index.End);var bgHeight=this.ChartBorder.Bottom;if(IFrameSplitOperator.IsNumber(bgItem.Height))bgHeight=bgItem.Height;var rtBG={Left:xStart,Width:xEnd-xStart,Top:border.Bottom,Height:bgHeight};this.Canvas.fillRect(rtBG.Left,rtBG.Top,rtBG.Width,rtBG.Height);}if(this.VerticalInfo[i].Message[0]!=null){if(this.VerticalInfo[i].Font)this.Canvas.font=this.VerticalInfo[i].Font;var textLeft=0;this.Canvas.strokeStyle=item.TextColor;var testWidth=this.Canvas.measureText(this.VerticalInfo[i].Message[0]).width;var textHeight=this.Canvas.measureText("擎").width;if(bottomTextExtend&&bottomTextExtend.Align==1){this.Canvas.textAlign="left";this.Canvas.textBaseline="top";textLeft=x;}else{if(x<testWidth/2){this.Canvas.textAlign="left";this.Canvas.textBaseline="top";textLeft=x;}else if(x+testWidth/2>=this.ChartBorder.GetChartWidth()){this.Canvas.textAlign="right";this.Canvas.textBaseline="top";textLeft=x-testWidth;}else{this.Canvas.textAlign="center";this.Canvas.textBaseline="top";textLeft=x-testWidth/2;}}if(textRightPrev==null||textLeft>textRightPrev){var yText=bottom;if(item.LineType==3){var lineLength=this.ShortXLineLength*pixelRatio;this.Canvas.beginPath();this.Canvas.moveTo(xFixed,yText);this.Canvas.lineTo(xFixed,yText+lineLength);this.Canvas.stroke();yText+=lineLength+2*pixelRatio;}if(bottomLineExtend){if(bottomLineExtend.Mode===1){if(item.Value>1){if(bottomLineExtend.Color)this.Canvas.strokeStyle=bottomLineExtend.Color;this.Canvas.beginPath();this.Canvas.moveTo(xFixed,bottom);this.Canvas.lineTo(xFixed,border.ChartHeight);this.Canvas.stroke();x+=1;}}else if(bottomLineExtend.Mode===2){if(bottomLineExtend.Width>=1){var lineLength=bottomLineExtend.Width;if(bottomLineExtend.Color)this.Canvas.strokeStyle=bottomLineExtend.Color;this.Canvas.beginPath();this.Canvas.moveTo(xFixed,yText);this.Canvas.lineTo(xFixed,yText+lineLength);this.Canvas.stroke();yText+=lineLength+2;}}}//item.TextBGColor="rgb(0,255,0)";
@@ -2572,7 +2572,8 @@ this.Canvas.strokeStyle=item.Data.Line.Color;this.Canvas.beginPath();if(item.IsH
2572
2572
  }else{this.Canvas.strokeRect(left,top,right-left-1,height);//少一个像素让边框显示出来
2573
2573
  }};//是否在X轴坐标上
2574
2574
  //this.PtInVertical=function(x,y) { return false; }
2575
- }function OverlayKLineFrame(){this.newMethod=KLineFrame;//派生
2575
+ //缓存X轴坐标刻度
2576
+ this.GetVerticalXCache=function(){if(!IFrameSplitOperator.IsNonEmptyArray(this.VerticalInfo))return null;var dataWidth=this.DataWidth;var distanceWidth=this.DistanceWidth;var xPointCount=this.XPointCount;var setIndex=new _set2.default();for(var i=0;i<this.VerticalInfo.length;++i){var item=this.VerticalInfo[i];setIndex.add(item.Value);}if(this.IsHScreen){var border=this.ChartBorder.GetHScreenBorder();var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;}else{var border=this.ChartBorder.GetBorder();var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;}var mapX=new _map2.default();for(var i=0;i<xPointCount;++i,xOffset+=dataWidth+distanceWidth){var left=xOffset;var right=xOffset+dataWidth;var x=left+(right-left)/2;if(setIndex.has(i)){mapX.set(i,x);}}return mapX;};}function OverlayKLineFrame(){this.newMethod=KLineFrame;//派生
2576
2577
  this.newMethod();delete this.newMethod;this.ClassName='OverlayKLineFrame';this.MainFrame=null;//主框架
2577
2578
  this.IsShareY=false;//使用和主框架公用Y轴
2578
2579
  this.IsCalculateYMaxMin=true;//是否计算Y最大最小值
@@ -2628,9 +2629,9 @@ for(var i=this.HorizontalInfo.length-1;i>=0;--i)//从上往下画分割线
2628
2629
  {var item=this.HorizontalInfo[i];var y=this.GetYFromData(item.Value);if(y!=null&&yPrev!=null&&Math.abs(y-yPrev)<this.MinYDistance)continue;//两个坐标在近了 就不画了
2629
2630
  //坐标信息 左边 间距小于10 画在内部
2630
2631
  if(item.Message[0]!=null&&isDrawLeft){if(item.Font!=null)this.Canvas.font=item.Font;this.Canvas.fillStyle=item.TextColor;this.Canvas.textAlign="left";if(y>=right-2)this.Canvas.textBaseline='top';else if(y<=left+2)this.Canvas.textBaseline='bottom';else this.Canvas.textBaseline="middle";var textObj={X:left,Y:y,Text:{BaseLine:this.Canvas.textBaseline,TextAlign:this.Canvas.textAlign,Font:this.Canvas.font,Value:item.Message[0]}};var xText=y,yText=top;this.Canvas.save();this.Canvas.translate(xText,yText);this.Canvas.rotate(90*Math.PI/180);this.Canvas.fillText(item.Message[0],-2,0);this.Canvas.restore();}if(item.Message[1]!=null&&isDrawRight){if(item.Font!=null)this.Canvas.font=item.Font;this.Canvas.fillStyle=item.TextColor;this.Canvas.textAlign="right";if(y>=right-2)this.Canvas.textBaseline='top';else if(y<=left+2)this.Canvas.textBaseline='bottom';else this.Canvas.textBaseline="middle";if(Array.isArray(item.Message[1]))var text=item.Message[1][0];else var text=item.Message[1];var textWidth=this.Canvas.measureText(text).width;var textObj={X:right-textWidth,Y:y,Text:{BaseLine:this.Canvas.textBaseline,TextAlign:this.Canvas.textAlign,Font:this.Canvas.font,Value:text}};var xText=y,yText=bottom;this.Canvas.save();this.Canvas.translate(xText,yText);this.Canvas.rotate(90*Math.PI/180);this.Canvas.fillText(text,-2,0);this.Canvas.restore();}yPrev=y;}}};this.GetXFromIndex=function(index,isLimit){if(isLimit===false){var border=this.ChartBorder.GetHScreenBorder();if(index>=0){var offset=border.TopEx+g_JSChartResource.FrameLeftMargin+this.DistanceWidth/2+this.DataWidth/2;for(var i=1;i<=index;++i){offset+=this.DistanceWidth+this.DataWidth;}}else{var offset=border.TopEx-(this.DistanceWidth/2+this.DataWidth+this.DistanceWidth);var absIndex=Math.abs(index);for(var i=1;i<absIndex;++i){offset-=this.DistanceWidth+this.DataWidth;}}}else{if(index<0)index=0;if(index>this.xPointCount-1)index=this.xPointCount-1;var border=this.ChartBorder.GetHScreenBorder();var offset=border.TopEx+g_JSChartResource.FrameLeftMargin+this.DistanceWidth/2+this.DataWidth/2;for(var i=1;i<=index;++i){offset+=this.DistanceWidth+this.DataWidth;}}return offset;};//画X轴
2631
- this.DrawVertical=function(){var border=this.ChartBorder.GetHScreenBorder();var left=border.Left;var right=border.RightTitle;var bottom=border.Bottom;var pixelRatio=GetDevicePixelRatio();//获取设备的分辨率
2632
+ this.DrawVertical=function(){var mapX=null;if(this.GetVerticalXCache)mapX=this.GetVerticalXCache();var border=this.ChartBorder.GetHScreenBorder();var left=border.Left;var right=border.RightTitle;var bottom=border.Bottom;var pixelRatio=GetDevicePixelRatio();//获取设备的分辨率
2632
2633
  var xPrev=null;//上一个坐标x的值
2633
- for(var i in this.VerticalInfo){var x=this.GetXFromIndex(this.VerticalInfo[i].Value);if(x>=bottom)break;if(xPrev!=null&&Math.abs(x-xPrev)<80)continue;var item=this.VerticalInfo[i];if(item.LineType==2){this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;this.Canvas.setLineDash([5*pixelRatio,5*pixelRatio]);//虚线
2634
+ for(var i=0;i<this.VerticalInfo.length;++i){var item=this.VerticalInfo[i];var x=null;if(mapX&&mapX.has(item.Value))x=mapX.get(item.Value);else x=this.GetXFromIndex(item.Value);if(x>=bottom)break;if(xPrev!=null&&Math.abs(x-xPrev)<80)continue;if(item.LineType==2){this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;this.Canvas.setLineDash([5*pixelRatio,5*pixelRatio]);//虚线
2634
2635
  this.Canvas.beginPath();this.Canvas.moveTo(left,ToFixedPoint(x));this.Canvas.lineTo(right,ToFixedPoint(x));this.Canvas.stroke();this.Canvas.setLineDash([]);}else if(item.LineType>0){this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;if(g_JSChartResource.FrameXLineDash){this.Canvas.setLineDash(g_JSChartResource.FrameXLineDash);//虚线
2635
2636
  this.Canvas.beginPath();this.Canvas.moveTo(left,ToFixedPoint(x));this.Canvas.lineTo(right,ToFixedPoint(x));this.Canvas.stroke();this.Canvas.setLineDash([]);}else//实线
2636
2637
  {this.Canvas.beginPath();this.Canvas.moveTo(left,ToFixedPoint(x));this.Canvas.lineTo(right,ToFixedPoint(x));this.Canvas.stroke();}}if(this.VerticalInfo[i].Message[0]!=null){if(this.VerticalInfo[i].Font!=null)this.Canvas.font=this.VerticalInfo[i].Font;this.Canvas.fillStyle=this.VerticalInfo[i].TextColor;var testWidth=this.Canvas.measureText(this.VerticalInfo[i].Message[0]).width;if(x<testWidth/2){this.Canvas.textAlign="left";this.Canvas.textBaseline="top";}else{this.Canvas.textAlign="center";this.Canvas.textBaseline="top";}var xText=left,yText=x;this.Canvas.save();this.Canvas.translate(xText,yText);this.Canvas.rotate(90*Math.PI/180);this.Canvas.fillText(this.VerticalInfo[i].Message[0],0,this.XBottomOffset);this.Canvas.restore();}xPrev=x;}};//Y坐标转y轴数值
@@ -4164,9 +4165,9 @@ tooltip.Data=item;tooltip.ChartPaint=this;tooltip.Type=3;//异动信息
4164
4165
  return true;}}return false;};}//MACD森林线 支持横屏
4165
4166
  function ChartMACD(){this.newMethod=IChartPainting;//派生
4166
4167
  this.newMethod();delete this.newMethod;this.ClassName="ChartMACD";this.UpColor=g_JSChartResource.UpBarColor;this.DownColor=g_JSChartResource.DownBarColor;this.LineWidth=1;this.DrawSelectedStatus=this.DrawLinePoint;this.ExportData=this.ExportArrayData;this.PtInChart=function(x,y){var dataWidth=this.ChartFrame.DataWidth;var barWidth=this.LineWidth*GetDevicePixelRatio();if(this.barWidth==50)barWidth=null;else if(barWidth>dataWidth)barWidth=dataWidth;if(barWidth<4)barWidth=4;//宽度太小了点不到
4167
- return this.PtInBar(x,y,{BarWidth:barWidth});};this.DrawBars=function(lineWidth,bUpBar){var isMinute=this.IsMinuteFrame();var border=this.ChartBorder.GetBorder();var dataWidth=this.ChartFrame.DataWidth;var distanceWidth=this.ChartFrame.DistanceWidth;var xPointCount=this.ChartFrame.XPointCount;var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;var chartright=border.RightEx;var lockRect=this.GetLockRect();if(lockRect)chartright=lockRect.Left;if(bUpBar)this.Canvas.strokeStyle=this.UpColor;else this.Canvas.strokeStyle=this.DownColor;var yBottom=this.ChartFrame.GetYFromData(0);this.Canvas.beginPath();var drawCount=0;for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j,xOffset+=dataWidth+distanceWidth){var value=this.Data.Data[i];if(value==null)continue;if(bUpBar){if(value<0)continue;}else{if(value>=0)continue;}if(isMinute){var x=this.ChartFrame.GetXFromIndex(j);}else{var left=xOffset;var right=xOffset+dataWidth;if(right>chartright)break;var x=left+(right-left)/2;}if(x>chartright)break;var y=this.ChartFrame.GetYFromData(value);var xFix=ToFixedPoint2(lineWidth,x);//毛边修正
4168
- this.Canvas.moveTo(xFix,yBottom);this.Canvas.lineTo(xFix,y);++drawCount;}if(drawCount>0)this.Canvas.stroke();};this.Draw=function(){if(!this.IsShow||this.ChartFrame.IsMinSize||!this.IsVisible)return;if(this.IsShowIndexTitleOnly())return;if(this.IsHideScriptIndex())return;if(this.NotSupportMessage){this.DrawNotSupportmessage();return;}if(this.ChartFrame.IsHScreen===true){this.HScreenDraw();return;}var dataWidth=this.ChartFrame.DataWidth;var lineWidth=this.LineWidth*GetDevicePixelRatio();if(this.LineWidth==50)lineWidth=dataWidth;else if(lineWidth>dataWidth)lineWidth=dataWidth;var backupLineWidth=this.Canvas.lineWidth;this.Canvas.lineWidth=lineWidth;//上下分开画
4169
- this.DrawBars(lineWidth,true);this.DrawBars(lineWidth,false);this.Canvas.lineWidth=backupLineWidth;};this.HScreenDraw=function(){var dataWidth=this.ChartFrame.DataWidth;var distanceWidth=this.ChartFrame.DistanceWidth;var border=this.ChartBorder.GetHScreenBorder();var chartright=border.BottomEx;var xPointCount=this.ChartFrame.XPointCount;var lockRect=this.GetLockRect();if(lockRect)chartright=lockRect.Top;var yBottom=this.ChartFrame.GetYFromData(0);var lineWidth=this.LineWidth*GetDevicePixelRatio();if(this.LineWidth==50)lineWidth=dataWidth;else if(lineWidth>dataWidth)lineWidth=dataWidth;var backupLineWidth=this.Canvas.lineWidth;this.Canvas.lineWidth=lineWidth;for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j){var value=this.Data.Data[i];if(value==null)continue;var x=this.ChartFrame.GetXFromIndex(j);var y=this.ChartFrame.GetYFromData(value);if(x>chartright)break;this.Canvas.beginPath();this.Canvas.moveTo(yBottom,ToFixedPoint(x));this.Canvas.lineTo(y,ToFixedPoint(x));if(value>=0)this.Canvas.strokeStyle=this.UpColor;else this.Canvas.strokeStyle=this.DownColor;this.Canvas.stroke();this.Canvas.closePath();}this.Canvas.lineWidth=backupLineWidth;};this.GetItemData=function(indexData){if(!indexData)return null;if(!IFrameSplitOperator.IsNumber(indexData.Index))return null;if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return null;var index=indexData.Index;if(index<0||index>=this.Data.Data.length)return null;var item=this.Data.Data[index];return[{Value:item,Color:item>0?this.UpColor:this.DownColor,Name:this.Name}];};}//柱子
4168
+ return this.PtInBar(x,y,{BarWidth:barWidth});};this.DrawBars=function(lineWidth,bUpBar){var isMinute=this.IsMinuteFrame();var dataWidth=this.ChartFrame.DataWidth;var distanceWidth=this.ChartFrame.DistanceWidth;var xPointCount=this.ChartFrame.XPointCount;var isHSCreen=this.ChartFrame.IsHScreen===true;if(isHSCreen){var border=this.ChartBorder.GetHScreenBorder();var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;var chartright=border.BottomEx;var lockRect=this.GetLockRect();if(lockRect)chartright=lockRect.Top;}else{var border=this.ChartBorder.GetBorder();var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;var chartright=border.RightEx;var lockRect=this.GetLockRect();if(lockRect)chartright=lockRect.Left;}if(bUpBar)this.Canvas.strokeStyle=this.UpColor;else this.Canvas.strokeStyle=this.DownColor;var yBottom=this.ChartFrame.GetYFromData(0);this.Canvas.beginPath();var drawCount=0;for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j,xOffset+=dataWidth+distanceWidth){var value=this.Data.Data[i];if(value==null)continue;if(bUpBar){if(value<0)continue;}else{if(value>=0)continue;}if(isMinute){var x=this.ChartFrame.GetXFromIndex(j);}else{var left=xOffset;var right=xOffset+dataWidth;if(right>chartright)break;var x=left+(right-left)/2;}if(x>chartright)break;var y=this.ChartFrame.GetYFromData(value);var xFix=ToFixedPoint2(lineWidth,x);//毛边修正
4169
+ if(isHSCreen){this.Canvas.moveTo(yBottom,ToFixedPoint(x));this.Canvas.lineTo(y,ToFixedPoint(x));}else{this.Canvas.moveTo(xFix,yBottom);this.Canvas.lineTo(xFix,y);}++drawCount;}if(drawCount>0)this.Canvas.stroke();};this.Draw=function(){if(!this.IsShow||this.ChartFrame.IsMinSize||!this.IsVisible)return;if(this.IsShowIndexTitleOnly())return;if(this.IsHideScriptIndex())return;if(this.NotSupportMessage){this.DrawNotSupportmessage();return;}var dataWidth=this.ChartFrame.DataWidth;var lineWidth=this.LineWidth*GetDevicePixelRatio();if(this.LineWidth==50)lineWidth=dataWidth;else if(lineWidth>dataWidth)lineWidth=dataWidth;var backupLineWidth=this.Canvas.lineWidth;this.Canvas.lineWidth=lineWidth;//上下分开画
4170
+ this.DrawBars(lineWidth,true);this.DrawBars(lineWidth,false);this.Canvas.lineWidth=backupLineWidth;};this.GetItemData=function(indexData){if(!indexData)return null;if(!IFrameSplitOperator.IsNumber(indexData.Index))return null;if(!this.Data||!IFrameSplitOperator.IsNonEmptyArray(this.Data.Data))return null;var index=indexData.Index;if(index<0||index>=this.Data.Data.length)return null;var item=this.Data.Data[index];return[{Value:item,Color:item>0?this.UpColor:this.DownColor,Name:this.Name}];};}//柱子
4170
4171
  function ChartBar(){this.newMethod=IChartPainting;//派生
4171
4172
  this.newMethod();delete this.newMethod;this.ClassName="ChartBar";this.UpBarColor=g_JSChartResource.UpBarColor;this.DownBarColor=g_JSChartResource.DownBarColor;this.Draw=function(){if(this.ChartFrame.IsMinSize)return;if(this.NotSupportMessage){this.DrawNotSupportmessage();return;}var dataWidth=this.ChartFrame.DataWidth;var distanceWidth=this.ChartFrame.DistanceWidth;var chartright=this.ChartBorder.GetRight();var xPointCount=this.ChartFrame.XPointCount;var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;var bFirstPoint=true;var drawCount=0;var yBottom=this.ChartFrame.GetYFromData(0);if(dataWidth>=4){yBottom=ToFixedRect(yBottom);//调整为整数
4172
4173
  for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j,xOffset+=dataWidth+distanceWidth){var value=this.Data.Data[i];if(value==null||value==0)continue;var left=xOffset;var right=xOffset+dataWidth;if(right>chartright)break;var x=this.ChartFrame.GetXFromIndex(j);var y=this.ChartFrame.GetYFromData(value);if(value>0)this.Canvas.fillStyle=this.UpBarColor;else this.Canvas.fillStyle=this.DownBarColor;//高度调整为整数
@@ -11888,7 +11889,8 @@ var aryPoint=[];for(var i in sourceData){var item=sourceData[i];for(var j in ite
11888
11889
  sourceData.sort(function(a,b){return a.Date-b.Date;});kdata.GetDateIndex(sourceData);return sourceData;}else if(ChartData.IsMinutePeriod(hqChart.Period,true)||ChartData.IsTickPeriod(hqChart.Period)||ChartData.IsSecondPeriod(hqChart.Period)||ChartData.IsMilliSecondPeriod(hqChart.Period))//分钟线
11889
11890
  {var kdata=hqChart.ChartPaint[0].Data;//K线
11890
11891
  sourceData.sort(function(a,b){if(a.Date==b.Date)return a.Time-b.Time;return a.Date-b.Date;});kdata.GetDateTimeIndex(sourceData);return sourceData;}else if(this.HQDataType==HQ_DATA_TYPE.MINUTE_ID||this.HQDataType==HQ_DATA_TYPE.MULTIDAY_MINUTE_ID){var minuteData=hqChart.SourceData;sourceData.sort(function(a,b){if(a.Date==b.Date)return a.Time-b.Time;return a.Date-b.Date;});minuteData.GetDateTimeIndex(sourceData);return sourceData;}return null;};this.FittingData=function(jsonData,hqChart){var outVar=jsonData.outvar;var date=jsonData.date;var time=jsonData.time;var kdata=hqChart.ChartPaint[0].Data;//把数据拟合到kdata上
11891
- var result=[];if(!outVar)return result;for(var i=0;i<outVar.length;++i){var item=outVar[i];var indexData=[];var outVarItem={Name:item.name,Type:item.type};if(item.color)outVarItem.Color=item.color;if(item.data){outVarItem.Data=this.FittingArray(item.data,date,time,hqChart);if(item.color)outVarItem.Color=item.color;if(item.linewidth)outVarItem.LineWidth=item.linewidth;if(IFrameSplitOperator.IsBool(item.isshow))outVarItem.IsShow=item.isshow;//是否绘制线段
11892
+ var result=[];if(!outVar)return result;for(var i=0;i<outVar.length;++i){var item=outVar[i];var indexData=[];var outVarItem={Name:item.name,Type:item.type};if(item.color)outVarItem.Color=item.color;if(IFrameSplitOperator.IsBool(item.IsShowTitle))outVarItem.IsShowTitle=item.IsShowTitle;//是否显示指标标题
11893
+ if(item.data){outVarItem.Data=this.FittingArray(item.data,date,time,hqChart);if(item.color)outVarItem.Color=item.color;if(item.linewidth)outVarItem.LineWidth=item.linewidth;if(IFrameSplitOperator.IsBool(item.isshow))outVarItem.IsShow=item.isshow;//是否绘制线段
11892
11894
  if(item.isexdata==true)outVarItem.IsExData=true;if(item.BreakPoint)outVarItem.BreakPoint=item.BreakPoint;result.push(outVarItem);}else if(item.Draw){var draw=item.Draw;var drawItem={};if(draw.DrawType=='DRAWICON')//图标
11893
11895
  {drawItem.Icon=draw.Icon;drawItem.Name=draw.Name;drawItem.DrawType=draw.DrawType;drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart);outVarItem.Draw=drawItem;result.push(outVarItem);}else if(draw.DrawType=='DRAWTEXT')//文本
11894
11896
  {drawItem.Text=draw.Text;drawItem.Name=draw.Name;drawItem.DrawType=draw.DrawType;drawItem.DrawData=this.FittingArray(draw.DrawData,date,time,hqChart);outVarItem.Draw=drawItem;result.push(outVarItem);}else if(draw.DrawType=='STICKLINE')//柱子
@@ -13034,7 +13036,7 @@ hisData.Symbol=message.symbol;}var stockObj={HQDataType:HQ_DATA_TYPE.KLINE_ID,St
13034
13036
  this.ExecuteScript(item,data);}this.Status=0;}};this.OnExecuteFinish=function(data,indexInfo,jsExectute,jobInfo){var message={Data:data,IndexInfo:indexInfo,ID:JSCHART_WORKER_MESSAGE_ID.FINISH_EXECUTE_SCRIPT,JobInfo:jobInfo};postMessage(message);};this.OnExecuteError=function(error,indexInfo,jobData){var message={IndexInfo:indexInfo,ID:JSCHART_WORKER_MESSAGE_ID.ERROR_EXECUTE_SCRIPT,Error:error};postMessage(message);};}/********************************************************************************
13035
13037
  * 版本信息输出
13036
13038
  *
13037
- */var HQCHART_VERSION="1.1.12878";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();//把给外界调用的方法暴露出来
13039
+ */var HQCHART_VERSION="1.1.12883";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();//把给外界调用的方法暴露出来
13038
13040
  exports.default=(_jsChartInit$jsChartS={jsChartInit:JSChart.Init,jsChartStyle:JSChart.SetStyle,// IsIndexSymbol:IsIndexSymbol,
13039
13041
  // BaseIndex:BaseIndex,
13040
13042
  // ChartLine:ChartLine,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hqchart",
3
- "version": "1.1.12879",
3
+ "version": "1.1.12884",
4
4
  "description": "HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接",
5
5
  "main": "lib/main.js",
6
6
  "scripts": {
@@ -23621,6 +23621,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
23621
23621
  var indexData=[];
23622
23622
  var outVarItem={Name:item.name,Type:item.type};
23623
23623
  if (item.color) outVarItem.Color=item.color;
23624
+ if (IFrameSplitOperator.IsBool(item.IsShowTitle)) outVarItem.IsShowTitle = item.IsShowTitle; //是否显示指标标题
23624
23625
  if (item.data)
23625
23626
  {
23626
23627
  outVarItem.Data=this.FittingArray(item.data,date,time,hqChart);
@@ -10643,6 +10643,9 @@ function AverageWidthFrame()
10643
10643
  //JSConsole.Chart.Log('[AverageWidthFrame.DrawVertical] bottom',bottom);
10644
10644
  if (this.ChartBorder.Bottom<=5*GetDevicePixelRatio()) return; //高度不够 不显示
10645
10645
 
10646
+ var mapX=null;
10647
+ if (this.GetVerticalXCache) mapX=this.GetVerticalXCache();
10648
+
10646
10649
  var bottomTextExtend=null;
10647
10650
  if (this.XTextExtend)
10648
10651
  {
@@ -10659,7 +10662,10 @@ function AverageWidthFrame()
10659
10662
  var textRightPrev=null; //上一次刻度输出右边x坐标
10660
10663
  for(var i=0; i<this.VerticalInfo.length; ++i)
10661
10664
  {
10662
- var x=this.GetXFromIndex(this.VerticalInfo[i].Value);
10665
+ var item=this.VerticalInfo[i];
10666
+ var x=null;
10667
+ if (mapX && mapX.has(item.Value)) x=mapX.get(item.Value);
10668
+ else x=this.GetXFromIndex(item.Value);
10663
10669
  if (x>right) break;
10664
10670
  if (xPrev!=null && Math.abs(x-xPrev)<this.MinXDistance) continue;
10665
10671
 
@@ -14995,6 +15001,49 @@ function KLineFrame()
14995
15001
 
14996
15002
  //是否在X轴坐标上
14997
15003
  //this.PtInVertical=function(x,y) { return false; }
15004
+
15005
+ //缓存X轴坐标刻度
15006
+ this.GetVerticalXCache=function()
15007
+ {
15008
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.VerticalInfo)) return null;
15009
+
15010
+ var dataWidth=this.DataWidth;
15011
+ var distanceWidth=this.DistanceWidth;
15012
+ var xPointCount=this.XPointCount;
15013
+
15014
+ var setIndex=new Set();
15015
+ for(var i=0; i<this.VerticalInfo.length; ++i)
15016
+ {
15017
+ var item=this.VerticalInfo[i];
15018
+ setIndex.add(item.Value);
15019
+ }
15020
+
15021
+ if (this.IsHScreen)
15022
+ {
15023
+ var border=this.ChartBorder.GetHScreenBorder();
15024
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
15025
+ }
15026
+ else
15027
+ {
15028
+ var border=this.ChartBorder.GetBorder();
15029
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
15030
+ }
15031
+
15032
+ var mapX=new Map();
15033
+ for(var i=0;i<xPointCount;++i, xOffset+=(dataWidth+distanceWidth))
15034
+ {
15035
+ var left=xOffset;
15036
+ var right=xOffset+dataWidth;
15037
+ var x=left+(right-left)/2;
15038
+
15039
+ if (setIndex.has(i))
15040
+ {
15041
+ mapX.set(i, x);
15042
+ }
15043
+ }
15044
+
15045
+ return mapX;
15046
+ }
14998
15047
  }
14999
15048
 
15000
15049
  function OverlayKLineFrame()
@@ -16034,19 +16083,25 @@ function KLineHScreenFrame()
16034
16083
  //画X轴
16035
16084
  this.DrawVertical=function()
16036
16085
  {
16086
+ var mapX=null;
16087
+ if (this.GetVerticalXCache) mapX=this.GetVerticalXCache();
16088
+
16037
16089
  var border=this.ChartBorder.GetHScreenBorder();
16038
16090
  var left=border.Left;
16039
16091
  var right=border.RightTitle;
16040
16092
  var bottom=border.Bottom;
16041
16093
  var pixelRatio = GetDevicePixelRatio(); //获取设备的分辨率
16042
16094
  var xPrev=null; //上一个坐标x的值
16043
- for(var i in this.VerticalInfo)
16095
+ for(var i=0; i<this.VerticalInfo.length; ++i)
16044
16096
  {
16045
- var x=this.GetXFromIndex(this.VerticalInfo[i].Value);
16097
+ var item=this.VerticalInfo[i];
16098
+ var x=null;
16099
+ if (mapX && mapX.has(item.Value)) x=mapX.get(item.Value);
16100
+ else x=this.GetXFromIndex(item.Value);
16101
+
16046
16102
  if (x>=bottom) break;
16047
16103
  if (xPrev!=null && Math.abs(x-xPrev)<80) continue;
16048
16104
 
16049
- var item=this.VerticalInfo[i];
16050
16105
  if (item.LineType==2)
16051
16106
  {
16052
16107
  this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;
@@ -33559,15 +33614,30 @@ function ChartMACD()
33559
33614
  this.DrawBars=function(lineWidth, bUpBar)
33560
33615
  {
33561
33616
  var isMinute=this.IsMinuteFrame();
33562
- var border=this.ChartBorder.GetBorder();
33617
+
33563
33618
  var dataWidth=this.ChartFrame.DataWidth;
33564
33619
  var distanceWidth=this.ChartFrame.DistanceWidth;
33565
33620
  var xPointCount=this.ChartFrame.XPointCount;
33566
- var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
33621
+ var isHSCreen=this.ChartFrame.IsHScreen===true;
33622
+
33623
+ if (isHSCreen)
33624
+ {
33625
+ var border=this.ChartBorder.GetHScreenBorder();
33626
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
33627
+ var chartright=border.BottomEx;
33628
+ var lockRect=this.GetLockRect();
33629
+ if (lockRect) chartright=lockRect.Top;
33630
+ }
33631
+ else
33632
+ {
33633
+ var border=this.ChartBorder.GetBorder();
33634
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
33635
+
33636
+ var chartright=border.RightEx;
33637
+ var lockRect=this.GetLockRect();
33638
+ if (lockRect) chartright=lockRect.Left;
33639
+ }
33567
33640
 
33568
- var chartright=border.RightEx;
33569
- var lockRect=this.GetLockRect();
33570
- if (lockRect) chartright=lockRect.Left;
33571
33641
 
33572
33642
  if (bUpBar) this.Canvas.strokeStyle=this.UpColor;
33573
33643
  else this.Canvas.strokeStyle=this.DownColor;
@@ -33604,8 +33674,18 @@ function ChartMACD()
33604
33674
 
33605
33675
  var y=this.ChartFrame.GetYFromData(value);
33606
33676
  var xFix=ToFixedPoint2(lineWidth, x); //毛边修正
33607
- this.Canvas.moveTo(xFix,yBottom);
33608
- this.Canvas.lineTo(xFix,y);
33677
+
33678
+ if (isHSCreen)
33679
+ {
33680
+ this.Canvas.moveTo(yBottom,ToFixedPoint(x));
33681
+ this.Canvas.lineTo(y,ToFixedPoint(x));
33682
+ }
33683
+ else
33684
+ {
33685
+ this.Canvas.moveTo(xFix,yBottom);
33686
+ this.Canvas.lineTo(xFix,y);
33687
+ }
33688
+
33609
33689
  ++drawCount;
33610
33690
  }
33611
33691
 
@@ -33624,12 +33704,6 @@ function ChartMACD()
33624
33704
  return;
33625
33705
  }
33626
33706
 
33627
- if (this.ChartFrame.IsHScreen===true)
33628
- {
33629
- this.HScreenDraw();
33630
- return;
33631
- }
33632
-
33633
33707
  var dataWidth=this.ChartFrame.DataWidth;
33634
33708
  var lineWidth=this.LineWidth*GetDevicePixelRatio();
33635
33709
  if (this.LineWidth==50) lineWidth=dataWidth;
@@ -33645,48 +33719,6 @@ function ChartMACD()
33645
33719
  this.Canvas.lineWidth=backupLineWidth;
33646
33720
  }
33647
33721
 
33648
- this.HScreenDraw=function()
33649
- {
33650
- var dataWidth=this.ChartFrame.DataWidth;
33651
- var distanceWidth=this.ChartFrame.DistanceWidth;
33652
- var border=this.ChartBorder.GetHScreenBorder();
33653
- var chartright=border.BottomEx;
33654
- var xPointCount=this.ChartFrame.XPointCount;
33655
- var lockRect=this.GetLockRect();
33656
- if (lockRect) chartright=lockRect.Top;
33657
-
33658
- var yBottom=this.ChartFrame.GetYFromData(0);
33659
-
33660
- var lineWidth=this.LineWidth*GetDevicePixelRatio();
33661
- if (this.LineWidth==50) lineWidth=dataWidth;
33662
- else if (lineWidth>dataWidth) lineWidth=dataWidth;
33663
-
33664
- var backupLineWidth=this.Canvas.lineWidth;
33665
- this.Canvas.lineWidth=lineWidth;
33666
-
33667
- for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
33668
- {
33669
- var value=this.Data.Data[i];
33670
- if (value==null) continue;
33671
-
33672
- var x=this.ChartFrame.GetXFromIndex(j);
33673
- var y=this.ChartFrame.GetYFromData(value);
33674
-
33675
- if (x>chartright) break;
33676
-
33677
- this.Canvas.beginPath();
33678
- this.Canvas.moveTo(yBottom,ToFixedPoint(x));
33679
- this.Canvas.lineTo(y,ToFixedPoint(x));
33680
-
33681
- if (value>=0) this.Canvas.strokeStyle=this.UpColor;
33682
- else this.Canvas.strokeStyle=this.DownColor;
33683
- this.Canvas.stroke();
33684
- this.Canvas.closePath();
33685
- }
33686
-
33687
- this.Canvas.lineWidth=backupLineWidth;
33688
- }
33689
-
33690
33722
  this.GetItemData=function(indexData)
33691
33723
  {
33692
33724
  if (!indexData) return null;
@@ -14810,6 +14810,9 @@ function AverageWidthFrame()
14810
14810
  //JSConsole.Chart.Log('[AverageWidthFrame.DrawVertical] bottom',bottom);
14811
14811
  if (this.ChartBorder.Bottom<=5*GetDevicePixelRatio()) return; //高度不够 不显示
14812
14812
 
14813
+ var mapX=null;
14814
+ if (this.GetVerticalXCache) mapX=this.GetVerticalXCache();
14815
+
14813
14816
  var bottomTextExtend=null;
14814
14817
  if (this.XTextExtend)
14815
14818
  {
@@ -14826,7 +14829,10 @@ function AverageWidthFrame()
14826
14829
  var textRightPrev=null; //上一次刻度输出右边x坐标
14827
14830
  for(var i=0; i<this.VerticalInfo.length; ++i)
14828
14831
  {
14829
- var x=this.GetXFromIndex(this.VerticalInfo[i].Value);
14832
+ var item=this.VerticalInfo[i];
14833
+ var x=null;
14834
+ if (mapX && mapX.has(item.Value)) x=mapX.get(item.Value);
14835
+ else x=this.GetXFromIndex(item.Value);
14830
14836
  if (x>right) break;
14831
14837
  if (xPrev!=null && Math.abs(x-xPrev)<this.MinXDistance) continue;
14832
14838
 
@@ -19162,6 +19168,49 @@ function KLineFrame()
19162
19168
 
19163
19169
  //是否在X轴坐标上
19164
19170
  //this.PtInVertical=function(x,y) { return false; }
19171
+
19172
+ //缓存X轴坐标刻度
19173
+ this.GetVerticalXCache=function()
19174
+ {
19175
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.VerticalInfo)) return null;
19176
+
19177
+ var dataWidth=this.DataWidth;
19178
+ var distanceWidth=this.DistanceWidth;
19179
+ var xPointCount=this.XPointCount;
19180
+
19181
+ var setIndex=new Set();
19182
+ for(var i=0; i<this.VerticalInfo.length; ++i)
19183
+ {
19184
+ var item=this.VerticalInfo[i];
19185
+ setIndex.add(item.Value);
19186
+ }
19187
+
19188
+ if (this.IsHScreen)
19189
+ {
19190
+ var border=this.ChartBorder.GetHScreenBorder();
19191
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
19192
+ }
19193
+ else
19194
+ {
19195
+ var border=this.ChartBorder.GetBorder();
19196
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
19197
+ }
19198
+
19199
+ var mapX=new Map();
19200
+ for(var i=0;i<xPointCount;++i, xOffset+=(dataWidth+distanceWidth))
19201
+ {
19202
+ var left=xOffset;
19203
+ var right=xOffset+dataWidth;
19204
+ var x=left+(right-left)/2;
19205
+
19206
+ if (setIndex.has(i))
19207
+ {
19208
+ mapX.set(i, x);
19209
+ }
19210
+ }
19211
+
19212
+ return mapX;
19213
+ }
19165
19214
  }
19166
19215
 
19167
19216
  function OverlayKLineFrame()
@@ -20201,19 +20250,25 @@ function KLineHScreenFrame()
20201
20250
  //画X轴
20202
20251
  this.DrawVertical=function()
20203
20252
  {
20253
+ var mapX=null;
20254
+ if (this.GetVerticalXCache) mapX=this.GetVerticalXCache();
20255
+
20204
20256
  var border=this.ChartBorder.GetHScreenBorder();
20205
20257
  var left=border.Left;
20206
20258
  var right=border.RightTitle;
20207
20259
  var bottom=border.Bottom;
20208
20260
  var pixelRatio = GetDevicePixelRatio(); //获取设备的分辨率
20209
20261
  var xPrev=null; //上一个坐标x的值
20210
- for(var i in this.VerticalInfo)
20262
+ for(var i=0; i<this.VerticalInfo.length; ++i)
20211
20263
  {
20212
- var x=this.GetXFromIndex(this.VerticalInfo[i].Value);
20264
+ var item=this.VerticalInfo[i];
20265
+ var x=null;
20266
+ if (mapX && mapX.has(item.Value)) x=mapX.get(item.Value);
20267
+ else x=this.GetXFromIndex(item.Value);
20268
+
20213
20269
  if (x>=bottom) break;
20214
20270
  if (xPrev!=null && Math.abs(x-xPrev)<80) continue;
20215
20271
 
20216
- var item=this.VerticalInfo[i];
20217
20272
  if (item.LineType==2)
20218
20273
  {
20219
20274
  this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;
@@ -37726,15 +37781,30 @@ function ChartMACD()
37726
37781
  this.DrawBars=function(lineWidth, bUpBar)
37727
37782
  {
37728
37783
  var isMinute=this.IsMinuteFrame();
37729
- var border=this.ChartBorder.GetBorder();
37784
+
37730
37785
  var dataWidth=this.ChartFrame.DataWidth;
37731
37786
  var distanceWidth=this.ChartFrame.DistanceWidth;
37732
37787
  var xPointCount=this.ChartFrame.XPointCount;
37733
- var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
37788
+ var isHSCreen=this.ChartFrame.IsHScreen===true;
37789
+
37790
+ if (isHSCreen)
37791
+ {
37792
+ var border=this.ChartBorder.GetHScreenBorder();
37793
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
37794
+ var chartright=border.BottomEx;
37795
+ var lockRect=this.GetLockRect();
37796
+ if (lockRect) chartright=lockRect.Top;
37797
+ }
37798
+ else
37799
+ {
37800
+ var border=this.ChartBorder.GetBorder();
37801
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
37802
+
37803
+ var chartright=border.RightEx;
37804
+ var lockRect=this.GetLockRect();
37805
+ if (lockRect) chartright=lockRect.Left;
37806
+ }
37734
37807
 
37735
- var chartright=border.RightEx;
37736
- var lockRect=this.GetLockRect();
37737
- if (lockRect) chartright=lockRect.Left;
37738
37808
 
37739
37809
  if (bUpBar) this.Canvas.strokeStyle=this.UpColor;
37740
37810
  else this.Canvas.strokeStyle=this.DownColor;
@@ -37771,8 +37841,18 @@ function ChartMACD()
37771
37841
 
37772
37842
  var y=this.ChartFrame.GetYFromData(value);
37773
37843
  var xFix=ToFixedPoint2(lineWidth, x); //毛边修正
37774
- this.Canvas.moveTo(xFix,yBottom);
37775
- this.Canvas.lineTo(xFix,y);
37844
+
37845
+ if (isHSCreen)
37846
+ {
37847
+ this.Canvas.moveTo(yBottom,ToFixedPoint(x));
37848
+ this.Canvas.lineTo(y,ToFixedPoint(x));
37849
+ }
37850
+ else
37851
+ {
37852
+ this.Canvas.moveTo(xFix,yBottom);
37853
+ this.Canvas.lineTo(xFix,y);
37854
+ }
37855
+
37776
37856
  ++drawCount;
37777
37857
  }
37778
37858
 
@@ -37791,12 +37871,6 @@ function ChartMACD()
37791
37871
  return;
37792
37872
  }
37793
37873
 
37794
- if (this.ChartFrame.IsHScreen===true)
37795
- {
37796
- this.HScreenDraw();
37797
- return;
37798
- }
37799
-
37800
37874
  var dataWidth=this.ChartFrame.DataWidth;
37801
37875
  var lineWidth=this.LineWidth*GetDevicePixelRatio();
37802
37876
  if (this.LineWidth==50) lineWidth=dataWidth;
@@ -37812,48 +37886,6 @@ function ChartMACD()
37812
37886
  this.Canvas.lineWidth=backupLineWidth;
37813
37887
  }
37814
37888
 
37815
- this.HScreenDraw=function()
37816
- {
37817
- var dataWidth=this.ChartFrame.DataWidth;
37818
- var distanceWidth=this.ChartFrame.DistanceWidth;
37819
- var border=this.ChartBorder.GetHScreenBorder();
37820
- var chartright=border.BottomEx;
37821
- var xPointCount=this.ChartFrame.XPointCount;
37822
- var lockRect=this.GetLockRect();
37823
- if (lockRect) chartright=lockRect.Top;
37824
-
37825
- var yBottom=this.ChartFrame.GetYFromData(0);
37826
-
37827
- var lineWidth=this.LineWidth*GetDevicePixelRatio();
37828
- if (this.LineWidth==50) lineWidth=dataWidth;
37829
- else if (lineWidth>dataWidth) lineWidth=dataWidth;
37830
-
37831
- var backupLineWidth=this.Canvas.lineWidth;
37832
- this.Canvas.lineWidth=lineWidth;
37833
-
37834
- for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
37835
- {
37836
- var value=this.Data.Data[i];
37837
- if (value==null) continue;
37838
-
37839
- var x=this.ChartFrame.GetXFromIndex(j);
37840
- var y=this.ChartFrame.GetYFromData(value);
37841
-
37842
- if (x>chartright) break;
37843
-
37844
- this.Canvas.beginPath();
37845
- this.Canvas.moveTo(yBottom,ToFixedPoint(x));
37846
- this.Canvas.lineTo(y,ToFixedPoint(x));
37847
-
37848
- if (value>=0) this.Canvas.strokeStyle=this.UpColor;
37849
- else this.Canvas.strokeStyle=this.DownColor;
37850
- this.Canvas.stroke();
37851
- this.Canvas.closePath();
37852
- }
37853
-
37854
- this.Canvas.lineWidth=backupLineWidth;
37855
- }
37856
-
37857
37889
  this.GetItemData=function(indexData)
37858
37890
  {
37859
37891
  if (!indexData) return null;
@@ -119229,6 +119261,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
119229
119261
  var indexData=[];
119230
119262
  var outVarItem={Name:item.name,Type:item.type};
119231
119263
  if (item.color) outVarItem.Color=item.color;
119264
+ if (IFrameSplitOperator.IsBool(item.IsShowTitle)) outVarItem.IsShowTitle = item.IsShowTitle; //是否显示指标标题
119232
119265
  if (item.data)
119233
119266
  {
119234
119267
  outVarItem.Data=this.FittingArray(item.data,date,time,hqChart);
@@ -132046,7 +132079,7 @@ function ScrollBarBGChart()
132046
132079
 
132047
132080
 
132048
132081
 
132049
- var HQCHART_VERSION="1.1.12878";
132082
+ var HQCHART_VERSION="1.1.12883";
132050
132083
 
132051
132084
  function PrintHQChartVersion()
132052
132085
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.12878";
8
+ var HQCHART_VERSION="1.1.12883";
9
9
 
10
10
  function PrintHQChartVersion()
11
11
  {
@@ -14854,6 +14854,9 @@ function AverageWidthFrame()
14854
14854
  //JSConsole.Chart.Log('[AverageWidthFrame.DrawVertical] bottom',bottom);
14855
14855
  if (this.ChartBorder.Bottom<=5*GetDevicePixelRatio()) return; //高度不够 不显示
14856
14856
 
14857
+ var mapX=null;
14858
+ if (this.GetVerticalXCache) mapX=this.GetVerticalXCache();
14859
+
14857
14860
  var bottomTextExtend=null;
14858
14861
  if (this.XTextExtend)
14859
14862
  {
@@ -14870,7 +14873,10 @@ function AverageWidthFrame()
14870
14873
  var textRightPrev=null; //上一次刻度输出右边x坐标
14871
14874
  for(var i=0; i<this.VerticalInfo.length; ++i)
14872
14875
  {
14873
- var x=this.GetXFromIndex(this.VerticalInfo[i].Value);
14876
+ var item=this.VerticalInfo[i];
14877
+ var x=null;
14878
+ if (mapX && mapX.has(item.Value)) x=mapX.get(item.Value);
14879
+ else x=this.GetXFromIndex(item.Value);
14874
14880
  if (x>right) break;
14875
14881
  if (xPrev!=null && Math.abs(x-xPrev)<this.MinXDistance) continue;
14876
14882
 
@@ -19206,6 +19212,49 @@ function KLineFrame()
19206
19212
 
19207
19213
  //是否在X轴坐标上
19208
19214
  //this.PtInVertical=function(x,y) { return false; }
19215
+
19216
+ //缓存X轴坐标刻度
19217
+ this.GetVerticalXCache=function()
19218
+ {
19219
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.VerticalInfo)) return null;
19220
+
19221
+ var dataWidth=this.DataWidth;
19222
+ var distanceWidth=this.DistanceWidth;
19223
+ var xPointCount=this.XPointCount;
19224
+
19225
+ var setIndex=new Set();
19226
+ for(var i=0; i<this.VerticalInfo.length; ++i)
19227
+ {
19228
+ var item=this.VerticalInfo[i];
19229
+ setIndex.add(item.Value);
19230
+ }
19231
+
19232
+ if (this.IsHScreen)
19233
+ {
19234
+ var border=this.ChartBorder.GetHScreenBorder();
19235
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
19236
+ }
19237
+ else
19238
+ {
19239
+ var border=this.ChartBorder.GetBorder();
19240
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
19241
+ }
19242
+
19243
+ var mapX=new Map();
19244
+ for(var i=0;i<xPointCount;++i, xOffset+=(dataWidth+distanceWidth))
19245
+ {
19246
+ var left=xOffset;
19247
+ var right=xOffset+dataWidth;
19248
+ var x=left+(right-left)/2;
19249
+
19250
+ if (setIndex.has(i))
19251
+ {
19252
+ mapX.set(i, x);
19253
+ }
19254
+ }
19255
+
19256
+ return mapX;
19257
+ }
19209
19258
  }
19210
19259
 
19211
19260
  function OverlayKLineFrame()
@@ -20245,19 +20294,25 @@ function KLineHScreenFrame()
20245
20294
  //画X轴
20246
20295
  this.DrawVertical=function()
20247
20296
  {
20297
+ var mapX=null;
20298
+ if (this.GetVerticalXCache) mapX=this.GetVerticalXCache();
20299
+
20248
20300
  var border=this.ChartBorder.GetHScreenBorder();
20249
20301
  var left=border.Left;
20250
20302
  var right=border.RightTitle;
20251
20303
  var bottom=border.Bottom;
20252
20304
  var pixelRatio = GetDevicePixelRatio(); //获取设备的分辨率
20253
20305
  var xPrev=null; //上一个坐标x的值
20254
- for(var i in this.VerticalInfo)
20306
+ for(var i=0; i<this.VerticalInfo.length; ++i)
20255
20307
  {
20256
- var x=this.GetXFromIndex(this.VerticalInfo[i].Value);
20308
+ var item=this.VerticalInfo[i];
20309
+ var x=null;
20310
+ if (mapX && mapX.has(item.Value)) x=mapX.get(item.Value);
20311
+ else x=this.GetXFromIndex(item.Value);
20312
+
20257
20313
  if (x>=bottom) break;
20258
20314
  if (xPrev!=null && Math.abs(x-xPrev)<80) continue;
20259
20315
 
20260
- var item=this.VerticalInfo[i];
20261
20316
  if (item.LineType==2)
20262
20317
  {
20263
20318
  this.Canvas.strokeStyle=this.VerticalInfo[i].LineColor;
@@ -37770,15 +37825,30 @@ function ChartMACD()
37770
37825
  this.DrawBars=function(lineWidth, bUpBar)
37771
37826
  {
37772
37827
  var isMinute=this.IsMinuteFrame();
37773
- var border=this.ChartBorder.GetBorder();
37828
+
37774
37829
  var dataWidth=this.ChartFrame.DataWidth;
37775
37830
  var distanceWidth=this.ChartFrame.DistanceWidth;
37776
37831
  var xPointCount=this.ChartFrame.XPointCount;
37777
- var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
37832
+ var isHSCreen=this.ChartFrame.IsHScreen===true;
37833
+
37834
+ if (isHSCreen)
37835
+ {
37836
+ var border=this.ChartBorder.GetHScreenBorder();
37837
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
37838
+ var chartright=border.BottomEx;
37839
+ var lockRect=this.GetLockRect();
37840
+ if (lockRect) chartright=lockRect.Top;
37841
+ }
37842
+ else
37843
+ {
37844
+ var border=this.ChartBorder.GetBorder();
37845
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
37846
+
37847
+ var chartright=border.RightEx;
37848
+ var lockRect=this.GetLockRect();
37849
+ if (lockRect) chartright=lockRect.Left;
37850
+ }
37778
37851
 
37779
- var chartright=border.RightEx;
37780
- var lockRect=this.GetLockRect();
37781
- if (lockRect) chartright=lockRect.Left;
37782
37852
 
37783
37853
  if (bUpBar) this.Canvas.strokeStyle=this.UpColor;
37784
37854
  else this.Canvas.strokeStyle=this.DownColor;
@@ -37815,8 +37885,18 @@ function ChartMACD()
37815
37885
 
37816
37886
  var y=this.ChartFrame.GetYFromData(value);
37817
37887
  var xFix=ToFixedPoint2(lineWidth, x); //毛边修正
37818
- this.Canvas.moveTo(xFix,yBottom);
37819
- this.Canvas.lineTo(xFix,y);
37888
+
37889
+ if (isHSCreen)
37890
+ {
37891
+ this.Canvas.moveTo(yBottom,ToFixedPoint(x));
37892
+ this.Canvas.lineTo(y,ToFixedPoint(x));
37893
+ }
37894
+ else
37895
+ {
37896
+ this.Canvas.moveTo(xFix,yBottom);
37897
+ this.Canvas.lineTo(xFix,y);
37898
+ }
37899
+
37820
37900
  ++drawCount;
37821
37901
  }
37822
37902
 
@@ -37835,12 +37915,6 @@ function ChartMACD()
37835
37915
  return;
37836
37916
  }
37837
37917
 
37838
- if (this.ChartFrame.IsHScreen===true)
37839
- {
37840
- this.HScreenDraw();
37841
- return;
37842
- }
37843
-
37844
37918
  var dataWidth=this.ChartFrame.DataWidth;
37845
37919
  var lineWidth=this.LineWidth*GetDevicePixelRatio();
37846
37920
  if (this.LineWidth==50) lineWidth=dataWidth;
@@ -37856,48 +37930,6 @@ function ChartMACD()
37856
37930
  this.Canvas.lineWidth=backupLineWidth;
37857
37931
  }
37858
37932
 
37859
- this.HScreenDraw=function()
37860
- {
37861
- var dataWidth=this.ChartFrame.DataWidth;
37862
- var distanceWidth=this.ChartFrame.DistanceWidth;
37863
- var border=this.ChartBorder.GetHScreenBorder();
37864
- var chartright=border.BottomEx;
37865
- var xPointCount=this.ChartFrame.XPointCount;
37866
- var lockRect=this.GetLockRect();
37867
- if (lockRect) chartright=lockRect.Top;
37868
-
37869
- var yBottom=this.ChartFrame.GetYFromData(0);
37870
-
37871
- var lineWidth=this.LineWidth*GetDevicePixelRatio();
37872
- if (this.LineWidth==50) lineWidth=dataWidth;
37873
- else if (lineWidth>dataWidth) lineWidth=dataWidth;
37874
-
37875
- var backupLineWidth=this.Canvas.lineWidth;
37876
- this.Canvas.lineWidth=lineWidth;
37877
-
37878
- for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
37879
- {
37880
- var value=this.Data.Data[i];
37881
- if (value==null) continue;
37882
-
37883
- var x=this.ChartFrame.GetXFromIndex(j);
37884
- var y=this.ChartFrame.GetYFromData(value);
37885
-
37886
- if (x>chartright) break;
37887
-
37888
- this.Canvas.beginPath();
37889
- this.Canvas.moveTo(yBottom,ToFixedPoint(x));
37890
- this.Canvas.lineTo(y,ToFixedPoint(x));
37891
-
37892
- if (value>=0) this.Canvas.strokeStyle=this.UpColor;
37893
- else this.Canvas.strokeStyle=this.DownColor;
37894
- this.Canvas.stroke();
37895
- this.Canvas.closePath();
37896
- }
37897
-
37898
- this.Canvas.lineWidth=backupLineWidth;
37899
- }
37900
-
37901
37933
  this.GetItemData=function(indexData)
37902
37934
  {
37903
37935
  if (!indexData) return null;
@@ -119273,6 +119305,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
119273
119305
  var indexData=[];
119274
119306
  var outVarItem={Name:item.name,Type:item.type};
119275
119307
  if (item.color) outVarItem.Color=item.color;
119308
+ if (IFrameSplitOperator.IsBool(item.IsShowTitle)) outVarItem.IsShowTitle = item.IsShowTitle; //是否显示指标标题
119276
119309
  if (item.data)
119277
119310
  {
119278
119311
  outVarItem.Data=this.FittingArray(item.data,date,time,hqChart);
@@ -132204,7 +132237,7 @@ function HQChartScriptWorker()
132204
132237
 
132205
132238
 
132206
132239
 
132207
- var HQCHART_VERSION="1.1.12878";
132240
+ var HQCHART_VERSION="1.1.12883";
132208
132241
 
132209
132242
  function PrintHQChartVersion()
132210
132243
  {