hqchart 1.1.12881 → 1.1.12886

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;//高度调整为整数
@@ -7598,13 +7599,13 @@ if(this.ZoomDownload.Tick.Status!=0)return;this.RequestZoomTickData(requestData)
7598
7599
  this.RequestDragTickData=function(){JSConsole.Chart.Log('[KLineChartContainer.RequestDragTickData] not finished.');};//请求拖动或缩放的分钟历史数据
7599
7600
  this.RequestPreviousMinuteData=function(option){var funcName=option.FuncName;var funcExplain=option.FuncExplain;var download=option.Download;var url=option.Url;var count=option.Count;//请求数据个数
7600
7601
  var self=this;this.AutoUpdateEvent(false,funcName);//停止自动更新
7601
- this.CancelAutoUpdate();download.Status=1;var firstItem=this.SourceData.Data[0];//最新的一条数据
7602
- var postData={"field":["name","symbol","yclose","open","price","high","low","vol"],"symbol":self.Symbol,"enddate":firstItem.Date,"endtime":firstItem.Time,"count":count,"first":{date:firstItem.Date,time:firstItem.Time}};if(IFrameSplitOperator.IsNonEmptyArray(this.OverlayChartPaint)){postData.overlay=[];for(var i=0;i<this.OverlayChartPaint.length;++i){var item=this.OverlayChartPaint[i];postData.overlay.push({symbol:item.Symbol});}}if(this.NetworkFilter){var obj={Name:funcName,//类名::函数
7602
+ this.CancelAutoUpdate();download.Status=1;var firstItem=null;if(IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))firstItem=this.SourceData.Data[0];//最新的一条数据
7603
+ else firstItem={Date:null,Time:null};var postData={"field":["name","symbol","yclose","open","price","high","low","vol"],"symbol":self.Symbol,"enddate":firstItem.Date,"endtime":firstItem.Time,"count":count,"first":{date:firstItem.Date,time:firstItem.Time}};if(IFrameSplitOperator.IsNonEmptyArray(this.OverlayChartPaint)){postData.overlay=[];for(var i=0;i<this.OverlayChartPaint.length;++i){var item=this.OverlayChartPaint[i];postData.overlay.push({symbol:item.Symbol});}}if(this.NetworkFilter){var obj={Name:funcName,//类名::函数
7603
7604
  Explain:funcExplain,Request:{Url:url,Type:'POST',Data:postData,Period:this.Period,Right:this.Right},DragDownload:download,Option:option,Self:this,PreventDefault:false,ZoomData:option.ZoomData};this.NetworkFilter(obj,function(data){self.RecvPreviousMinuteData(data,option);download.Status=0;self.AutoUpdateEvent(true,funcName);//自动更新
7604
7605
  self.AutoUpdate();});if(obj.PreventDefault==true)return;//已被上层替换,不调用默认的网络请求
7605
7606
  }JSNetwork.HttpRequest({url:url,data:postData,type:"post",dataType:"json",async:true,success:function success(data){self.RecvPreviousMinuteData(data,option);download.Status=0;self.AutoUpdateEvent(true,funcName);//自动更新
7606
7607
  self.AutoUpdate();}});};this.RecvPreviousMinuteData=function(data,option){var download=option.Download;var aryDayData=KLineChartContainer.JsonDataToMinuteHistoryData(data);if(!aryDayData||aryDayData.length<=0){download.IsEnd=true;JSConsole.Chart.Log('[KLineChartContainer.RecvPreviousMinuteData] '+this.Symbol+' data end. FuncName='+option.FuncName);this.Draw();return;}var lastDataCount=this.GetHistoryDataCount();//保存下上一次的数据个数
7607
- var firstData=this.SourceData.Data[0];var endIndex=null;for(var i=aryDayData.length-1;i>=0;--i){var item=aryDayData[i];if(firstData.Date>item.Date||firstData.Date==item.Date&&firstData.Time>item.Time){endIndex=i;break;}else if(firstData.Date==item.Date&&firstData.Time==item.Time){firstData.YClose=item.YClose;endIndex=i-1;break;}}if(endIndex==null&&endIndex<0)return;for(var i=0;i<aryDayData.length&&i<=endIndex;++i)//数据往前插
7608
+ var endIndex=null;if(IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data)){var firstData=this.SourceData.Data[0];for(var i=aryDayData.length-1;i>=0;--i){var item=aryDayData[i];if(firstData.Date>item.Date||firstData.Date==item.Date&&firstData.Time>item.Time){endIndex=i;break;}else if(firstData.Date==item.Date&&firstData.Time==item.Time){firstData.YClose=item.YClose;endIndex=i-1;break;}}}else{endIndex=aryDayData.length-1;}if(endIndex==null&&endIndex<0)return;for(var i=0;i<aryDayData.length&&i<=endIndex;++i)//数据往前插
7608
7609
  {var item=aryDayData[i];this.SourceData.Data.splice(i,0,item);}var bindData=new ChartData();bindData.Data=this.SourceData.Data;bindData.Period=this.Period;bindData.Right=this.Right;bindData.DataType=this.SourceData.DataType;bindData.Symbol=this.Symbol;if(!this.IsApiPeriod){if(bindData.Right>0&&this.RightFormula>=1)//复权
7609
7610
  {var rightData=bindData.GetRightData(bindData.Right,{AlgorithmType:this.RightFormula});bindData.Data=rightData;}if(ChartData.IsDayPeriod(bindData.Period,false)||ChartData.IsMinutePeriod(bindData.Period,false))//周期数据 (0= 日线,4=1分钟线 不需要处理)
7610
7611
  {var periodData=bindData.GetPeriodData(bindData.Period);bindData.Data=periodData;}}var kLineCalculate=this.GetKLineCalulate();if(kLineCalculate)//额外的K线图形计算
@@ -7629,14 +7630,13 @@ bindData.Data=aryOverlayData;if(ChartData.IsMinutePeriod(bindData.Period,false)&
7629
7630
  {var periodData=bindData.GetPeriodData(bindData.Period);bindData.Data=periodData;}item.Data=bindData;}};//请求拖动或缩放的日线历史数据
