hqchart 1.1.12622 → 1.1.12631

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.
@@ -5770,7 +5770,7 @@ this.PointToValue=function(){if(!this.Frame)return false;if(this.Frame.ClassName
5770
5770
  this.ValueToPoint=function(){if(!this.Frame)return false;var data=this.Frame.Data;if(!data)return false;//this.UpdateXValue();
5771
5771
  var isHScreen=this.Frame.IsHScreen;this.Point=[];for(var i=0;i<this.Value.length;++i){var item=this.Value[i];var pt=new Point();if(isHScreen){pt.Y=this.Frame.GetXFromIndex(item.XValue-data.DataOffset,false);pt.X=this.Frame.GetYFromData(item.YValue,false);}else{pt.X=this.Frame.GetXFromIndex(item.XValue-data.DataOffset,false);pt.Y=this.Frame.GetYFromData(item.YValue,false);}this.Point[i]=pt;}};this.UpdateXValue=function()//通过datetime更新x的索引
5772
5772
  {if(!this.Frame)return false;var data=this.Frame.Data;if(!data)return false;var aryDateTime=[];for(var i=0;i<this.Value.length;++i){var item=this.Value[i];if(!item.DateTime)break;var dateTime={Date:item.DateTime.Date};if(IFrameSplitOperator.IsNumber(item.DateTime.Time))dateTime.Time=item.DateTime.Time;aryDateTime[i]=dateTime;}data.FindDataIndexByDateTime(aryDateTime);for(var i in aryDateTime){var findItem=aryDateTime[i];var valueItem=this.Value[i];if(findItem.Index>=0)valueItem.XValue=findItem.Index;}};//xStep,yStep 移动的偏移量
5773
- this.Move=function(xStep,yStep){if(this.Status!=20)return fasle;if(!this.Frame)return false;var data=this.Frame.Data;if(!data)return false;if(this.MovePointIndex==null)return false;var index=parseInt(this.MovePointIndex);if(index===100)//整体移动
5773
+ this.Move=function(xStep,yStep){if(this.Status!=20)return false;if(!this.Frame)return false;var data=this.Frame.Data;if(!data)return false;if(this.MovePointIndex==null)return false;var index=parseInt(this.MovePointIndex);if(index===100)//整体移动
5774
5774
  {if(this.IsMoveOutOfBounds(this.Point,xStep,yStep))return false;for(var i in this.Point){this.Point[i].X+=xStep;this.Point[i].Y+=yStep;}}else if(index===0||index===1||index===2||index===3||index===4||index===5){if(index<this.Point.length){this.Point[index].X+=xStep;this.Point[index].Y+=yStep;}}else{return false;}};//是否超出边界了
5775
5775
  this.IsMoveOutOfBounds=function(aryPoint,xStep,yStep){if(!this.EnableMoveCheck)return false;if(!this.Frame)return false;if(this.Frame.ClassName=="MinuteFrame"||this.Frame.Class=="MinuteHScreenFrame")return false;var data=this.Frame.Data;if(!data)return false;if(!IFrameSplitOperator.IsNonEmptyArray(data.Data))return false;if(!IFrameSplitOperator.IsNonEmptyArray(aryPoint))return false;var isHScreen=this.Frame.IsHScreen;if(isHScreen){//TODO:横屏以后再做
5776
5776
  return false;}else{var offset=data.DataOffset;var startIndex=0-offset;var endIndex=data.Data.length-offset;if(xStep>0){var xEnd=this.Frame.GetXFromIndex(endIndex-1,false);for(var i=0;i<aryPoint.length;++i){var item=aryPoint[i];if(item.X+xStep>xEnd)return true;}}else if(xStep<0){var xStart=this.Frame.GetXFromIndex(startIndex,false);for(var i=0;i<aryPoint.length;++i){var item=aryPoint[i];if(item.X+xStep<xStart)return true;}}return false;}};this.ClipFrame=function(){if(this.Frame.IsHScreen){var left=this.Frame.ChartBorder.GetLeftEx();var top=this.Frame.ChartBorder.GetTop();var width=this.Frame.ChartBorder.GetWidthEx();var height=this.Frame.ChartBorder.GetHeight();}else{var left=this.Frame.ChartBorder.GetLeft();var top=this.Frame.ChartBorder.GetTopEx();var width=this.Frame.ChartBorder.GetWidth();var height=this.Frame.ChartBorder.GetHeightEx();}this.Canvas.save();this.Canvas.beginPath();this.Canvas.rect(left,top,width,height);this.Canvas.clip();};//计算需要画的点的坐标option:{IsCheckX:是否检测X值, IsCheckY:是否检测Y值}
@@ -5889,8 +5889,41 @@ this.newMethod();delete this.newMethod;this.Super_SetOption=this.SetOption;//父
5889
5889
  this.Super_ExportStorageData=this.ExportStorageData;this.Label;//{Text:文本, Position: 0=左, 1=右 }
5890
5890
  this.SetOption=function(option){if(this.Super_SetOption)this.Super_SetOption(option);if(option){if(option.Label)this.Label=option.Label;}};this.ExportStorageData=function(){var storageData;if(this.Super_ExportStorageData){storageData=this.Super_ExportStorageData();if(this.Label)storageData.Label=this.Label;}return storageData;};this.PointCount=1;this.ClassName='ChartDrawPictureHorizontalLine';this.IsPointIn=this.IsPointIn_XYValue_Line;this.Font=16*GetDevicePixelRatio()+"px 微软雅黑";this.GetXYCoordinate=function(){if(this.IsFrameMinSize())return null;var drawPoint=this.CalculateDrawPoint();return this.PointRange(drawPoint);};this.Draw=function(){this.LinePoint=[];if(this.IsFrameMinSize())return;var drawPoint=this.CalculateDrawPoint();if(!drawPoint||drawPoint.length!=1)return;if(!this.Frame)return;if(this.Value.length!=1)return;if(!this.IsYValueInFrame(this.Value[0].YValue))return null;var isHScreen=this.Frame.IsHScreen;var left=this.Frame.ChartBorder.GetLeft();var right=this.Frame.ChartBorder.GetRight();if(isHScreen){left=this.Frame.ChartBorder.GetTop();right=this.Frame.ChartBorder.GetBottom();}this.ClipFrame();this.Canvas.strokeStyle=this.LineColor;this.SetLineWidth();this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(drawPoint[0].X,left);this.Canvas.lineTo(drawPoint[0].X,right);}else{this.Canvas.moveTo(left,drawPoint[0].Y);this.Canvas.lineTo(right,drawPoint[0].Y);}this.Canvas.stroke();this.RestoreLineWidth();var line={Start:new Point(),End:new Point()};if(isHScreen){line.Start.X=drawPoint[0].X;line.Start.Y=left;line.End.X=drawPoint[0].X;line.End.Y=right;}else{line.Start.X=left;line.Start.Y=drawPoint[0].Y;line.End.X=right;line.End.Y=drawPoint[0].Y;}this.LinePoint.push(line);//画点
5891
5891
  this.DrawPoint(drawPoint);//显示价格
5892
- this.Canvas.fillStyle=this.LineColor;this.Canvas.font=this.Font;if(isHScreen){this.Canvas.textAlign="left";this.Canvas.textBaseline="bottom";var xText=drawPoint[0].X;var yText=left;this.Canvas.translate(xText,yText);this.Canvas.rotate(90*Math.PI/180);//数据和框子旋转180度
5893
- var yValue=this.Frame.GetYData(drawPoint[0].X);var text=yValue.toFixed(2);if(this.Label){if(this.Label.Position==0)text=this.Label.Text+yValue.toFixed(2);else if(this.Label.Position==1)text=yValue.toFixed(2)+this.Label.Text;}this.Canvas.fillText(text,0,0);}else{this.Canvas.textAlign="left";this.Canvas.textBaseline="bottom";var yValue=this.Frame.GetYData(drawPoint[0].Y);var text=yValue.toFixed(2);if(this.Label){if(this.Label.Position==0)text=this.Label.Text+yValue.toFixed(2);else if(this.Label.Position==1)text=yValue.toFixed(2)+this.Label.Text;}this.Canvas.fillText(text,left,drawPoint[0].Y);}this.Canvas.restore();};}//水平线2
5892
+ this.LineText(drawPoint[0]);/*
5893
+ this.Canvas.fillStyle=this.LineColor;
5894
+ this.Canvas.font=this.Font;
5895
+ if (isHScreen)
5896
+ {
5897
+ this.Canvas.textAlign="left";
5898
+ this.Canvas.textBaseline="bottom";
5899
+ var xText=drawPoint[0].X;
5900
+ var yText=left;
5901
+ this.Canvas.translate(xText, yText);
5902
+ this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
5903
+ var yValue=this.Frame.GetYData(drawPoint[0].X);
5904
+ var text=yValue.toFixed(2);
5905
+ if (this.Label)
5906
+ {
5907
+ if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);
5908
+ else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;
5909
+ }
5910
+ this.Canvas.fillText(text,0,0);
5911
+ }
5912
+ else
5913
+ {
5914
+ this.Canvas.textAlign="left";
5915
+ this.Canvas.textBaseline="bottom";
5916
+ var yValue=this.Frame.GetYData(drawPoint[0].Y);
5917
+ var text=yValue.toFixed(2);
5918
+ if (this.Label)
5919
+ {
5920
+ if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);
5921
+ else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;
5922
+ }
5923
+ this.Canvas.fillText(text,left,drawPoint[0].Y);
5924
+ }
5925
+ */this.Canvas.restore();};this.LineText=function(point){if(!point)return;var isHScreen=this.Frame.IsHScreen;var left=this.Frame.ChartBorder.GetLeft();this.Canvas.fillStyle=this.LineColor;this.Canvas.font=this.Font;if(isHScreen){left=this.Frame.ChartBorder.GetTop();this.Canvas.textAlign="left";this.Canvas.textBaseline="bottom";var xText=point.X;var yText=left;this.Canvas.translate(xText,yText);this.Canvas.rotate(90*Math.PI/180);//数据和框子旋转180度
5926
+ var yValue=this.Frame.GetYData(point.X);var text=yValue.toFixed(2);if(this.Label){if(this.Label.Position==0)text=this.Label.Text+yValue.toFixed(2);else if(this.Label.Position==1)text=yValue.toFixed(2)+this.Label.Text;}this.Canvas.fillText(text,2,0);}else{this.Canvas.textAlign="left";this.Canvas.textBaseline="bottom";var yValue=this.Frame.GetYData(point.Y);var text=yValue.toFixed(2);if(this.Label){if(this.Label.Position==0)text=this.Label.Text+yValue.toFixed(2);else if(this.Label.Position==1)text=yValue.toFixed(2)+this.Label.Text;}this.Canvas.fillText(text,left,point.Y);}};}//水平线2
5894
5927
  function ChartDrawHLine(){this.newMethod=IChartDrawPicture;//派生
5895
5928
  this.newMethod();delete this.newMethod;this.Super_SetOption=this.SetOption;//父类函数
5896
5929
  this.Super_ExportStorageData=this.ExportStorageData;//this.Label; //{Text:文本, Position: 0=左, 1=右 2=中间 }
@@ -5987,7 +6020,7 @@ this.CalculateDrawPoint=function(){if(this.Status<2)return null;if(!this.Point.l
5987
6020
  linePoint={Start:new Point(),End:new Point()};linePoint.Start.X=drawPoint[0].X;linePoint.Start.Y=drawPoint[0].Y-yMove;linePoint.End.X=drawPoint[1].X;linePoint.End.Y=drawPoint[1].Y-yMove;this.LinePoint.push(linePoint);var ptCenter=new Point();ptCenter.X=linePoint.Start.X+(linePoint.End.X-linePoint.Start.X)/2;ptCenter.Y=linePoint.Start.Y+(linePoint.End.Y-linePoint.Start.Y)/2;drawPoint[2]=ptCenter;this.Point[2]=ptCenter;var xValue=parseInt(this.Frame.GetXData(ptCenter.X))+data.DataOffset;var yValue=this.Frame.GetYData(ptCenter.Y);this.Value[2]={XValue:xValue,YValue:yValue};this.PointCount=this.Point.length;//完成以后是3个点
5988
6021
  linePoint={Start:new Point(),End:new Point()};linePoint.Start.X=drawPoint[0].X;linePoint.Start.Y=drawPoint[0].Y-yMove/2;linePoint.End.X=drawPoint[1].X;linePoint.End.Y=drawPoint[1].Y-yMove/2;this.CenterLine.Line=linePoint;}}return drawPoint;};this.DrawArea=function(pt,pt2,pt3,pt4){this.Canvas.fillStyle=this.AreaColor;this.Canvas.beginPath();this.Canvas.moveTo(pt.X,pt.Y);this.Canvas.lineTo(pt2.X,pt2.Y);this.Canvas.lineTo(pt3.X,pt3.Y);this.Canvas.lineTo(pt4.X,pt4.Y);this.Canvas.closePath();this.Canvas.fill();};this.Draw=function(){this.LinePoint=[];if(this.IsFrameMinSize())return;var drawPoint=this.CalculateDrawPoint();if(!drawPoint)return;this.AreaColor=IChartDrawPicture.ColorToRGBA(this.LineColor,0.3);this.ClipFrame();if(this.LinePoint.length==2){this.DrawArea(this.LinePoint[0].Start,this.LinePoint[0].End,this.LinePoint[1].End,this.LinePoint[1].Start);}for(var i=0;i<this.LinePoint.length;++i){var item=this.LinePoint[i];this.DrawLine(item.Start,item.End);}if(this.CenterLine.IsShow&&this.CenterLine.Line){var item=this.CenterLine.Line;this.Canvas.setLineDash(this.CenterLine.LineDash);this.DrawLine(item.Start,item.End);this.Canvas.setLineDash([]);}this.Canvas.restore();this.DrawPoint(drawPoint);//画点
5989
6022
  };//xStep,yStep 移动的偏移量
