hqchart 1.1.14305 → 1.1.14307

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.
@@ -41457,6 +41457,7 @@ function ChartDrawSVG()
41457
41457
  this.Family;
41458
41458
  this.TextFont;
41459
41459
  this.Texts=[]; //[ { Index:, Value:, Symbol:, Text:, Size: } ] SVG:图标 Text:文字 Size:图标大小
41460
+ //this.Data; 存K线数据
41460
41461
  this.IsHScreen=false; //是否横屏
41461
41462
  this.IsDestroy=false; //是否已销毁
41462
41463
  this.EnableTooltip=true;
@@ -41466,8 +41467,38 @@ function ChartDrawSVG()
41466
41467
 
41467
41468
  this.AryDrawRect=[]; //已经绘制的区域
41468
41469
  this.AutoYOffset=0;
41469
-
41470
- //this.Data; 存K线数据
41470
+
41471
+ this.BuildKeyCallback=null;
41472
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
41473
+
41474
+ this.BuildKey=function(item)
41475
+ {
41476
+ if (this.BuildKeyCallback) return this.BuildKeyCallback(item);
41477
+
41478
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
41479
+ else return `${item.Date}`;
41480
+ }
41481
+
41482
+ this.BuildCacheData=function()
41483
+ {
41484
+ var mapData=new Map();
41485
+ this.MapCache=mapData;
41486
+ for(var i=0; i<this.Texts.length;++i)
41487
+ {
41488
+ var item=this.Texts[i];
41489
+ var key=this.BuildKey(item);
41490
+
41491
+ if (mapData.has(key))
41492
+ {
41493
+ var mapItem=mapData.get(key);
41494
+ mapItem.Data.push(item);
41495
+ }
41496
+ else
41497
+ {
41498
+ mapData.set(key,{ Date:item.Date, Time:item.Time, Data:[item] });
41499
+ }
41500
+ }
41501
+ }
41471
41502
 
41472
41503
  this.Draw=function()
41473
41504
  {
@@ -41478,8 +41509,9 @@ function ChartDrawSVG()
41478
41509
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
41479
41510
  if (this.IsShowIndexTitleOnly()) return;
41480
41511
  if (this.IsHideScriptIndex()) return;
41512
+ if (!this.MapCache || this.MapCache.size<=0) return;
41481
41513
 
41482
- this.DrawSVG();
41514
+ this.DrawSVGV2();
41483
41515
  }
41484
41516
 
41485
41517
  this.DrawDetail=function(rtSVG, data, svgItem)
@@ -41708,6 +41740,221 @@ function ChartDrawSVG()
41708
41740
  return false;
41709
41741
  }
41710
41742
 