7630
7631
  this.RequestPreviousDayData=function(option){var funcName=option.FuncName;var funcExplain=option.FuncExplain;var download=option.Download;var url=option.Url;var count=option.Count;//请求数据个数
7631
7632
  var self=this;this.AutoUpdateEvent(false,funcName);//停止自动更新
7632
- this.CancelAutoUpdate();download.Status=1;var firstItem=this.SourceData.Data[0];//最新的一条数据
7633
- var postData={"field":["name","symbol","yclose","open","price","high","low","vol"],"symbol":self.Symbol,"enddate":firstItem.Date,"count":count,"first":{date:firstItem.Date}};if(IFrameSplitOperator.IsNonEmptyArray(this.OverlayChartPaint)){postData.overlay=[];for(var i=0;i<this.OverlayChartPaint.length;++i){var item=this.OverlayChartPaint[i];postData.overlay.push({symbol:item.Symbol});}}if(this.NetworkFilter){var obj={Name:funcName,//类名::函数
7633
+ this.CancelAutoUpdate();download.Status=1;var firstItem=null;if(IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))firstItem=this.SourceData.Data[0];else firstItem={Date:null};var postData={"field":["name","symbol","yclose","open","price","high","low","vol"],"symbol":self.Symbol,"enddate":firstItem.Date,"count":count,"first":{date:firstItem.Date}};if(IFrameSplitOperator.IsNonEmptyArray(this.OverlayChartPaint)){postData.overlay=[];for(var i=0;i<this.OverlayChartPaint.length;++i){var item=this.OverlayChartPaint[i];postData.overlay.push({symbol:item.Symbol});}}if(this.NetworkFilter){var obj={Name:funcName,//类名::函数
7634
7634
  Explain:funcExplain,Request:{Url:url,Type:'POST',Data:postData,Period:this.Period,Right:this.Right},DragDownload:download,Option:option,Self:this,PreventDefault:false,ZoomData:option.ZoomData};this.NetworkFilter(obj,function(data){self.RecvPreviousDayData(data,option);download.Status=0;self.AutoUpdateEvent(true,funcName);//自动更新
7635
7635
  self.AutoUpdate();});if(obj.PreventDefault==true)return;//已被上层替换,不调用默认的网络请求
7636
7636
  }JSNetwork.HttpRequest({url:url,data:postData,type:"post",dataType:"json",async:true,success:function success(data){self.RecvPreviousDayData(data,option);download.Status=0;self.AutoUpdateEvent(true,funcName);//自动更新
7637
7637
  self.AutoUpdate();}});};this.RecvPreviousDayData=function(data,option){var download=option.Download;var aryDayData=KLineChartContainer.JsonDataToHistoryData(data);if(!aryDayData||aryDayData.length<=0){download.IsEnd=true;//下完了
7638
7638
  JSConsole.Chart.Log('[KLineChartContainer.RecvPreviousDayData] '+this.Symbol+' data end. FuncName='+option.FuncName);return;}var lastDataCount=this.GetHistoryDataCount();//保存下上一次的数据个数
7639
- var firstData=this.SourceData.Data[0];var endIndex=null;for(var i=aryDayData.length-1;i>=0;--i){var item=aryDayData[i];if(firstData.Date>item.Date){endIndex=i;break;}else if(firstData.Date==item.Date){firstData.YClose=item.YClose;endIndex=i-1;break;}}if(endIndex==null&&endIndex<0)return;for(var i=0;i<aryDayData.length&&i<=endIndex;++i)//数据往前插
7639
+ var endIndex=null;if(IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data)){var firstData=this.SourceData.Data[0];for(var i=aryDayData.length-1;i>=0;--i){var item=aryDayData[i];if(firstData.Date>item.Date){endIndex=i;break;}else if(firstData.Date==item.Date){firstData.YClose=item.YClose;endIndex=i-1;break;}}}else{var firstData={Date:null};endIndex=aryDayData.length-1;}if(endIndex==null&&endIndex<0)return;for(var i=0;i<aryDayData.length&&i<=endIndex;++i)//数据往前插
7640
7640
  {var item=aryDayData[i];this.SourceData.Data.splice(i,0,item);}var bindData=new ChartData();bindData.Data=this.SourceData.Data;bindData.Period=this.Period;bindData.Right=this.Right;bindData.DataType=this.SourceData.DataType;bindData.Symbol=this.Symbol;if(!this.IsApiPeriod){if(bindData.Right>0)//复权
7641
7641
  {var rightData=bindData.GetRightData(bindData.Right,{AlgorithmType:this.RightFormula});bindData.Data=rightData;}if(ChartData.IsDayPeriod(bindData.Period,false)||ChartData.IsMinutePeriod(bindData.Period,false))//周期数据 (0= 日线,4=1分钟线 不需要处理)
7642
7642
  {var periodData=bindData.GetPeriodData(bindData.Period);bindData.Data=periodData;}}var kLineCalculate=this.GetKLineCalulate();if(kLineCalculate)//额外的K线图形计算
@@ -13035,7 +13035,7 @@ hisData.Symbol=message.symbol;}var stockObj={HQDataType:HQ_DATA_TYPE.KLINE_ID,St
13035
13035
  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);};}/********************************************************************************
13036
13036
  * 版本信息输出
13037
13037
  *
13038
- */var HQCHART_VERSION="1.1.12880";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
+ */var HQCHART_VERSION="1.1.12885";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
13039
  exports.default=(_jsChartInit$jsChartS={jsChartInit:JSChart.Init,jsChartStyle:JSChart.SetStyle,// IsIndexSymbol:IsIndexSymbol,
13040
13040
  // BaseIndex:BaseIndex,
13041
13041
  // ChartLine:ChartLine,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hqchart",
3
- "version": "1.1.12881",
3
+ "version": "1.1.12886",
4
4
  "description": "HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接",
5
5
  "main": "lib/main.js",
6
6
  "scripts": {
@@ -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;
@@ -71775,7 +71807,12 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
71775
71807
  this.AutoUpdateEvent(false,funcName); //停止自动更新
71776
71808
  this.CancelAutoUpdate();
71777
71809
  download.Status=1;
71778
- var firstItem=this.SourceData.Data[0]; //最新的一条数据
71810
+ var firstItem=null;
71811
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
71812
+ firstItem=this.SourceData.Data[0]; //最新的一条数据
71813
+ else
71814
+ firstItem={Date:null, Time:null};
71815
+
71779
71816
  var postData=
71780
71817
  {
71781
71818
  "field": ["name","symbol", "yclose","open","price","high","low","vol"],
@@ -71849,25 +71886,31 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
71849
71886
  }
71850
71887
 
71851
71888
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
71852
-
71853
- var firstData=this.SourceData.Data[0];
71854
71889
  var endIndex=null;
71855
- for(var i=aryDayData.length-1;i>=0;--i)
71890
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
71856
71891
  {
71857
- var item=aryDayData[i];
71858
- if (firstData.Date>item.Date || (firstData.Date==item.Date && firstData.Time>item.Time))
71859
- {
71860
- endIndex=i;
71861
- break;
71862
- }
71863
- else if (firstData.Date==item.Date && firstData.Time==item.Time)
71892
+ var firstData=this.SourceData.Data[0];
71893
+ for(var i=aryDayData.length-1;i>=0;--i)
71864
71894
  {
71865
- firstData.YClose=item.YClose;
71866
- endIndex=i-1;
71867
- break;
71895
+ var item=aryDayData[i];
71896
+ if (firstData.Date>item.Date || (firstData.Date==item.Date && firstData.Time>item.Time))
71897
+ {
71898
+ endIndex=i;
71899
+ break;
71900
+ }
71901
+ else if (firstData.Date==item.Date && firstData.Time==item.Time)
71902
+ {
71903
+ firstData.YClose=item.YClose;
71904
+ endIndex=i-1;
71905
+ break;
71906
+ }
71868
71907
  }
71869
71908
  }
71870
-
71909
+ else
71910
+ {
71911
+ endIndex=aryDayData.length-1;
71912
+ }
71913
+
71871
71914
  if (endIndex==null && endIndex<0) return;
71872
71915
 
71873
71916
  for(var i=0;i<aryDayData.length && i<=endIndex;++i) //数据往前插
@@ -72074,7 +72117,12 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72074
72117
  this.AutoUpdateEvent(false,funcName); //停止自动更新
72075
72118
  this.CancelAutoUpdate();
72076
72119
  download.Status=1;
72077
- var firstItem=this.SourceData.Data[0]; //最新的一条数据
72120
+ var firstItem=null;
72121
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
72122
+ firstItem=this.SourceData.Data[0];
72123
+ else
72124
+ firstItem={Date:null};
72125
+
72078
72126
  var postData=
72079
72127
  {
72080
72128
  "field": ["name","symbol", "yclose","open","price","high","low","vol"],
@@ -72145,24 +72193,34 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72145
72193
  return;
72146
72194
  }
72147
72195
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
72148
-
72149
- var firstData=this.SourceData.Data[0];
72150
72196
  var endIndex=null;
72151
- for(var i=aryDayData.length-1;i>=0;--i)
72152
- {
72153
- var item=aryDayData[i];
72154
- if (firstData.Date>item.Date)
72155
- {
72156
- endIndex=i;
72157
- break;
72158
- }
72159
- else if (firstData.Date==item.Date)
72197
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
72198
+ {
72199
+ var firstData=this.SourceData.Data[0];
72200
+
72201
+ for(var i=aryDayData.length-1;i>=0;--i)
72160
72202
  {
72161
- firstData.YClose=item.YClose;
72162
- endIndex=i-1;
72163
- break;
72203
+ var item=aryDayData[i];
72204
+ if (firstData.Date>item.Date)
72205
+ {
72206
+ endIndex=i;
72207
+ break;
72208
+ }
72209
+ else if (firstData.Date==item.Date)
72210
+ {
72211
+ firstData.YClose=item.YClose;
72212
+ endIndex=i-1;
72213
+ break;
72214
+ }
72164
72215
  }
72165
72216
  }
72217
+ else
72218
+ {
72219
+ var firstData={ Date:null };
72220
+ endIndex=aryDayData.length-1;
72221
+ }
72222
+
72223
+
72166
72224
  if (endIndex==null && endIndex<0) return;
72167
72225
 
72168
72226
  for(var i=0; i<aryDayData.length && i<=endIndex;++i) //数据往前插
@@ -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;
@@ -75942,7 +75974,12 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
75942
75974
  this.AutoUpdateEvent(false,funcName); //停止自动更新
75943
75975
  this.CancelAutoUpdate();
75944
75976
  download.Status=1;
75945
- var firstItem=this.SourceData.Data[0]; //最新的一条数据
75977
+ var firstItem=null;
75978
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
75979
+ firstItem=this.SourceData.Data[0]; //最新的一条数据
75980
+ else
75981
+ firstItem={Date:null, Time:null};
75982
+
75946
75983
  var postData=
75947
75984
  {
75948
75985
  "field": ["name","symbol", "yclose","open","price","high","low","vol"],
@@ -76016,25 +76053,31 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76016
76053
  }
76017
76054
 
76018
76055
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
76019
-
76020
- var firstData=this.SourceData.Data[0];
76021
76056
  var endIndex=null;
76022
- for(var i=aryDayData.length-1;i>=0;--i)
76057
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
76023
76058
  {
76024
- var item=aryDayData[i];
76025
- if (firstData.Date>item.Date || (firstData.Date==item.Date && firstData.Time>item.Time))
76026
- {
76027
- endIndex=i;
76028
- break;
76029
- }
76030
- else if (firstData.Date==item.Date && firstData.Time==item.Time)
76059
+ var firstData=this.SourceData.Data[0];
76060
+ for(var i=aryDayData.length-1;i>=0;--i)
76031
76061
  {
76032
- firstData.YClose=item.YClose;
76033
- endIndex=i-1;
76034
- break;
76062
+ var item=aryDayData[i];
76063
+ if (firstData.Date>item.Date || (firstData.Date==item.Date && firstData.Time>item.Time))
76064
+ {
76065
+ endIndex=i;
76066
+ break;
76067
+ }
76068
+ else if (firstData.Date==item.Date && firstData.Time==item.Time)
76069
+ {
76070
+ firstData.YClose=item.YClose;
76071
+ endIndex=i-1;
76072
+ break;
76073
+ }
76035
76074
  }
76036
76075
  }
76037
-
76076
+ else
76077
+ {
76078
+ endIndex=aryDayData.length-1;
76079
+ }
76080
+
76038
76081
  if (endIndex==null && endIndex<0) return;
76039
76082
 
76040
76083
  for(var i=0;i<aryDayData.length && i<=endIndex;++i) //数据往前插
@@ -76241,7 +76284,12 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76241
76284
  this.AutoUpdateEvent(false,funcName); //停止自动更新
76242
76285
  this.CancelAutoUpdate();
76243
76286
  download.Status=1;
76244
- var firstItem=this.SourceData.Data[0]; //最新的一条数据
76287
+ var firstItem=null;
76288
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
76289
+ firstItem=this.SourceData.Data[0];
76290
+ else
76291
+ firstItem={Date:null};
76292
+
76245
76293
  var postData=
76246
76294
  {
76247
76295
  "field": ["name","symbol", "yclose","open","price","high","low","vol"],
@@ -76312,24 +76360,34 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76312
76360
  return;
76313
76361
  }
76314
76362
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
76315
-
76316
- var firstData=this.SourceData.Data[0];
76317
76363
  var endIndex=null;
76318
- for(var i=aryDayData.length-1;i>=0;--i)
76319
- {
76320
- var item=aryDayData[i];
76321
- if (firstData.Date>item.Date)
76322
- {
76323
- endIndex=i;
76324
- break;
76325
- }
76326
- else if (firstData.Date==item.Date)
76364
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
76365
+ {
76366
+ var firstData=this.SourceData.Data[0];
76367
+
76368
+ for(var i=aryDayData.length-1;i>=0;--i)
76327
76369
  {
76328
- firstData.YClose=item.YClose;
76329
- endIndex=i-1;
76330
- break;
76370
+ var item=aryDayData[i];
76371
+ if (firstData.Date>item.Date)
76372
+ {
76373
+ endIndex=i;
76374
+ break;
76375
+ }
76376
+ else if (firstData.Date==item.Date)
76377
+ {
76378
+ firstData.YClose=item.YClose;
76379
+ endIndex=i-1;
76380
+ break;
76381
+ }
76331
76382
  }
76332
76383
  }
76384
+ else
76385
+ {
76386
+ var firstData={ Date:null };
76387
+ endIndex=aryDayData.length-1;
76388
+ }
76389
+
76390
+
76333
76391
  if (endIndex==null && endIndex<0) return;
76334
76392
 
76335
76393
  for(var i=0; i<aryDayData.length && i<=endIndex;++i) //数据往前插
@@ -132047,7 +132105,7 @@ function ScrollBarBGChart()
132047
132105
 
132048
132106
 
132049
132107
 
132050
- var HQCHART_VERSION="1.1.12880";
132108
+ var HQCHART_VERSION="1.1.12885";
132051
132109
 
132052
132110
  function PrintHQChartVersion()
132053
132111
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.12880";
8
+ var HQCHART_VERSION="1.1.12885";
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;
@@ -75986,7 +76018,12 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
75986
76018
  this.AutoUpdateEvent(false,funcName); //停止自动更新
75987
76019
  this.CancelAutoUpdate();
75988
76020
  download.Status=1;
75989
- var firstItem=this.SourceData.Data[0]; //最新的一条数据
76021
+ var firstItem=null;
76022
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
76023
+ firstItem=this.SourceData.Data[0]; //最新的一条数据
76024
+ else
76025
+ firstItem={Date:null, Time:null};
76026
+
75990
76027
  var postData=
75991
76028
  {
75992
76029
  "field": ["name","symbol", "yclose","open","price","high","low","vol"],
@@ -76060,25 +76097,31 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76060
76097
  }
76061
76098
 
76062
76099
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
76063
-
76064
- var firstData=this.SourceData.Data[0];
76065
76100
  var endIndex=null;
76066
- for(var i=aryDayData.length-1;i>=0;--i)
76101
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
76067
76102
  {
76068
- var item=aryDayData[i];
76069
- if (firstData.Date>item.Date || (firstData.Date==item.Date && firstData.Time>item.Time))
76070
- {
76071
- endIndex=i;
76072
- break;
76073
- }
76074
- else if (firstData.Date==item.Date && firstData.Time==item.Time)
76103
+ var firstData=this.SourceData.Data[0];
76104
+ for(var i=aryDayData.length-1;i>=0;--i)
76075
76105
  {
76076
- firstData.YClose=item.YClose;
76077
- endIndex=i-1;
76078
- break;
76106
+ var item=aryDayData[i];
76107
+ if (firstData.Date>item.Date || (firstData.Date==item.Date && firstData.Time>item.Time))
76108
+ {
76109
+ endIndex=i;
76110
+ break;
76111
+ }
76112
+ else if (firstData.Date==item.Date && firstData.Time==item.Time)
76113
+ {
76114
+ firstData.YClose=item.YClose;
76115
+ endIndex=i-1;
76116
+ break;
76117
+ }
76079
76118
  }
76080
76119
  }
76081
-
76120
+ else
76121
+ {
76122
+ endIndex=aryDayData.length-1;
76123
+ }
76124
+
76082
76125
  if (endIndex==null && endIndex<0) return;
76083
76126
 
76084
76127
  for(var i=0;i<aryDayData.length && i<=endIndex;++i) //数据往前插
@@ -76285,7 +76328,12 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76285
76328
  this.AutoUpdateEvent(false,funcName); //停止自动更新
76286
76329
  this.CancelAutoUpdate();
76287
76330
  download.Status=1;
76288
- var firstItem=this.SourceData.Data[0]; //最新的一条数据
76331
+ var firstItem=null;
76332
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
76333
+ firstItem=this.SourceData.Data[0];
76334
+ else
76335
+ firstItem={Date:null};
76336
+
76289
76337
  var postData=
76290
76338
  {
76291
76339
  "field": ["name","symbol", "yclose","open","price","high","low","vol"],
@@ -76356,24 +76404,34 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76356
76404
  return;
76357
76405
  }
76358
76406
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
76359
-
76360
- var firstData=this.SourceData.Data[0];
76361
76407
  var endIndex=null;
76362
- for(var i=aryDayData.length-1;i>=0;--i)
76363
- {
76364
- var item=aryDayData[i];
76365
- if (firstData.Date>item.Date)
76366
- {
76367
- endIndex=i;
76368
- break;
76369
- }
76370
- else if (firstData.Date==item.Date)
76408
+ if (IFrameSplitOperator.IsNonEmptyArray(this.SourceData.Data))
76409
+ {
76410
+ var firstData=this.SourceData.Data[0];
76411
+
76412
+ for(var i=aryDayData.length-1;i>=0;--i)
76371
76413
  {
76372
- firstData.YClose=item.YClose;
76373
- endIndex=i-1;
76374
- break;
76414
+ var item=aryDayData[i];
76415
+ if (firstData.Date>item.Date)
76416
+ {
76417
+ endIndex=i;
76418
+ break;
76419
+ }
76420
+ else if (firstData.Date==item.Date)
76421
+ {
76422
+ firstData.YClose=item.YClose;
76423
+ endIndex=i-1;
76424
+ break;
76425
+ }
76375
76426
  }
76376
76427
  }
76428
+ else
76429
+ {
76430
+ var firstData={ Date:null };
76431
+ endIndex=aryDayData.length-1;
76432
+ }
76433
+
76434
+
76377
76435
  if (endIndex==null && endIndex<0) return;
76378
76436
 
76379
76437
  for(var i=0; i<aryDayData.length && i<=endIndex;++i) //数据往前插
@@ -132205,7 +132263,7 @@ function HQChartScriptWorker()
132205
132263
 
132206
132264
 
132207
132265
 
132208
- var HQCHART_VERSION="1.1.12880";
132266
+ var HQCHART_VERSION="1.1.12885";
132209
132267
 
132210
132268
  function PrintHQChartVersion()
132211
132269
  {