hqchart 1.1.10521 → 1.1.10538

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.
@@ -1889,6 +1889,7 @@ this.IsShowYText=[true,true];//是否显示Y轴坐标坐标 [0=左侧] [1=右侧
1889
1889
  this.XBottomOffset=g_JSChartResource.Frame.XBottomOffset;//X轴文字显示向下偏移
1890
1890
  this.YTextTopOffset=g_JSChartResource.Frame.YTopOffset;//Y轴顶部文字向下偏移
1891
1891
  this.YTextPosition=[0,0],//是坐标否强制画在内部 [0=左侧] [1=右侧] 1=OUT" , 2=INSIDE
1892
+ this.YTextPadding=[g_JSChartResource.Frame.YTextPadding[0],g_JSChartResource.Frame.YTextPadding[1]],//Y轴文字和边框间距 [0=左侧] [1=右侧]
1892
1893
  this.IsShowXLine=true;//是否显示X轴刻度线
1893
1894
  this.IsShowYLine=true;this.YInsideOffset=0;this.YTextBaseline=0;//0=居中 1=上部 (目前就支持内部刻度)
1894
1895
  this.MultiTextFormat=0;//多行刻度信息显示模式 0=显示第1行 1=价格/百分比 2=显示2行
@@ -1904,11 +1905,11 @@ this.Canvas.beginPath();this.Canvas.moveTo(left,yFixed);this.Canvas.lineTo(right
1904
1905
  {}else if(item.LineType==8||item.LineType==9)//集合竞价不画线
1905
1906
  {}else if(item.LineType>0){if(g_JSChartResource.FrameYLineDash){this.Canvas.setLineDash(g_JSChartResource.FrameYLineDash);//虚线
1906
1907
  this.Canvas.beginPath();this.Canvas.moveTo(left,yFixed);this.Canvas.lineTo(right,yFixed);this.Canvas.stroke();this.Canvas.setLineDash([]);}else{this.Canvas.beginPath();this.Canvas.moveTo(left,yFixed);this.Canvas.lineTo(right,yFixed);this.Canvas.stroke();}}}var yText=y;if(y>=bottom-2){this.Canvas.textBaseline='bottom';}else if(y<=top+2){this.Canvas.textBaseline='top';yText+=this.YTextTopOffset;}else{this.Canvas.textBaseline="middle";}//坐标信息 左边 间距小于10 不画坐标
1907
- this.Canvas.strokeStyle=item.TextColor;this.Canvas.fillStyle=item.TextColor;if(item.Message[0]!=null&&isDrawLeft){if(item.Font!=null)this.Canvas.font=item.Font;this.Canvas.textAlign="right";this.Canvas.fillText(item.Message[0],left-2,yText);}//坐标信息 右边 间距小于10 不画坐标
1908
+ this.Canvas.strokeStyle=item.TextColor;this.Canvas.fillStyle=item.TextColor;if(item.Message[0]!=null&&isDrawLeft){if(item.Font!=null)this.Canvas.font=item.Font;this.Canvas.textAlign="right";this.Canvas.fillText(item.Message[0],left-this.YTextPadding[0],yText);}//坐标信息 右边 间距小于10 不画坐标
1908
1909
  if(item.Message[1]!=null&&isDrawRight){if(item.Font!=null)this.Canvas.font=item.Font;var xText=right;if(item.LineType==3){var lineLength=this.ShortYLineLength*GetDevicePixelRatio();this.Canvas.beginPath();this.Canvas.moveTo(xText,yFixed);this.Canvas.lineTo(xText+lineLength,yFixed);this.Canvas.stroke();xText+=lineLength;}this.Canvas.textAlign="left";if(Array.isArray(item.Message[1])){if(this.MultiTextFormat==1)//显示1行 格式:价格/百分比
1909
1910
  {if(item.ExtendData){if(item.ExtendData.Font)this.Canvas.font=item.ExtendData.Font;}var textData={Text:[{Text:item.Message[1][0],Width:this.Canvas.measureText(item.Message[1][0]).width},{Text:item.Message[1][1],Width:this.Canvas.measureText(item.Message[1][1]).width}],X:xText+2,Y:yText,TextBaseline:this.Canvas.textBaseline,Item:item};aryMultiText.push(textData);}else if(this.MultiTextFormat==2)//显示2行
1910
- {this.Canvas.fillText(item.Message[1][0],xText+2,yText);var lineHeight=this.Canvas.measureText('M').width;if(itemHeight>lineHeight*2)this.Canvas.fillText(item.Message[1][1],xText+2,yText+lineHeight);}else//显示第1行
1911
- {this.Canvas.fillText(item.Message[1][0],xText+2,yText);}}else{this.Canvas.fillText(item.Message[1],xText+2,yText);}}yPrev=y;}if(IFrameSplitOperator.IsNonEmptyArray(aryMultiText)&&this.MultiTextFormat==1)this.DrawHorizontalMuText(aryMultiText);};this.DrawHorizontalMuText=function(aryText){var maxWidth=[null,null];for(var i=0;i<aryText.length;++i){var item=aryText[i];var width=item.Text[0].Width;if(!IFrameSplitOperator.IsNumber(maxWidth[0]))maxWidth[0]=width;else if(maxWidth[0]<width)maxWidth[0]=width;width=item.Text[1].Width;if(!IFrameSplitOperator.IsNumber(maxWidth[1]))maxWidth[1]=width;else if(maxWidth[1]<width)maxWidth[1]=width;}for(var i=0;i<aryText.length;++i){var item=aryText[i];var message=item.Item;this.Canvas.textBaseline=message.TextBaseline;if(message.ExtendData&&message.ExtendData.Font)this.Canvas.font=message.ExtendData.Font;else if(message.Font)this.Canvas.font=message.Font;if(message.ExtendData&&message.ExtendData.PriceColor)this.Canvas.fillStyle=message.ExtendData.PriceColor;else this.Canvas.fillStyle=message.TextColor;this.Canvas.textAlign="right";var x=item.X+maxWidth[1];this.Canvas.fillText(item.Text[1].Text,x,item.Y);if(message.ExtendData&&message.ExtendData.SplitColor)this.Canvas.fillStyle=message.ExtendData.SplitColor;else this.Canvas.fillStyle=message.TextColor;this.Canvas.textAlign="left";var splitWidth=this.Canvas.measureText('/').width;this.Canvas.fillText('/',x,item.Y);if(message.ExtendData&&message.ExtendData.PercentageColor)this.Canvas.fillStyle=message.ExtendData.PercentageColor;else this.Canvas.fillStyle=message.TextColor;this.Canvas.textAlign="right";var x=item.X+maxWidth[1]+maxWidth[0]+splitWidth;this.Canvas.fillText(item.Text[0].Text,x,item.Y);var textWidth=maxWidth[1]+maxWidth[0]+splitWidth*4;if(this.RightTextMaxWidth<textWidth)this.RightTextMaxWidth=textWidth;}};//画Y轴Message[2,3]两个内部刻度
1911
+ {this.Canvas.fillText(item.Message[1][0],xText+this.YTextPadding[1],yText);var lineHeight=this.Canvas.measureText('M').width;if(itemHeight>lineHeight*2)this.Canvas.fillText(item.Message[1][1],xText+this.YTextPadding[1],yText+lineHeight);}else//显示第1行
1912
+ {this.Canvas.fillText(item.Message[1][0],xText+this.YTextPadding[1],yText);}}else{this.Canvas.fillText(item.Message[1],xText+this.YTextPadding[1],yText);}}yPrev=y;}if(IFrameSplitOperator.IsNonEmptyArray(aryMultiText)&&this.MultiTextFormat==1)this.DrawHorizontalMuText(aryMultiText);};this.DrawHorizontalMuText=function(aryText){var maxWidth=[null,null];for(var i=0;i<aryText.length;++i){var item=aryText[i];var width=item.Text[0].Width;if(!IFrameSplitOperator.IsNumber(maxWidth[0]))maxWidth[0]=width;else if(maxWidth[0]<width)maxWidth[0]=width;width=item.Text[1].Width;if(!IFrameSplitOperator.IsNumber(maxWidth[1]))maxWidth[1]=width;else if(maxWidth[1]<width)maxWidth[1]=width;}for(var i=0;i<aryText.length;++i){var item=aryText[i];var message=item.Item;this.Canvas.textBaseline=message.TextBaseline;if(message.ExtendData&&message.ExtendData.Font)this.Canvas.font=message.ExtendData.Font;else if(message.Font)this.Canvas.font=message.Font;if(message.ExtendData&&message.ExtendData.PriceColor)this.Canvas.fillStyle=message.ExtendData.PriceColor;else this.Canvas.fillStyle=message.TextColor;this.Canvas.textAlign="right";var x=item.X+maxWidth[1];this.Canvas.fillText(item.Text[1].Text,x,item.Y);if(message.ExtendData&&message.ExtendData.SplitColor)this.Canvas.fillStyle=message.ExtendData.SplitColor;else this.Canvas.fillStyle=message.TextColor;this.Canvas.textAlign="left";var splitWidth=this.Canvas.measureText('/').width;this.Canvas.fillText('/',x,item.Y);if(message.ExtendData&&message.ExtendData.PercentageColor)this.Canvas.fillStyle=message.ExtendData.PercentageColor;else this.Canvas.fillStyle=message.TextColor;this.Canvas.textAlign="right";var x=item.X+maxWidth[1]+maxWidth[0]+splitWidth;this.Canvas.fillText(item.Text[0].Text,x,item.Y);var textWidth=maxWidth[1]+maxWidth[0]+splitWidth*4;if(this.RightTextMaxWidth<textWidth)this.RightTextMaxWidth=textWidth;}};//画Y轴Message[2,3]两个内部刻度
1912
1913
  this.DrawInsideClientHorizontal=function(){var border=this.GetBorder();if(border.DayBorder&&IFrameSplitOperator.IsNonEmptyArray(border.DayBorder)){var item=border.DayBorder[0];var left=item.LeftEx;var item=border.DayBorder[border.DayBorder.length-1];var right=item.RightEx;var bottom=border.Bottom;var top=border.TopTitle;}else{var left=border.LeftEx;var right=border.RightEx;var bottom=border.Bottom;var top=border.TopTitle;}var pixelTatio=GetDevicePixelRatio();var yPrev=null;//上一个坐标y的值
1913
1914
  var yInsideText=null;for(var i=this.HorizontalInfo.length-1;i>=0;--i)//从上往下画分割线
1914
1915
  {var item=this.HorizontalInfo[i];var y=this.GetYFromData(item.Value);if(y!=null&&yPrev!=null&&Math.abs(y-yPrev)<this.MinYDistance)continue;//两个坐标在近了 就不画了
@@ -1946,7 +1947,7 @@ if(this.IsHScreen){var borderTop=this.ChartBorder.Top;var borderBottom=this.Char
1946
1947
  {if(item.ExtendData){if(item.ExtendData.Font)this.Canvas.font=item.ExtendData.Font;var width1=this.Canvas.measureText(item.Message[1][0]).width;var width2=this.Canvas.measureText(item.Message[1][1]).width;var width3=this.Canvas.measureText('/').width;textWidth=width1+width3;if(rightExtendWidth<width2)rightExtendWidth=width2;//JSConsole.Chart.Log(`[ChartData::GetScaleTextWidth] ${item.Message[1][1]}/${item.Message[1][0]} ${textWidth}, ${rightExtendWidth}`);
1947
1948
  }}else if(this.MultiTextFormat==2)//显示2行
1948
1949
  {textWidth=this.Canvas.measureText(item.Message[1][0]).width;var textWidth2=this.Canvas.measureText(item.Message[1][1]).width;if(textWidth<textWidth2)textWidth=textWidth2;}else//显示第1行
1949
- {textWidth=this.Canvas.measureText(item.Message[1][0]).width;}}else{textWidth=this.Canvas.measureText(item.Message[1]).width;}if(width.Right==null||width.Right<textWidth)width.Right=textWidth;}}if(IFrameSplitOperator.IsNumber(width.Right))width.Right+=rightExtendWidth;return{TextWidth:width};};this.ClearToolbar=function(){if(!this.ToolbarID)return;var divToolbar=document.getElementById(this.ToolbarID);if(!divToolbar)return;this.ChartBorder.UIElement.parentNode.removeChild(divToolbar);this.ToolbarRect=null;};this.HideToolbar=function(){if(!this.ToolbarID)return;this.ToolbarRect=null;var divToolbar=document.getElementById(this.ToolbarID);if(!divToolbar)return;if(divToolbar.style.display!='none')divToolbar.style.display='none';};}function MinuteFrame(){this.newMethod=AverageWidthFrame;//派生
1950
+ {textWidth=this.Canvas.measureText(item.Message[1][0]).width;}}else{textWidth=this.Canvas.measureText(item.Message[1]).width;}if(width.Right==null||width.Right<textWidth)width.Right=textWidth;}}if(IFrameSplitOperator.IsNumber(width.Right))width.Right+=rightExtendWidth;if(IFrameSplitOperator.IsNumber(width.Left))width.Left+=this.YTextPadding[0];if(IFrameSplitOperator.IsNumber(width.Right))width.Right+=this.YTextPadding[1];return{TextWidth:width};};this.ClearToolbar=function(){if(!this.ToolbarID)return;var divToolbar=document.getElementById(this.ToolbarID);if(!divToolbar)return;this.ChartBorder.UIElement.parentNode.removeChild(divToolbar);this.ToolbarRect=null;};this.HideToolbar=function(){if(!this.ToolbarID)return;this.ToolbarRect=null;var divToolbar=document.getElementById(this.ToolbarID);if(!divToolbar)return;if(divToolbar.style.display!='none')divToolbar.style.display='none';};}function MinuteFrame(){this.newMethod=AverageWidthFrame;//派生
1950
1951
  this.newMethod();delete this.newMethod;this.ClassName="MinuteFrame";this.DataWidth=1*GetDevicePixelRatio();this.DistanceWidth=1*GetDevicePixelRatio();this.MinuteCount=243;//每天的分钟个数
1951
1952
  this.BeforeBGColor=g_JSChartResource.Minute.Before.BGColor;//集合竞价背景
1952
1953
  this.MultiDayBorderPen=g_JSChartResource.FrameBorderPen;this.CustomHorizontalInfo=[];this.RightFrame=null;//右侧多重坐标
@@ -2669,7 +2670,7 @@ var ZOOM_SEED=
2669
2670
  //[0.3,0.06], [0.2,0.04], [0.1,0.02]
2670
2671
  ];