5990
- this.Move=function(xStep,yStep){if(this.Status!=20)return fasle;if(!this.Frame)return false;var data=this.Frame.Data;if(!data)return false;if(this.MovePointIndex==100)//整体移动
6023
+ this.Move=function(xStep,yStep){if(this.Status!=20)return false;if(!this.Frame)return false;var data=this.Frame.Data;if(!data)return false;if(this.MovePointIndex==100)//整体移动
5991
6024
  {for(var i=0;i<this.Point.length;++i){this.Point[i].X+=xStep;this.Point[i].Y+=yStep;}}else if(this.MovePointIndex==0||this.MovePointIndex==1){if(this.MovePointIndex<this.Point.length){this.Point[this.MovePointIndex].X+=xStep;this.Point[this.MovePointIndex].Y+=yStep;}}else if(this.MovePointIndex==2)//宽度的点要计算
5992
6025
  {this.Point[this.MovePointIndex].X+=xStep;this.Point[this.MovePointIndex].Y+=yStep;var x=this.Point[1].X-this.Point[0].X;var y=this.Point[1].Y-this.Point[0].Y;var angle=Math.atan(Math.abs(x/y));var yMove=this.ChannelWidth/Math.sin(angle)-yStep;this.ChannelWidth=Math.sin(angle)*yMove;}};//0-10 鼠标对应的点索引 100=鼠标在正个图形上 -1 鼠标不在图形上
5993
6026
  this.IsPointIn=function(x,y){if(!this.Frame||this.Status!=10)return-1;var data=this.Frame.Data;if(!data)return-1;//是否在点上
@@ -7279,7 +7312,12 @@ this.ClearIndexPaint();//清空指标
7279
7312
  if(option){if(option.Windows&&Array.isArray(option.Windows)&&option.Windows.length>0){var windows=option.Windows;var systemScript=new JSIndexScript();for(var i in windows){if(i>=this.WindowIndex.length)break;//暂时不支持 动态增加/减少
7280
7313
  var item=windows[i];if(!item)continue;if(item.Script){this.WindowIndex[i]=new ScriptIndex(item.Name,item.Script,item.Args,item);//脚本执行
7281
7314
  }else if(item.API){var apiItem=item.API;this.WindowIndex[i]=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,item);}else{var indexID=item.Index;var indexInfo=systemScript.Get(indexID);if(indexInfo){var args=indexInfo.Args;if(item.Args)indexInfo.Args=item.Args;indexInfo.ID=indexID;this.WindowIndex[i]=new ScriptIndex(indexInfo.Name,indexInfo.Script,indexInfo.Args,indexInfo);//脚本执行
7282
- }}}}}this.ReloadChartDrawPicture();this.Frame.ClearUpDonwFrameYData();if(ChartData.IsDayPeriod(this.Period,true)){this.ClearStockCache();this.RequestHistoryData();//请求日线数据
7315
+ }}}}//清空叠加股票
7316
+ if(option.ClearOverlay===true){for(var i in this.OverlayChartPaint){var item=this.OverlayChartPaint[i];item.IsDelete=true;}this.OverlayChartPaint=[];this.Frame.SubFrame[0].Frame.YSplitOperator.OverlayChartPaint=this.OverlayChartPaint;this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint;//绑定叠加
7317
+ }//叠加股票
7318
+ if(open.Overlay&&IFrameSplitOperator.IsNonEmptyArray(option.Overlay)){var setSymbol=new _set2.default();for(var i=0;i<this.OverlayChartPaint.length;++i){var item=this.OverlayChartPaint[j];setSymbol.add(item.Symbol);}for(var i=0;i<option.Overlay.length;++i){var item=option.Overlay[i];if(setSymbol.has(item.Symbol))continue;var paint=new ChartOverlayMinutePriceLine();paint.Canvas=this.Canvas;paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;paint.ChartFrame=this.Frame.SubFrame[0].Frame;paint.Name="Overlay-Minute";paint.Symbol=item.Symbol;paint.Identify='Overlay-Minute-'+item.Symbol;if(item.Color)paint.Color=item.Color;//外部设置颜色
7319
+ else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];++g_JSChartResource.OverlaySymbol.Random;paint.MainData=this.SourceData;//绑定主图数据
7320
+ if(paint.SetOption)paint.SetOption(item);this.OverlayChartPaint.push(paint);}}}this.ReloadChartDrawPicture();this.Frame.ClearUpDonwFrameYData();if(ChartData.IsDayPeriod(this.Period,true)){this.ClearStockCache();this.RequestHistoryData();//请求日线数据
7283
7321
  //this.ReqeustKLineInfoData();
7284
7322
  }else if(ChartData.IsMinutePeriod(this.Period,true)||ChartData.IsSecondPeriod(this.Period)||ChartData.IsMilliSecondPeriod(this.Period)){this.ClearStockCache();this.ReqeustHistoryMinuteData();//请求分钟数据
7285
7323
  }else if(ChartData.IsTickPeriod(this.Period)){this.ClearStockCache();this.RequestTickData();}};this.ReqeustKLineInfoData=function(obj){if(obj&&obj.FunctionName=="RecvDragDayData")//增量更新
@@ -7780,10 +7818,10 @@ var item=option.Windows[i];if(!item)continue;if(item.Script){this.WindowIndex[in
7780
7818
  }else if(item.API){var apiItem=item.API;this.WindowIndex[index]=new APIScriptIndex(apiItem.Name,apiItem.Script,apiItem.Args,item);}else{var indexID=item.Index;var indexInfo=systemScript.Get(indexID);if(indexInfo){var args=indexInfo.Args;if(item.Args)indexInfo.Args=item.Args;indexInfo.ID=indexID;this.WindowIndex[index]=new ScriptIndex(indexInfo.Name,indexInfo.Script,indexInfo.Args,indexInfo);//脚本执行
7781
7819
  }}}}}if(!symbol||this.DayCount<=0){this.DrawEmpty();}else{this.ChartSplashPaint.SetTitle(this.LoadDataSplashTitle);this.ChartSplashPaint.EnableSplash(true);//增加下载动画
7782
7820
  this.Draw();this.RequestData();}};this.SetPageInfo=function(pageInfo){if(!pageInfo)return;if(IFrameSplitOperator.IsBool(pageInfo.Enable))this.PageInfo.Enable=pageInfo.Enable;if(IFrameSplitOperator.IsNumber(pageInfo.Offset))this.PageInfo.Offset=pageInfo.Offset;if(IFrameSplitOperator.IsNumber(pageInfo.ShowDayCount))this.PageInfo.ShowDayCount=pageInfo.ShowDayCount;};this.ClearMinuteData=function(){this.SourceData=null;this.DayData=null;this.BeforeOpenData=null;this.AfterCloseData=null;this.MultiDayBeforeOpenData=null;this.MultiDayAfterCloseData=null;};this.ChangeDayCount=function(count,option){if(count<0)return;this.StopDisplayLatest();this.CancelAutoUpdate();this.AutoUpdateEvent(false,"MinuteChartContainer::ChangeDayCount");this.DayCount=count;this.ClearMinuteData();if(option&&option.PageInfo){this.SetPageInfo(option.PageInfo);this.ResetDayOffset();}if(this.DayCount>1){this.ChartDrawPicture=[];}else{this.ReloadChartDrawPicture();}this.ResetDataStatus();this.ClearIndexPaint();//清空指标
7783
- this.ResetOverlaySymbolStatus();this.RequestData();};//叠加股票
7784
- this.OverlaySymbol=function(symbol,option){for(var i=0;i<this.OverlayChartPaint.length;++i){var item=this.OverlayChartPaint[i];if(item.Symbol==symbol){console.warn('[MinuteChartContainer::OverlaySymbol] overlay symbol='+symbol+' exist.');return false;}}var paint=new ChartOverlayMinutePriceLine();paint.Canvas=this.Canvas;paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;paint.ChartFrame=this.Frame.SubFrame[0].Frame;paint.Name="Overlay-Minute";paint.Symbol=symbol;paint.Identify='Overlay-Minute-'+symbol;if(option&&option.Color)paint.Color=option.Color;//外部设置颜色
7821
+ this.ResetOverlaySymbolStatus();this.RequestData();};//叠加股票 symbol支持数据 ["600000.sh", "0000001.sz"]
7822
+ this.OverlaySymbol=function(symbol,option){var arySymbol=null;if(IFrameSplitOperator.IsString(symbol))arySymbol=[symbol];else if(Array.isArray(symbol))arySymbol=symbol;if(!IFrameSplitOperator.IsNonEmptyArray(arySymbol))return false;var aryNewSymbol=[];for(var i=0,j=0;i<arySymbol.length;++i){var strSymbol=arySymbol[i];var bFind=false;for(j=0;j<this.OverlayChartPaint.length;++j){var item=this.OverlayChartPaint[j];if(item.Symbol==strSymbol){bFind=true;console.warn('[MinuteChartContainer::OverlaySymbol] overlay symbol='+strSymbol+' exist.');break;}}if(!bFind)aryNewSymbol.push(strSymbol);}if(!IFrameSplitOperator.IsNonEmptyArray(arySymbol))return true;for(var i=0;i<aryNewSymbol.length;++i){var strSymbol=aryNewSymbol[i];var paint=new ChartOverlayMinutePriceLine();paint.Canvas=this.Canvas;paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;paint.ChartFrame=this.Frame.SubFrame[0].Frame;paint.Name="Overlay-Minute";paint.Symbol=strSymbol;paint.Identify='Overlay-Minute-'+strSymbol;if(option&&option.Color)paint.Color=option.Color;//外部设置颜色
7785
7823
  else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];++g_JSChartResource.OverlaySymbol.Random;paint.MainData=this.SourceData;//绑定主图数据
7786
- if(paint.SetOption)paint.SetOption(option);this.OverlayChartPaint.push(paint);if(this.DayCount<=1)this.RequestOverlayMinuteData();//请求数据
7824
+ if(paint.SetOption)paint.SetOption(option);this.OverlayChartPaint.push(paint);}if(this.DayCount<=1)this.RequestOverlayMinuteData();//请求数据
7787
7825
  else this.RequestOverlayHistoryMinuteData();return true;};this.ResetOverlaySymbolStatus=function(){for(var i in this.OverlayChartPaint){var item=this.OverlayChartPaint[i];item.Status=OVERLAY_STATUS_ID.STATUS_NONE_ID;}};//删除一个叠加股票
