hqchart 1.1.14305 → 1.1.14309

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,223 @@ 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
+ var top=border.TopEx;
41791
+ var bottom=border.BottomEx;
41792
+ }
41793
+
41794
+ var x,y,price;
41795
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
41796
+ {
41797
+ var kItem=this.Data.Data[i];
41798
+ var key=this.BuildKey(kItem);
41799
+ if (!this.MapCache.has(key)) continue;
41800
+ var mapItem=this.MapCache.get(key);
41801
+
41802
+ if (isMinute)
41803
+ {
41804
+ x=this.ChartFrame.GetXFromIndex(j);
41805
+ }
41806
+ else
41807
+ {
41808
+ var left=xOffset;
41809
+ var right=xOffset+dataWidth;
41810
+ if (right>chartright) break;
41811
+ x=left+(right-left)/2;
41812
+ }
41813
+
41814
+ for(var k=0;k<mapItem.Data.length;++k)
41815
+ {
41816
+ var item=mapItem.Data[k];
41817
+
41818
+ if (item.Value=="Top") y=top;
41819
+ else if (item.Value=="Bottom") y=bottom;
41820
+ else
41821
+ {
41822
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
41823
+ else price=item.Value;
41824
+
41825
+ y=this.ChartFrame.GetYFromData(price, false);
41826
+ }
41827
+ if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
41828
+
41829
+ var svgItem=item.SVG;
41830
+ if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
41831
+
41832
+ if (this.AutoPosition)
41833
+ {
41834
+ var pt={ X:x, Y:y };
41835
+ this.CalculateShowPosition(item, pt); //重新计算位置
41836
+ x=pt.X;
41837
+ y=pt.Y;
41838
+ }
41839
+
41840
+ var fontSVG=`${svgItem.Size}px ${this.Family}`;
41841
+ this.Canvas.font=fontSVG;
41842
+ var halfSize=svgItem.Size/2;
41843
+ var textBaseline='bottom';
41844
+ var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
41845
+ if (svgItem.VAlign===0)
41846
+ {
41847
+ textBaseline="top";
41848
+ rtSVG.Top=y;
41849
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
41850
+ }
41851
+ else if (svgItem.VAlign===1)
41852
+ {
41853
+ textBaseline='middle';
41854
+ rtSVG.Top=y-svgItem.Size/2;
41855
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
41856
+ }
41857
+
41858
+ if (rtSVG.Top<0)
41859
+ {
41860
+ rtSVG.Top=0;
41861
+ rtSVG.Bottom=svgItem.Size;
41862
+ y=rtSVG.Bottom;
41863
+ }
41864
+
41865
+ this.Canvas.textBaseline=textBaseline;
41866
+ this.Canvas.textAlign='center';
41867
+ this.Canvas.fillStyle = svgItem.Color;
41868
+ this.Canvas.fillText(svgItem.Symbol, x, y);
41869
+
41870
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
41871
+
41872
+ if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
41873
+
41874
+ //文字
41875
+ if (item.Text && item.Text.Content && this.TextFont)
41876
+ {
41877
+ var textItem=item.Text;
41878
+ this.Canvas.font=this.TextFont;
41879
+ this.Canvas.fillStyle=textItem.Color;
41880
+ var yText=y;
41881
+ if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
41882
+ this.Canvas.fillText(textItem.Content, x, yText);
41883
+ }
41884
+
41885
+ if (item.Detail)
41886
+ {
41887
+ this.DrawDetail(rtSVG,item.Detail, item);
41888
+ }
41889
+
41890
+ //连线
41891
+ if (item.Line)
41892
+ {
41893
+ var lineItem=item.Line;
41894
+ var price=null, yPrice=null;
41895
+ if (lineItem.Value=="Bottom")
41896
+ {
41897
+ yPrice=bottom;
41898
+ }
41899
+ else if (lineItem.Value=="Top")
41900
+ {
41901
+ yPrice=top;
41902
+ }
41903
+ else
41904
+ {
41905
+ if (IFrameSplitOperator.IsString(lineItem.Value))
41906
+ price=this.GetKValue(kItem,lineItem.Value);
41907
+
41908
+ if (!IFrameSplitOperator.IsNumber(price)) continue;
41909
+ yPrice=this.ChartFrame.GetYFromData(price);
41910
+ }
41911
+
41912
+ if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
41913
+
41914
+ var yText;
41915
+ if (yPrice<rtSVG.Top)
41916
+ {
41917
+ yText=rtSVG.Top;
41918
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
41919
+ {
41920
+ //yPrice+=lineItem.Blank;
41921
+ yText-=lineItem.SVGBlank;
41922
+ }
41923
+ }
41924
+ else
41925
+ {
41926
+ yText=rtSVG.Bottom;
41927
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
41928
+ {
41929
+ //yPrice-=lineItem.Blank;
41930
+ yText+=lineItem.SVGBlank;
41931
+ }
41932
+ }
41933
+
41934
+ if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
41935
+ var lineWidth=1*pixelRatio;
41936
+ if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
41937
+ this.Canvas.lineWidth=lineWidth; //线宽
41938
+ this.Canvas.strokeStyle = lineItem.Color;
41939
+ this.Canvas.beginPath();
41940
+
41941
+ if (this.IsHScreen)
41942
+ {
41943
+ this.Canvas.moveTo(yText, ToFixedPoint(x));
41944
+ this.Canvas.lineTo(yPrice,ToFixedPoint(x));
41945
+ }
41946
+ else
41947
+ {
41948
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
41949
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
41950
+ }
41951
+
41952
+ this.Canvas.stroke();
41953
+ this.Canvas.setLineDash([]);
41954
+ }
41955
+ }
41956
+ }
41957
+ }
41958
+
41959
+ /*
41711
41960
  this.DrawSVG=function()
41712
41961
  {
41713
41962
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
@@ -41882,26 +42131,35 @@ function ChartDrawSVG()
41882
42131
  }
41883
42132
  }
41884
42133
  }
42134
+ */
41885
42135
 
