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.
@@ -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,221 @@ 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
+ }
45716
+
45717
+ var x,y,price;
45718
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
45719
+ {
45720
+ var kItem=this.Data.Data[i];
45721
+ var key=this.BuildKey(kItem);
45722
+ if (!this.MapCache.has(key)) continue;
45723
+ var mapItem=this.MapCache.get(key);
45724
+
45725
+ if (isMinute)
45726
+ {
45727
+ x=this.ChartFrame.GetXFromIndex(j);
45728
+ }
45729
+ else
45730
+ {
45731
+ var left=xOffset;
45732
+ var right=xOffset+dataWidth;
45733
+ if (right>chartright) break;
45734
+ x=left+(right-left)/2;
45735
+ }
45736
+
45737
+ for(var j=0;j<mapItem.Data.length;++j)
45738
+ {
45739
+ var item=mapItem.Data[j];
45740
+
45741
+ if (item.Value=="Top") y=top;
45742
+ else if (item.Value=="Bottom") y=bottom;
45743
+ else
45744
+ {
45745
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
45746
+ else price=item.Value;
45747
+
45748
+ y=this.ChartFrame.GetYFromData(price, false);
45749
+ }
45750
+ if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
45751
+
45752
+ var svgItem=item.SVG;
45753
+ if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
45754
+
45755
+ if (this.AutoPosition)
45756
+ {
45757
+ var pt={ X:x, Y:y };
45758
+ this.CalculateShowPosition(item, pt); //重新计算位置
45759
+ x=pt.X;
45760
+ y=pt.Y;
45761
+ }
45762
+
45763
+ var fontSVG=`${svgItem.Size}px ${this.Family}`;
45764
+ this.Canvas.font=fontSVG;
45765
+ var halfSize=svgItem.Size/2;
45766
+ var textBaseline='bottom';
45767
+ var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
45768
+ if (svgItem.VAlign===0)
45769
+ {
45770
+ textBaseline="top";
45771
+ rtSVG.Top=y;
45772
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
45773
+ }
45774
+ else if (svgItem.VAlign===1)
45775
+ {
45776
+ textBaseline='middle';
45777
+ rtSVG.Top=y-svgItem.Size/2;
45778
+ rtSVG.Bottom=rtSVG.Top+svgItem.Size;
45779
+ }
45780
+
45781
+ if (rtSVG.Top<0)
45782
+ {
45783
+ rtSVG.Top=0;
45784
+ rtSVG.Bottom=svgItem.Size;
45785
+ y=rtSVG.Bottom;
45786
+ }
45787
+
45788
+ this.Canvas.textBaseline=textBaseline;
45789
+ this.Canvas.textAlign='center';
45790
+ this.Canvas.fillStyle = svgItem.Color;
45791
+ this.Canvas.fillText(svgItem.Symbol, x, y);
45792
+
45793
+ this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
45794
+
45795
+ if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
45796
+
45797
+ //文字
45798
+ if (item.Text && item.Text.Content && this.TextFont)
45799
+ {
45800
+ var textItem=item.Text;
45801
+ this.Canvas.font=this.TextFont;
45802
+ this.Canvas.fillStyle=textItem.Color;
45803
+ var yText=y;
45804
+ if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
45805
+ this.Canvas.fillText(textItem.Content, x, yText);
45806
+ }
45807
+
45808
+ if (item.Detail)
45809
+ {
45810
+ this.DrawDetail(rtSVG,item.Detail, item);
45811
+ }
45812
+
45813
+ //连线
45814
+ if (item.Line)
45815
+ {
45816
+ var lineItem=item.Line;
45817
+ var price=null, yPrice=null;
45818
+ if (lineItem.Value=="Bottom")
45819
+ {
45820
+ yPrice=bottom;
45821
+ }
45822
+ else if (lineItem.Value=="Top")
45823
+ {
45824
+ yPrice=top;
45825
+ }
45826
+ else
45827
+ {
45828
+ if (IFrameSplitOperator.IsString(lineItem.Value))
45829
+ price=this.GetKValue(kItem,lineItem.Value);
45830
+
45831
+ if (!IFrameSplitOperator.IsNumber(price)) continue;
45832
+ yPrice=this.ChartFrame.GetYFromData(price);
45833
+ }
45834
+
45835
+ if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
45836
+
45837
+ var yText;
45838
+ if (yPrice<rtSVG.Top)
45839
+ {
45840
+ yText=rtSVG.Top;
45841
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
45842
+ {
45843
+ //yPrice+=lineItem.Blank;
45844
+ yText-=lineItem.SVGBlank;
45845
+ }
45846
+ }
45847
+ else
45848
+ {
45849
+ yText=rtSVG.Bottom;
45850
+ if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
45851
+ {
45852
+ //yPrice-=lineItem.Blank;
45853
+ yText+=lineItem.SVGBlank;
45854
+ }
45855
+ }
45856
+
45857
+ if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
45858
+ var lineWidth=1*pixelRatio;
45859
+ if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
45860
+ this.Canvas.lineWidth=lineWidth; //线宽
45861
+ this.Canvas.strokeStyle = lineItem.Color;
45862
+ this.Canvas.beginPath();
45863
+
45864
+ if (this.IsHScreen)
45865
+ {
45866
+ this.Canvas.moveTo(yText, ToFixedPoint(x));
45867
+ this.Canvas.lineTo(yPrice,ToFixedPoint(x));
45868
+ }
45869
+ else
45870
+ {
45871
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
45872
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
45873
+ }
45874
+
45875
+ this.Canvas.stroke();
45876
+ this.Canvas.setLineDash([]);
45877
+ }
45878
+ }
45879
+ }
45880
+ }
45881
+
45882
+ /*
45636
45883
  this.DrawSVG=function()
45637
45884
  {
45638
45885
  if (!this.IsShow || this.ChartFrame.IsMinSize) return;
@@ -45807,26 +46054,35 @@ function ChartDrawSVG()
45807
46054
  }
45808
46055
  }
45809
46056
  }
46057
+ */
45810
46058
 
