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.
@@ -45382,6 +45382,7 @@ function ChartDrawSVG()
45382
45382
  this.Family;
45383
45383
  this.TextFont;
45384
45384
  this.Texts=[]; //[ { Index:, Value:, Symbol:, Text:, Size: } ] SVG:图标 Text:文字 Size:图标大小
45385
+ //this.Data; 存K线数据
45385
45386
  this.IsHScreen=false; //是否横屏
45386
45387
  this.IsDestroy=false; //是否已销毁
45387
45388
  this.EnableTooltip=true;
@@ -45391,8 +45392,38 @@ function ChartDrawSVG()
45391
45392
 
45392
45393
  this.AryDrawRect=[]; //已经绘制的区域
45393
45394
  this.AutoYOffset=0;
45394
-
45395
- //this.Data; 存K线数据
45395
+
45396
+ this.BuildKeyCallback=null;
45397
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
45398
+
45399
+ this.BuildKey=function(item)
45400
+ {
45401
+ if (this.BuildKeyCallback) return this.BuildKeyCallback(item);
45402
+
45403
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
45404
+ else return `${item.Date}`;
45405
+ }
45406
+
45407
+ this.BuildCacheData=function()
45408
+ {
45409
+ var mapData=new Map();
45410
+ this.MapCache=mapData;
45411
+ for(var i=0; i<this.Texts.length;++i)
45412
+ {
45413
+ var item=this.Texts[i];
45414
+ var key=this.BuildKey(item);
45415
+
45416
+ if (mapData.has(key))
45417
+ {
45418
+ var mapItem=mapData.get(key);
45419
+ mapItem.Data.push(item);
45420
+ }
45421
+ else
45422
+ {
45423
+ mapData.set(key,{ Date:item.Date, Time:item.Time, Data:[item] });
45424
+ }
45425
+ }
45426
+ }
45396
45427
 
45397
45428
  this.Draw=function()
45398
45429
  {
@@ -45403,8 +45434,9 @@ function ChartDrawSVG()
45403
45434
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
45404
45435
  if (this.IsShowIndexTitleOnly()) return;
45405
45436
  if (this.IsHideScriptIndex()) return;
45437
+ if (!this.MapCache || this.MapCache.size<=0) return;
45406
45438
 
45407
- this.DrawSVG();
45439
+ this.DrawSVGV2();
45408
45440
  }
45409
45441
 
45410
45442
  this.DrawDetail=function(rtSVG, data, svgItem)
@@ -45633,6 +45665,223 @@ function ChartDrawSVG()
45633
45665
  return false;
45634
45666
  }
45635
45667
 