2671
2672
  */var ZOOM_SEED=//0=柱子宽度 1=间距
2672
- [[48,10],[44,10],[40,9],[36,9],[32,8],[28,8],[24,7],[20,7],[18,6],[16,6],[14,5],[12,5],[8,4],[6,4],[4,4],[3,3],[3,1],[2,1],[1,1],[1,0]];//K线画法 支持横屏
2673
+ [[48,10],[44,10],[40,9],[36,9],[32,8],[28,8],[24,7],[20,7],[18,6],[16,6],[15,5],[13,5],[9,4],[7,4],[5,4],[3,3],[3,1],[2,1],[1,1],[1,0]];//K线画法 支持横屏
2673
2674
  function ChartKLine(){this.newMethod=IChartPainting;//派生
2674
2675
  this.newMethod();delete this.newMethod;this.ClassName='ChartKLine';//类名
2675
2676
  this.Symbol;//股票代码
@@ -2727,21 +2728,21 @@ if(bFirstPoint)return;this.Canvas.stroke();if(isHScreen){this.Canvas.lineTo(bord
2727
2728
  this.TooltipRect.push([i,rect]);//[0]数据索引 [1]数据区域
2728
2729
  }if(this.Data.DataType==0){var infoItem={Xleft:left,XRight:right,XCenter:x,YMax:yHigh,YMin:yLow,DayData:data,Index:j};this.DrawInfo(infoItem);}if(i==this.Data.Data.length-1){ptLast={X:x,Y:yClose,XLeft:left,XRight:right,KItem:data,ChartRight:chartright};}}this.DrawLastPointEvent(ptLast);//通知外部绘制最后一个点
2729
2730
  this.PtMax=ptMax;this.PtMin=ptMin;};this.DrawKBar_Up=function(data,dataWidth,upColor,drawType,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen)//阳线
2730
- {if(dataWidth>=4){this.Canvas.strokeStyle=upColor;if(data.High>data.Close)//上影线
2731
- {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(drawType==3?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.min(yClose,yOpen):yClose));}this.Canvas.stroke();y=yClose;}else{y=yClose;}this.Canvas.fillStyle=upColor;if(isHScreen){if(Math.abs(yOpen-y)<1){this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));//高度小于1,统一使用高度1
2731
+ {if(dataWidth>=4){if(drawType==3){if(dataWidth%2!=0)dataWidth-=1;}this.Canvas.strokeStyle=upColor;if(data.High>data.Close)//上影线
2732
+ {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(drawType==3?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));}else{if(drawType==3){var xFixed=left+dataWidth/2;this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(Math.min(yClose,yOpen)));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yClose));}}this.Canvas.stroke();y=yClose;}else{y=yClose;}this.Canvas.fillStyle=upColor;if(isHScreen){if(Math.abs(yOpen-y)<1){this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));//高度小于1,统一使用高度1
2732
2733
  }else{if(drawType==3)//空心柱
2733
2734
  {this.Canvas.beginPath();this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));this.Canvas.stroke();}else{this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));}}}else{if(Math.abs(yOpen-y)<1){this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);//高度小于1,统一使用高度1
2734
2735
  }else{if(drawType==3)//空心柱
2735
2736
  {this.Canvas.beginPath();this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));this.Canvas.stroke();}else{this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yOpen)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yOpen-y)));}}}if(data.Open>data.Low)//下影线
2736
- {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(drawType==3?Math.min(yClose,yOpen):y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.max(yClose,yOpen):y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));}this.Canvas.stroke();}}else{this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh,ToFixedPoint(x));this.Canvas.lineTo(yLow,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),yHigh);this.Canvas.lineTo(ToFixedPoint(x),yLow);}this.Canvas.strokeStyle=upColor;this.Canvas.stroke();}};this.DrawKBar_Down=function(data,dataWidth,downColor,drawType,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen)//阴线
2737
+ {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(drawType==3?Math.min(yClose,yOpen):y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));}else{if(drawType==3){var xFixed=left+dataWidth/2;this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(Math.max(yClose,yOpen)));this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(yLow));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));}}this.Canvas.stroke();}}else{this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh,ToFixedPoint(x));this.Canvas.lineTo(yLow,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),yHigh);this.Canvas.lineTo(ToFixedPoint(x),yLow);}this.Canvas.strokeStyle=upColor;this.Canvas.stroke();}};this.DrawKBar_Down=function(data,dataWidth,downColor,drawType,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen)//阴线
2737
2738
  {if(dataWidth>=4){this.Canvas.strokeStyle=downColor;if(data.High>data.Close)//上影线
2738
2739
  {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yOpen),ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yOpen));}this.Canvas.stroke();y=yOpen;}else{y=yOpen;}this.Canvas.fillStyle=downColor;if(isHScreen){if(Math.abs(yClose-y)<1)this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));//高度小于1,统一使用高度1
2739
2740
  else this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yClose-y),ToFixedRect(dataWidth));}else{if(Math.abs(yClose-y)<1)this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);//高度小于1,统一使用高度1
2740
2741
  else this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yClose)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yClose-y)));}if(data.Open>data.Low)//下影线
2741
2742
  {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));}this.Canvas.stroke();}}else{this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh,ToFixedPoint(x));this.Canvas.lineTo(yLow,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),yHigh);this.Canvas.lineTo(ToFixedPoint(x),yLow);}this.Canvas.strokeStyle=downColor;this.Canvas.stroke();}};this.DrawKBar_Unchagne=function(data,dataWidth,unchagneColor,drawType,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen)//平线
