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.
@@ -45426,6 +45426,7 @@ function ChartDrawSVG()
45426
45426
  this.Family;
45427
45427
  this.TextFont;
45428
45428
  this.Texts=[]; //[ { Index:, Value:, Symbol:, Text:, Size: } ] SVG:图标 Text:文字 Size:图标大小
45429
+ //this.Data; 存K线数据
45429
45430
  this.IsHScreen=false; //是否横屏
45430
45431
  this.IsDestroy=false; //是否已销毁
45431
45432
  this.EnableTooltip=true;
@@ -45435,8 +45436,38 @@ function ChartDrawSVG()
45435
45436
 
45436
45437
  this.AryDrawRect=[]; //已经绘制的区域
45437
45438
  this.AutoYOffset=0;
45438
-
45439
- //this.Data; 存K线数据
45439
+
45440
+ this.BuildKeyCallback=null;
45441
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
45442
+
45443
+ this.BuildKey=function(item)
45444
+ {
45445
+ if (this.BuildKeyCallback) return this.BuildKeyCallback(item);
45446
+
45447
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
45448
+ else return `${item.Date}`;
45449
+ }
45450
+
45451
+ this.BuildCacheData=function()
45452
+ {
45453
+ var mapData=new Map();
45454
+ this.MapCache=mapData;
45455
+ for(var i=0; i<this.Texts.length;++i)
45456
+ {
45457
+ var item=this.Texts[i];
45458
+ var key=this.BuildKey(item);
45459
+
45460
+ if (mapData.has(key))
45461
+ {
45462
+ var mapItem=mapData.get(key);
45463
+ mapItem.Data.push(item);
45464
+ }
45465
+ else
45466
+ {
45467
+ mapData.set(key,{ Date:item.Date, Time:item.Time, Data:[item] });
45468
+ }
45469
+ }
45470
+ }
45440
45471
 
45441
45472
  this.Draw=function()
45442
45473
  {
@@ -45447,8 +45478,9 @@ function ChartDrawSVG()
45447
45478
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
45448
45479
  if (this.IsShowIndexTitleOnly()) return;
45449
45480
  if (this.IsHideScriptIndex()) return;
45481
+ if (!this.MapCache || this.MapCache.size<=0) return;
45450
45482
 
45451
- this.DrawSVG();
45483
+ this.DrawSVGV2();
45452
45484
  }
45453
45485
 
45454
45486
  this.DrawDetail=function(rtSVG, data, svgItem)
@@ -45677,6 +45709,223 @@ function ChartDrawSVG()
45677
45709
  return false;
45678
45710
  }
45679
45711
 