45668
+ this.GetKValue=function(kItem, valueName)
45669
+ {
45670
+ switch(valueName)
45671
+ {
45672
+ case "HIGH":
45673
+ case "H":
45674
+ return kItem.High;
45675
+ case "L":
45676
+ case "LOW":
45677
+ return kItem.Low;
45678
+ case "C":
45679
+ case "CLOSE":
45680
+ return kItem.Close;
45681
+ case "O":
45682
+ case "OPEN":
45683
+ return KItem.Open;
45684
+ default:
45685
+ return null;
45686
+ }
45687
+ }
45688
+
45689
+ this.DrawSVGV2=function()
45690
+ {
45691
+ if (!this.IsShow || this.ChartFrame.IsMinSize) return;
45692
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return;
45693
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45694
+ if (!this.Family) return;
45695
+
45696
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45697
+ if (this.IsHScreen) return;
45698
+
45699
+ var xPointCount=this.ChartFrame.XPointCount;
45700
+ var dataWidth=this.ChartFrame.DataWidth;
45701
+ var distanceWidth=this.ChartFrame.DistanceWidth;
45702
+ var isMinute=this.IsMinuteFrame();
45703
+ var border=this.GetBorder();
45704
+ var pixelRatio = GetDevicePixelRatio();
45705
+
45706
+ if (this.IsHScreen)
45707
+ {
45708
+
45709
+ }
45710
+ else
45711
+ {
45712
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
45713
+ var chartright=border.RightEx;
45714
+ var chartLeft=border.LeftEx;
45715
+ var top=border.TopEx;
45716
+ var bottom=border.BottomEx;
45717
+ }
45718
+
45719
+ var x,y,price;
45720
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
45721
+ {
45722
+ var kItem=this.Data.Data[i];
45723
+ var key=this.BuildKey(kItem);
45724
+ if (!this.MapCache.has(key)) continue;
45725
+ var mapItem=this.MapCache.get(key);
45726
+
45727
+ if (isMinute)
45728
+ {
45729
+ x=this.ChartFrame.GetXFromIndex(j);
45730
+ }
45731
+ else
45732
+ {
45733
+ var left=xOffset;
45734
+ var right=xOffset+dataWidth;
45735
+ if (right>chartright) break;
45736
+ x=left+(right-left)/2;
45737
+ }
45738
+
45739
+ for(var k=0;k<mapItem.Data.length;++k)
45740
+ {
45741
+ var item=mapItem.Data[k];
45742
+
45743
+ if (item.Value=="Top") y=top;
45744
+ else if (item.Value=="Bottom") y=bottom;
45745
+ else
45746
+ {
45747
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
45748
+ else price=item.Value;
45749
+
45750
+ y=this.ChartFrame.GetYFromData(price, false);
45751
+ }
45752
+ if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
45753
+
45754
+ var svgItem=item.SVG;
45755
+ if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
45756
+
45757
+ if (this.AutoPosition)
45758
+ {
45759
+ var pt={ X:x, Y:y };
45760
+ this.CalculateShowPosition(item, pt); //重新计算位置
45761
+ x=pt.X;
45762
+ y=pt.Y;
45763
+ }
45764
+
45765
+ var fontSVG=`${svgItem.Size}px ${this.Family}`;
45766
+ this.Canvas.font=fontSVG;
45767
+ var halfSize=svgItem.Size/2;
45768
+ var textBaseline='bottom';
45769
+ var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
45770
+ if (svgItem.VAlign===0)
45771
+ {
45772
+ textBaseline="top";
45773
+ rtSVG.Top=y;
45774
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
45775
+ }
45776
+ else if (svgItem.VAlign===1)
45777
+ {
45778
+ textBaseline='middle';
45779
+ rtSVG.Top=y-svgItem.Size/2;
45780
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
45781
+ }
45782
+
45783
+ if (rtSVG.Top<0)
45784
+ {
45785
+ rtSVG.Top=0;
45786
+ rtSVG.Bottom=svgItem.Size;
45787
+ y=rtSVG.Bottom;
45788
+ }
45789
+
45790
+ this.Canvas.textBaseline=textBaseline;
45791
+ this.Canvas.textAlign='center';
45792
+ this.Canvas.fillStyle = svgItem.Color;
45793
+ this.Canvas.fillText(svgItem.Symbol, x, y);
45794
+
45795
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
45796
+
45797
+ if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
45798
+
45799
+ //文字
45800
+ if (item.Text && item.Text.Content && this.TextFont)
45801
+ {
45802
+ var textItem=item.Text;
45803
+ this.Canvas.font=this.TextFont;
45804
+ this.Canvas.fillStyle=textItem.Color;
45805
+ var yText=y;
45806
+ if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
45807
+ this.Canvas.fillText(textItem.Content, x, yText);
45808
+ }
45809
+
45810
+ if (item.Detail)
45811
+ {
45812
+ this.DrawDetail(rtSVG,item.Detail, item);
45813
+ }
45814
+
45815
+ //连线
45816
+ if (item.Line)
45817
+ {
45818
+ var lineItem=item.Line;
45819
+ var price=null, yPrice=null;
45820
+ if (lineItem.Value=="Bottom")
45821
+ {
45822
+ yPrice=bottom;
45823
+ }
45824
+ else if (lineItem.Value=="Top")
45825
+ {
45826
+ yPrice=top;
45827
+ }
45828
+ else
45829
+ {
45830
+ if (IFrameSplitOperator.IsString(lineItem.Value))
45831
+ price=this.GetKValue(kItem,lineItem.Value);
45832
+
45833
+ if (!IFrameSplitOperator.IsNumber(price)) continue;
45834
+ yPrice=this.ChartFrame.GetYFromData(price);
45835
+ }
45836
+
45837
+ if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
45838
+
45839
+ var yText;
45840
+ if (yPrice<rtSVG.Top)
45841
+ {
45842
+ yText=rtSVG.Top;
45843
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
45844
+ {
45845
+ //yPrice+=lineItem.Blank;
45846
+ yText-=lineItem.SVGBlank;
45847
+ }
45848
+ }
45849
+ else
45850
+ {
45851
+ yText=rtSVG.Bottom;
45852
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
45853
+ {
45854
+ //yPrice-=lineItem.Blank;
45855
+ yText+=lineItem.SVGBlank;
45856
+ }
45857
+ }
45858
+
45859
+ if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
45860
+ var lineWidth=1*pixelRatio;
45861
+ if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
45862
+ this.Canvas.lineWidth=lineWidth; //线宽
45863
+ this.Canvas.strokeStyle = lineItem.Color;
45864
+ this.Canvas.beginPath();
45865
+
45866
+ if (this.IsHScreen)
45867
+ {
45868
+ this.Canvas.moveTo(yText, ToFixedPoint(x));
45869
+ this.Canvas.lineTo(yPrice,ToFixedPoint(x));
45870
+ }
45871
+ else
45872
+ {
45873
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
45874
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
45875
+ }
45876
+
45877
+ this.Canvas.stroke();
45878
+ this.Canvas.setLineDash([]);
45879
+ }
45880
+ }
45881
+ }
45882
+ }
45883
+
45884
+ /*
45636
45885
  this.DrawSVG=function()
45637
45886
  {
45638
45887
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
@@ -45807,26 +46056,35 @@ function ChartDrawSVG()
45807
46056
  }
45808
46057
  }
45809
46058
  }
46059
+ */
45810
46060
 