41743
+ this.GetKValue=function(kItem, valueName)
41744
+ {
41745
+ switch(valueName)
41746
+ {
41747
+ case "HIGH":
41748
+ case "H":
41749
+ return kItem.High;
41750
+ case "L":
41751
+ case "LOW":
41752
+ return kItem.Low;
41753
+ case "C":
41754
+ case "CLOSE":
41755
+ return kItem.Close;
41756
+ case "O":
41757
+ case "OPEN":
41758
+ return KItem.Open;
41759
+ default:
41760
+ return null;
41761
+ }
41762
+ }
41763
+
41764
+ this.DrawSVGV2=function()
41765
+ {
41766
+ if (!this.IsShow || this.ChartFrame.IsMinSize) return;
41767
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return;
41768
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
41769
+ if (!this.Family) return;
41770
+
41771
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
41772
+ if (this.IsHScreen) return;
41773
+
41774
+ var xPointCount=this.ChartFrame.XPointCount;
41775
+ var dataWidth=this.ChartFrame.DataWidth;
41776
+ var distanceWidth=this.ChartFrame.DistanceWidth;
41777
+ var isMinute=this.IsMinuteFrame();
41778
+ var border=this.GetBorder();
41779
+ var pixelRatio = GetDevicePixelRatio();
41780
+
41781
+ if (this.IsHScreen)
41782
+ {
41783
+
41784
+ }
41785
+ else
41786
+ {
41787
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
41788
+ var chartright=border.RightEx;
41789
+ var chartLeft=border.LeftEx;
41790
+ }
41791
+
41792
+ var x,y,price;
41793
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
41794
+ {
41795
+ var kItem=this.Data.Data[i];
41796
+ var key=this.BuildKey(kItem);
41797
+ if (!this.MapCache.has(key)) continue;
41798
+ var mapItem=this.MapCache.get(key);
41799
+
41800
+ if (isMinute)
41801
+ {
41802
+ x=this.ChartFrame.GetXFromIndex(j);
41803
+ }
41804
+ else
41805
+ {
41806
+ var left=xOffset;
41807
+ var right=xOffset+dataWidth;
41808
+ if (right>chartright) break;
41809
+ x=left+(right-left)/2;
41810
+ }
41811
+
41812
+ for(var j=0;j<mapItem.Data.length;++j)
41813
+ {
41814
+ var item=mapItem.Data[j];
41815
+
41816
+ if (item.Value=="Top") y=top;
41817
+ else if (item.Value=="Bottom") y=bottom;
41818
+ else
41819
+ {
41820
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
41821
+ else price=item.Value;
41822
+
41823
+ y=this.ChartFrame.GetYFromData(price, false);
41824
+ }
41825
+ if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
41826
+
41827
+ var svgItem=item.SVG;
41828
+ if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
41829
+
41830
+ if (this.AutoPosition)
41831
+ {
41832
+ var pt={ X:x, Y:y };
41833
+ this.CalculateShowPosition(item, pt); //重新计算位置
41834
+ x=pt.X;
41835
+ y=pt.Y;
41836
+ }
41837
+
41838
+ var fontSVG=`${svgItem.Size}px ${this.Family}`;
41839
+ this.Canvas.font=fontSVG;
41840
+ var halfSize=svgItem.Size/2;
41841
+ var textBaseline='bottom';
41842
+ var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
41843
+ if (svgItem.VAlign===0)
41844
+ {
41845
+ textBaseline="top";
41846
+ rtSVG.Top=y;
41847
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
41848
+ }
41849
+ else if (svgItem.VAlign===1)
41850
+ {
41851
+ textBaseline='middle';
41852
+ rtSVG.Top=y-svgItem.Size/2;
41853
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
41854
+ }
41855
+
41856
+ if (rtSVG.Top<0)
41857
+ {
41858
+ rtSVG.Top=0;
41859
+ rtSVG.Bottom=svgItem.Size;
41860
+ y=rtSVG.Bottom;
41861
+ }
41862
+
41863
+ this.Canvas.textBaseline=textBaseline;
41864
+ this.Canvas.textAlign='center';
41865
+ this.Canvas.fillStyle = svgItem.Color;
41866
+ this.Canvas.fillText(svgItem.Symbol, x, y);
41867
+
41868
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
41869
+
41870
+ if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
41871
+
41872
+ //文字
41873
+ if (item.Text && item.Text.Content && this.TextFont)
41874
+ {
41875
+ var textItem=item.Text;
41876
+ this.Canvas.font=this.TextFont;
41877
+ this.Canvas.fillStyle=textItem.Color;
41878
+ var yText=y;
41879
+ if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
41880
+ this.Canvas.fillText(textItem.Content, x, yText);
41881
+ }
41882
+
41883
+ if (item.Detail)
41884
+ {
41885
+ this.DrawDetail(rtSVG,item.Detail, item);
41886
+ }
41887
+
41888
+ //连线
41889
+ if (item.Line)
41890
+ {
41891
+ var lineItem=item.Line;
41892
+ var price=null, yPrice=null;
41893
+ if (lineItem.Value=="Bottom")
41894
+ {
41895
+ yPrice=bottom;
41896
+ }
41897
+ else if (lineItem.Value=="Top")
41898
+ {
41899
+ yPrice=top;
41900
+ }
41901
+ else
41902
+ {
41903
+ if (IFrameSplitOperator.IsString(lineItem.Value))
41904
+ price=this.GetKValue(kItem,lineItem.Value);
41905
+
41906
+ if (!IFrameSplitOperator.IsNumber(price)) continue;
41907
+ yPrice=this.ChartFrame.GetYFromData(price);
41908
+ }
41909
+
41910
+ if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
41911
+
41912
+ var yText;
41913
+ if (yPrice<rtSVG.Top)
41914
+ {
41915
+ yText=rtSVG.Top;
41916
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
41917
+ {
41918
+ //yPrice+=lineItem.Blank;
41919
+ yText-=lineItem.SVGBlank;
41920
+ }
41921
+ }
41922
+ else
41923
+ {
41924
+ yText=rtSVG.Bottom;
41925
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
41926
+ {
41927
+ //yPrice-=lineItem.Blank;
41928
+ yText+=lineItem.SVGBlank;
41929
+ }
41930
+ }
41931
+
41932
+ if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
41933
+ var lineWidth=1*pixelRatio;
41934
+ if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
41935
+ this.Canvas.lineWidth=lineWidth; //线宽
41936
+ this.Canvas.strokeStyle = lineItem.Color;
41937
+ this.Canvas.beginPath();
41938
+
41939
+ if (this.IsHScreen)
41940
+ {
41941
+ this.Canvas.moveTo(yText, ToFixedPoint(x));
41942
+ this.Canvas.lineTo(yPrice,ToFixedPoint(x));
41943
+ }
41944
+ else
41945
+ {
41946
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
41947
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
41948
+ }
41949
+
41950
+ this.Canvas.stroke();
41951
+ this.Canvas.setLineDash([]);
41952
+ }
41953
+ }
41954
+ }
41955
+ }
41956
+
41957
+ /*
41711
41958
  this.DrawSVG=function()
41712
41959
  {
41713
41960
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
@@ -41882,26 +42129,35 @@ function ChartDrawSVG()
41882
42129
  }
41883
42130
  }
41884
42131
  }
42132
+ */
41885
42133
 