7788
7826
  this.DeleteOverlaySymbol=function(symbol){for(var i in this.OverlayChartPaint){var item=this.OverlayChartPaint[i];if(item.Symbol===symbol){item.IsDelete=true;this.OverlayChartPaint.splice(i,1);this.UpdateFrameMaxMin();this.Draw();return true;}}console.warn('[MinuteChartContainer::DeleteOverlaySymbol] overlay symbol='+symbol+' not exist.');return false;};//取消叠加股票
7789
7827
  this.ClearOverlaySymbol=function(){for(var i in this.OverlayChartPaint){var item=this.OverlayChartPaint[i];item.IsDelete=true;}this.OverlayChartPaint=[];this.Frame.SubFrame[0].Frame.YSplitOperator.OverlayChartPaint=this.OverlayChartPaint;this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint;//绑定叠加
@@ -10351,10 +10389,10 @@ this.ALL=function(data,n){if(n<=0)n=1;var result=[];if(Array.isArray(data)){if(n
10351
10389
  SUMBARS(X,A):将X向前累加直到大于等于A,返回这个区间的周期数,若所有的数据都累加后还不能达到A,则返回此时前面的总周期数.
10352
10390
  例如:SUMBARS(VOL,CAPITAL)求完全换手到现在的周期数
10353
10391
  */this.SUMBARS=function(data,data2){var isArray=Array.isArray(data);var isArray2=Array.isArray(data2);var isNumber=IFrameSplitOperator.IsNumber(data);var isNumber2=IFrameSplitOperator.IsNumber(data2);var result=[];if(isArray&&isNumber2){for(var i=0,n=0;i<data.length;++i){var sum=0;var n=0;for(var j=i-1;j>=0;--j,++n){var item=data[i];if(!IFrameSplitOperator.IsNumber(item))continue;sum+=data[j];if(sum>data2){break;}}result[i]=n;}}else if(isArray&&isArray2){var count=Math.max(data.length,data2.length);for(var i=0;i<count;++i){result[i]=null;var sum=0;var n=0;var value=data2[i];if(!IFrameSplitOperator.IsNumber(value))continue;for(var j=i-1;j>=0;--j,++n){var item=data[i];if(!IFrameSplitOperator.IsNumber(item))continue;sum+=data[j];if(sum>value){break;}}result[i]=n;}}else if(isNumber&&isArray2){for(var i=0;i<data2.length;++i){result[i]=null;var sum=0;var n=0;var value=data2[i];if(!IFrameSplitOperator.IsNumber(value))continue;for(var j=i-1;j>=0;--j,++n){sum+=data;if(sum>value){break;}}result[i]=n;}}else if(isNumber&&isNumber2){//TODO: 后面再写吧
10354
- }return result;};//格式化字符串 "{0}-{1}", C, O;
10355
- this.STRFORMAT=function(strFormat,args,node){var aryParam=strFormat.match(/{\d+}/g);if(!IFrameSplitOperator.IsNonEmptyArray(aryParam))return null;var mapParam=new _map2.default();//key=index, value={Text}
10356
- var maxIndex=-1;for(var i=0;i<aryParam.length;++i){var item=aryParam[i];if(item.length<3)continue;var value=item.slice(1,item.length-1);var index=parseInt(value);var paramItem={Src:item,Index:index,Text:null};if(maxIndex<index)maxIndex=index;mapParam.set(index,paramItem);}var isArray=false;//是否输出数组字符串
10357
- var maxCount=0;for(var i=1;i<args.length;++i){var item=args[i];if(Array.isArray(item)){isArray=true;if(maxCount<item.length)maxCount=item.length;}}if(isArray){var result=[];for(var i=0;i<maxCount;++i){var strItem=strFormat;var _iteratorNormalCompletion19=true;var _didIteratorError19=false;var _iteratorError19=undefined;try{for(var _iterator19=(0,_getIterator3.default)(mapParam),_step19;!(_iteratorNormalCompletion19=(_step19=_iterator19.next()).done);_iteratorNormalCompletion19=true){var item=_step19.value;var paramInfo=item[1];var paramItem=args[paramInfo.Index+1];var text="null";if(paramItem){if(Array.isArray(paramItem)){var value=paramItem[i];if(value)text=''+value;}else{text=''+paramItem;}}strItem=strItem.replace(paramInfo.Src,text);}}catch(err){_didIteratorError19=true;_iteratorError19=err;}finally{try{if(!_iteratorNormalCompletion19&&_iterator19.return){_iterator19.return();}}finally{if(_didIteratorError19){throw _iteratorError19;}}}result[i]=strItem;}return result;}else{var result=strFormat;var _iteratorNormalCompletion20=true;var _didIteratorError20=false;var _iteratorError20=undefined;try{for(var _iterator20=(0,_getIterator3.default)(mapParam),_step20;!(_iteratorNormalCompletion20=(_step20=_iterator20.next()).done);_iteratorNormalCompletion20=true){var item=_step20.value;var paramInfo=item[1];var paramItem=args[paramInfo.Index+1];var text="null";if(paramItem){text=''+paramItem;}result=result.replace(paramInfo.Src,text);}}catch(err){_didIteratorError20=true;_iteratorError20=err;}finally{try{if(!_iteratorNormalCompletion20&&_iterator20.return){_iterator20.return();}}finally{if(_didIteratorError20){throw _iteratorError20;}}}return result;}};//函数调用
10392
+ }return result;};//格式化字符串 "{0}-{1}", C, O; 小数位数 {0:0.00}
10393
+ this.STRFORMAT=function(strFormat,args,node){var aryParam=strFormat.match(/{[0-9.:]+}/g);if(!IFrameSplitOperator.IsNonEmptyArray(aryParam))return null;var mapParam=new _map2.default();//key=index, value={Text}
10394
+ var maxIndex=-1;for(var i=0;i<aryParam.length;++i){var item=aryParam[i];if(item.length<3)continue;var value=item.slice(1,item.length-1);var index=-1,decimal=-1;if(value.indexOf(":")>0){var aryTemp=value.split(":");if(aryTemp){if(aryTemp[0])index=parseInt(aryTemp[0]);if(aryTemp[1]){if(aryTemp[1].indexOf(".")>=0){var zeroCount=0;var strTemp=aryTemp[1];for(var j=strTemp.length-1;j>=0;--j){if(strTemp[j]=="0")++zeroCount;else break;}if(zeroCount>0)decimal=zeroCount;}else if(aryTemp[1]=="0"){decimal=0;}}}}else{index=parseInt(value);}if(index<0)continue;var paramItem={Src:item,Index:index,Text:null,Decimal:null};if(decimal>=0)paramItem.Decimal=decimal;if(maxIndex<index)maxIndex=index;mapParam.set(index,paramItem);}var isArray=false;//是否输出数组字符串
10395
+ var maxCount=0;for(var i=1;i<args.length;++i){var item=args[i];if(Array.isArray(item)){isArray=true;if(maxCount<item.length)maxCount=item.length;}}if(isArray){var result=[];for(var i=0;i<maxCount;++i){var strItem=strFormat;var _iteratorNormalCompletion19=true;var _didIteratorError19=false;var _iteratorError19=undefined;try{for(var _iterator19=(0,_getIterator3.default)(mapParam),_step19;!(_iteratorNormalCompletion19=(_step19=_iterator19.next()).done);_iteratorNormalCompletion19=true){var item=_step19.value;var paramInfo=item[1];var paramItem=args[paramInfo.Index+1];var text="null";if(paramItem){if(Array.isArray(paramItem)){var value=paramItem[i];if(value){if(IFrameSplitOperator.IsNumber(paramInfo.Decimal))text=''+value.toFixed(paramInfo.Decimal);else text=''+value;}}else{text=''+paramItem;}}strItem=strItem.replace(paramInfo.Src,text);}}catch(err){_didIteratorError19=true;_iteratorError19=err;}finally{try{if(!_iteratorNormalCompletion19&&_iterator19.return){_iterator19.return();}}finally{if(_didIteratorError19){throw _iteratorError19;}}}result[i]=strItem;}return result;}else{var result=strFormat;var _iteratorNormalCompletion20=true;var _didIteratorError20=false;var _iteratorError20=undefined;try{for(var _iterator20=(0,_getIterator3.default)(mapParam),_step20;!(_iteratorNormalCompletion20=(_step20=_iterator20.next()).done);_iteratorNormalCompletion20=true){var item=_step20.value;var paramInfo=item[1];var paramItem=args[paramInfo.Index+1];var text="null";if(paramItem){text=''+paramItem;}result=result.replace(paramInfo.Src,text);}}catch(err){_didIteratorError20=true;_iteratorError20=err;}finally{try{if(!_iteratorNormalCompletion20&&_iterator20.return){_iterator20.return();}}finally{if(_didIteratorError20){throw _iteratorError20;}}}return result;}};//函数调用
10358
10396
  this.CallFunction=function(name,args,node,symbolData){switch(name){case'MAX':case"MAX6":return this.MAX(args,node);case'MIN':case"MIN6":return this.MIN(args,node);case'REF':return this.REF(args[0],args[1]);case"REFV":return this.REFV(args[0],args[1]);case'REFX':return this.REFX(args[0],args[1]);case"REFXV":return this.REFXV(args[0],args[1]);case"REFX1"://文华函数
10359
10397
  return this.REFX(args[0],args[1]);case'ABS':return this.ABS(args[0]);case'MA':return this.MA(args[0],args[1]);case"EMA":return this.EMA(args[0],args[1]);case"SMA":return this.SMA(args[0],args[1],args[2]);case"DMA":return this.DMA(args[0],args[1]);case"XMA":return this.XMA(args[0],args[1]);case'EXPMA':return this.EXPMA(args[0],args[1]);case'EXPMEMA':return this.EXPMEMA(args[0],args[1]);case'COUNT':return this.COUNT(args[0],args[1]);case'LLV':return this.LLV(args[0],args[1]);case"LV":return this.LV(args[0],args[1]);case'LLVBARS':return this.LLVBARS(args[0],args[1]);case'HHV':return this.HHV(args[0],args[1]);case'HV':return this.HV(args[0],args[1]);case'HHVBARS':return this.HHVBARS(args[0],args[1]);case'MULAR':return this.MULAR(args[0],args[1]);case'CROSS':return this.CROSS(args[0],args[1]);case'LONGCROSS':return this.LONGCROSS(args[0],args[1],args[2]);case"ISVALID":return this.ISVALID(args[0]);case"CROSSDOWN":return this.CROSSDOWN(args[0],args[1]);case"CROSSUP":return this.CROSSUP(args[0],args[1]);case'AVEDEV':return this.AVEDEV(args[0],args[1]);case'STD':return this.STD(args[0],args[1]);case'IF':case'IFF':case"IFELSE":return this.IF(args[0],args[1],args[2]);case'IFN':return this.IFN(args[0],args[1],args[2]);case'NOT':return this.NOT(args[0]);case'SUM':return this.SUM(args[0],args[1]);case'RANGE':return this.RANGE(args[0],args[1],args[2]);case'EXIST':return this.EXIST(args[0],args[1]);case'EXISTR':return this.EXISTR(args[0],args[1],args[2]);case'FILTER':return this.FILTER(args[0],args[1]);case'TFILTER':return this.TFILTER(args[0],args[1],args[2]);case'SLOPE':return this.SLOPE(args[0],args[1]);case'BARSLAST':return this.BARSLAST(args[0]);case'BARSCOUNT':return this.BARSCOUNT(args[0]);case'BARSSINCEN':return this.BARSSINCEN(args[0],args[1]);case'BARSSINCE':return this.BARSSINCE(args[0]);case'LAST':return this.LAST(args[0],args[1],args[2]);case'EVERY':return this.EVERY(args[0],args[1]);case'DEVSQ':return this.DEVSQ(args[0],args[1]);case'ZIG':return this.ZIG(args[0],args[1]);case'TROUGHBARS':return this.TROUGHBARS(args[0],args[1],args[2]);case"TROUGH":return this.TROUGH(args[0],args[1],args[2]);case'PEAKBARS':return this.PEAKBARS(args[0],args[1],args[2]);case'PEAK':return this.PEAK(args[0],args[1],args[2]);case'COST':return this.COST(args[0]);case'WINNER':return this.WINNER(args[0],node);case'PPART':return this.PPART(args[0],node);case"COSTEX":return this.COSTEX(args[0],args[1],node);case"LWINNER":return this.LWINNER(args[0],args[1],node);case"PWINNER":return this.PWINNER(args[0],args[1],node);case'FORCAST':return this.FORCAST(args[0],args[1]);case"TSMA":return this.TSMA(args[0],args[1]);case'STDP':return this.STDP(args[0],args[1]);case'VAR':return this.VAR(args[0],args[1]);case'VARP':return this.VARP(args[0],args[1]);case'UPNDAY':return this.UPNDAY(args[0],args[1]);case'DOWNNDAY':return this.DOWNNDAY(args[0],args[1]);case'NDAY':return this.NDAY(args[0],args[1],args[2]);case'RELATE':return this.RELATE(args[0],args[1],args[2]);case'COVAR':return this.COVAR(args[0],args[1],args[2]);case'BETA':return this.BETA(args[0]);case'BETA2':return this.BETA2(args[0],args[1],args[2]);case'WMA':return this.WMA(args[0],args[1]);case'MEMA':return this.MEMA(args[0],args[1]);case'SUMBARS':return this.SUMBARS(args[0],args[1]);case'REVERSE':return this.REVERSE(args[0]);case'SAR':return this.SAR(args[0],args[1],args[2]);case'SARTURN':return this.SARTURN(args[0],args[1],args[2]);case'BACKSET':return this.BACKSET(args[0],args[1]);case'BETWEEN':return this.BETWEEN(args[0],args[1],args[2]);case'STRCAT':return this.STRCAT(args[0],args[1]);case'CON2STR':return this.CON2STR(args[0],args[1]);case"VAR2STR":return this.VAR2STR(args[0],args[1]);case"VARCAT":return this.VARCAT(args[0],args[1]);case"STRSPACE":return this.STRSPACE(args[0]);case"FINDSTR":return this.FINDSTR(args[0],args[1]);case"STRCMP":return this.STRCMP(args[0],args[1]);case"STRLEN":return this.STRLEN(args[0]);case"STRFORMAT":return this.STRFORMAT(args[0],args,node);case'DTPRICE':return this.DTPRICE(args[0],args[1]);case'ZTPRICE':return this.ZTPRICE(args[0],args[1]);case'MOD':return this.MOD(args[0],args[1]);case'POW':return this.POW(args[0],args[1]);case'CEILING':return this.CEILING(args[0]);case'FLOOR':return this.FLOOR(args[0]);case'FRACPART':return this.FRACPART(args[0]);case"SIGN":return this.SIGN(args[0]);case'BARSLASTCOUNT':return this.BARSLASTCOUNT(args[0]);case'INTPART':return this.INTPART(args[0]);case"CONST":return this.CONST(args[0]);case"TOPRANGE":return this.TOPRANGE(args[0]);case"LOWRANGE":return this.LOWRANGE(args[0]);case"FINDLOW":return this.FINDLOW(args[0],args[1],args[2],args[3]);case"FINDLOWBARS":return this.FINDLOWBARS(args[0],args[1],args[2],args[3]);case"FINDHIGH":return this.FINDHIGH(args[0],args[1],args[2],args[3]);case"FINDHIGHBARS":return this.FINDHIGHBARS(args[0],args[1],args[2],args[3]);case"BARSNEXT":return this.BARSNEXT(args[0]);case"HOD":return this.HOD(args[0],args[1]);case"LOD":return this.LOD(args[0],args[1]);case"AMA":return this.AMA(args[0],args[1]);case"TMA":return this.TMA(args[0],args[1],args[2]);case"ROUND":return this.ROUND(args[0]);case"ROUND2":return this.ROUND2(args[0],args[1]);case"TRMA":return this.TRMA(args[0],args[1]);case"VALUEWHEN":return this.VALUEWHEN(args[0],args[1]);case"HARMEAN":return this.HARMEAN(args[0],args[1]);case"DATETODAY":return this.DATETODAY(args[0]);case"DAYTODATE":return this.DAYTODATE(args[0]);case"TIMETOSEC":return this.TIMETOSEC(args[0]);case"SECTOTIME":return this.SECTOTIME(args[0]);case"ANY":return this.ANY(args[0],args[1]);case"ALL":return this.ALL(args[0],args[1]);case"TESTSKIP":return this.TESTSKIP(args[0],node);case"SUMBARS":return this.SUMBARS(args[0],args[1]);case"ALIGNRIGHT":return this.ALIGNRIGHT(args[0]);//三角函数
10360
10398
  case'ATAN':return this.Trigonometric(args[0],Math.atan);case'ACOS':return this.ACOS(args[0]);case'ASIN':return this.ASIN(args[0]);case'COS':return this.Trigonometric(args[0],Math.cos);case'SIN':return this.Trigonometric(args[0],Math.sin);case'TAN':return this.Trigonometric(args[0],Math.tan);case'LN':return this.Trigonometric(args[0],Math.log);case'LOG':return this.Trigonometric(args[0],_log2.default);case'EXP':return this.Trigonometric(args[0],Math.exp);case'SQRT':return this.Trigonometric(args[0],Math.sqrt);case"RAND":return this.RAND(args[0]);default:this.ThrowUnexpectedNode(node,'函数'+name+'不存在',name);}};//调用自定义函数 返回数据格式{Out:输出数据, Draw:绘图数据(可选)}
@@ -12734,7 +12772,7 @@ hisData.Symbol=message.symbol;}var stockObj={HQDataType:HQ_DATA_TYPE.KLINE_ID,St
12734
12772
  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);};}/********************************************************************************
12735
12773
  * 版本信息输出
12736
12774
  *
12737
- */var HQCHART_VERSION="1.1.12621";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();//把给外界调用的方法暴露出来
12775
+ */var HQCHART_VERSION="1.1.12630";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();//把给外界调用的方法暴露出来
12738
12776
  exports.default=(_jsChartInit$jsChartS={jsChartInit:JSChart.Init,jsChartStyle:JSChart.SetStyle,// IsIndexSymbol:IsIndexSymbol,
12739
12777
  // BaseIndex:BaseIndex,
12740
12778
  // ChartLine:ChartLine,
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "hqchart",
3
3
  "description": "stock chart",
4
4
  "author": "jones2000",
5
- "version": "1.1.12622",
5
+ "version": "1.1.12631",
6
6
  "main": "lib/main.js",
7
7
  "private": false,
8
8
  "license": "Apache License 2.0",
@@ -8611,10 +8611,10 @@ function JSAlgorithm(errorHandler,symbolData)
8611
8611
  }
8612
8612
 
8613
8613
 
8614
- //格式化字符串 "{0}-{1}", C, O;
8614
+ //格式化字符串 "{0}-{1}", C, O; 小数位数 {0:0.00}
8615
8615
  this.STRFORMAT=function(strFormat,args,node)
8616
8616
  {
8617
- var aryParam=strFormat.match(/{\d+}/g);
8617
+ var aryParam=strFormat.match(/{[0-9.:]+}/g);
8618
8618
 
8619
8619
  if (!IFrameSplitOperator.IsNonEmptyArray(aryParam)) return null;
8620
8620
 
@@ -8626,9 +8626,47 @@ function JSAlgorithm(errorHandler,symbolData)
8626
8626
  if (item.length<3) continue;
8627
8627
 
8628
8628
  var value=item.slice(1, item.length-1);
8629
- var index=parseInt(value);
8629
+ var index=-1,decimal=-1;
8630
+ if (value.indexOf(":")>0)
8631
+ {
8632
+ var aryTemp=value.split(":");
8633
+ if (aryTemp)
8634
+ {
8635
+ if (aryTemp[0])
8636
+ index=parseInt(aryTemp[0]);
8630
8637
 
8631
- var paramItem={ Src:item, Index:index, Text:null};
8638
+ if (aryTemp[1])
8639
+ {
8640
+ if (aryTemp[1].indexOf(".")>=0)
8641
+ {
8642
+ var zeroCount=0;
8643
+ var strTemp=aryTemp[1];
8644
+ for(var j=strTemp.length-1; j>=0; --j)
8645
+ {
8646
+ if (strTemp[j]=="0") ++zeroCount;
8647
+ else break;
8648
+ }
8649
+
8650
+ if (zeroCount>0) decimal=zeroCount;
8651
+ }
8652
+ else if (aryTemp[1]=="0")
8653
+ {
8654
+ decimal=0;
8655
+ }
8656
+ }
8657
+
8658
+ }
8659
+
8660
+ }
8661
+ else
8662
+ {
8663
+ index=parseInt(value);
8664
+ }
8665
+
8666
+ if (index<0) continue;
8667
+
8668
+ var paramItem={ Src:item, Index:index, Text:null, Decimal:null };
8669
+ if (decimal>=0) paramItem.Decimal=decimal;
8632
8670
 
8633
8671
  if (maxIndex<index) maxIndex=index;
8634
8672
 
@@ -8665,7 +8703,13 @@ function JSAlgorithm(errorHandler,symbolData)
8665
8703
  if (Array.isArray(paramItem))
8666
8704
  {
8667
8705
  var value=paramItem[i];
8668
- if (value) text=`${value}`;
8706
+ if (value)
8707
+ {
8708
+ if (IFrameSplitOperator.IsNumber(paramInfo.Decimal))
8709
+ text=`${value.toFixed(paramInfo.Decimal)}`;
8710
+ else
8711
+ text=`${value}`;
8712
+ }
8669
8713
  }
8670
8714
  else
8671
8715
  {
@@ -51289,7 +51289,7 @@ function IChartDrawPicture()
51289
51289
  //xStep,yStep 移动的偏移量
51290
51290
  this.Move=function(xStep,yStep)
51291
51291
  {
51292
- if (this.Status!=20) return fasle;
51292
+ if (this.Status!=20) return false;
51293
51293
  if (!this.Frame) return false;
51294
51294
  var data=this.Frame.Data;
51295
51295
  if (!data) return false;
@@ -52981,7 +52981,8 @@ function ChartDrawPictureHorizontalLine()
52981
52981
  this.DrawPoint(drawPoint);
52982
52982
 
52983
52983
  //显示价格
52984
-
52984
+ this.LineText(drawPoint[0])
52985
+ /*
52985
52986
  this.Canvas.fillStyle=this.LineColor;
52986
52987
  this.Canvas.font=this.Font;
52987
52988
  if (isHScreen)
@@ -53014,9 +53015,53 @@ function ChartDrawPictureHorizontalLine()
53014
53015
  }
53015
53016
  this.Canvas.fillText(text,left,drawPoint[0].Y);
53016
53017
  }
53018
+ */
53017
53019
 
53018
53020
  this.Canvas.restore();
53019
53021
  }
53022
+
53023
+ this.LineText=function(point)
53024
+ {
53025
+ if (!point) return;
53026
+
53027
+ var isHScreen=this.Frame.IsHScreen;
53028
+ var left=this.Frame.ChartBorder.GetLeft();
53029
+
53030
+ this.Canvas.fillStyle=this.LineColor;
53031
+ this.Canvas.font=this.Font;
53032
+
53033
+ if (isHScreen)
53034
+ {
53035
+ left=this.Frame.ChartBorder.GetTop();
53036
+ this.Canvas.textAlign="left";
53037
+ this.Canvas.textBaseline="bottom";
53038
+ var xText=point.X;
53039
+ var yText=left;
53040
+ this.Canvas.translate(xText, yText);
53041
+ this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
53042
+ var yValue=this.Frame.GetYData(point.X);
53043
+ var text=yValue.toFixed(2);
53044
+ if (this.Label)
53045
+ {
53046
+ if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);
53047
+ else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;
53048
+ }
53049
+ this.Canvas.fillText(text,2,0);
53050
+ }
53051
+ else
53052
+ {
53053
+ this.Canvas.textAlign="left";
53054
+ this.Canvas.textBaseline="bottom";
53055
+ var yValue=this.Frame.GetYData(point.Y);
53056
+ var text=yValue.toFixed(2);
53057
+ if (this.Label)
53058
+ {
53059
+ if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);
53060
+ else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;
53061
+ }
53062
+ this.Canvas.fillText(text,left,point.Y);
53063
+ }
53064
+ }
53020
53065
  }