2742
- {if(dataWidth>=4){this.Canvas.strokeStyle=unchagneColor;this.Canvas.beginPath();if(data.High>data.Close)//上影线
2743
- {if(isHScreen){this.Canvas.moveTo(y,ToFixedPoint(x));this.Canvas.lineTo(yOpen,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),y);this.Canvas.lineTo(ToFixedPoint(x),yOpen);}y=yOpen;}else{y=yOpen;}if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(left));this.Canvas.lineTo(ToFixedPoint(y),ToFixedPoint(right));}else{this.Canvas.moveTo(ToFixedPoint(left),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(y));}if(data.Open>data.Low)//下影线
2744
- {if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));}}this.Canvas.stroke();}else{this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh,ToFixedPoint(x));this.Canvas.lineTo(yLow,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),yHigh);this.Canvas.lineTo(ToFixedPoint(x),yLow);}this.Canvas.strokeStyle=unchagneColor;this.Canvas.stroke();}};this.DrawKBar_Custom=function(data,dataWidth,barColor,drawType,option,x,y,left,right,yLow,yHigh,yOpen,yClose,border,isHScreen){if(option.BGColor)//画背景色
2743
+ {if(dataWidth>=4){if(dataWidth%2!=0)dataWidth-=1;this.Canvas.strokeStyle=unchagneColor;this.Canvas.beginPath();if(data.High>data.Close)//上影线
2744
+ {if(isHScreen){this.Canvas.moveTo(y,ToFixedPoint(x));this.Canvas.lineTo(yOpen,ToFixedPoint(x));}else{var xFixed=ToFixedPoint(left+dataWidth/2);this.Canvas.moveTo(xFixed,y);this.Canvas.lineTo(xFixed,yOpen);}y=yOpen;}else{y=yOpen;}if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(left));this.Canvas.lineTo(ToFixedPoint(y),ToFixedPoint(right));}else{this.Canvas.moveTo(ToFixedPoint(left),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(left+dataWidth),ToFixedPoint(y));}if(data.Open>data.Low)//下影线
2745
+ {if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));}else{var xFixed=ToFixedPoint(left+dataWidth/2);this.Canvas.moveTo(xFixed,ToFixedPoint(y));this.Canvas.lineTo(xFixed,ToFixedPoint(yLow));}}this.Canvas.stroke();}else{this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh,ToFixedPoint(x));this.Canvas.lineTo(yLow,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),yHigh);this.Canvas.lineTo(ToFixedPoint(x),yLow);}this.Canvas.strokeStyle=unchagneColor;this.Canvas.stroke();}};this.DrawKBar_Custom=function(data,dataWidth,barColor,drawType,option,x,y,left,right,yLow,yHigh,yOpen,yClose,border,isHScreen){if(option.BGColor)//画背景色
2745
2746
  {this.Canvas.fillStyle=option.BGColor;var distanceWidth=this.ChartFrame.DistanceWidth;if(isHScreen){var yLeft=left-distanceWidth/2;var yRight=right+distanceWidth/2;var xTop=border.RightEx;var xBottom=border.LeftEx;this.Canvas.fillRect(ToFixedRect(xBottom),ToFixedRect(yLeft),ToFixedRect(xTop-xBottom),ToFixedRect(yRight-yLeft));}else{var xLeft=left-distanceWidth/2;var xRight=right+distanceWidth/2;var yTop=border.TopEx;var yBottom=border.BottomEx;this.Canvas.fillRect(ToFixedRect(xLeft),ToFixedRect(yTop),ToFixedRect(xRight-xLeft),ToFixedRect(yBottom-yTop));}}if(dataWidth>=4){this.Canvas.strokeStyle=barColor;if(data.High>data.Close)//上影线
2746
2747
  {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(drawType==3?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.min(yClose,yOpen):yClose));}this.Canvas.stroke();y=yClose;}else{y=yClose;}this.Canvas.fillStyle=barColor;if(isHScreen){if(Math.abs(yOpen-y)<1){this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth));//高度小于1,统一使用高度1
2747
2748
  }else{if(drawType==3)//空心柱
@@ -4357,8 +4358,8 @@ this.FrameSplitTextColor="rgb(117,125,129)";//刻度文字颜色
4357
4358
  this.FrameSplitTextFont=14*GetDevicePixelRatio()+"px 微软雅黑";//坐标刻度文字字体
4358
4359
  this.FrameTitleBGColor="rgb(246,251,253)";//标题栏背景色
4359
4360
  this.Frame={XBottomOffset:1*GetDevicePixelRatio(),//X轴文字向下偏移
4360
- YTopOffset:2*GetDevicePixelRatio()//Y轴顶部文字向下偏移
4361
- };//百分比坐标文字颜色
4361
+ YTopOffset:2*GetDevicePixelRatio(),//Y轴顶部文字向下偏移
4362
+ YTextPadding:[2,2]};//百分比坐标文字颜色
4362
4363
  this.Frame.PercentageText={PriceColor:'rgb(117,125,129)',PercentageColor:"rgb(117,125,129)",SplitColor:"rgb(117,125,129)",Font:14*GetDevicePixelRatio()+"px 微软雅黑"};//对数坐标
4363
4364
  this.FrameLogarithmic={OpenPriceFont:"bold "+14*GetDevicePixelRatio()+"px 微软雅黑",//开盘价刻度文字字体
4364
4365
  MinInterval:45*GetDevicePixelRatio()//刻度最小间距
@@ -6409,6 +6410,7 @@ var choicedText=(0,_jquery2.default)(this).closest(".fontSizeSelect").find('.cho
6409
6410
  //
6410
6411
  //////////////////////////////////////////////////////////////////////////////////////
6411
6412
  var MARKET_SUFFIX_NAME={SH:'.SH',SZ:'.SZ',SHSZ_C_Index:'.CI',//自定义指数
6413
+ BJ:".BJ",//北交所 BeiJing stock exchange
6412
6414
  SHO:'.SHO',//上海交易所 股票期权
6413
6415
  HK:'.HK',//港股
6414
6416
  FHK:'.FHK',//港股期货
@@ -6433,7 +6435,7 @@ ET:'.ET',//其他未知的品种
6433
6435
  IsET:function IsET(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.ET)>0;},IsETShowAvPrice:function IsETShowAvPrice(upperSymbol)//是否显示均价
6434
6436
  {return false;},IsNYMEX:function IsNYMEX(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.NYMEX)>0;},IsCOMEX:function IsCOMEX(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.COMEX)>0;},IsNYBOT:function IsNYBOT(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.NYBOT)>0;},IsCBOT:function IsCBOT(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.CBOT)>0;},IsLME:function IsLME(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.LME)>0;},IsTOCOM:function IsTOCOM(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.TOCOM)>0;},IsIPE:function IsIPE(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.IPE)>0;},IsForeignExchange:function IsForeignExchange(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.FOREX)>0;},IsFTSE:function IsFTSE(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.FTSE)>0;},IsFHK:function IsFHK(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.FHK)>0;},IsBIT:function IsBIT(upperSymbol){if(!upperSymbol)return false;if(upperSymbol.indexOf(this.BIT)>0)return true;if(upperSymbol.indexOf(this.BIZ)>0)return true;return false;},IsUSA:function IsUSA(upperSymbol)//是否是美股
6435
6437
  {if(!upperSymbol)return false;return upperSymbol.indexOf(this.USA)>0;},IsSH:function IsSH(upperSymbol){//需要精确匹配最后3位
6436
- var pos=upperSymbol.length-this.SH.length;var find=upperSymbol.indexOf(this.SH);return find==pos;},IsSZ:function IsSZ(upperSymbol){var pos=upperSymbol.length-this.SZ.length;var find=upperSymbol.indexOf(this.SZ);return find==pos;},//自定义指数
6438
+ var pos=upperSymbol.length-this.SH.length;var find=upperSymbol.indexOf(this.SH);return find==pos;},IsSZ:function IsSZ(upperSymbol){var pos=upperSymbol.length-this.SZ.length;var find=upperSymbol.indexOf(this.SZ);return find==pos;},IsBJ:function IsBJ(upperSymbol){var pos=upperSymbol.length-this.BJ.length;var find=upperSymbol.indexOf(this.BJ);return find==pos;},//自定义指数
6437
6439
  IsSHSZCustomIndex:function IsSHSZCustomIndex(upperSymbol){var pos=upperSymbol.length-this.SHSZ_C_Index.length;var find=upperSymbol.indexOf(this.SHSZ_C_Index);return find==pos;},IsSHO:function IsSHO(upperSymbol){var pos=upperSymbol.length-this.SHO.length;var find=upperSymbol.indexOf(this.SHO);return find==pos;},IsHK:function IsHK(upperSymbol){var pos=upperSymbol.length-this.HK.length;var find=upperSymbol.indexOf(this.HK);return find==pos;},IsSHFE:function IsSHFE(upperSymbol){if(!upperSymbol)return false;if(upperSymbol.indexOf(this.SHFE)>0)return true;if(upperSymbol.indexOf(this.SHFE2)>0)return true;return false;},IsCFFEX:function IsCFFEX(upperSymbol){if(!upperSymbol)return false;if(upperSymbol.indexOf(this.CFFEX)>0)return true;return false;},IsDCE:function IsDCE(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.DCE)>0;},IsCZCE:function IsCZCE(upperSymbol){if(!upperSymbol)return false;return upperSymbol.indexOf(this.CZCE)>0;},IsChinaFutures:function IsChinaFutures(upperSymbol)//是否是国内期货 /期权
6438
6440
  {return this.IsSHO(upperSymbol)||this.IsCFFEX(upperSymbol)||this.IsCZCE(upperSymbol)||this.IsDCE(upperSymbol)||this.IsSHFE(upperSymbol);},IsFutures:function IsFutures(upperSymbol)//是否是期货 包含国外的
6439
6441
  {return this.IsChinaFutures(upperSymbol)||this.IsNYMEX(upperSymbol)||this.IsCOMEX(upperSymbol)||this.IsNYBOT(upperSymbol)||this.IsCBOT(upperSymbol)||this.IsLME(upperSymbol)||this.IsTOCOM(upperSymbol);},IsSHSZ:function IsSHSZ(upperSymbol)//是否是沪深的股票
@@ -6445,7 +6447,8 @@ IsSHSZCustomIndex:function IsSHSZCustomIndex(upperSymbol){var pos=upperSymbol.le
6445
6447
  {return true;}return false;},IsSHSZStockA:function IsSHSZStockA(symbol)//是否是沪深A股