45811
46061
  this.GetMaxMin=function()
45812
46062
  {
46063
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45813
46064
  var range={ Min:null, Max:null };
46065
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
46066
+ if (!this.MapCache || this.MapCache.size<=0) return;
45814
46067
  var xPointCount=this.ChartFrame.XPointCount;
45815
- var start=this.Data.DataOffset;
45816
- var end=start+xPointCount;
45817
- if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return range;
45818
46068
 
45819
- for(var i=0; i<this.Texts.length; ++i)
46069
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45820
46070
  {
45821
- var item=this.Texts[i];
45822
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
45823
- if (item.Index>=start && item.Index<end)
46071
+ var kItem=this.Data.Data[i];
46072
+ var key=this.BuildKey(kItem);
46073
+ if (!this.MapCache.has(key)) continue;
46074
+ var mapItem=this.MapCache.get(key);
46075
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
46076
+
46077
+ for(k=0;k<mapItem.Data.length;++k)
45824
46078
  {
45825
- if(!IFrameSplitOperator.IsNumber(item.Value)) continue;
45826
- if (range.Max==null) range.Max=item.Value;
45827
- else if (range.Max<item.Value) range.Max=item.Value;
45828
- if (range.Min==null) range.Min=item.Value;
45829
- else if (range.Min>item.Value) range.Min=item.Value;
46079
+ var item=mapItem.Data[k];
46080
+ var value=item.Value;
46081
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
46082
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
46083
+
46084
+ if (range.Max==null) range.Max=value;
46085
+ else if (range.Max<value) range.Max=value;
46086
+ if (range.Min==null) range.Min=value;
46087
+ else if (range.Min>value) range.Min=value;
45830
46088
  }
45831
46089
  }
45832
46090
 
@@ -45842,11 +46100,10 @@ function ChartDrawSVG()
45842
46100
  var item=this.TooltipRect[i];
45843
46101
  if (!item.Rect) continue;
45844
46102
  var rect=item.Rect;
45845
- this.Canvas.beginPath();
45846
- this.Canvas.rect(rect.Left,rect.Top,rect.Width,rect.Height);
45847
- if (this.Canvas.isPointInPath(x,y))
46103
+
46104
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
45848
46105
  {
45849
- var data=this.Texts[item.Index];
46106
+ var data=item.Item;
45850
46107
  JSConsole.Chart.Log('[ChartDrawSVG::GetTooltipData] svg icon.', item);
45851
46108
  tooltip.Data={ Rect:item.Rect, Item:data, Index:item.Index };
45852
46109
  tooltip.ChartPaint=this;
@@ -91727,7 +91984,7 @@ MinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)
91727
91984
  return aryMinuteData;
91728
91985
  }