53021
53066
 
53022
53067
  //水平线2
@@ -54714,7 +54759,7 @@ function ChartDrawPictureParallelChannel()
54714
54759
  //xStep,yStep 移动的偏移量
54715
54760
  this.Move=function(xStep,yStep)
54716
54761
  {
54717
- if (this.Status!=20) return fasle;
54762
+ if (this.Status!=20) return false;
54718
54763
  if (!this.Frame) return false;
54719
54764
  var data=this.Frame.Data;
54720
54765
  if (!data) return false;
@@ -68992,6 +69037,53 @@ function KLineChartContainer(uielement,OffscreenElement)
68992
69037
  }
68993
69038
  }
68994
69039
  }
69040
+
69041
+ //清空叠加股票
69042
+ if (option.ClearOverlay===true)
69043
+ {
69044
+ for(var i in this.OverlayChartPaint)
69045
+ {
69046
+ var item=this.OverlayChartPaint[i];
69047
+ item.IsDelete=true;
69048
+ }
69049
+
69050
+ this.OverlayChartPaint=[];
69051
+ this.Frame.SubFrame[0].Frame.YSplitOperator.OverlayChartPaint=this.OverlayChartPaint;
69052
+ this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint; //绑定叠加
69053
+ }
69054
+
69055
+ //叠加股票
69056
+ if (open.Overlay && IFrameSplitOperator.IsNonEmptyArray(option.Overlay))
69057
+ {
69058
+ var setSymbol=new Set();
69059
+ for(var i=0;i<this.OverlayChartPaint.length;++i)
69060
+ {
69061
+ var item=this.OverlayChartPaint[j];
69062
+ setSymbol.add(item.Symbol);
69063
+ }
69064
+
69065
+ for(var i=0;i<option.Overlay.length;++i)
69066
+ {
69067
+ var item=option.Overlay[i];
69068
+ if (setSymbol.has(item.Symbol)) continue;
69069
+
69070
+ var paint=new ChartOverlayMinutePriceLine();
69071
+ paint.Canvas=this.Canvas;
69072
+ paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
69073
+ paint.ChartFrame=this.Frame.SubFrame[0].Frame;
69074
+ paint.Name="Overlay-Minute";
69075
+ paint.Symbol=item.Symbol;
69076
+ paint.Identify=`Overlay-Minute-${item.Symbol}`;
69077
+ if (item.Color) paint.Color=item.Color; //外部设置颜色
69078
+ else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
69079
+ ++g_JSChartResource.OverlaySymbol.Random;
69080
+ paint.MainData=this.SourceData; //绑定主图数据
69081
+
69082
+ if (paint.SetOption) paint.SetOption(item);
69083
+
69084
+ this.OverlayChartPaint.push(paint);
69085
+ }
69086
+ }
68995
69087
  }