45712
+ this.GetKValue=function(kItem, valueName)
45713
+ {
45714
+ switch(valueName)
45715
+ {
45716
+ case "HIGH":
45717
+ case "H":
45718
+ return kItem.High;
45719
+ case "L":
45720
+ case "LOW":
45721
+ return kItem.Low;
45722
+ case "C":
45723
+ case "CLOSE":
45724
+ return kItem.Close;
45725
+ case "O":
45726
+ case "OPEN":
45727
+ return KItem.Open;
45728
+ default:
45729
+ return null;
45730
+ }
45731
+ }
45732
+
45733
+ this.DrawSVGV2=function()
45734
+ {
45735
+ if (!this.IsShow || this.ChartFrame.IsMinSize) return;
45736
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return;
45737
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45738
+ if (!this.Family) return;
45739
+
45740
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45741
+ if (this.IsHScreen) return;
45742
+
45743
+ var xPointCount=this.ChartFrame.XPointCount;
45744
+ var dataWidth=this.ChartFrame.DataWidth;
45745
+ var distanceWidth=this.ChartFrame.DistanceWidth;
45746
+ var isMinute=this.IsMinuteFrame();
45747
+ var border=this.GetBorder();
45748
+ var pixelRatio = GetDevicePixelRatio();
45749
+
45750
+ if (this.IsHScreen)
45751
+ {
45752
+
45753
+ }
45754
+ else
45755
+ {
45756
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
45757
+ var chartright=border.RightEx;
45758
+ var chartLeft=border.LeftEx;
45759
+ var top=border.TopEx;
45760
+ var bottom=border.BottomEx;
45761
+ }
45762
+
45763
+ var x,y,price;
45764
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
45765
+ {
45766
+ var kItem=this.Data.Data[i];
45767
+ var key=this.BuildKey(kItem);
45768
+ if (!this.MapCache.has(key)) continue;
45769
+ var mapItem=this.MapCache.get(key);
45770
+
45771
+ if (isMinute)
45772
+ {
45773
+ x=this.ChartFrame.GetXFromIndex(j);
45774
+ }
45775
+ else
45776
+ {
45777
+ var left=xOffset;
45778
+ var right=xOffset+dataWidth;
45779
+ if (right>chartright) break;
45780
+ x=left+(right-left)/2;
45781
+ }
45782
+
45783
+ for(var k=0;k<mapItem.Data.length;++k)
45784
+ {
45785
+ var item=mapItem.Data[k];
45786
+
45787
+ if (item.Value=="Top") y=top;
45788
+ else if (item.Value=="Bottom") y=bottom;
45789
+ else
45790
+ {
45791
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
45792
+ else price=item.Value;
45793
+
45794
+ y=this.ChartFrame.GetYFromData(price, false);
45795
+ }
45796
+ if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
45797
+
45798
+ var svgItem=item.SVG;
45799
+ if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
45800
+
45801
+ if (this.AutoPosition)
45802
+ {
45803
+ var pt={ X:x, Y:y };
45804
+ this.CalculateShowPosition(item, pt); //重新计算位置
45805
+ x=pt.X;
45806
+ y=pt.Y;
45807
+ }
45808
+
45809
+ var fontSVG=`${svgItem.Size}px ${this.Family}`;
45810
+ this.Canvas.font=fontSVG;
45811
+ var halfSize=svgItem.Size/2;
45812
+ var textBaseline='bottom';
45813
+ var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
45814
+ if (svgItem.VAlign===0)
45815
+ {
45816
+ textBaseline="top";
45817
+ rtSVG.Top=y;
45818
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
45819
+ }
45820
+ else if (svgItem.VAlign===1)
45821
+ {
45822
+ textBaseline='middle';
45823
+ rtSVG.Top=y-svgItem.Size/2;
45824
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
45825
+ }
45826
+
45827
+ if (rtSVG.Top<0)
45828
+ {
45829
+ rtSVG.Top=0;
45830
+ rtSVG.Bottom=svgItem.Size;
45831
+ y=rtSVG.Bottom;
45832
+ }
45833
+
45834
+ this.Canvas.textBaseline=textBaseline;
45835
+ this.Canvas.textAlign='center';
45836
+ this.Canvas.fillStyle = svgItem.Color;
45837
+ this.Canvas.fillText(svgItem.Symbol, x, y);
45838
+
45839
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
45840
+
45841
+ if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
45842
+
45843
+ //文字
45844
+ if (item.Text && item.Text.Content && this.TextFont)
45845
+ {
45846
+ var textItem=item.Text;
45847
+ this.Canvas.font=this.TextFont;
45848
+ this.Canvas.fillStyle=textItem.Color;
45849
+ var yText=y;
45850
+ if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
45851
+ this.Canvas.fillText(textItem.Content, x, yText);
45852
+ }
45853
+
45854
+ if (item.Detail)
45855
+ {
45856
+ this.DrawDetail(rtSVG,item.Detail, item);
45857
+ }
45858
+
45859
+ //连线
45860
+ if (item.Line)
45861
+ {
45862
+ var lineItem=item.Line;
45863
+ var price=null, yPrice=null;
45864
+ if (lineItem.Value=="Bottom")
45865
+ {
45866
+ yPrice=bottom;
45867
+ }
45868
+ else if (lineItem.Value=="Top")
45869
+ {
45870
+ yPrice=top;
45871
+ }
45872
+ else
45873
+ {
45874
+ if (IFrameSplitOperator.IsString(lineItem.Value))
45875
+ price=this.GetKValue(kItem,lineItem.Value);
45876
+
45877
+ if (!IFrameSplitOperator.IsNumber(price)) continue;
45878
+ yPrice=this.ChartFrame.GetYFromData(price);
45879
+ }
45880
+
45881
+ if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
45882
+
45883
+ var yText;
45884
+ if (yPrice<rtSVG.Top)
45885
+ {
45886
+ yText=rtSVG.Top;
45887
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
45888
+ {
45889
+ //yPrice+=lineItem.Blank;
45890
+ yText-=lineItem.SVGBlank;
45891
+ }
45892
+ }
45893
+ else
45894
+ {
45895
+ yText=rtSVG.Bottom;
45896
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
45897
+ {
45898
+ //yPrice-=lineItem.Blank;
45899
+ yText+=lineItem.SVGBlank;
45900
+ }
45901
+ }
45902
+
45903
+ if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
45904
+ var lineWidth=1*pixelRatio;
45905
+ if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
45906
+ this.Canvas.lineWidth=lineWidth; //线宽
45907
+ this.Canvas.strokeStyle = lineItem.Color;
45908
+ this.Canvas.beginPath();
45909
+
45910
+ if (this.IsHScreen)
45911
+ {
45912
+ this.Canvas.moveTo(yText, ToFixedPoint(x));
45913
+ this.Canvas.lineTo(yPrice,ToFixedPoint(x));
45914
+ }
45915
+ else
45916
+ {
45917
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
45918
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
45919
+ }
45920
+
45921
+ this.Canvas.stroke();
45922
+ this.Canvas.setLineDash([]);
45923
+ }
45924
+ }
45925
+ }
45926
+ }
45927
+
45928
+ /*
45680
45929
  this.DrawSVG=function()
45681
45930
  {
45682
45931
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
@@ -45851,26 +46100,35 @@ function ChartDrawSVG()
45851
46100
  }
45852
46101
  }
45853
46102
  }
46103
+ */
45854
46104
 