45811
46059
  this.GetMaxMin=function()
45812
46060
  {
46061
+ this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45813
46062
  var range={ Min:null, Max:null };
46063
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
46064
+ if (!this.MapCache || this.MapCache.size<=0) return;
45814
46065
  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
46066
 
45819
- for(var i=0; i<this.Texts.length; ++i)
46067
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45820
46068
  {
45821
- var item=this.Texts[i];
45822
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
45823
- if (item.Index>=start && item.Index<end)
46069
+ var kItem=this.Data.Data[i];
46070
+ var key=this.BuildKey(kItem);
46071
+ if (!this.MapCache.has(key)) continue;
46072
+ var mapItem=this.MapCache.get(key);
46073
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
46074
+
46075
+ for(k=0;k<mapItem.Data.length;++k)
45824
46076
  {
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;
46077
+ var item=mapItem.Data[k];
46078
+ var value=item.Value;
46079
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
46080
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
46081
+
46082
+ if (range.Max==null) range.Max=value;
46083
+ else if (range.Max<value) range.Max=value;
46084
+ if (range.Min==null) range.Min=value;
46085
+ else if (range.Min>value) range.Min=value;
45830
46086
  }
45831
46087
  }
45832
46088
 
@@ -45842,11 +46098,10 @@ function ChartDrawSVG()
45842
46098
  var item=this.TooltipRect[i];
45843
46099
  if (!item.Rect) continue;
45844
46100
  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))
46101
+
46102
+ if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
45848
46103
  {
45849
- var data=this.Texts[item.Index];
46104
+ var data=item.Item;
45850
46105
  JSConsole.Chart.Log('[ChartDrawSVG::GetTooltipData] svg icon.', item);
45851
46106
  tooltip.Data={ Rect:item.Rect, Item:data, Index:item.Index };
45852
46107
  tooltip.ChartPaint=this;
@@ -91727,7 +91982,7 @@ MinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)
91727
91982
  return aryMinuteData;
91728
91983
  }
91729
91984
 
91730
- //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 ]
91985
+ //分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 12=持仓 ]
91731
91986
  MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
91732
91987
  {
91733
91988
  if (!data || !data.stock) return null;
@@ -91765,16 +92020,17 @@ MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
91765
92020
  if (IFrameSplitOperator.IsNumber(jsData[9])) item.Increase=jsData[9];
91766
92021
  if (IFrameSplitOperator.IsNumber(jsData[10])) item.Risefall=jsData[10];
91767
92022
  if (IFrameSplitOperator.IsNumber(jsData[11])) item.Lead=jsData[11];
91768
-
92023
+ if (IFrameSplitOperator.IsNumber(jsData[12])) item.Position=jsData[12];
91769
92024
 
91770
92025
  if (jsData[extendDataIndex]) item.ExtendData=jsData[extendDataIndex];
91771
- item.DateTime=item.Date.toString()+" "+item.Time.toString();
92026
+
92027
+ item.DateTime=`${item.Date} ${item.Time}`;
91772
92028
 
91773
92029
  if (IFrameSplitOperator.IsNumber(minuteData.YClose) && item.Close)
91774
- item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
92030
+ item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
91775
92031
 
91776
92032
  if (isFutures && minuteData.YClearing && item.Close)
91777
- item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
92033
+ item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
91778
92034
 
91779
92035
 
91780
92036
  minuteData.Data.push(item);
@@ -122217,11 +122473,12 @@ function ScriptIndex(name,script,args,option)
122217
122473
  for(var j=0;j<drawData.length;++j)
122218
122474
  {
122219
122475
  var item=drawData[j];
122476
+ var kItem=chart.Data.Data[j];
122220
122477
  if (!IFrameSplitOperator.IsNumber(item)) continue;
122221
122478
 
122222
122479
  var svgItem=
122223
122480
  {
122224
- Index:j, Value:item,
122481
+ Value:item, Date:kItem.Date, Time:kItem.Time,
122225
122482
  SVG:{ Symbol:varItem.Draw.Icon.Symbol, Size:svgSize, Color:svgColor, YOffset:svgYOffset, VAlign:svgVAlign }
122226
122483
  };
122227
122484
 
@@ -122241,6 +122498,7 @@ function ScriptIndex(name,script,args,option)
122241
122498
  chart.Texts= aryData;
122242
122499
  }
122243
122500
 
122501
+ chart.BuildCacheData();
122244
122502
  hqChart.ChartPaint.push(chart);
122245
122503
  }