68996
69088
 
68997
69089
  this.ReloadChartDrawPicture();
@@ -74153,34 +74245,55 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
74153
74245
  this.RequestData();
74154
74246
  }
74155
74247
 
74156
- //叠加股票
74248
+ //叠加股票 symbol支持数据 ["600000.sh", "0000001.sz"]
74157
74249
  this.OverlaySymbol=function(symbol,option)
74158
74250
  {
74159
- for(var i=0; i<this.OverlayChartPaint.length; ++i)
74251
+ var arySymbol=null;
74252
+ if (IFrameSplitOperator.IsString(symbol)) arySymbol=[symbol];
74253
+ else if (Array.isArray(symbol)) arySymbol=symbol;
74254
+ if (!IFrameSplitOperator.IsNonEmptyArray(arySymbol)) return false;
74255
+
74256
+ var aryNewSymbol=[];
74257
+ for(var i=0, j=0;i<arySymbol.length;++i)
74160
74258
  {
74161
- var item=this.OverlayChartPaint[i];
74162
- if (item.Symbol==symbol)
74259
+ var strSymbol=arySymbol[i];
74260
+ var bFind=false;
74261
+ for(j=0;j<this.OverlayChartPaint.length; ++j)
74163
74262
  {
74164
- console.warn(`[MinuteChartContainer::OverlaySymbol] overlay symbol=${symbol} exist.`);
74165
- return false;
74263
+ var item=this.OverlayChartPaint[j];
74264
+ if (item.Symbol==strSymbol)
74265
+ {
74266
+ bFind=true;
74267
+ console.warn(`[MinuteChartContainer::OverlaySymbol] overlay symbol=${strSymbol} exist.`);
74268
+ break;
74269
+ }
74166
74270
  }
74271
+
74272
+ if (!bFind) aryNewSymbol.push(strSymbol);
74167
74273
  }
74168
74274
 
74169
- var paint=new ChartOverlayMinutePriceLine();
74170
- paint.Canvas=this.Canvas;
74171
- paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
74172
- paint.ChartFrame=this.Frame.SubFrame[0].Frame;
74173
- paint.Name="Overlay-Minute";
74174
- paint.Symbol=symbol;
74175
- paint.Identify=`Overlay-Minute-${symbol}`;
74176
- if (option && option.Color) paint.Color=option.Color; //外部设置颜色
74177
- else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
74178
- ++g_JSChartResource.OverlaySymbol.Random;
74179
- paint.MainData=this.SourceData; //绑定主图数据
74275
+ if (!IFrameSplitOperator.IsNonEmptyArray(arySymbol)) return true;
74180
74276
 
74181
- if (paint.SetOption) paint.SetOption(option);
74277
+ for(var i=0;i<aryNewSymbol.length;++i)
74278
+ {
74279
+ var strSymbol=aryNewSymbol[i];
74182
74280
 
74183
- this.OverlayChartPaint.push(paint);
74281
+ var paint=new ChartOverlayMinutePriceLine();
74282
+ paint.Canvas=this.Canvas;
74283
+ paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
74284
+ paint.ChartFrame=this.Frame.SubFrame[0].Frame;
74285
+ paint.Name="Overlay-Minute";
74286
+ paint.Symbol=strSymbol;
74287
+ paint.Identify=`Overlay-Minute-${strSymbol}`;
74288
+ if (option && option.Color) paint.Color=option.Color; //外部设置颜色
74289
+ else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
74290
+ ++g_JSChartResource.OverlaySymbol.Random;
74291
+ paint.MainData=this.SourceData; //绑定主图数据
74292
+
74293
+ if (paint.SetOption) paint.SetOption(option);
74294
+
74295
+ this.OverlayChartPaint.push(paint);
74296
+ }
74184
74297
 
74185
74298
  if (this.DayCount<=1) this.RequestOverlayMinuteData(); //请求数据
74186
74299
  else this.RequestOverlayHistoryMinuteData();
@@ -55369,7 +55369,7 @@ function IChartDrawPicture()
55369
55369
  //xStep,yStep 移动的偏移量
55370
55370
  this.Move=function(xStep,yStep)
55371
55371
  {
55372
- if (this.Status!=20) return fasle;
55372
+ if (this.Status!=20) return false;
55373
55373
  if (!this.Frame) return false;
55374
55374
  var data=this.Frame.Data;
55375
55375
  if (!data) return false;
@@ -57061,7 +57061,8 @@ function ChartDrawPictureHorizontalLine()
57061
57061
  this.DrawPoint(drawPoint);
57062
57062
 
57063
57063
  //显示价格
57064
-
57064
+ this.LineText(drawPoint[0])
57065
+ /*
57065
57066
  this.Canvas.fillStyle=this.LineColor;
57066
57067
  this.Canvas.font=this.Font;
57067
57068
  if (isHScreen)
@@ -57094,9 +57095,53 @@ function ChartDrawPictureHorizontalLine()
57094
57095
  }
57095
57096
  this.Canvas.fillText(text,left,drawPoint[0].Y);
57096
57097
  }
57098
+ */
57097
57099
 
57098
57100
  this.Canvas.restore();
57099
57101
  }
57102
+
57103
+ this.LineText=function(point)
57104
+ {
57105
+ if (!point) return;
57106
+
57107
+ var isHScreen=this.Frame.IsHScreen;
57108
+ var left=this.Frame.ChartBorder.GetLeft();
57109
+
57110
+ this.Canvas.fillStyle=this.LineColor;
57111
+ this.Canvas.font=this.Font;
57112
+
57113
+ if (isHScreen)
57114
+ {
57115
+ left=this.Frame.ChartBorder.GetTop();
57116
+ this.Canvas.textAlign="left";
57117
+ this.Canvas.textBaseline="bottom";
57118
+ var xText=point.X;
57119
+ var yText=left;
57120
+ this.Canvas.translate(xText, yText);
57121
+ this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
57122
+ var yValue=this.Frame.GetYData(point.X);
57123
+ var text=yValue.toFixed(2);
57124
+ if (this.Label)
57125
+ {
57126
+ if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);
57127
+ else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;
57128
+ }
57129
+ this.Canvas.fillText(text,2,0);
57130
+ }
57131
+ else
57132
+ {
57133
+ this.Canvas.textAlign="left";
57134
+ this.Canvas.textBaseline="bottom";
57135
+ var yValue=this.Frame.GetYData(point.Y);
57136
+ var text=yValue.toFixed(2);
57137
+ if (this.Label)
57138
+ {
57139
+ if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);
57140
+ else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;
57141
+ }
57142
+ this.Canvas.fillText(text,left,point.Y);
57143
+ }
57144
+ }
57100
57145
  }