45855
46105
  this.GetMaxMin=function()
45856
46106
  {
46107
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45857
46108
  var range={ Min:null, Max:null };
46109
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
46110
+ if (!this.MapCache || this.MapCache.size<=0) return;
45858
46111
  var xPointCount=this.ChartFrame.XPointCount;
45859
- var start=this.Data.DataOffset;
45860
- var end=start+xPointCount;
45861
- if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return range;
45862
46112
 
45863
- for(var i=0; i<this.Texts.length; ++i)
46113
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45864
46114
  {
45865
- var item=this.Texts[i];
45866
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
45867
- if (item.Index>=start && item.Index<end)
46115
+ var kItem=this.Data.Data[i];
46116
+ var key=this.BuildKey(kItem);
46117
+ if (!this.MapCache.has(key)) continue;
46118
+ var mapItem=this.MapCache.get(key);
46119
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
46120
+
46121
+ for(k=0;k<mapItem.Data.length;++k)
45868
46122
  {
45869
- if(!IFrameSplitOperator.IsNumber(item.Value)) continue;
45870
- if (range.Max==null) range.Max=item.Value;
45871
- else if (range.Max<item.Value) range.Max=item.Value;
45872
- if (range.Min==null) range.Min=item.Value;
45873
- else if (range.Min>item.Value) range.Min=item.Value;
46123
+ var item=mapItem.Data[k];
46124
+ var value=item.Value;
46125
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
46126
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
46127
+
46128
+ if (range.Max==null) range.Max=value;
46129
+ else if (range.Max<value) range.Max=value;
46130
+ if (range.Min==null) range.Min=value;
46131
+ else if (range.Min>value) range.Min=value;
45874
46132
  }
45875
46133
  }
45876
46134
 
@@ -45886,11 +46144,10 @@ function ChartDrawSVG()
45886
46144
  var item=this.TooltipRect[i];
45887
46145
  if (!item.Rect) continue;
45888
46146
  var rect=item.Rect;
45889
- this.Canvas.beginPath();
45890
- this.Canvas.rect(rect.Left,rect.Top,rect.Width,rect.Height);
45891
- if (this.Canvas.isPointInPath(x,y))
46147
+
46148
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
45892
46149
  {
45893
- var data=this.Texts[item.Index];
46150
+ var data=item.Item;
45894
46151
  JSConsole.Chart.Log('[ChartDrawSVG::GetTooltipData] svg icon.', item);
45895
46152
  tooltip.Data={ Rect:item.Rect, Item:data, Index:item.Index };
45896
46153
  tooltip.ChartPaint=this;
@@ -91771,7 +92028,7 @@ MinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)
91771
92028
  return aryMinuteData;
91772
92029
  }