122246
122504
 
@@ -122464,6 +122722,8 @@ function ScriptIndex(name,script,args,option)
122464
122722
  chart.Family=varItem.Draw.DrawData.Family;
122465
122723
  chart.TextFont=varItem.Draw.DrawData.TextFont;
122466
122724
  chart.Texts= varItem.Draw.DrawData.Data;
122725
+ chart.BuildCacheData();
122726
+ this.SetChartIndexName(chart);
122467
122727
  hqChart.ChartPaint.push(chart);
122468
122728
  }
122469
122729
 
@@ -123984,11 +124244,12 @@ function OverlayScriptIndex(name,script,args,option)
123984
124244
  for(var j=0;j<drawData.length;++j)
123985
124245
  {
123986
124246
  var item=drawData[j];
124247
+ var kItem=chart.Data.Data[j];
123987
124248
  if (!IFrameSplitOperator.IsNumber(item)) continue;
123988
124249
 
123989
124250
  var svgItem=
123990
124251
  {
123991
- Index:j, Value:item,
124252
+ Value:item, Date:kItem.Date, Time:kItem.Time,
123992
124253
  SVG:{ Symbol:varItem.Draw.Icon.Symbol, Size:svgSize, Color:svgColor, YOffset:svgYOffset, VAlign:svgVAlign }
123993
124254
  };
123994
124255
 
@@ -124008,6 +124269,7 @@ function OverlayScriptIndex(name,script,args,option)
124008
124269
  chart.Texts= aryData;
124009
124270
  }
124010
124271
 
124272
+ chart.BuildCacheData();
124011
124273
  frame.ChartPaint.push(chart);
124012
124274
  }
124013
124275
 
@@ -124219,7 +124481,8 @@ function OverlayScriptIndex(name,script,args,option)
124219
124481
  if (varItem.Draw.AutoPosition) chart.AutoPosition=varItem.Draw.AutoPosition;
124220
124482
 
124221
124483
  this.ReloadChartResource(hqChart, windowIndex, chart);
124222
-
124484
+
124485
+ chart.BuildCacheData();
124223
124486
  this.SetChartIndexName(chart);
124224
124487
  frame.ChartPaint.push(chart);
124225
124488
  }
@@ -125358,8 +125621,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125358
125621
  drawItem.Name=draw.Name;
125359
125622
  drawItem.DrawType=draw.DrawType;
125360
125623
  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);
125624
+ drawItem.DrawData={ Data:draw.Data, Family:draw.Family, TextFont:draw.TextFont, EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125363
125625
  outVarItem.Draw=drawItem;
125364
125626
 
125365
125627
  result.push(outVarItem);
@@ -125850,8 +126112,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125850
126112
  drawItem.Name=draw.Name;
125851
126113
  drawItem.DrawType=draw.DrawType;
125852
126114
  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);
126115
+ drawItem.DrawData={ Data:draw.Data, Family:draw.Family, TextFont:draw.TextFont , EnableTooltip:draw.EnableTooltip, IsDrawFirst:draw.IsDrawFirst };
125855
126116
  outVarItem.Draw=drawItem;
125856
126117
 
125857
126118
  result.push(outVarItem);
@@ -141661,7 +141922,7 @@ function ScrollBarBGChart()
141661
141922
 
141662
141923
 
141663
141924
 
141664
- var HQCHART_VERSION="1.1.14304";
141925
+ var HQCHART_VERSION="1.1.14306";
141665
141926
 
141666
141927
  function PrintHQChartVersion()
141667
141928
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.14304";
8
+ var HQCHART_VERSION="1.1.14306";
9
9
 
10
10
  function PrintHQChartVersion()
11
11
  {