57101
57146
 
57102
57147
  //水平线2
@@ -58794,7 +58839,7 @@ function ChartDrawPictureParallelChannel()
58794
58839
  //xStep,yStep 移动的偏移量
58795
58840
  this.Move=function(xStep,yStep)
58796
58841
  {
58797
- if (this.Status!=20) return fasle;
58842
+ if (this.Status!=20) return false;
58798
58843
  if (!this.Frame) return false;
58799
58844
  var data=this.Frame.Data;
58800
58845
  if (!data) return false;
@@ -73072,6 +73117,53 @@ function KLineChartContainer(uielement,OffscreenElement)
73072
73117
  }
73073
73118
  }
73074
73119
  }
73120
+
73121
+ //清空叠加股票
73122
+ if (option.ClearOverlay===true)
73123
+ {
73124
+ for(var i in this.OverlayChartPaint)
73125
+ {
73126
+ var item=this.OverlayChartPaint[i];
73127
+ item.IsDelete=true;
73128
+ }
73129
+
73130
+ this.OverlayChartPaint=[];
73131
+ this.Frame.SubFrame[0].Frame.YSplitOperator.OverlayChartPaint=this.OverlayChartPaint;
73132
+ this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint; //绑定叠加
73133
+ }
73134
+
73135
+ //叠加股票
73136
+ if (open.Overlay && IFrameSplitOperator.IsNonEmptyArray(option.Overlay))
73137
+ {
73138
+ var setSymbol=new Set();
73139
+ for(var i=0;i<this.OverlayChartPaint.length;++i)
73140
+ {
73141
+ var item=this.OverlayChartPaint[j];
73142
+ setSymbol.add(item.Symbol);
73143
+ }
73144
+
73145
+ for(var i=0;i<option.Overlay.length;++i)
73146
+ {
73147
+ var item=option.Overlay[i];
73148
+ if (setSymbol.has(item.Symbol)) continue;
73149
+
73150
+ var paint=new ChartOverlayMinutePriceLine();
73151
+ paint.Canvas=this.Canvas;
73152
+ paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
73153
+ paint.ChartFrame=this.Frame.SubFrame[0].Frame;
73154
+ paint.Name="Overlay-Minute";
73155
+ paint.Symbol=item.Symbol;
73156
+ paint.Identify=`Overlay-Minute-${item.Symbol}`;
73157
+ if (item.Color) paint.Color=item.Color; //外部设置颜色
73158
+ else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
73159
+ ++g_JSChartResource.OverlaySymbol.Random;
73160
+ paint.MainData=this.SourceData; //绑定主图数据
73161
+
73162
+ if (paint.SetOption) paint.SetOption(item);
73163
+
73164
+ this.OverlayChartPaint.push(paint);
73165
+ }
73166
+ }
73075
73167
  }
73076
73168
 
73077
73169
  this.ReloadChartDrawPicture();
@@ -78233,34 +78325,55 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
78233
78325
  this.RequestData();
78234
78326
  }
78235
78327
 
78236
- //叠加股票
78328
+ //叠加股票 symbol支持数据 ["600000.sh", "0000001.sz"]
78237
78329
  this.OverlaySymbol=function(symbol,option)