91729
91986
 
91730
- //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 ]
91987
+ //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 12=持仓 ]
91731
91988
  MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
91732
91989
  {
91733
91990
  if (!data || !data.stock) return null;
@@ -91765,16 +92022,17 @@ MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
91765
92022
  if (IFrameSplitOperator.IsNumber(jsData[9])) item.Increase=jsData[9];
91766
92023
  if (IFrameSplitOperator.IsNumber(jsData[10])) item.Risefall=jsData[10];
91767
92024
  if (IFrameSplitOperator.IsNumber(jsData[11])) item.Lead=jsData[11];
91768
-
92025
+ if (IFrameSplitOperator.IsNumber(jsData[12])) item.Position=jsData[12];
91769
92026
 
91770
92027
  if (jsData[extendDataIndex]) item.ExtendData=jsData[extendDataIndex];
91771
- item.DateTime=item.Date.toString()+" "+item.Time.toString();
92028
+
92029
+ item.DateTime=`${item.Date} ${item.Time}`;
91772
92030
 
91773
92031
  if (IFrameSplitOperator.IsNumber(minuteData.YClose) && item.Close)
91774
- item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
92032
+ item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
91775
92033
 
91776
92034
  if (isFutures && minuteData.YClearing && item.Close)
91777
- item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
92035
+ item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
91778
92036
 
91779
92037
 
91780
92038
  minuteData.Data.push(item);
@@ -122217,11 +122475,12 @@ function ScriptIndex(name,script,args,option)
122217
122475
  for(var j=0;j<drawData.length;++j)
122218
122476
  {
122219
122477
  var item=drawData[j];
122478
+ var kItem=chart.Data.Data[j];
122220
122479
  if (!IFrameSplitOperator.IsNumber(item)) continue;
122221
122480
 
122222
122481
  var svgItem=
122223
122482
  {
122224
- Index:j, Value:item,
122483
+ Value:item, Date:kItem.Date, Time:kItem.Time,
122225
122484
  SVG:{ Symbol:varItem.Draw.Icon.Symbol, Size:svgSize, Color:svgColor, YOffset:svgYOffset, VAlign:svgVAlign }
122226
122485
  };
122227
122486
 
@@ -122241,6 +122500,7 @@ function ScriptIndex(name,script,args,option)
122241
122500
  chart.Texts= aryData;
122242
122501
  }
122243
122502
 
122503
+ chart.BuildCacheData();
122244
122504
  hqChart.ChartPaint.push(chart);
122245
122505
  }
122246
122506
 
@@ -122464,6 +122724,8 @@ function ScriptIndex(name,script,args,option)
122464
122724
  chart.Family=varItem.Draw.DrawData.Family;
122465
122725
  chart.TextFont=varItem.Draw.DrawData.TextFont;
122466
122726
  chart.Texts= varItem.Draw.DrawData.Data;