6446
6448
  {if(!symbol)return false;var upperSymbol=symbol.toUpperCase();if(this.IsSH(upperSymbol)){var temp=upperSymbol.replace('.SH','');if(upperSymbol.charAt(0)=='6')return true;}else if(this.IsSZ(upperSymbol)){if(upperSymbol.charAt(0)=='0'){if(upperSymbol.charAt(1)=='0'&&upperSymbol.charAt(2)=='2')return true;//002 中小板
6447
6449
  if(upperSymbol.charAt(1)!='7'&&upperSymbol.charAt(1)!='8')return true;}else if(upperSymbol.charAt(0)=='3'){if(upperSymbol.charAt(1)=='0'&&upperSymbol.charAt(2)=='0')return true;//创业板 300XXX.sz
6448
- }}return false;},IsSHStockSTAR:function IsSHStockSTAR(symbol)// 是否是科创板 Sci-Tech innovAtion boaRd (STAR Market)
6450
+ }}return false;},IsBJStock:function IsBJStock(symbol)//北交所股票
6451
+ {if(!symbol)return false;var upperSymbol=symbol.toUpperCase();if(!this.IsBJ(upperSymbol))return false;var value=upperSymbol.charAt(0);if(value=='4'||value=='8')return true;return false;},IsSHStockSTAR:function IsSHStockSTAR(symbol)// 是否是科创板 Sci-Tech innovAtion boaRd (STAR Market)
6449
6452
  {if(!symbol)return false;var upperSymbol=symbol.toUpperCase();if(!this.IsSH(upperSymbol))return false;if(upperSymbol.charAt(0)=='6'&&upperSymbol.charAt(1)=='8'&&upperSymbol.charAt(2)=='8')return true;return false;},GetMarketStatus:function GetMarketStatus(symbol)//获取市场状态 0=闭市 1=盘前 2=盘中 3=盘后