78238
78330
  {
78239
- for(var i=0; i<this.OverlayChartPaint.length; ++i)
78331
+ var arySymbol=null;
78332
+ if (IFrameSplitOperator.IsString(symbol)) arySymbol=[symbol];
78333
+ else if (Array.isArray(symbol)) arySymbol=symbol;
78334
+ if (!IFrameSplitOperator.IsNonEmptyArray(arySymbol)) return false;
78335
+
78336
+ var aryNewSymbol=[];
78337
+ for(var i=0, j=0;i<arySymbol.length;++i)
78240
78338
  {
78241
- var item=this.OverlayChartPaint[i];
78242
- if (item.Symbol==symbol)
78339
+ var strSymbol=arySymbol[i];
78340
+ var bFind=false;
78341
+ for(j=0;j<this.OverlayChartPaint.length; ++j)
78243
78342
  {
78244
- console.warn(`[MinuteChartContainer::OverlaySymbol] overlay symbol=${symbol} exist.`);
78245
- return false;
78343
+ var item=this.OverlayChartPaint[j];
78344
+ if (item.Symbol==strSymbol)
78345
+ {
78346
+ bFind=true;
78347
+ console.warn(`[MinuteChartContainer::OverlaySymbol] overlay symbol=${strSymbol} exist.`);
78348
+ break;
78349
+ }
78246
78350
  }
78351
+
78352
+ if (!bFind) aryNewSymbol.push(strSymbol);
78247
78353
  }
78248
78354
 
78249
- var paint=new ChartOverlayMinutePriceLine();
78250
- paint.Canvas=this.Canvas;
78251
- paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
78252
- paint.ChartFrame=this.Frame.SubFrame[0].Frame;
78253
- paint.Name="Overlay-Minute";
78254
- paint.Symbol=symbol;
78255
- paint.Identify=`Overlay-Minute-${symbol}`;
78256
- if (option && option.Color) paint.Color=option.Color; //外部设置颜色
78257
- else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
78258
- ++g_JSChartResource.OverlaySymbol.Random;
78259
- paint.MainData=this.SourceData; //绑定主图数据
78355
+ if (!IFrameSplitOperator.IsNonEmptyArray(arySymbol)) return true;
78260
78356
 
78261
- if (paint.SetOption) paint.SetOption(option);
78357
+ for(var i=0;i<aryNewSymbol.length;++i)
78358
+ {
78359
+ var strSymbol=aryNewSymbol[i];
78262
78360
 
78263
- this.OverlayChartPaint.push(paint);
78361
+ var paint=new ChartOverlayMinutePriceLine();
78362
+ paint.Canvas=this.Canvas;
78363
+ paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
78364
+ paint.ChartFrame=this.Frame.SubFrame[0].Frame;
78365
+ paint.Name="Overlay-Minute";
78366
+ paint.Symbol=strSymbol;
78367
+ paint.Identify=`Overlay-Minute-${strSymbol}`;
78368
+ if (option && option.Color) paint.Color=option.Color; //外部设置颜色
78369
+ else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
78370
+ ++g_JSChartResource.OverlaySymbol.Random;
78371
+ paint.MainData=this.SourceData; //绑定主图数据
78372
+
78373
+ if (paint.SetOption) paint.SetOption(option);
78374
+
78375
+ this.OverlayChartPaint.push(paint);
78376
+ }
78264
78377
 
78265
78378
  if (this.DayCount<=1) this.RequestOverlayMinuteData(); //请求数据
78266
78379
  else this.RequestOverlayHistoryMinuteData();
@@ -102543,10 +102656,10 @@ function JSAlgorithm(errorHandler,symbolData)
102543
102656
  }
102544
102657
 
102545
102658
 
102546
- //格式化字符串 "{0}-{1}", C, O;
102659
+ //格式化字符串 "{0}-{1}", C, O; 小数位数 {0:0.00}
102547
102660
  this.STRFORMAT=function(strFormat,args,node)
102548
102661
  {
102549
- var aryParam=strFormat.match(/{\d+}/g);
102662
+ var aryParam=strFormat.match(/{[0-9.:]+}/g);
102550
102663
 
102551
102664
  if (!IFrameSplitOperator.IsNonEmptyArray(aryParam)) return null;
102552
102665
 
@@ -102558,9 +102671,47 @@ function JSAlgorithm(errorHandler,symbolData)
102558
102671
  if (item.length<3) continue;
102559
102672
 
102560
102673
  var value=item.slice(1, item.length-1);
102561
- var index=parseInt(value);
102674
+ var index=-1,decimal=-1;
102675
+ if (value.indexOf(":")>0)
102676
+ {
102677
+ var aryTemp=value.split(":");
102678
+ if (aryTemp)
102679
+ {
102680
+ if (aryTemp[0])
102681
+ index=parseInt(aryTemp[0]);
102562
102682
 
102563
- var paramItem={ Src:item, Index:index, Text:null};
102683
+ if (aryTemp[1])
102684
+ {
102685
+ if (aryTemp[1].indexOf(".")>=0)
102686
+ {
102687
+ var zeroCount=0;
102688
+ var strTemp=aryTemp[1];
102689
+ for(var j=strTemp.length-1; j>=0; --j)
102690
+ {
102691
+ if (strTemp[j]=="0") ++zeroCount;
102692
+ else break;
102693
+ }
102694
+
102695
+ if (zeroCount>0) decimal=zeroCount;
102696
+ }
102697
+ else if (aryTemp[1]=="0")
102698
+ {
102699
+ decimal=0;
102700
+ }
102701
+ }
102702
+
102703
+ }
102704
+
102705
+ }
102706
+ else
102707
+ {
102708
+ index=parseInt(value);
102709
+ }
102710
+
102711
+ if (index<0) continue;
102712
+
102713
+ var paramItem={ Src:item, Index:index, Text:null, Decimal:null };
102714
+ if (decimal>=0) paramItem.Decimal=decimal;
102564
102715
 
102565
102716
  if (maxIndex<index) maxIndex=index;
102566
102717
 
@@ -102597,7 +102748,13 @@ function JSAlgorithm(errorHandler,symbolData)
102597
102748
  if (Array.isArray(paramItem))
102598
102749
  {
102599
102750
  var value=paramItem[i];
102600
- if (value) text=`${value}`;
102751
+ if (value)
102752
+ {
102753
+ if (IFrameSplitOperator.IsNumber(paramInfo.Decimal))
102754
+ text=`${value.toFixed(paramInfo.Decimal)}`;
102755
+ else
102756
+ text=`${value}`;
102757
+ }
102601
102758
  }
102602
102759
  else
102603
102760
  {
@@ -129881,7 +130038,7 @@ function ScrollBarBGChart()
129881
130038
 
129882
130039
 
129883
130040
 
129884
- var HQCHART_VERSION="1.1.12621";
130041
+ var HQCHART_VERSION="1.1.12630";
129885
130042
 
129886
130043
  function PrintHQChartVersion()
129887
130044
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.12621";
8
+ var HQCHART_VERSION="1.1.12630";
9
9
 
10
10
  function PrintHQChartVersion()
11
11
  {
@@ -55413,7 +55413,7 @@ function IChartDrawPicture()
55413
55413
  //xStep,yStep 移动的偏移量
55414
55414
  this.Move=function(xStep,yStep)
55415
55415
  {
55416
- if (this.Status!=20) return fasle;
55416
+ if (this.Status!=20) return false;
55417
55417
  if (!this.Frame) return false;
55418
55418
  var data=this.Frame.Data;
55419
55419
  if (!data) return false;
@@ -57105,7 +57105,8 @@ function ChartDrawPictureHorizontalLine()
57105
57105
  this.DrawPoint(drawPoint);
57106
57106
 
57107
57107
  //显示价格
57108
-
57108
+ this.LineText(drawPoint[0])
57109
+ /*
57109
57110
  this.Canvas.fillStyle=this.LineColor;
57110
57111
  this.Canvas.font=this.Font;
57111
57112
  if (isHScreen)
@@ -57138,9 +57139,53 @@ function ChartDrawPictureHorizontalLine()
57138
57139
  }
57139
57140
  this.Canvas.fillText(text,left,drawPoint[0].Y);
57140
57141
  }
57142
+ */
57141
57143
 
57142
57144
  this.Canvas.restore();
57143
57145
  }
57146
+
57147
+ this.LineText=function(point)
57148
+ {
57149
+ if (!point) return;
57150
+
57151
+ var isHScreen=this.Frame.IsHScreen;
57152
+ var left=this.Frame.ChartBorder.GetLeft();
57153
+
57154
+ this.Canvas.fillStyle=this.LineColor;
57155
+ this.Canvas.font=this.Font;
57156
+
57157
+ if (isHScreen)
57158
+ {
57159
+ left=this.Frame.ChartBorder.GetTop();
57160
+ this.Canvas.textAlign="left";
57161
+ this.Canvas.textBaseline="bottom";
57162
+ var xText=point.X;
57163
+ var yText=left;
57164
+ this.Canvas.translate(xText, yText);
57165
+ this.Canvas.rotate(90 * Math.PI / 180); //数据和框子旋转180度
57166
+ var yValue=this.Frame.GetYData(point.X);
57167
+ var text=yValue.toFixed(2);
57168
+ if (this.Label)
57169
+ {
57170
+ if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);
57171
+ else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;
57172
+ }
57173
+ this.Canvas.fillText(text,2,0);
57174
+ }
57175
+ else
57176
+ {
57177
+ this.Canvas.textAlign="left";
57178
+ this.Canvas.textBaseline="bottom";
57179
+ var yValue=this.Frame.GetYData(point.Y);
57180
+ var text=yValue.toFixed(2);
57181
+ if (this.Label)
57182
+ {
57183
+ if (this.Label.Position==0) text=this.Label.Text+yValue.toFixed(2);
57184
+ else if (this.Label.Position==1) text=yValue.toFixed(2)+this.Label.Text;
57185
+ }
57186
+ this.Canvas.fillText(text,left,point.Y);
57187
+ }
57188
+ }
57144
57189
  }
57145
57190
 
57146
57191
  //水平线2
@@ -58838,7 +58883,7 @@ function ChartDrawPictureParallelChannel()
58838
58883
  //xStep,yStep 移动的偏移量
58839
58884
  this.Move=function(xStep,yStep)
58840
58885
  {
58841
- if (this.Status!=20) return fasle;
58886
+ if (this.Status!=20) return false;
58842
58887
  if (!this.Frame) return false;
58843
58888
  var data=this.Frame.Data;
58844
58889
  if (!data) return false;
@@ -73116,6 +73161,53 @@ function KLineChartContainer(uielement,OffscreenElement)
73116
73161
  }
73117
73162
  }