91773
92030
 
91774
- //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 ]
92031
+ //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 12=持仓 ]
91775
92032
  MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
91776
92033
  {
91777
92034
  if (!data || !data.stock) return null;
@@ -91809,16 +92066,17 @@ MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
91809
92066
  if (IFrameSplitOperator.IsNumber(jsData[9])) item.Increase=jsData[9];
91810
92067
  if (IFrameSplitOperator.IsNumber(jsData[10])) item.Risefall=jsData[10];
91811
92068
  if (IFrameSplitOperator.IsNumber(jsData[11])) item.Lead=jsData[11];
91812
-
92069
+ if (IFrameSplitOperator.IsNumber(jsData[12])) item.Position=jsData[12];
91813
92070
 
91814
92071
  if (jsData[extendDataIndex]) item.ExtendData=jsData[extendDataIndex];
91815
- item.DateTime=item.Date.toString()+" "+item.Time.toString();
92072
+
92073
+ item.DateTime=`${item.Date} ${item.Time}`;
91816
92074
 
91817
92075
  if (IFrameSplitOperator.IsNumber(minuteData.YClose) && item.Close)
91818
- item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
92076
+ item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
91819
92077
 
91820
92078
  if (isFutures && minuteData.YClearing && item.Close)
91821
- item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
92079
+ item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
91822
92080
 
91823
92081
 
91824
92082
  minuteData.Data.push(item);
@@ -122261,11 +122519,12 @@ function ScriptIndex(name,script,args,option)
122261
122519
  for(var j=0;j<drawData.length;++j)
122262
122520
  {
122263
122521
  var item=drawData[j];
122522
+ var kItem=chart.Data.Data[j];
122264
122523
  if (!IFrameSplitOperator.IsNumber(item)) continue;
122265
122524
 
122266
122525
  var svgItem=
122267
122526
  {
122268
- Index:j, Value:item,
122527
+ Value:item, Date:kItem.Date, Time:kItem.Time,
122269
122528
  SVG:{ Symbol:varItem.Draw.Icon.Symbol, Size:svgSize, Color:svgColor, YOffset:svgYOffset, VAlign:svgVAlign }
122270
122529
  };
122271
122530
 
@@ -122285,6 +122544,7 @@ function ScriptIndex(name,script,args,option)
122285
122544
  chart.Texts= aryData;
122286
122545
  }
122287
122546
 
122547
+ chart.BuildCacheData();
122288
122548
  hqChart.ChartPaint.push(chart);
122289
122549
  }
122290
122550
 
@@ -122508,6 +122768,8 @@ function ScriptIndex(name,script,args,option)
122508
122768
  chart.Family=varItem.Draw.DrawData.Family;
122509
122769
  chart.TextFont=varItem.Draw.DrawData.TextFont;
