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.
@@ -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,221 @@ 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
+ }
45760
+
45761
+ var x,y,price;
45762
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
45763
+ {
45764
+ var kItem=this.Data.Data[i];
45765
+ var key=this.BuildKey(kItem);
45766
+ if (!this.MapCache.has(key)) continue;
45767
+ var mapItem=this.MapCache.get(key);
45768
+
45769
+ if (isMinute)
45770
+ {
45771
+ x=this.ChartFrame.GetXFromIndex(j);
45772
+ }
45773
+ else
45774
+ {
45775
+ var left=xOffset;
45776
+ var right=xOffset+dataWidth;
45777
+ if (right>chartright) break;
45778
+ x=left+(right-left)/2;
45779
+ }
45780
+
45781
+ for(var j=0;j<mapItem.Data.length;++j)
45782
+ {
45783
+ var item=mapItem.Data[j];
45784
+
45785
+ if (item.Value=="Top") y=top;
45786
+ else if (item.Value=="Bottom") y=bottom;
45787
+ else
45788
+ {
45789
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
45790
+ else price=item.Value;
45791
+
45792
+ y=this.ChartFrame.GetYFromData(price, false);
45793
+ }
45794
+ if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
45795
+
45796
+ var svgItem=item.SVG;
45797
+ if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
45798
+
45799
+ if (this.AutoPosition)
45800
+ {
45801
+ var pt={ X:x, Y:y };
45802
+ this.CalculateShowPosition(item, pt); //重新计算位置
45803
+ x=pt.X;
45804
+ y=pt.Y;
45805
+ }
45806
+
45807
+ var fontSVG=`${svgItem.Size}px ${this.Family}`;
45808
+ this.Canvas.font=fontSVG;
45809
+ var halfSize=svgItem.Size/2;
45810
+ var textBaseline='bottom';
45811
+ var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
45812
+ if (svgItem.VAlign===0)
45813
+ {
45814
+ textBaseline="top";
45815
+ rtSVG.Top=y;
45816
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
45817
+ }
45818
+ else if (svgItem.VAlign===1)
45819
+ {
45820
+ textBaseline='middle';
45821
+ rtSVG.Top=y-svgItem.Size/2;
45822
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
45823
+ }
45824
+
45825
+ if (rtSVG.Top<0)
45826
+ {
45827
+ rtSVG.Top=0;
45828
+ rtSVG.Bottom=svgItem.Size;
45829
+ y=rtSVG.Bottom;
45830
+ }
45831
+
45832
+ this.Canvas.textBaseline=textBaseline;
45833
+ this.Canvas.textAlign='center';
45834
+ this.Canvas.fillStyle = svgItem.Color;
45835
+ this.Canvas.fillText(svgItem.Symbol, x, y);
45836
+
45837
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
45838
+
45839
+ if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
45840
+
45841
+ //文字
45842
+ if (item.Text && item.Text.Content && this.TextFont)
45843
+ {
45844
+ var textItem=item.Text;
45845
+ this.Canvas.font=this.TextFont;
45846
+ this.Canvas.fillStyle=textItem.Color;
45847
+ var yText=y;
45848
+ if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
45849
+ this.Canvas.fillText(textItem.Content, x, yText);
45850
+ }
45851
+
45852
+ if (item.Detail)
45853
+ {
45854
+ this.DrawDetail(rtSVG,item.Detail, item);
45855
+ }
45856
+
45857
+ //连线
45858
+ if (item.Line)
45859
+ {
45860
+ var lineItem=item.Line;
45861
+ var price=null, yPrice=null;
45862
+ if (lineItem.Value=="Bottom")
45863
+ {
45864
+ yPrice=bottom;
45865
+ }
45866
+ else if (lineItem.Value=="Top")
45867
+ {
45868
+ yPrice=top;
45869
+ }
45870
+ else
45871
+ {
45872
+ if (IFrameSplitOperator.IsString(lineItem.Value))
45873
+ price=this.GetKValue(kItem,lineItem.Value);
45874
+
45875
+ if (!IFrameSplitOperator.IsNumber(price)) continue;
45876
+ yPrice=this.ChartFrame.GetYFromData(price);
45877
+ }
45878
+
45879
+ if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
45880
+
45881
+ var yText;
45882
+ if (yPrice<rtSVG.Top)
45883
+ {
45884
+ yText=rtSVG.Top;
45885
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
45886
+ {
45887
+ //yPrice+=lineItem.Blank;
45888
+ yText-=lineItem.SVGBlank;
45889
+ }
45890
+ }
45891
+ else
45892
+ {
45893
+ yText=rtSVG.Bottom;
45894
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
45895
+ {
45896
+ //yPrice-=lineItem.Blank;
45897
+ yText+=lineItem.SVGBlank;
45898
+ }
45899
+ }
45900
+
45901
+ if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
45902
+ var lineWidth=1*pixelRatio;
45903
+ if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
45904
+ this.Canvas.lineWidth=lineWidth; //线宽
45905
+ this.Canvas.strokeStyle = lineItem.Color;
45906
+ this.Canvas.beginPath();
45907
+
45908
+ if (this.IsHScreen)
45909
+ {
45910
+ this.Canvas.moveTo(yText, ToFixedPoint(x));
45911
+ this.Canvas.lineTo(yPrice,ToFixedPoint(x));
45912
+ }
45913
+ else
45914
+ {
45915
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
45916
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
45917
+ }
45918
+
45919
+ this.Canvas.stroke();
45920
+ this.Canvas.setLineDash([]);
45921
+ }
45922
+ }
45923
+ }
45924
+ }
45925
+
45926
+ /*
45680
45927
  this.DrawSVG=function()
45681
45928
  {
45682
45929
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
@@ -45851,26 +46098,35 @@ function ChartDrawSVG()
45851
46098
  }
45852
46099
  }
45853
46100
  }
46101
+ */
45854
46102
 