41886
42136
  this.GetMaxMin=function()
41887
42137
  {
42138
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
41888
42139
  var range={ Min:null, Max:null };
42140
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
42141
+ if (!this.MapCache || this.MapCache.size<=0) return;
41889
42142
  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
42143
 
41894
- for(var i=0; i<this.Texts.length; ++i)
42144
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
41895
42145
  {
41896
- var item=this.Texts[i];
41897
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
41898
- if (item.Index>=start && item.Index<end)
42146
+ var kItem=this.Data.Data[i];
42147
+ var key=this.BuildKey(kItem);
42148
+ if (!this.MapCache.has(key)) continue;
42149
+ var mapItem=this.MapCache.get(key);
42150
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
42151
+
42152
+ for(k=0;k<mapItem.Data.length;++k)
41899
42153
  {
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;
42154
+ var item=mapItem.Data[k];
42155
+ var value=item.Value;
42156
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
42157
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
42158
+
42159
+ if (range.Max==null) range.Max=value;
42160
+ else if (range.Max<value) range.Max=value;
42161
+ if (range.Min==null) range.Min=value;
42162
+ else if (range.Min>value) range.Min=value;
41905
42163
  }
41906
42164
  }
41907
42165
 
@@ -41917,11 +42175,10 @@ function ChartDrawSVG()
41917
42175
  var item=this.TooltipRect[i];
41918
42176
  if (!item.Rect) continue;
41919
42177
  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))
42178
+
42179
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
41923
42180
  {
41924
- var data=this.Texts[item.Index];
42181
+ var data=item.Item;
41925
42182
  JSConsole.Chart.Log('[ChartDrawSVG::GetTooltipData] svg icon.', item);
41926
42183
  tooltip.Data={ Rect:item.Rect, Item:data, Index:item.Index };
41927
42184
  tooltip.ChartPaint=this;
@@ -87802,7 +88059,7 @@ MinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)
87802
88059
  return aryMinuteData;
87803
88060
  }
87804
88061
 
87805
- //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 ]
88062
+ //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 12=持仓 ]
87806
88063
  MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
87807
88064
  {
87808
88065
  if (!data || !data.stock) return null;
@@ -87840,16 +88097,17 @@ MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
87840
88097
  if (IFrameSplitOperator.IsNumber(jsData[9])) item.Increase=jsData[9];
87841
88098
  if (IFrameSplitOperator.IsNumber(jsData[10])) item.Risefall=jsData[10];
87842
88099
  if (IFrameSplitOperator.IsNumber(jsData[11])) item.Lead=jsData[11];
87843
-
88100
+ if (IFrameSplitOperator.IsNumber(jsData[12])) item.Position=jsData[12];
87844
88101
 
87845
88102
  if (jsData[extendDataIndex]) item.ExtendData=jsData[extendDataIndex];
87846
- item.DateTime=item.Date.toString()+" "+item.Time.toString();
88103
+
88104
+ item.DateTime=`${item.Date} ${item.Time}`;
87847
88105
 
87848
88106
  if (IFrameSplitOperator.IsNumber(minuteData.YClose) && item.Close)
87849
- item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
88107
+ item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
87850
88108
 
87851
88109
  if (isFutures && minuteData.YClearing && item.Close)
87852
- item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
88110
+ item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
87853
88111
 
87854
88112
 
87855
88113
  minuteData.Data.push(item);