73118
73163
  }
73164
+
73165
+ //清空叠加股票
73166
+ if (option.ClearOverlay===true)
73167
+ {
73168
+ for(var i in this.OverlayChartPaint)
73169
+ {
73170
+ var item=this.OverlayChartPaint[i];
73171
+ item.IsDelete=true;
73172
+ }
73173
+
73174
+ this.OverlayChartPaint=[];
73175
+ this.Frame.SubFrame[0].Frame.YSplitOperator.OverlayChartPaint=this.OverlayChartPaint;
73176
+ this.TitlePaint[0].OverlayChartPaint=this.OverlayChartPaint; //绑定叠加
73177
+ }
73178
+
73179
+ //叠加股票
73180
+ if (open.Overlay && IFrameSplitOperator.IsNonEmptyArray(option.Overlay))
73181
+ {
73182
+ var setSymbol=new Set();
73183
+ for(var i=0;i<this.OverlayChartPaint.length;++i)
73184
+ {
73185
+ var item=this.OverlayChartPaint[j];
73186
+ setSymbol.add(item.Symbol);
73187
+ }
73188
+
73189
+ for(var i=0;i<option.Overlay.length;++i)
73190
+ {
73191
+ var item=option.Overlay[i];
73192
+ if (setSymbol.has(item.Symbol)) continue;
73193
+
73194
+ var paint=new ChartOverlayMinutePriceLine();
73195
+ paint.Canvas=this.Canvas;
73196
+ paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
73197
+ paint.ChartFrame=this.Frame.SubFrame[0].Frame;
73198
+ paint.Name="Overlay-Minute";
73199
+ paint.Symbol=item.Symbol;
73200
+ paint.Identify=`Overlay-Minute-${item.Symbol}`;
73201
+ if (item.Color) paint.Color=item.Color; //外部设置颜色
73202
+ else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
73203
+ ++g_JSChartResource.OverlaySymbol.Random;
73204
+ paint.MainData=this.SourceData; //绑定主图数据
73205
+
73206
+ if (paint.SetOption) paint.SetOption(item);
73207
+
73208
+ this.OverlayChartPaint.push(paint);
73209
+ }
73210
+ }
73119
73211
  }
73120
73212
 
73121
73213
  this.ReloadChartDrawPicture();
@@ -78277,34 +78369,55 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
78277
78369
  this.RequestData();
78278
78370
  }
78279
78371
 
78280
- //叠加股票
78372
+ //叠加股票 symbol支持数据 ["600000.sh", "0000001.sz"]
78281
78373
  this.OverlaySymbol=function(symbol,option)
78282
78374
  {
78283
- for(var i=0; i<this.OverlayChartPaint.length; ++i)
78375
+ var arySymbol=null;
78376
+ if (IFrameSplitOperator.IsString(symbol)) arySymbol=[symbol];
78377
+ else if (Array.isArray(symbol)) arySymbol=symbol;
78378
+ if (!IFrameSplitOperator.IsNonEmptyArray(arySymbol)) return false;
78379
+
78380
+ var aryNewSymbol=[];
78381
+ for(var i=0, j=0;i<arySymbol.length;++i)
78284
78382
  {
78285
- var item=this.OverlayChartPaint[i];
78286
- if (item.Symbol==symbol)
78383
+ var strSymbol=arySymbol[i];
78384
+ var bFind=false;
78385
+ for(j=0;j<this.OverlayChartPaint.length; ++j)
78287
78386
  {
78288
- console.warn(`[MinuteChartContainer::OverlaySymbol] overlay symbol=${symbol} exist.`);
78289
- return false;
78387
+ var item=this.OverlayChartPaint[j];
78388
+ if (item.Symbol==strSymbol)
78389
+ {
78390
+ bFind=true;
78391
+ console.warn(`[MinuteChartContainer::OverlaySymbol] overlay symbol=${strSymbol} exist.`);
78392
+ break;
78393
+ }
78290
78394
  }
78395
+
78396
+ if (!bFind) aryNewSymbol.push(strSymbol);
78291
78397
  }
78292
78398
 
78293
- var paint=new ChartOverlayMinutePriceLine();
78294
- paint.Canvas=this.Canvas;
78295
- paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
78296
- paint.ChartFrame=this.Frame.SubFrame[0].Frame;
78297
- paint.Name="Overlay-Minute";
78298
- paint.Symbol=symbol;
78299
- paint.Identify=`Overlay-Minute-${symbol}`;
78300
- if (option && option.Color) paint.Color=option.Color; //外部设置颜色
78301
- else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
78302
- ++g_JSChartResource.OverlaySymbol.Random;
78303
- paint.MainData=this.SourceData; //绑定主图数据
78399
+ if (!IFrameSplitOperator.IsNonEmptyArray(arySymbol)) return true;
78304
78400
 
78305
- if (paint.SetOption) paint.SetOption(option);
78401
+ for(var i=0;i<aryNewSymbol.length;++i)
78402
+ {
78403
+ var strSymbol=aryNewSymbol[i];
78306
78404
 
78307
- this.OverlayChartPaint.push(paint);
78405
+ var paint=new ChartOverlayMinutePriceLine();
78406
+ paint.Canvas=this.Canvas;
78407
+ paint.ChartBorder=this.Frame.SubFrame[0].Frame.ChartBorder;
78408
+ paint.ChartFrame=this.Frame.SubFrame[0].Frame;
78409
+ paint.Name="Overlay-Minute";
78410
+ paint.Symbol=strSymbol;
78411
+ paint.Identify=`Overlay-Minute-${strSymbol}`;
78412
+ if (option && option.Color) paint.Color=option.Color; //外部设置颜色
78413
+ else paint.Color=g_JSChartResource.OverlaySymbol.Color[g_JSChartResource.OverlaySymbol.Random%g_JSChartResource.OverlaySymbol.Color.length];
78414
+ ++g_JSChartResource.OverlaySymbol.Random;
78415
+ paint.MainData=this.SourceData; //绑定主图数据
78416
+
78417
+ if (paint.SetOption) paint.SetOption(option);
78418
+
78419
+ this.OverlayChartPaint.push(paint);
78420
+ }
78308
78421
 
78309
78422
  if (this.DayCount<=1) this.RequestOverlayMinuteData(); //请求数据
78310
78423
  else this.RequestOverlayHistoryMinuteData();
@@ -102587,10 +102700,10 @@ function JSAlgorithm(errorHandler,symbolData)
102587
102700
  }
102588
102701
 
102589
102702
 
102590
- //格式化字符串 "{0}-{1}", C, O;
102703
+ //格式化字符串 "{0}-{1}", C, O; 小数位数 {0:0.00}
102591
102704
  this.STRFORMAT=function(strFormat,args,node)
102592
102705
  {
102593
- var aryParam=strFormat.match(/{\d+}/g);
102706
+ var aryParam=strFormat.match(/{[0-9.:]+}/g);
102594
102707
 
102595
102708
  if (!IFrameSplitOperator.IsNonEmptyArray(aryParam)) return null;
102596
102709
 
@@ -102602,9 +102715,47 @@ function JSAlgorithm(errorHandler,symbolData)
102602
102715
  if (item.length<3) continue;
102603
102716
 
102604
102717
  var value=item.slice(1, item.length-1);
102605
- var index=parseInt(value);
102718
+ var index=-1,decimal=-1;
102719
+ if (value.indexOf(":")>0)
102720
+ {
102721
+ var aryTemp=value.split(":");
102722
+ if (aryTemp)
102723
+ {
102724
+ if (aryTemp[0])
102725
+ index=parseInt(aryTemp[0]);
102606
102726
 
102607
- var paramItem={ Src:item, Index:index, Text:null};
102727
+ if (aryTemp[1])
102728
+ {
102729
+ if (aryTemp[1].indexOf(".")>=0)
102730
+ {
102731
+ var zeroCount=0;
102732
+ var strTemp=aryTemp[1];
102733
+ for(var j=strTemp.length-1; j>=0; --j)
102734
+ {
102735
+ if (strTemp[j]=="0") ++zeroCount;
102736
+ else break;
102737
+ }
102738
+
102739
+ if (zeroCount>0) decimal=zeroCount;
102740
+ }
102741
+ else if (aryTemp[1]=="0")
102742
+ {
102743
+ decimal=0;
102744
+ }
102745
+ }
102746
+
102747
+ }
102748
+
102749
+ }
102750
+ else
102751
+ {
102752
+ index=parseInt(value);
102753
+ }
102754
+
102755
+ if (index<0) continue;
102756
+
102757
+ var paramItem={ Src:item, Index:index, Text:null, Decimal:null };
102758
+ if (decimal>=0) paramItem.Decimal=decimal;
102608
102759
 
102609
102760
  if (maxIndex<index) maxIndex=index;
102610
102761
 
@@ -102641,7 +102792,13 @@ function JSAlgorithm(errorHandler,symbolData)
102641
102792
  if (Array.isArray(paramItem))
102642
102793
  {
102643
102794
  var value=paramItem[i];
102644
- if (value) text=`${value}`;
102795
+ if (value)
102796
+ {
102797
+ if (IFrameSplitOperator.IsNumber(paramInfo.Decimal))
102798
+ text=`${value.toFixed(paramInfo.Decimal)}`;
102799
+ else
102800
+ text=`${value}`;
102801
+ }
102645
102802
  }
102646
102803
  else
102647
102804
  {
@@ -130039,7 +130196,7 @@ function HQChartScriptWorker()
130039
130196
 
130040
130197
 
130041
130198
 
130042
- var HQCHART_VERSION="1.1.12621";
130199
+ var HQCHART_VERSION="1.1.12630";
130043
130200
 
130044
130201
  function PrintHQChartVersion()
130045
130202
  {