45855
46103
  this.GetMaxMin=function()
45856
46104
  {
46105
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45857
46106
  var range={ Min:null, Max:null };
46107
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
46108
+ if (!this.MapCache || this.MapCache.size<=0) return;
45858
46109
  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
46110
 
45863
- for(var i=0; i<this.Texts.length; ++i)
46111
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45864
46112
  {
45865
- var item=this.Texts[i];
45866
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
45867
- if (item.Index>=start && item.Index<end)
46113
+ var kItem=this.Data.Data[i];
46114
+ var key=this.BuildKey(kItem);
46115
+ if (!this.MapCache.has(key)) continue;
46116
+ var mapItem=this.MapCache.get(key);
46117
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
46118
+
46119
+ for(k=0;k<mapItem.Data.length;++k)
45868
46120
  {
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;
46121
+ var item=mapItem.Data[k];
46122
+ var value=item.Value;
46123
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
46124
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
46125
+
46126
+ if (range.Max==null) range.Max=value;
46127
+ else if (range.Max<value) range.Max=value;
46128
+ if (range.Min==null) range.Min=value;
46129
+ else if (range.Min>value) range.Min=value;
45874
46130
  }
45875
46131
  }
45876
46132
 
@@ -45886,11 +46142,10 @@ function ChartDrawSVG()
45886
46142
  var item=this.TooltipRect[i];
45887
46143
  if (!item.Rect) continue;
45888
46144
  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))
46145
+
46146
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
45892
46147
  {
45893
- var data=this.Texts[item.Index];
46148
+ var data=item.Item;
45894
46149
  JSConsole.Chart.Log('[ChartDrawSVG::GetTooltipData] svg icon.', item);
45895
46150
  tooltip.Data={ Rect:item.Rect, Item:data, Index:item.Index };
45896
46151
  tooltip.ChartPaint=this;
@@ -91771,7 +92026,7 @@ MinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)
91771
92026
  return aryMinuteData;
91772
92027
  }
91773
92028
 
91774
- //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 ]
92029
+ //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 12=持仓 ]
91775
92030
  MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
91776
92031
  {
91777
92032
  if (!data || !data.stock) return null;
@@ -91809,16 +92064,17 @@ MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
91809
92064
  if (IFrameSplitOperator.IsNumber(jsData[9])) item.Increase=jsData[9];
91810
92065
  if (IFrameSplitOperator.IsNumber(jsData[10])) item.Risefall=jsData[10];
91811
92066
  if (IFrameSplitOperator.IsNumber(jsData[11])) item.Lead=jsData[11];
91812
-
92067
+ if (IFrameSplitOperator.IsNumber(jsData[12])) item.Position=jsData[12];
91813
92068
 
91814
92069
  if (jsData[extendDataIndex]) item.ExtendData=jsData[extendDataIndex];
91815
- item.DateTime=item.Date.toString()+" "+item.Time.toString();
92070
+
92071
+ item.DateTime=`${item.Date} ${item.Time}`;
91816
92072
 
91817
92073
  if (IFrameSplitOperator.IsNumber(minuteData.YClose) && item.Close)
91818
- item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
92074
+ item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
91819
92075
 
91820
92076
  if (isFutures && minuteData.YClearing && item.Close)
91821
- item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
92077
+ item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
91822
92078
 
91823
92079
 
91824
92080
  minuteData.Data.push(item);
@@ -122261,11 +122517,12 @@ function ScriptIndex(name,script,args,option)
122261
122517
  for(var j=0;j<drawData.length;++j)
122262
122518
  {
122263
122519
  var item=drawData[j];
122520
+ var kItem=chart.Data.Data[j];
122264
122521
  if (!IFrameSplitOperator.IsNumber(item)) continue;
122265
122522
 
122266
122523
  var svgItem=
122267
122524
  {
122268
- Index:j, Value:item,
122525
+ Value:item, Date:kItem.Date, Time:kItem.Time,
122269
122526
  SVG:{ Symbol:varItem.Draw.Icon.Symbol, Size:svgSize, Color:svgColor, YOffset:svgYOffset, VAlign:svgVAlign }
122270
122527
  };
122271
122528
 
@@ -122285,6 +122542,7 @@ function ScriptIndex(name,script,args,option)
122285
122542
  chart.Texts= aryData;
122286
122543
  }
122287
122544
 
122545
+ chart.BuildCacheData();
122288
122546
  hqChart.ChartPaint.push(chart);
122289
122547
  }