122727
+ chart.BuildCacheData();
122728
+ this.SetChartIndexName(chart);
122467
122729
  hqChart.ChartPaint.push(chart);
122468
122730
  }
122469
122731
 
@@ -123984,11 +124246,12 @@ function OverlayScriptIndex(name,script,args,option)
123984
124246
  for(var j=0;j<drawData.length;++j)
123985
124247
  {
123986
124248
  var item=drawData[j];
124249
+ var kItem=chart.Data.Data[j];
123987
124250
  if (!IFrameSplitOperator.IsNumber(item)) continue;
123988
124251
 
123989
124252
  var svgItem=
123990
124253
  {
123991
- Index:j, Value:item,
124254
+ Value:item, Date:kItem.Date, Time:kItem.Time,
123992
124255
  SVG:{ Symbol:varItem.Draw.Icon.Symbol, Size:svgSize, Color:svgColor, YOffset:svgYOffset, VAlign:svgVAlign }
123993
124256
  };
123994
124257
 
@@ -124008,6 +124271,7 @@ function OverlayScriptIndex(name,script,args,option)
124008
124271
  chart.Texts= aryData;
124009
124272
  }
124010
124273
 
124274
+ chart.BuildCacheData();
124011
124275
  frame.ChartPaint.push(chart);
124012
124276
  }
124013
124277
 
@@ -124219,7 +124483,8 @@ function OverlayScriptIndex(name,script,args,option)
124219
124483
  if (varItem.Draw.AutoPosition) chart.AutoPosition=varItem.Draw.AutoPosition;
124220
124484
 
124221
124485
  this.ReloadChartResource(hqChart, windowIndex, chart);
124222
-
124486
+
124487
+ chart.BuildCacheData();
124223
124488
  this.SetChartIndexName(chart);
124224
124489
  frame.ChartPaint.push(chart);
124225
124490
  }
@@ -125358,8 +125623,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125358
125623
  drawItem.Name=draw.Name;
125359
125624
  drawItem.DrawType=draw.DrawType;
125360
125625
  if (draw.AutoPosition) drawItem.AutoPosition=draw.AutoPosition;
125361
- drawItem.DrawData={ Data:this.FittingMultiText(draw.Data,date,time,hqChart), Family:draw.Family, TextFont:draw.TextFont, EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125362
- this.GetKLineData(drawItem.DrawData.Data, hqChart);
125626
+ drawItem.DrawData={ Data:draw.Data, Family:draw.Family, TextFont:draw.TextFont, EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125363
125627
  outVarItem.Draw=drawItem;
125364
125628
 
125365
125629
  result.push(outVarItem);
@@ -125850,8 +126114,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125850
126114
  drawItem.Name=draw.Name;
125851
126115
  drawItem.DrawType=draw.DrawType;
125852
126116
  if (draw.AutoPosition) drawItem.AutoPosition=draw.AutoPosition;
125853
- drawItem.DrawData={ Data:this.FittingMultiText(draw.Data,date,time,hqChart), Family:draw.Family, TextFont:draw.TextFont ,EnableTooltip:draw.EnableTooltip,IsDrawFirst:draw.IsDrawFirst };
125854
- this.GetKLineData(drawItem.DrawData.Data, hqChart);
126117
+ drawItem.DrawData={ Data:draw.Data, Family:draw.Family, TextFont:draw.TextFont , EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125855
126118
  outVarItem.Draw=drawItem;
125856
126119
 
125857
126120
  result.push(outVarItem);
@@ -141661,7 +141924,7 @@ function ScrollBarBGChart()
141661
141924
 
141662
141925
 
141663
141926
 
141664
- var HQCHART_VERSION="1.1.14304";
141927
+ var HQCHART_VERSION="1.1.14308";
141665
141928
 
141666
141929
  function PrintHQChartVersion()
141667
141930
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.14304";
8
+ var HQCHART_VERSION="1.1.14308";
9
9
 
10
10
  function PrintHQChartVersion()
11
11
  {