41886
42134
  this.GetMaxMin=function()
41887
42135
  {
42136
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
41888
42137
  var range={ Min:null, Max:null };
42138
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
42139
+ if (!this.MapCache || this.MapCache.size<=0) return;
41889
42140
  var xPointCount=this.ChartFrame.XPointCount;
41890
- var start=this.Data.DataOffset;
41891
- var end=start+xPointCount;
41892
- if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return range;
41893
42141
 
41894
- for(var i=0; i<this.Texts.length; ++i)
42142
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
41895
42143
  {
41896
- var item=this.Texts[i];
41897
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
41898
- if (item.Index>=start && item.Index<end)
42144
+ var kItem=this.Data.Data[i];
42145
+ var key=this.BuildKey(kItem);
42146
+ if (!this.MapCache.has(key)) continue;
42147
+ var mapItem=this.MapCache.get(key);
42148
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
42149
+
42150
+ for(k=0;k<mapItem.Data.length;++k)
41899
42151
  {
41900
- if(!IFrameSplitOperator.IsNumber(item.Value)) continue;
41901
- if (range.Max==null) range.Max=item.Value;
41902
- else if (range.Max<item.Value) range.Max=item.Value;
41903
- if (range.Min==null) range.Min=item.Value;
41904
- else if (range.Min>item.Value) range.Min=item.Value;
42152
+ var item=mapItem.Data[k];
42153
+ var value=item.Value;
42154
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
42155
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
42156
+
42157
+ if (range.Max==null) range.Max=value;
42158
+ else if (range.Max<value) range.Max=value;
42159
+ if (range.Min==null) range.Min=value;
42160
+ else if (range.Min>value) range.Min=value;
41905
42161
  }
41906
42162
  }
41907
42163
 
@@ -41917,11 +42173,10 @@ function ChartDrawSVG()
41917
42173
  var item=this.TooltipRect[i];
41918
42174
  if (!item.Rect) continue;
41919
42175
  var rect=item.Rect;
41920
- this.Canvas.beginPath();
41921
- this.Canvas.rect(rect.Left,rect.Top,rect.Width,rect.Height);
41922
- if (this.Canvas.isPointInPath(x,y))
42176
+
42177
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
41923
42178
  {
41924
- var data=this.Texts[item.Index];
42179
+ var data=item.Item;
41925
42180
  JSConsole.Chart.Log('[ChartDrawSVG::GetTooltipData] svg icon.', item);
41926
42181
  tooltip.Data={ Rect:item.Rect, Item:data, Index:item.Index };
41927
42182
  tooltip.ChartPaint=this;
@@ -87802,7 +88057,7 @@ MinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)
87802
88057
  return aryMinuteData;
87803
88058
  }
87804
88059
 
87805
- //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 ]
88060
+ //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 12=持仓 ]
87806
88061
  MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
87807
88062
  {
87808
88063
  if (!data || !data.stock) return null;
@@ -87840,16 +88095,17 @@ MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
87840
88095
  if (IFrameSplitOperator.IsNumber(jsData[9])) item.Increase=jsData[9];
87841
88096
  if (IFrameSplitOperator.IsNumber(jsData[10])) item.Risefall=jsData[10];
87842
88097
  if (IFrameSplitOperator.IsNumber(jsData[11])) item.Lead=jsData[11];
87843
-
88098
+ if (IFrameSplitOperator.IsNumber(jsData[12])) item.Position=jsData[12];
87844
88099
 
87845
88100
  if (jsData[extendDataIndex]) item.ExtendData=jsData[extendDataIndex];
87846
- item.DateTime=item.Date.toString()+" "+item.Time.toString();
88101
+
88102
+ item.DateTime=`${item.Date} ${item.Time}`;
87847
88103
 
87848
88104
  if (IFrameSplitOperator.IsNumber(minuteData.YClose) && item.Close)
87849
- item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
88105
+ item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
87850
88106
 
87851
88107
  if (isFutures && minuteData.YClearing && item.Close)
87852
- item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
88108
+ item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
87853
88109
 
87854
88110
 
87855
88111
  minuteData.Data.push(item);