122290
122548
 
@@ -122508,6 +122766,8 @@ function ScriptIndex(name,script,args,option)
122508
122766
  chart.Family=varItem.Draw.DrawData.Family;
122509
122767
  chart.TextFont=varItem.Draw.DrawData.TextFont;
122510
122768
  chart.Texts= varItem.Draw.DrawData.Data;
122769
+ chart.BuildCacheData();
122770
+ this.SetChartIndexName(chart);
122511
122771
  hqChart.ChartPaint.push(chart);
122512
122772
  }
122513
122773
 
@@ -124028,11 +124288,12 @@ function OverlayScriptIndex(name,script,args,option)
124028
124288
  for(var j=0;j<drawData.length;++j)
124029
124289
  {
124030
124290
  var item=drawData[j];
124291
+ var kItem=chart.Data.Data[j];
124031
124292
  if (!IFrameSplitOperator.IsNumber(item)) continue;
124032
124293
 
124033
124294
  var svgItem=
124034
124295
  {
124035
- Index:j, Value:item,
124296
+ Value:item, Date:kItem.Date, Time:kItem.Time,
124036
124297
  SVG:{ Symbol:varItem.Draw.Icon.Symbol, Size:svgSize, Color:svgColor, YOffset:svgYOffset, VAlign:svgVAlign }
124037
124298
  };
124038
124299
 
@@ -124052,6 +124313,7 @@ function OverlayScriptIndex(name,script,args,option)
124052
124313
  chart.Texts= aryData;
124053
124314
  }
124054
124315
 
124316
+ chart.BuildCacheData();
124055
124317
  frame.ChartPaint.push(chart);
124056
124318
  }
124057
124319
 
@@ -124263,7 +124525,8 @@ function OverlayScriptIndex(name,script,args,option)
124263
124525
  if (varItem.Draw.AutoPosition) chart.AutoPosition=varItem.Draw.AutoPosition;
124264
124526
 
124265
124527
  this.ReloadChartResource(hqChart, windowIndex, chart);
124266
-
124528
+
124529
+ chart.BuildCacheData();
124267
124530
  this.SetChartIndexName(chart);
124268
124531
  frame.ChartPaint.push(chart);
124269
124532
  }
@@ -125402,8 +125665,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125402
125665
  drawItem.Name=draw.Name;
125403
125666
  drawItem.DrawType=draw.DrawType;
125404
125667
  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);
125668
+ drawItem.DrawData={ Data:draw.Data, Family:draw.Family, TextFont:draw.TextFont, EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125407
125669
  outVarItem.Draw=drawItem;
125408
125670
 
125409
125671
  result.push(outVarItem);
@@ -125894,8 +126156,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125894
126156
  drawItem.Name=draw.Name;
125895
126157
  drawItem.DrawType=draw.DrawType;
125896
126158
  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);
126159
+ drawItem.DrawData={ Data:draw.Data, Family:draw.Family, TextFont:draw.TextFont , EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125899
126160
  outVarItem.Draw=drawItem;
125900
126161
 
125901
126162
  result.push(outVarItem);
@@ -151309,7 +151570,7 @@ function HQChartScriptWorker()
151309
151570
 
151310
151571
 
151311
151572
 
151312
- var HQCHART_VERSION="1.1.14304";
151573
+ var HQCHART_VERSION="1.1.14306";
151313
151574
 
151314
151575
  function PrintHQChartVersion()
151315
151576
  {