6450
6453
  {if(!symbol)return 0;var upperSymbol=symbol.toUpperCase();var nowDate=new Date();var day=nowDate.getDay();var time=nowDate.getHours()*100+nowDate.getMinutes();if(this.IsUSA(upperSymbol)){var usaDate=GetLocalTime(-4);var day=usaDate.getDay();var time=usaDate.getHours()*100+usaDate.getMinutes();if(day==6||day==0)return 0;//周末
6451
6454
  //9:30 - 16:00 考虑夏令时间时间增加1小时 9:30 - 17:00
@@ -6477,11 +6480,11 @@ return 2;},GetNYMEXMarketStatus:function GetNYMEXMarketStatus(symbol){return g_N
6477
6480
  return false;},IsShowMinutePostionLine:function IsShowMinutePostionLine(upperSymbol)//分时图 成交量图中是否显示持仓线
6478
6481
  {if(MARKET_SUFFIX_NAME.IsFutures(upperSymbol)||MARKET_SUFFIX_NAME.IsSHO(upperSymbol))return true;return false;},IsShowMinuteColorVolBar:function IsShowMinuteColorVolBar(symobl)//是否分时图成绩量柱子使用彩色柱
6479
6482
  {if(g_JSChartResource.Minute.VolBarColor)return true;return false;},IsEnableRight:function IsEnableRight(period,symbol)//是否支持复权
6480
- {if(!MARKET_SUFFIX_NAME.IsSHSZStockA(symbol))return false;if(ChartData.IsTickPeriod(period))return false;//分笔没有复权
6483
+ {if(!MARKET_SUFFIX_NAME.IsSHSZStockA(symbol)||!MARKET_SUFFIX_NAME.IsBJStock(symbol))return false;if(ChartData.IsTickPeriod(period))return false;//分笔没有复权
6481
6484
  if(ChartData.IsMinutePeriod(period,true))return false;//内置分钟K线不支持复权
6482
6485
  return true;}//走势图分钟数据对应的时间
6483
6486
  };function MinuteTimeStringData(){this.SHSZ=null;//上海深证交易所时间
6484
- this.SHO=null;//上海股票期权交易时间
6487
+ this.BJ=null;this.SHO=null;//上海股票期权交易时间
6485
6488
  this.HK=null;//香港交易所时间
6486
6489
  this.Futures=new _map2.default();//期货交易时间 key=时间名称 Value=数据
6487
6490
  this.USA=null;//美股交易时间
@@ -6494,7 +6497,7 @@ this.Initialize=function()//初始化 默认只初始化沪深的 其他市场
6494
6497
  //this.HK = this.CreateHKData();
6495
6498
  };this.GetET=function(upperSymbol)//当天所有的分钟
6496
6499
  {throw{Name:'MinuteTimeStringData::GetET',Error:'not implement'};};this.GetSHSZ=function(upperSymbol)//动态创建
6497
- {if(!this.SHSZ)this.SHSZ=this.CreateSHSZData();return this.SHSZ;};this.GetSHO=function(){if(!this.SHO)this.SHO=this.CreateSHOData();return this.SHO;};this.GetHK=function(){if(!this.HK)this.HK=this.CreateHKData();return this.HK;};this.GetFutures=function(splitData){if(!this.Futures.has(splitData.Name)){var data=this.CreateTimeData(splitData.Data);this.Futures.set(splitData.Name,data);}return this.Futures.get(splitData.Name);};this.GetUSA=function(){if(!this.USA)this.USA=this.CreateUSAData(0);return this.USA;};this.GetFTSE=function(){if(!this.FTSE)this.FTSE=this.CreateFTSEData();return this.FTSE;};this.GetFHK=function(){if(!this.FHK)this.FHK=this.CreateFHKData();return this.FHK;};this.GetForeignExchange=function(){if(!this.ForeEx)this.ForeEx=this.CreateForeignExchangeData();return this.ForeEx;};this.GetBIT=function(upperSymbol){if(!this.BIT)this.BIT=this.CreateBITData();return this.BIT;};this.CreateSHSZData=function(){var TIME_SPLIT=[{Start:925,End:925},{Start:930,End:1130},{Start:1300,End:1500}];return this.CreateTimeData(TIME_SPLIT);};this.CreateSHOData=function(){var TIME_SPLIT=[{Start:930,End:1129},{Start:1300,End:1500}];return this.CreateTimeData(TIME_SPLIT);};this.CreateHKData=function(){var TIME_SPLIT=[{Start:930,End:1200},{Start:1300,End:1600}];return this.CreateTimeData(TIME_SPLIT);};this.CreateFTSEData=function(){var TIME_SPLIT=[{Start:1700,End:2359},{Start:0,End:445},{Start:900,End:1630}];return this.CreateTimeData(TIME_SPLIT);};this.CreateFHKData=function(){//港股指数期货 9:15-12:00 13:00-16:30 17:15-03:00
6500
+ {if(!this.SHSZ)this.SHSZ=this.CreateSHSZData();return this.SHSZ;};this.GetBJ=function(upperSymbol){if(!this.BJ)this.BJ=this.CreateBJData();return this.BJ;};this.GetSHO=function(){if(!this.SHO)this.SHO=this.CreateSHOData();return this.SHO;};this.GetHK=function(){if(!this.HK)this.HK=this.CreateHKData();return this.HK;};this.GetFutures=function(splitData){if(!this.Futures.has(splitData.Name)){var data=this.CreateTimeData(splitData.Data);this.Futures.set(splitData.Name,data);}return this.Futures.get(splitData.Name);};this.GetUSA=function(){if(!this.USA)this.USA=this.CreateUSAData(0);return this.USA;};this.GetFTSE=function(){if(!this.FTSE)this.FTSE=this.CreateFTSEData();return this.FTSE;};this.GetFHK=function(){if(!this.FHK)this.FHK=this.CreateFHKData();return this.FHK;};this.GetForeignExchange=function(){if(!this.ForeEx)this.ForeEx=this.CreateForeignExchangeData();return this.ForeEx;};this.GetBIT=function(upperSymbol){if(!this.BIT)this.BIT=this.CreateBITData();return this.BIT;};this.CreateSHSZData=function(){var TIME_SPLIT=[{Start:925,End:925},{Start:930,End:1130},{Start:1300,End:1500}];return this.CreateTimeData(TIME_SPLIT);};this.CreateBJData=function(){var TIME_SPLIT=[{Start:925,End:925},{Start:930,End:1130},{Start:1300,End:1500}];return this.CreateTimeData(TIME_SPLIT);};this.CreateSHOData=function(){var TIME_SPLIT=[{Start:930,End:1129},{Start:1300,End:1500}];return this.CreateTimeData(TIME_SPLIT);};this.CreateHKData=function(){var TIME_SPLIT=[{Start:930,End:1200},{Start:1300,End:1600}];return this.CreateTimeData(TIME_SPLIT);};this.CreateFTSEData=function(){var TIME_SPLIT=[{Start:1700,End:2359},{Start:0,End:445},{Start:900,End:1630}];return this.CreateTimeData(TIME_SPLIT);};this.CreateFHKData=function(){//港股指数期货 9:15-12:00 13:00-16:30 17:15-03:00
6498
6501
  var TIME_SPLIT=[{Start:1715,End:2359},{Start:0,End:300},{Start:915,End:1200},{Start:1300,End:1630}];return this.CreateTimeData(TIME_SPLIT);};this.CreateUSAData=function(type){if(type==1)//美国夏令时
6499
6502
  {var TIME_SPLIT=[{Start:2130,End:2359},{Start:0,End:400}];return this.CreateTimeData(TIME_SPLIT);}else if(type==2)//非夏令时
6500
6503
  {var _TIME_SPLIT=[{Start:2230,End:2359},{Start:0,End:500}];return this.CreateTimeData(_TIME_SPLIT);}else//使用美国本地时间
@@ -6503,7 +6506,7 @@ var TIME_SPLIT=[{Start:1715,End:2359},{Start:0,End:300},{Start:915,End:1200},{St
6503
6506
  var TIME_SPLIT=[{Start:600,End:2359},{Start:0,End:559}];return this.CreateTimeData(TIME_SPLIT);};this.CreateBITData=function(){//数字货币 7:00 - 6:59
6504
6507
  var TIME_SPLIT=[{Start:600,End:2359},{Start:0,End:559}];return this.CreateTimeData(TIME_SPLIT);};this.CreateTimeData=function(timeSplit){var data=[];for(var i in timeSplit){var item=timeSplit[i];for(var j=item.Start;j<=item.End;++j){if(j%100>=60)continue;//大于60分钟的数据去掉
6505
6508
  data.push(j);}}return data;};this.GetTimeData=function(symbol){if(!symbol)return this.SHSZ;var upperSymbol=symbol.toLocaleUpperCase();//转成大写
6506
- if(MARKET_SUFFIX_NAME.IsSH(upperSymbol)||MARKET_SUFFIX_NAME.IsSZ(upperSymbol))return this.GetSHSZ(upperSymbol);if(MARKET_SUFFIX_NAME.IsSHO(upperSymbol))return this.GetSHO();if(MARKET_SUFFIX_NAME.IsHK(upperSymbol))return this.GetHK();if(MARKET_SUFFIX_NAME.IsUSA(upperSymbol))return this.GetUSA(true);if(MARKET_SUFFIX_NAME.IsCFFEX(upperSymbol)||MARKET_SUFFIX_NAME.IsCZCE(upperSymbol)||MARKET_SUFFIX_NAME.IsDCE(upperSymbol)||MARKET_SUFFIX_NAME.IsSHFE(upperSymbol)){var splitData=g_FuturesTimeData.GetSplitData(upperSymbol);if(!splitData)return null;return this.GetFutures(splitData);}if(MARKET_SUFFIX_NAME.IsFTSE(upperSymbol))return this.GetFTSE();if(MARKET_SUFFIX_NAME.IsFHK(upperSymbol))return this.GetFHK();if(MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol))return this.GetForeignExchange();if(MARKET_SUFFIX_NAME.IsET(upperSymbol))return this.GetET(upperSymbol);if(MARKET_SUFFIX_NAME.IsBIT(upperSymbol))return this.GetBIT(upperSymbol);if(MARKET_SUFFIX_NAME.IsNYMEX(upperSymbol))//纽约期货交易所
6509
+ if(MARKET_SUFFIX_NAME.IsSH(upperSymbol)||MARKET_SUFFIX_NAME.IsSZ(upperSymbol))return this.GetSHSZ(upperSymbol);if(MARKET_SUFFIX_NAME.IsBJ(upperSymbol))return this.GetBJ(upperSymbol);if(MARKET_SUFFIX_NAME.IsSHO(upperSymbol))return this.GetSHO();if(MARKET_SUFFIX_NAME.IsHK(upperSymbol))return this.GetHK();if(MARKET_SUFFIX_NAME.IsUSA(upperSymbol))return this.GetUSA(true);if(MARKET_SUFFIX_NAME.IsCFFEX(upperSymbol)||MARKET_SUFFIX_NAME.IsCZCE(upperSymbol)||MARKET_SUFFIX_NAME.IsDCE(upperSymbol)||MARKET_SUFFIX_NAME.IsSHFE(upperSymbol)){var splitData=g_FuturesTimeData.GetSplitData(upperSymbol);if(!splitData)return null;return this.GetFutures(splitData);}if(MARKET_SUFFIX_NAME.IsFTSE(upperSymbol))return this.GetFTSE();if(MARKET_SUFFIX_NAME.IsFHK(upperSymbol))return this.GetFHK();if(MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol))return this.GetForeignExchange();if(MARKET_SUFFIX_NAME.IsET(upperSymbol))return this.GetET(upperSymbol);if(MARKET_SUFFIX_NAME.IsBIT(upperSymbol))return this.GetBIT(upperSymbol);if(MARKET_SUFFIX_NAME.IsNYMEX(upperSymbol))//纽约期货交易所
6507
6510
  {var splitData=g_NYMEXTimeData.GetSplitData(upperSymbol);if(!splitData)return null;return this.GetFutures(splitData);}if(MARKET_SUFFIX_NAME.IsCOMEX(upperSymbol))//纽约期货交易所
6508
6511
  {var splitData=g_COMEXTimeData.GetSplitData(upperSymbol);if(!splitData)return null;return this.GetFutures(splitData);}if(MARKET_SUFFIX_NAME.IsNYBOT(upperSymbol))//纽约期货交易所
6509
6512
  {var splitData=g_NYBOTTimeData.GetSplitData(upperSymbol);if(!splitData)return null;return this.GetFutures(splitData);}if(MARKET_SUFFIX_NAME.IsCBOT(upperSymbol))//芝商所
@@ -6589,8 +6592,8 @@ var FTSE_MINUTE_X_COORDINATE={Full://完整模式
6589
6592
  [[0,1,"RGB(200,200,200)","06:00"],[240,1,"RGB(200,200,200)","10:00"],[480,0,"RGB(200,200,200)","14:00"],[720,1,"RGB(200,200,200)","18:00"],[960,1,"RGB(200,200,200)","22:00"],[1200,1,"RGB(200,200,200)","02:00"]],Min://最小模式
6590
6593
  [[0,1,"RGB(200,200,200)","06:00"],[480,0,"RGB(200,200,200)","14:00"],[960,1,"RGB(200,200,200)","22:00"]],Count:1440,MiddleCount:600,GetData:function GetData(width){if(width<200)return this.Min;else if(width<450)return this.Simple;return this.Full;}};this.GetCoordinateData=function(symbol,width){var data=null;if(!symbol){data=SHZE_MINUTE_X_COORDINATE;//默认沪深股票
6591
6594
  }else{var upperSymbol=symbol.toLocaleUpperCase();//转成大写
6592
- if(MARKET_SUFFIX_NAME.IsSH(upperSymbol)||MARKET_SUFFIX_NAME.IsSZ(upperSymbol)||MARKET_SUFFIX_NAME.IsSHSZIndex(upperSymbol))data=this.GetSHSZData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsSHO(upperSymbol))data=this.GetSHOData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsHK(upperSymbol))data=this.GetHKData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsCFFEX(upperSymbol)||MARKET_SUFFIX_NAME.IsCZCE(upperSymbol)||MARKET_SUFFIX_NAME.IsDCE(upperSymbol)||MARKET_SUFFIX_NAME.IsSHFE(upperSymbol))return this.GetChinatFuturesData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsUSA(upperSymbol))data=this.GetUSAData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsFTSE(upperSymbol))data=this.GetFTSEData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsFHK(upperSymbol))data=this.GetFHKData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol))data=this.GetForeignExchangeData(upperSymbol);else if(MARKET_SUFFIX_NAME.IsBIT(upperSymbol,width))data=this.GetBITData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsET(upperSymbol))data=this.GetETData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsNYMEX(upperSymbol))return data=this.GetNYMEXData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsCOMEX(upperSymbol))return data=this.GetCOMEXData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsNYBOT(upperSymbol))return data=this.GetNYBOTData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsCBOT(upperSymbol))return data=this.GetCBOTData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsLME(upperSymbol))return data=this.GetLMEData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsTOCOM(upperSymbol))return data=this.GetTOCOMData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsIPE(upperSymbol))return data=this.GetIPEData(upperSymbol,width);}//JSConsole.Chart.Log('[MiuteCoordinateData]', width);
6593
- var result={Count:data.Count,MiddleCount:data.MiddleCount,Data:data.GetData(width)};return result;};this.GetSHSZData=function(upperSymbol,width){var result=SHZE_MINUTE_X_COORDINATE;return result;};this.GetUSAData=function(upperSymbol,width){var result=USA_MINUTE_X_COORDINATE;return result;};this.GetHKData=function(upperSymbol,width){var result=HK_MINUTE_X_COORDINATE;return result;};this.GetSHOData=function(upperSymbol,width){var result=SHO_MINUTE_X_COORDINATE;return result;};this.GetFuturesData=function(upperSymbol,width,timeData){var splitData=timeData.GetSplitData(upperSymbol);if(!splitData)return null;var stringData=g_MinuteTimeStringData.GetFutures(splitData);if(!stringData)return null;var result={Count:stringData.length};var coordinate=null;var minWidth=200,simpleWidth=480;/*
6595
+ if(MARKET_SUFFIX_NAME.IsSH(upperSymbol)||MARKET_SUFFIX_NAME.IsSZ(upperSymbol)||MARKET_SUFFIX_NAME.IsSHSZIndex(upperSymbol))data=this.GetSHSZData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsBJ(upperSymbol))data=this.GetBJData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsSHO(upperSymbol))data=this.GetSHOData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsHK(upperSymbol))data=this.GetHKData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsCFFEX(upperSymbol)||MARKET_SUFFIX_NAME.IsCZCE(upperSymbol)||MARKET_SUFFIX_NAME.IsDCE(upperSymbol)||MARKET_SUFFIX_NAME.IsSHFE(upperSymbol))return this.GetChinatFuturesData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsUSA(upperSymbol))data=this.GetUSAData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsFTSE(upperSymbol))data=this.GetFTSEData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsFHK(upperSymbol))data=this.GetFHKData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsForeignExchange(upperSymbol))data=this.GetForeignExchangeData(upperSymbol);else if(MARKET_SUFFIX_NAME.IsBIT(upperSymbol,width))data=this.GetBITData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsET(upperSymbol))data=this.GetETData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsNYMEX(upperSymbol))return data=this.GetNYMEXData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsCOMEX(upperSymbol))return data=this.GetCOMEXData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsNYBOT(upperSymbol))return data=this.GetNYBOTData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsCBOT(upperSymbol))return data=this.GetCBOTData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsLME(upperSymbol))return data=this.GetLMEData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsTOCOM(upperSymbol))return data=this.GetTOCOMData(upperSymbol,width);else if(MARKET_SUFFIX_NAME.IsIPE(upperSymbol))return data=this.GetIPEData(upperSymbol,width);}//JSConsole.Chart.Log('[MiuteCoordinateData]', width);
6596
+ var result={Count:data.Count,MiddleCount:data.MiddleCount,Data:data.GetData(width)};return result;};this.GetSHSZData=function(upperSymbol,width){var result=SHZE_MINUTE_X_COORDINATE;return result;};this.GetBJData=function(upperSymbol,width){var result=SHZE_MINUTE_X_COORDINATE;return result;};this.GetUSAData=function(upperSymbol,width){var result=USA_MINUTE_X_COORDINATE;return result;};this.GetHKData=function(upperSymbol,width){var result=HK_MINUTE_X_COORDINATE;return result;};this.GetSHOData=function(upperSymbol,width){var result=SHO_MINUTE_X_COORDINATE;return result;};this.GetFuturesData=function(upperSymbol,width,timeData){var splitData=timeData.GetSplitData(upperSymbol);if(!splitData)return null;var stringData=g_MinuteTimeStringData.GetFutures(splitData);if(!stringData)return null;var result={Count:stringData.length};var coordinate=null;var minWidth=200,simpleWidth=480;/*
6594
6597
  if (splitData.Name =='21:00-1:00,9:00-10:15,10:30-11:30,13:30-15:00')
6595
6598
  {
6596
6599
  minWidth=250;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "hqchart",
3
3
  "description": "stock chart",
4
4
  "author": "jones2000",
5
- "version": "1.1.10521",
5
+ "version": "1.1.10538",
6
6
  "main": "lib/main.js",
7
7
  "private": false,
8
8
  "license": "Apache License 2.0",
@@ -10537,6 +10537,7 @@ function AverageWidthFrame()
10537
10537
  this.XBottomOffset=g_JSChartResource.Frame.XBottomOffset; //X轴文字显示向下偏移
10538
10538
  this.YTextTopOffset=g_JSChartResource.Frame.YTopOffset; //Y轴顶部文字向下偏移
10539
10539
  this.YTextPosition=[0,0], //是坐标否强制画在内部 [0=左侧] [1=右侧] 1=OUT" , 2=INSIDE
10540
+ this.YTextPadding=[g_JSChartResource.Frame.YTextPadding[0], g_JSChartResource.Frame.YTextPadding[1]], //Y轴文字和边框间距 [0=左侧] [1=右侧]
10540
10541
  this.IsShowXLine=true; //是否显示X轴刻度线
10541
10542
  this.IsShowYLine=true;
10542
10543
  this.YInsideOffset=0;
@@ -10697,7 +10698,7 @@ function AverageWidthFrame()
10697
10698
  if (item.Font!=null) this.Canvas.font=item.Font;
10698
10699
 
10699
10700
  this.Canvas.textAlign="right";
10700
- this.Canvas.fillText(item.Message[0],left-2,yText);
10701
+ this.Canvas.fillText(item.Message[0],left-this.YTextPadding[0],yText);
10701
10702
  }
10702
10703
 
10703
10704
  //坐标信息 右边 间距小于10 不画坐标
@@ -10743,18 +10744,18 @@ function AverageWidthFrame()
10743
10744
  }
10744
10745
  else if (this.MultiTextFormat==2) //显示2行
10745
10746
  {
10746
- this.Canvas.fillText(item.Message[1][0],xText+2,yText);
10747
+ this.Canvas.fillText(item.Message[1][0],xText+this.YTextPadding[1],yText);
10747
10748
  var lineHeight=this.Canvas.measureText('M').width;
10748
- if (itemHeight>lineHeight*2) this.Canvas.fillText(item.Message[1][1],xText+2,yText+lineHeight);
10749
+ if (itemHeight>lineHeight*2) this.Canvas.fillText(item.Message[1][1],xText+this.YTextPadding[1],yText+lineHeight);
10749
10750
  }
10750
10751
  else //显示第1行
10751
10752
  {
10752
- this.Canvas.fillText(item.Message[1][0],xText+2,yText);
10753
+ this.Canvas.fillText(item.Message[1][0],xText+this.YTextPadding[1],yText);
10753
10754
  }
10754
10755
  }
10755
10756
  else
10756
10757
  {
10757
- this.Canvas.fillText(item.Message[1],xText+2,yText);
10758
+ this.Canvas.fillText(item.Message[1],xText+this.YTextPadding[1],yText);
10758
10759
  }
10759
10760
 
10760
10761
  }
@@ -11594,6 +11595,9 @@ function AverageWidthFrame()
11594
11595
  }
11595
11596
 
11596
11597
  if (IFrameSplitOperator.IsNumber(width.Right)) width.Right+=rightExtendWidth;
11598
+
11599
+ if (IFrameSplitOperator.IsNumber(width.Left)) width.Left+=this.YTextPadding[0];
11600
+ if (IFrameSplitOperator.IsNumber(width.Right)) width.Right+=this.YTextPadding[1];
11597
11601
 
11598
11602
  return { TextWidth:width };
11599
11603
  }
@@ -19125,8 +19129,8 @@ var ZOOM_SEED= //0=柱子宽度 1=间距
19125
19129
  [32,8], [28,8],
19126
19130
  [24,7], [20,7],
19127
19131
  [18,6], [16,6],
19128
- [14,5], [12,5],
19129
- [8,4], [6,4], [4,4],
19132
+ [15,5], [13,5],
19133
+ [9,4], [7,4], [5,4],
19130
19134
 
19131
19135
  [3,3],
19132
19136
  [3,1], [2,1], [1,1], [1,0],
@@ -19650,6 +19654,11 @@ function ChartKLine()
19650
19654
  {
19651
19655
  if (dataWidth>=4)
19652
19656
  {
19657
+ if (drawType==3)
19658
+ {
19659
+ if ((dataWidth%2)!=0) dataWidth-=1;
19660
+ }
19661
+
19653
19662
  this.Canvas.strokeStyle=upColor;
19654
19663
  if (data.High>data.Close) //上影线
19655
19664
  {
@@ -19661,8 +19670,18 @@ function ChartKLine()
19661
19670
  }
19662
19671
  else
19663
19672
  {
19664
- this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
19665
- this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.min(yClose,yOpen):yClose));
19673
+ if (drawType==3)
19674
+ {
19675
+ var xFixed=left+dataWidth/2;
19676
+ this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(y));
19677
+ this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(Math.min(yClose,yOpen)));
19678
+ }
19679
+ else
19680
+ {
19681
+ this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
19682
+ this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yClose));
19683
+ }
19684
+
19666
19685
  }
19667
19686
  this.Canvas.stroke();
19668
19687
  y=yClose;
@@ -19724,8 +19743,18 @@ function ChartKLine()
19724
19743
  }
19725
19744
  else
19726
19745
  {
19727
- this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.max(yClose,yOpen):y));
19728
- this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));
19746
+ if (drawType==3)
19747
+ {
19748
+ var xFixed=left+dataWidth/2;
19749
+ this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(Math.max(yClose,yOpen)));
19750
+ this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(yLow));
19751
+ }
19752
+ else
19753
+ {
19754
+ this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
19755
+ this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));
19756
+ }
19757
+
19729
19758
  }
19730
19759
  this.Canvas.stroke();
19731
19760
  }
@@ -19824,6 +19853,7 @@ function ChartKLine()
19824
19853
  {
19825
19854
  if (dataWidth>=4)
19826
19855
  {
19856
+ if ((dataWidth%2)!=0) dataWidth-=1;
19827
19857
  this.Canvas.strokeStyle=unchagneColor;
19828
19858
  this.Canvas.beginPath();
19829
19859
  if (data.High>data.Close) //上影线
@@ -19835,8 +19865,9 @@ function ChartKLine()
19835
19865
  }
19836
19866
  else
19837
19867
  {
19838
- this.Canvas.moveTo(ToFixedPoint(x),y);
19839
- this.Canvas.lineTo(ToFixedPoint(x),yOpen);
19868
+ var xFixed=ToFixedPoint(left+dataWidth/2);
19869
+ this.Canvas.moveTo(xFixed,y);
19870
+ this.Canvas.lineTo(xFixed,yOpen);
19840
19871
  }
19841
19872
  y=yOpen;
19842
19873
  }
@@ -19853,7 +19884,7 @@ function ChartKLine()
19853
19884
  else
19854
19885
  {
19855
19886
  this.Canvas.moveTo(ToFixedPoint(left),ToFixedPoint(y));
19856
- this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(y));
19887
+ this.Canvas.lineTo(ToFixedPoint(left+dataWidth),ToFixedPoint(y));
19857
19888
  }
19858
19889
 
19859
19890
  if (data.Open>data.Low) //下影线
@@ -19865,8 +19896,9 @@ function ChartKLine()
19865
19896
  }
19866
19897
  else
19867
19898
  {
19868
- this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
19869
- this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));
19899
+ var xFixed=ToFixedPoint(left+dataWidth/2);
19900
+ this.Canvas.moveTo(xFixed,ToFixedPoint(y));
19901
+ this.Canvas.lineTo(xFixed,ToFixedPoint(yLow));
19870
19902
  }
19871
19903
  }
19872
19904
 
@@ -43397,7 +43429,8 @@ function JSChartResource()
43397
43429
  this.FrameTitleBGColor="rgb(246,251,253)"; //标题栏背景色
43398
43430
  this.Frame={
43399
43431
  XBottomOffset:1*GetDevicePixelRatio(), //X轴文字向下偏移
43400
- YTopOffset:2*GetDevicePixelRatio() //Y轴顶部文字向下偏移
43432
+ YTopOffset:2*GetDevicePixelRatio(), //Y轴顶部文字向下偏移
43433
+ YTextPadding:[2,2]
43401
43434
  };
43402
43435
 
43403
43436
  //百分比坐标文字颜色
@@ -62088,6 +62121,7 @@ var MARKET_SUFFIX_NAME=
62088
62121
  SH:'.SH',
62089
62122
  SZ:'.SZ',
62090
62123
  SHSZ_C_Index:'.CI', //自定义指数
62124
+ BJ:".BJ", //北交所 BeiJing stock exchange
62091
62125
 
62092
62126
  SHO:'.SHO', //上海交易所 股票期权
62093
62127
  HK:'.HK', //港股
@@ -62216,6 +62250,13 @@ var MARKET_SUFFIX_NAME=
62216
62250
  return find == pos;
62217
62251
  },
62218
62252
 
62253
+ IsBJ:function(upperSymbol)
62254
+ {
62255
+ var pos = upperSymbol.length - this.BJ.length;
62256
+ var find = upperSymbol.indexOf(this.BJ);
62257
+ return find == pos;
62258
+ },
62259
+
62219
62260
  //自定义指数
62220
62261
  IsSHSZCustomIndex:function(upperSymbol)
62221
62262
  {
@@ -62348,6 +62389,19 @@ var MARKET_SUFFIX_NAME=
62348
62389
  return false;
62349
62390
  },
62350
62391
 
62392
+ IsBJStock:function(symbol) //北交所股票
62393
+ {
62394
+ if (!symbol) return false;
62395
+ var upperSymbol=symbol.toUpperCase();
62396
+ if (!this.IsBJ(upperSymbol)) return false;
62397
+
62398
+ var value=upperSymbol.charAt(0);
62399
+
62400
+ if (value=='4' || value=='8') return true;
62401
+
62402
+ return false;
62403
+ },
62404
+
62351
62405
  IsSHStockSTAR:function(symbol) // 是否是科创板 Sci-Tech innovAtion boaRd (STAR Market)
62352
62406
  {
62353
62407
  if (!symbol) return false;
@@ -62606,7 +62660,7 @@ var MARKET_SUFFIX_NAME=
62606
62660
 
62607
62661
  IsEnableRight:function(period, symbol) //是否支持复权
62608
62662
  {
62609
- if (!MARKET_SUFFIX_NAME.IsSHSZStockA(symbol)) return false;
62663
+ if (!MARKET_SUFFIX_NAME.IsSHSZStockA(symbol) || !MARKET_SUFFIX_NAME.IsBJStock(symbol)) return false;
62610
62664
  if (ChartData.IsTickPeriod(period)) return false; //分笔没有复权
62611
62665
  if (ChartData.IsMinutePeriod(period,true)) return false; //内置分钟K线不支持复权
62612
62666
 
@@ -62619,6 +62673,7 @@ var MARKET_SUFFIX_NAME=
62619
62673
  function MinuteTimeStringData()
62620
62674
  {
62621
62675
  this.SHSZ = null; //上海深证交易所时间
62676
+ this.BJ=null;
62622
62677
  this.SHO=null; //上海股票期权交易时间
62623
62678
  this.HK = null; //香港交易所时间
62624
62679
  this.Futures=new Map(); //期货交易时间 key=时间名称 Value=数据
@@ -62645,6 +62700,12 @@ function MinuteTimeStringData()
62645
62700
  return this.SHSZ;
62646
62701
  }
62647
62702
 
62703
+ this.GetBJ=function(upperSymbol)
62704
+ {
62705
+ if (!this.BJ) this.BJ=this.CreateBJData();
62706
+ return this.BJ;
62707
+ }
62708
+
62648
62709
  this.GetSHO=function()
62649
62710
  {
62650
62711
  if (!this.SHO) this.SHO=this.CreateSHOData();
@@ -62710,6 +62771,18 @@ function MinuteTimeStringData()
62710
62771
  return this.CreateTimeData(TIME_SPLIT);
62711
62772
  }
62712
62773
 
62774
+ this.CreateBJData=function()
62775
+ {
62776
+ const TIME_SPLIT =
62777
+ [
62778
+ { Start: 925, End: 925 },
62779
+ { Start: 930, End: 1130 },
62780
+ { Start: 1300, End: 1500 }
62781
+ ];
62782
+
62783
+ return this.CreateTimeData(TIME_SPLIT);
62784
+ }
62785
+
62713
62786
  this.CreateSHOData=function()
62714
62787
  {
62715
62788
  const TIME_SPLIT =
@@ -62836,6 +62909,7 @@ function MinuteTimeStringData()
62836
62909
 
62837
62910
  var upperSymbol = symbol.toLocaleUpperCase(); //转成大写
62838
62911
  if (MARKET_SUFFIX_NAME.IsSH(upperSymbol) || MARKET_SUFFIX_NAME.IsSZ(upperSymbol)) return this.GetSHSZ(upperSymbol);
62912
+ if (MARKET_SUFFIX_NAME.IsBJ(upperSymbol)) return this.GetBJ(upperSymbol);
62839
62913
  if (MARKET_SUFFIX_NAME.IsSHO(upperSymbol)) return this.GetSHO();
62840
62914
  if (MARKET_SUFFIX_NAME.IsHK(upperSymbol)) return this.GetHK();
62841
62915
  if (MARKET_SUFFIX_NAME.IsUSA(upperSymbol)) return this.GetUSA(true);
@@ -63271,6 +63345,8 @@ function MinuteCoordinateData()
63271
63345
  var upperSymbol = symbol.toLocaleUpperCase(); //转成大写
63272
63346
  if (MARKET_SUFFIX_NAME.IsSH(upperSymbol) || MARKET_SUFFIX_NAME.IsSZ(upperSymbol) || MARKET_SUFFIX_NAME.IsSHSZIndex(upperSymbol))
63273
63347
  data = this.GetSHSZData(upperSymbol,width);
63348
+ else if (MARKET_SUFFIX_NAME.IsBJ(upperSymbol))
63349
+ data=this.GetBJData(upperSymbol,width);
63274
63350
  else if (MARKET_SUFFIX_NAME.IsSHO(upperSymbol))
63275
63351
  data=this.GetSHOData(upperSymbol,width);
63276
63352
  else if (MARKET_SUFFIX_NAME.IsHK(upperSymbol))
@@ -63317,10 +63393,15 @@ function MinuteCoordinateData()
63317
63393
  return result;
63318
63394
  }
63319
63395
 
63396
+ this.GetBJData=function(upperSymbol,width)
63397
+ {
63398
+ var result=SHZE_MINUTE_X_COORDINATE;
63399
+ return result;
63400
+ }
63401
+
63320
63402
  this.GetUSAData=function(upperSymbol,width)
63321
63403
  {
63322
63404
  var result=USA_MINUTE_X_COORDINATE;
63323
-
63324
63405
  return result;
63325
63406
  }
63326
63407
 
@@ -10581,6 +10581,7 @@ function AverageWidthFrame()
10581
10581
  this.XBottomOffset=g_JSChartResource.Frame.XBottomOffset; //X轴文字显示向下偏移
10582
10582
  this.YTextTopOffset=g_JSChartResource.Frame.YTopOffset; //Y轴顶部文字向下偏移
10583
10583
  this.YTextPosition=[0,0], //是坐标否强制画在内部 [0=左侧] [1=右侧] 1=OUT" , 2=INSIDE
10584
+ this.YTextPadding=[g_JSChartResource.Frame.YTextPadding[0], g_JSChartResource.Frame.YTextPadding[1]], //Y轴文字和边框间距 [0=左侧] [1=右侧]
10584
10585
  this.IsShowXLine=true; //是否显示X轴刻度线
10585
10586
  this.IsShowYLine=true;
10586
10587
  this.YInsideOffset=0;
@@ -10741,7 +10742,7 @@ function AverageWidthFrame()
10741
10742
  if (item.Font!=null) this.Canvas.font=item.Font;
10742
10743
 
10743
10744
  this.Canvas.textAlign="right";
10744
- this.Canvas.fillText(item.Message[0],left-2,yText);
10745
+ this.Canvas.fillText(item.Message[0],left-this.YTextPadding[0],yText);
10745
10746
  }
10746
10747
 
10747
10748
  //坐标信息 右边 间距小于10 不画坐标
@@ -10787,18 +10788,18 @@ function AverageWidthFrame()
10787
10788
  }
10788
10789
  else if (this.MultiTextFormat==2) //显示2行
10789
10790
  {
10790
- this.Canvas.fillText(item.Message[1][0],xText+2,yText);
10791
+ this.Canvas.fillText(item.Message[1][0],xText+this.YTextPadding[1],yText);
10791
10792
  var lineHeight=this.Canvas.measureText('M').width;
10792
- if (itemHeight>lineHeight*2) this.Canvas.fillText(item.Message[1][1],xText+2,yText+lineHeight);
10793
+ if (itemHeight>lineHeight*2) this.Canvas.fillText(item.Message[1][1],xText+this.YTextPadding[1],yText+lineHeight);
10793
10794
  }
10794
10795
  else //显示第1行
10795
10796
  {
10796
- this.Canvas.fillText(item.Message[1][0],xText+2,yText);
10797
+ this.Canvas.fillText(item.Message[1][0],xText+this.YTextPadding[1],yText);
10797
10798
  }
10798
10799
  }
10799
10800
  else
10800
10801
  {
10801
- this.Canvas.fillText(item.Message[1],xText+2,yText);
10802
+ this.Canvas.fillText(item.Message[1],xText+this.YTextPadding[1],yText);
10802
10803
  }
10803
10804
 
10804
10805
  }
@@ -11638,6 +11639,9 @@ function AverageWidthFrame()
11638
11639
  }
11639
11640
 
11640
11641
  if (IFrameSplitOperator.IsNumber(width.Right)) width.Right+=rightExtendWidth;
11642
+
11643
+ if (IFrameSplitOperator.IsNumber(width.Left)) width.Left+=this.YTextPadding[0];
11644
+ if (IFrameSplitOperator.IsNumber(width.Right)) width.Right+=this.YTextPadding[1];
11641
11645
 
11642
11646
  return { TextWidth:width };
11643
11647
  }
@@ -19169,8 +19173,8 @@ var ZOOM_SEED= //0=柱子宽度 1=间距
19169
19173
  [32,8], [28,8],
19170
19174
  [24,7], [20,7],
19171
19175
  [18,6], [16,6],
19172
- [14,5], [12,5],
19173
- [8,4], [6,4], [4,4],
19176
+ [15,5], [13,5],
19177
+ [9,4], [7,4], [5,4],
19174
19178
 
19175
19179
  [3,3],
19176
19180
  [3,1], [2,1], [1,1], [1,0],
@@ -19694,6 +19698,11 @@ function ChartKLine()
19694
19698
  {
19695
19699
  if (dataWidth>=4)
19696
19700
  {
19701
+ if (drawType==3)
19702
+ {
19703
+ if ((dataWidth%2)!=0) dataWidth-=1;
19704
+ }
19705
+
19697
19706
  this.Canvas.strokeStyle=upColor;
19698
19707
  if (data.High>data.Close) //上影线
19699
19708
  {
@@ -19705,8 +19714,18 @@ function ChartKLine()
19705
19714
  }
19706
19715
  else
19707
19716
  {
19708
- this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
19709
- this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.min(yClose,yOpen):yClose));
19717
+ if (drawType==3)
19718
+ {
19719
+ var xFixed=left+dataWidth/2;
19720
+ this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(y));
19721
+ this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(Math.min(yClose,yOpen)));
19722
+ }
19723
+ else
19724
+ {
19725
+ this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
19726
+ this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yClose));
19727
+ }
19728
+
19710
19729
  }
19711
19730
  this.Canvas.stroke();
19712
19731
  y=yClose;
@@ -19768,8 +19787,18 @@ function ChartKLine()
19768
19787
  }
19769
19788
  else
19770
19789
  {
19771
- this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.max(yClose,yOpen):y));
19772
- this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));
19790
+ if (drawType==3)
19791
+ {
19792
+ var xFixed=left+dataWidth/2;
19793
+ this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(Math.max(yClose,yOpen)));
19794
+ this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(yLow));
19795
+ }
19796
+ else
19797
+ {
19798
+ this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
19799
+ this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));
19800
+ }
19801
+
19773
19802
  }
19774
19803
  this.Canvas.stroke();
19775
19804
  }
@@ -19868,6 +19897,7 @@ function ChartKLine()
19868
19897
  {
19869
19898
  if (dataWidth>=4)
19870
19899
  {
19900
+ if ((dataWidth%2)!=0) dataWidth-=1;
19871
19901
  this.Canvas.strokeStyle=unchagneColor;
19872
19902
  this.Canvas.beginPath();
19873
19903
  if (data.High>data.Close) //上影线
@@ -19879,8 +19909,9 @@ function ChartKLine()
19879
19909
  }
19880
19910
  else
19881
19911
  {
19882
- this.Canvas.moveTo(ToFixedPoint(x),y);
19883
- this.Canvas.lineTo(ToFixedPoint(x),yOpen);
19912
+ var xFixed=ToFixedPoint(left+dataWidth/2);
19913
+ this.Canvas.moveTo(xFixed,y);
19914
+ this.Canvas.lineTo(xFixed,yOpen);
19884
19915
  }
19885
19916
  y=yOpen;
19886
19917
  }
@@ -19897,7 +19928,7 @@ function ChartKLine()
19897
19928
  else
19898
19929
  {
19899
19930
  this.Canvas.moveTo(ToFixedPoint(left),ToFixedPoint(y));
19900
- this.Canvas.lineTo(ToFixedPoint(right),ToFixedPoint(y));
19931
+ this.Canvas.lineTo(ToFixedPoint(left+dataWidth),ToFixedPoint(y));
19901
19932
  }
19902
19933
 
19903
19934
  if (data.Open>data.Low) //下影线
@@ -19909,8 +19940,9 @@ function ChartKLine()
19909
19940
  }
19910
19941
  else
19911
19942
  {
19912
- this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
19913
- this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));
19943
+ var xFixed=ToFixedPoint(left+dataWidth/2);
19944
+ this.Canvas.moveTo(xFixed,ToFixedPoint(y));
19945
+ this.Canvas.lineTo(xFixed,ToFixedPoint(yLow));
19914
19946
  }
19915
19947
  }
19916
19948
 
@@ -43441,7 +43473,8 @@ function JSChartResource()
43441
43473
  this.FrameTitleBGColor="rgb(246,251,253)"; //标题栏背景色
43442
43474
  this.Frame={
43443
43475
  XBottomOffset:1*GetDevicePixelRatio(), //X轴文字向下偏移
43444
- YTopOffset:2*GetDevicePixelRatio() //Y轴顶部文字向下偏移
43476
+ YTopOffset:2*GetDevicePixelRatio(), //Y轴顶部文字向下偏移
43477
+ YTextPadding:[2,2]
43445
43478
  };
43446
43479
 
43447
43480
  //百分比坐标文字颜色
@@ -62132,6 +62165,7 @@ var MARKET_SUFFIX_NAME=
62132
62165
  SH:'.SH',
62133
62166
  SZ:'.SZ',
62134
62167
  SHSZ_C_Index:'.CI', //自定义指数
62168
+ BJ:".BJ", //北交所 BeiJing stock exchange
62135
62169
 
62136
62170
  SHO:'.SHO', //上海交易所 股票期权
62137
62171
  HK:'.HK', //港股
@@ -62260,6 +62294,13 @@ var MARKET_SUFFIX_NAME=
62260
62294
  return find == pos;
62261
62295
  },
62262
62296
 
62297
+ IsBJ:function(upperSymbol)
62298
+ {
62299
+ var pos = upperSymbol.length - this.BJ.length;
62300
+ var find = upperSymbol.indexOf(this.BJ);
62301
+ return find == pos;
62302
+ },
62303
+
62263
62304
  //自定义指数
62264
62305
  IsSHSZCustomIndex:function(upperSymbol)
62265
62306
  {
@@ -62392,6 +62433,19 @@ var MARKET_SUFFIX_NAME=
62392
62433
  return false;
62393
62434
  },
62394
62435
 
62436
+ IsBJStock:function(symbol) //北交所股票
62437
+ {
62438
+ if (!symbol) return false;
62439
+ var upperSymbol=symbol.toUpperCase();
62440
+ if (!this.IsBJ(upperSymbol)) return false;
62441
+
62442
+ var value=upperSymbol.charAt(0);
62443
+
62444
+ if (value=='4' || value=='8') return true;
62445
+
62446
+ return false;
62447
+ },
62448
+
62395
62449
  IsSHStockSTAR:function(symbol) // 是否是科创板 Sci-Tech innovAtion boaRd (STAR Market)
62396
62450
  {
62397
62451
  if (!symbol) return false;
@@ -62650,7 +62704,7 @@ var MARKET_SUFFIX_NAME=
62650
62704
 
62651
62705
  IsEnableRight:function(period, symbol) //是否支持复权
62652
62706
  {
62653
- if (!MARKET_SUFFIX_NAME.IsSHSZStockA(symbol)) return false;
62707
+ if (!MARKET_SUFFIX_NAME.IsSHSZStockA(symbol) || !MARKET_SUFFIX_NAME.IsBJStock(symbol)) return false;
62654
62708
  if (ChartData.IsTickPeriod(period)) return false; //分笔没有复权
62655
62709
  if (ChartData.IsMinutePeriod(period,true)) return false; //内置分钟K线不支持复权
62656
62710
 
@@ -62663,6 +62717,7 @@ var MARKET_SUFFIX_NAME=
62663
62717
  function MinuteTimeStringData()
62664
62718
  {
62665
62719
  this.SHSZ = null; //上海深证交易所时间
62720
+ this.BJ=null;
62666
62721
  this.SHO=null; //上海股票期权交易时间
62667
62722
  this.HK = null; //香港交易所时间
62668
62723
  this.Futures=new Map(); //期货交易时间 key=时间名称 Value=数据
@@ -62689,6 +62744,12 @@ function MinuteTimeStringData()
62689
62744
  return this.SHSZ;
62690
62745
  }
62691
62746
 
62747
+ this.GetBJ=function(upperSymbol)
62748
+ {
62749
+ if (!this.BJ) this.BJ=this.CreateBJData();
62750
+ return this.BJ;
62751
+ }
62752
+
62692
62753
  this.GetSHO=function()
62693
62754
  {
62694
62755
  if (!this.SHO) this.SHO=this.CreateSHOData();
@@ -62754,6 +62815,18 @@ function MinuteTimeStringData()
62754
62815
  return this.CreateTimeData(TIME_SPLIT);
62755
62816
  }
62756
62817
 
62818
+ this.CreateBJData=function()
62819
+ {
62820
+ const TIME_SPLIT =
62821
+ [
62822
+ { Start: 925, End: 925 },
62823
+ { Start: 930, End: 1130 },
62824
+ { Start: 1300, End: 1500 }
62825
+ ];
62826
+
62827
+ return this.CreateTimeData(TIME_SPLIT);
62828
+ }
62829
+
62757
62830
  this.CreateSHOData=function()
62758
62831
  {
62759
62832
  const TIME_SPLIT =
@@ -62880,6 +62953,7 @@ function MinuteTimeStringData()
62880
62953
 
62881
62954
  var upperSymbol = symbol.toLocaleUpperCase(); //转成大写
62882
62955
  if (MARKET_SUFFIX_NAME.IsSH(upperSymbol) || MARKET_SUFFIX_NAME.IsSZ(upperSymbol)) return this.GetSHSZ(upperSymbol);
62956
+ if (MARKET_SUFFIX_NAME.IsBJ(upperSymbol)) return this.GetBJ(upperSymbol);
62883
62957
  if (MARKET_SUFFIX_NAME.IsSHO(upperSymbol)) return this.GetSHO();
62884
62958
  if (MARKET_SUFFIX_NAME.IsHK(upperSymbol)) return this.GetHK();
62885
62959
  if (MARKET_SUFFIX_NAME.IsUSA(upperSymbol)) return this.GetUSA(true);
@@ -63315,6 +63389,8 @@ function MinuteCoordinateData()
63315
63389
  var upperSymbol = symbol.toLocaleUpperCase(); //转成大写
63316
63390
  if (MARKET_SUFFIX_NAME.IsSH(upperSymbol) || MARKET_SUFFIX_NAME.IsSZ(upperSymbol) || MARKET_SUFFIX_NAME.IsSHSZIndex(upperSymbol))
63317
63391
  data = this.GetSHSZData(upperSymbol,width);
63392
+ else if (MARKET_SUFFIX_NAME.IsBJ(upperSymbol))
63393
+ data=this.GetBJData(upperSymbol,width);
63318
63394
  else if (MARKET_SUFFIX_NAME.IsSHO(upperSymbol))
63319
63395
  data=this.GetSHOData(upperSymbol,width);
63320
63396
  else if (MARKET_SUFFIX_NAME.IsHK(upperSymbol))
@@ -63361,10 +63437,15 @@ function MinuteCoordinateData()
63361
63437
  return result;
63362
63438
  }
63363
63439
 
63440
+ this.GetBJData=function(upperSymbol,width)
63441
+ {
63442
+ var result=SHZE_MINUTE_X_COORDINATE;
63443
+ return result;
63444
+ }
63445
+
63364
63446
  this.GetUSAData=function(upperSymbol,width)
63365
63447
  {
63366
63448
  var result=USA_MINUTE_X_COORDINATE;
63367
-
63368
63449
  return result;
63369
63450
  }
63370
63451