122510
122770
  chart.Texts= varItem.Draw.DrawData.Data;
122771
+ chart.BuildCacheData();
122772
+ this.SetChartIndexName(chart);
122511
122773
  hqChart.ChartPaint.push(chart);
122512
122774
  }
122513
122775
 
@@ -124028,11 +124290,12 @@ function OverlayScriptIndex(name,script,args,option)
124028
124290
  for(var j=0;j<drawData.length;++j)
124029
124291
  {
124030
124292
  var item=drawData[j];
124293
+ var kItem=chart.Data.Data[j];
124031
124294
  if (!IFrameSplitOperator.IsNumber(item)) continue;
124032
124295
 
124033
124296
  var svgItem=
124034
124297
  {
124035
- Index:j, Value:item,
124298
+ Value:item, Date:kItem.Date, Time:kItem.Time,
124036
124299
  SVG:{ Symbol:varItem.Draw.Icon.Symbol, Size:svgSize, Color:svgColor, YOffset:svgYOffset, VAlign:svgVAlign }
124037
124300
  };
124038
124301
 
@@ -124052,6 +124315,7 @@ function OverlayScriptIndex(name,script,args,option)
124052
124315
  chart.Texts= aryData;
124053
124316
  }
124054
124317
 
124318
+ chart.BuildCacheData();
124055
124319
  frame.ChartPaint.push(chart);
124056
124320
  }
124057
124321
 
@@ -124263,7 +124527,8 @@ function OverlayScriptIndex(name,script,args,option)
124263
124527
  if (varItem.Draw.AutoPosition) chart.AutoPosition=varItem.Draw.AutoPosition;
124264
124528
 
124265
124529
  this.ReloadChartResource(hqChart, windowIndex, chart);
124266
-
124530
+
124531
+ chart.BuildCacheData();
124267
124532
  this.SetChartIndexName(chart);
124268
124533
  frame.ChartPaint.push(chart);
124269
124534
  }
@@ -125402,8 +125667,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125402
125667
  drawItem.Name=draw.Name;
125403
125668
  drawItem.DrawType=draw.DrawType;
125404
125669
  if (draw.AutoPosition) drawItem.AutoPosition=draw.AutoPosition;
125405
- drawItem.DrawData={ Data:this.FittingMultiText(draw.Data,date,time,hqChart), Family:draw.Family, TextFont:draw.TextFont, EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125406
- this.GetKLineData(drawItem.DrawData.Data, hqChart);
125670
+ drawItem.DrawData={ Data:draw.Data, Family:draw.Family, TextFont:draw.TextFont, EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125407
125671
  outVarItem.Draw=drawItem;
125408
125672
 
125409
125673
  result.push(outVarItem);
@@ -125894,8 +126158,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125894
126158
  drawItem.Name=draw.Name;
125895
126159
  drawItem.DrawType=draw.DrawType;
125896
126160
  if (draw.AutoPosition) drawItem.AutoPosition=draw.AutoPosition;
125897
- drawItem.DrawData={ Data:this.FittingMultiText(draw.Data,date,time,hqChart), Family:draw.Family, TextFont:draw.TextFont ,EnableTooltip:draw.EnableTooltip,IsDrawFirst:draw.IsDrawFirst };
125898
- this.GetKLineData(drawItem.DrawData.Data, hqChart);
126161
+ drawItem.DrawData={ Data:draw.Data, Family:draw.Family, TextFont:draw.TextFont , EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125899
126162
  outVarItem.Draw=drawItem;
125900
126163
 
125901
126164
  result.push(outVarItem);
@@ -151309,7 +151572,7 @@ function HQChartScriptWorker()
151309
151572
 
151310
151573
 
151311
151574
 
151312
- var HQCHART_VERSION="1.1.14304";
151575
+ var HQCHART_VERSION="1.1.14308";
151313
151576
 
151314
151577
  function PrintHQChartVersion()
151315
151578
  {