hqchart 1.1.14336 → 1.1.14349

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.
@@ -28443,6 +28443,12 @@ function IChartPainting()
28443
28443
 
28444
28444
  }
28445
28445
 
28446
+ this.BuildKey=function(item)
28447
+ {
28448
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
28449
+ else return item.Date;
28450
+ }
28451
+
28446
28452
  //数据导出 数据格式 [{ Title:数据名称, Data:[] }]
28447
28453
  //this.ExportData=function(aryKData) { }
28448
28454
 
@@ -35276,15 +35282,7 @@ function ChartOverlayKLine()
35276
35282
 
35277
35283
  if (!this.MainData || !this.Data) return range;
35278
35284
 
35279
- var firstOpen=null; //主线数据第1个收盘价
35280
- for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length && j<xPointCount;++i,++j)
35281
- {
35282
- var data=this.MainData.Data[i];
35283
- if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
35284
- firstOpen=data.Close;
35285
- break;
35286
- }
35287
-
35285
+ var firstOpen=this.GetFirstOpen();
35288
35286
  if (firstOpen==null) return range;
35289
35287
 
35290
35288
  var firstOverlayOpen=null;
@@ -44388,159 +44386,285 @@ function ChartMultiBar()
44388
44386
  delete this.newMethod;
44389
44387
 
44390
44388
  this.ClassName="ChartMultiBar";
44391
- this.Bars=[]; // [ {Point:[ {Index, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
44389
+ this.Bars=[]; // [ {Point:[ {Date, Time, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
44392
44390
  this.IsHScreen=false;
44393
44391
 
44392
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44393
+ this.GetKValue=ChartData.GetKValue;
44394
+
44395
+ this.GetItem=function(kItem)
44396
+ {
44397
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44398
+
44399
+ var key=this.BuildKey(kItem);
44400
+ if (!this.MapCache.has(key)) return null;
44401
+
44402
+ return this.MapCache.get(key);
44403
+ }
44404
+
44405
+ this.BuildCacheData=function()
44406
+ {
44407
+ var mapData=new Map();
44408
+ this.MapCache=mapData;
44409
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Bars)) return;
44410
+
44411
+ for(var i=0; i<this.Bars.length; ++i)
44412
+ {
44413
+ var groupItem=this.Bars[i];
44414
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44415
+
44416
+ var clrConfig= { Color:groupItem.Color, Width:5, Name:groupItem.Name, Type:0 };
44417
+ if (IFrameSplitOperator.IsNumber(groupItem.Width)) clrConfig.Width=groupItem.Width;
44418
+ if (IFrameSplitOperator.IsNumber(groupItem.Type)) clrConfig.Type=groupItem.Type;
44419
+
44420
+ for(var j=0; j<groupItem.Point.length; ++j)
44421
+ {
44422
+ var point=groupItem.Point[j];
44423
+ var key=this.BuildKey(point);
44424
+
44425
+ var item={ Data:point, ColorConfig:clrConfig }
44426
+ if (mapData.has(key))
44427
+ {
44428
+ var mapItem=mapData.get(key);
44429
+ mapItem.Data.push(item);
44430
+ }
44431
+ else
44432
+ {
44433
+ mapData.set(key,{ Data:[item] });
44434
+ }
44435
+ }
44436
+ }
44437
+ }
44438
+
44394
44439
  this.Draw=function()
44395
44440
  {
44396
44441
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44397
44442
  if (this.IsShowIndexTitleOnly()) return;
44398
44443
  if (this.IsHideScriptIndex()) return;
44399
- if (!this.Data || this.Data.length<=0) return;
44444
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44445
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Bars)) return;
44446
+ if (!this.MapCache || this.MapCache.size<=0) return;
44400
44447
 
44401
44448
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44402
44449
  var xPointCount=this.ChartFrame.XPointCount;
44403
- var offset=this.Data.DataOffset;
44404
44450
  var dataWidth=this.ChartFrame.DataWidth;
44405
- var pixelRatio=GetDevicePixelRatio();
44451
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44452
+ var isMinute=this.IsMinuteFrame();
44406
44453
 
44407
- var drawBars=[];
44408
- for(var i in this.Bars)
44454
+ var border=this.GetBorder();
44455
+ if (this.IsHScreen)
44409
44456
  {
44410
- var item=this.Bars[i];
44411
- var drawPoints={ Point:[], Color:item.Color, Width:dataWidth, Type:0 };
44412
- if (item.Type>0) drawPoints.Type=item.Type;
44413
- if (item.Width>0)
44414
- {
44415
- drawPoints.Width=item.Width*pixelRatio;
44416
- if (drawPoints.Width>dataWidth) drawPoints.Width=dataWidth;
44417
- }
44418
- else
44419
- {
44420
- if(drawPoints.Width<4) drawPoints.Width=1*pixelRatio;
44421
- }
44422
-
44423
- for(var j in item.Point)
44424
- {
44425
- var point=item.Point[j];
44426
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
44427
-
44428
- var index=point.Index-offset;
44429
- if (index>=0 && index<xPointCount)
44430
- {
44431
- var x=this.ChartFrame.GetXFromIndex(index);
44432
- var y=this.ChartFrame.GetYFromData(point.Value);
44433
- var y2=this.ChartFrame.GetYFromData(point.Value2);
44434
- drawPoints.Point.push({X:x, Y:y, Y2:y2});
44435
- }
44436
- }
44437
-
44438
- if (drawPoints.Point.length>0) drawBars.push(drawPoints)
44457
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44458
+ var chartright=border.BottomEx;
44459
+ var chartLeft=border.TopEx;
44439
44460
  }
44440
-
44441
- for(var i in drawBars)
44461
+ else
44442
44462
  {
44443
- var item=drawBars[i];
44444
- if (item.Width>=4)
44445
- {
44446
- if (item.Type==1) this.DrawHollowBar(item);
44447
- else this.DrawFillBar(item);
44448
- }
44449
- else
44450
- {
44451
- this.DrawLineBar(item);
44452
- }
44463
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44464
+ var chartright=border.RightEx;
44465
+ var chartLeft=border.LeftEx;
44453
44466
  }
44454
- }
44455
44467
 
44456
- this.DrawLineBar=function(bar)
44457
- {
44458
- this.Canvas.strokeStyle=bar.Color;
44459
- var backupLineWidth=this.Canvas.lineWidth;
44460
- this.Canvas.lineWidth=bar.Width;
44461
- for(var i in bar.Point)
44468
+ //计算所有柱子位置
44469
+ var mapBar=new Map();
44470
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44462
44471
  {
44463
- var item=bar.Point[i];
44472
+ var kItem=this.Data.Data[i];
44473
+ var key=this.BuildKey(kItem);
44474
+ if (!this.MapCache.has(key)) continue;
44475
+ var mapItem=this.MapCache.get(key);
44476
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44464
44477
 
44465
- this.Canvas.beginPath();
44466
- if (this.IsHScreen)
44478
+ if (isMinute)
44467
44479
  {
44468
- this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));
44469
- this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));
44480
+ var x=this.ChartFrame.GetXFromIndex(j);
44470
44481
  }
44471
44482
  else
44472
44483
  {
44473
- this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));
44474
- this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));
44484
+ var left=xOffset;
44485
+ var right=xOffset+dataWidth;
44486
+ if (right>chartright) break;
44487
+ var x=left+(right-left)/2;
44475
44488
  }
44476
-
44477
- this.Canvas.stroke();
44489
+
44490
+ this.CalculateItem(mapItem, kItem, x, mapBar);
44478
44491
  }
44479
44492
 
44480
- this.Canvas.lineWidth=backupLineWidth;
44493
+ if (mapBar.size<=0) return;
44494
+
44495
+ this.Canvas.save();
44496
+ this.ClipClient(this.IsHScreen);
44497
+
44498
+ this.DrawAllBar(mapBar);
44499
+
44500
+ this.Canvas.restore();
44481
44501
  }
44482
44502
 
44483
- this.DrawFillBar=function(bar)
44503
+ this.CalculateItem=function(groupItem, kItem, x, mapBar)
44484
44504
  {
44485
- this.Canvas.fillStyle=bar.Color;
44486
- for(var i in bar.Point)
44505
+ for(var i=0; i<groupItem.Data.length; ++i)
44487
44506
  {
44488
- var item=bar.Point[i];
44489
- var x=item.X-(bar.Width/2);
44490
- var y=Math.min(item.Y,item.Y2);
44491
- var barWidth=bar.Width;
44492
- var barHeight=Math.abs(item.Y-item.Y2);
44493
- if (this.IsHScreen)
44494
- this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth));
44495
- else
44496
- this.Canvas.fillRect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight));
44507
+ var item=groupItem.Data[i];
44508
+ var value=item.Data.Value;
44509
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44510
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44511
+
44512
+ var value2=item.Data.Value2;
44513
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=this.GetKValue(kItem,item.Data.Value2);
44514
+ if (!IFrameSplitOperator.IsNumber(value2)) continue;
44515
+
44516
+ var y=this.ChartFrame.GetYFromData(value, false);
44517
+ var y2=this.ChartFrame.GetYFromData(value2, false);
44518
+
44519
+ var strConfig=JSON.stringify(item.ColorConfig);
44520
+ if (!mapBar.has(strConfig)) mapBar.set(strConfig, { AryBar:[]});
44521
+ var mapItem=mapBar.get(strConfig);
44522
+
44523
+ mapItem.AryBar.push({ X:x, Y:y, Y2:y2, Data:item });
44497
44524
  }
44498
44525
  }
44499
44526
 
44500
- this.DrawHollowBar=function(bar) //空心柱子
44527
+
44528
+ this.DrawAllBar=function(mapBar)
44501
44529
  {
44502
- this.Canvas.strokeStyle=bar.Color;
44503
- var backupLineWidth=1;
44504
- for(var i in bar.Point)
44530
+ var pixelRatio=GetDevicePixelRatio();
44531
+
44532
+ for(var mapItem of mapBar)
44505
44533
  {
44506
- var item=bar.Point[i];
44507
- var x=item.X-(bar.Width/2);
44508
- var y=Math.min(item.Y,item.Y2);
44509
- var barWidth=bar.Width;
44510
- var barHeight=Math.abs(item.Y-item.Y2);
44511
- this.Canvas.beginPath();
44512
- if (this.IsHScreen)
44513
- this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedRect(barHeight),ToFixedRect(barWidth));
44514
- else
44515
- this.Canvas.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedRect(barWidth),ToFixedRect(barHeight));
44534
+ aryBar=mapItem[1].AryBar;
44535
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryBar)) continue;
44516
44536
 
44517
- this.Canvas.stroke();
44518
- }
44537
+ var config=null;
44538
+ var path=new Path2D();
44539
+ var count=0;
44540
+ var drawType=-1; //1=直线 2=实心 3=空心
44541
+ var barWidth=1;
44542
+ for(var i=0;i<aryBar.length;++i)
44543
+ {
44544
+ var item=aryBar[i];
44545
+ if (!config)
44546
+ {
44547
+ config=item.Data.ColorConfig;
44548
+ barWidth=config.Width*pixelRatio;
44549
+ if (barWidth>4)
44550
+ {
44551
+ if (config.Type==0) drawType=2; //实心
44552
+ else if (config.Type==1) drawType=3; //空心
44553
+ else continue;
44554
+ }
44555
+ else //太细了, 直线
44556
+ {
44557
+ drawType=1;
44558
+ }
44559
+ }
44519
44560
 
44520
- this.Canvas.lineWidth=backupLineWidth;
44561
+ if (drawType<=0) continue;
44562
+
44563
+ if (drawType==1)
44564
+ {
44565
+ this.Canvas.beginPath();
44566
+ if (this.IsHScreen)
44567
+ {
44568
+ this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));
44569
+ this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));
44570
+ }
44571
+ else
44572
+ {
44573
+ this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));
44574
+ this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));
44575
+ }
44576
+ ++count;
44577
+ }
44578
+ else if (drawType==2) //实心
44579
+ {
44580
+ var x=item.X-(barWidth/2);
44581
+ var y=Math.min(item.Y,item.Y2);
44582
+ var barWidth=barWidth;
44583
+ var barHeight=Math.abs(item.Y-item.Y2);
44584
+
44585
+ var barPath = new Path2D();
44586
+ if (this.IsHScreen)
44587
+ barPath.rect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth))
44588
+ else
44589
+ barPath.rect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight))
44590
+
44591
+ path.addPath(barPath);
44592
+ ++count;
44593
+ }
44594
+ else if (drawType==3) //空心
44595
+ {
44596
+ var x=item.X-(barWidth/2);
44597
+ var y=Math.min(item.Y,item.Y2);
44598
+ var barWidth=barWidth;
44599
+ var barHeight=Math.abs(item.Y-item.Y2);
44600
+
44601
+ var barPath = new Path2D();
44602
+ if (this.IsHScreen)
44603
+ barPath.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedPoint(barHeight),ToFixedPoint(barWidth))
44604
+ else
44605
+ barPath.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedPoint(barWidth),ToFixedPoint(barHeight))
44606
+
44607
+ path.addPath(barPath);
44608
+ ++count;
44609
+ }
44610
+ }
44611
+
44612
+
44613
+ if (count>0 && drawType>0 && config)
44614
+ {
44615
+ if (drawType==1)
44616
+ {
44617
+ this.Canvas.lineWidth=1*pixelRatio;
44618
+ this.Canvas.strokeStyle=config.Color;
44619
+ this.Canvas.stroke();
44620
+ }
44621
+ else if (drawType==2)
44622
+ {
44623
+ this.Canvas.fillStyle=config.Color; //背景填充颜色
44624
+ this.Canvas.fill(path);
44625
+ }
44626
+ else if (drawType==3)
44627
+ {
44628
+ this.Canvas.lineWidth=1*pixelRatio;
44629
+ this.Canvas.strokeStyle=config.Color;
44630
+ this.Canvas.stroke(path);
44631
+ }
44632
+ }
44633
+
44634
+ }
44521
44635
  }
44522
44636
 
44523
44637
  this.GetMaxMin=function()
44524
44638
  {
44525
44639
  var range={ Min:null, Max:null };
44640
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
44641
+ if (!this.MapCache || this.MapCache.size<=0) return range;
44526
44642
  var xPointCount=this.ChartFrame.XPointCount;
44527
- var start=this.Data.DataOffset;
44528
- var end=start+xPointCount;
44529
- for(var i in this.Bars)
44643
+
44644
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44530
44645
  {
44531
- var item=this.Bars[i];
44532
- for(var j in item.Point)
44646
+ var kItem=this.Data.Data[i];
44647
+ var key=this.BuildKey(kItem);
44648
+ if (!this.MapCache.has(key)) continue;
44649
+ var mapItem=this.MapCache.get(key);
44650
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44651
+
44652
+ for(k=0;k<mapItem.Data.length;++k)
44533
44653
  {
44534
- var point=item.Point[j];
44535
- if (point.Index>=start && point.Index<end)
44536
- {
44537
- var minValue=Math.min(point.Value,point.Value2);
44538
- var maxValue=Math.max(point.Value,point.Value2);
44539
- if (range.Max==null) range.Max=maxValue;
44540
- else if (range.Max<maxValue) range.Max=maxValue;
44541
- if (range.Min==null) range.Min=minValue;
44542
- else if (range.Min>minValue) range.Min=minValue;
44543
- }
44654
+ var item=mapItem.Data[k];
44655
+ var value=item.Data.Value;
44656
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44657
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44658
+ var value2=item.Data.Value2;
44659
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=this.GetKValue(kItem,item.Data.Value2);
44660
+ if (!IFrameSplitOperator.IsNumber(value2)) continue;
44661
+
44662
+ var minValue=Math.min(value, value2);
44663
+ var maxValue=Math.max(value, value2);
44664
+ if (range.Max==null) range.Max=maxValue;
44665
+ else if (range.Max<maxValue) range.Max=maxValue;
44666
+ if (range.Min==null) range.Min=minValue;
44667
+ else if (range.Min>minValue) range.Min=minValue;
44544
44668
  }
44545
44669
  }
44546
44670
 
@@ -44882,7 +45006,7 @@ function ChartMultiLine()
44882
45006
  }
44883
45007
  }
44884
45008
 
44885
- // 线段集合 支持横屏
45009
+ // 多个点集合2.0 支持横屏
44886
45010
  function ChartMultiPoint()
44887
45011
  {
44888
45012
  this.newMethod=IChartPainting; //派生
@@ -44900,12 +45024,6 @@ function ChartMultiPoint()
44900
45024
  this.MapCache=null; //key=date/date-time value={ Data:[] }
44901
45025
  this.GetKValue=ChartData.GetKValue;
44902
45026
 
44903
- this.BuildKey=function(item)
44904
- {
44905
- if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44906
- else return item.Date;
44907
- }
44908
-
44909
45027
  this.GetItem=function(kItem)
44910
45028
  {
44911
45029
  if (!this.MapCache || this.MapCache.size<=0) return null;
@@ -44929,6 +45047,7 @@ function ChartMultiPoint()
44929
45047
 
44930
45048
  var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44931
45049
  if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
45050
+ if (IFrameSplitOperator.IsNumber(groupItem.LineWidth)) clrConfig.LineWidth=groupItem.LineWidth;
44932
45051
 
44933
45052
  for(var j=0; j<groupItem.Point.length; ++j)
44934
45053
  {
@@ -45053,7 +45172,7 @@ function ChartMultiPoint()
45053
45172
  if (this.IsHScreen)
45054
45173
  pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
45055
45174
  else
45056
- pointPath.arc(item.X,item.Y,config.Radius**pixelRatio,0,360,false);
45175
+ pointPath.arc(item.X,item.Y,config.Radius*pixelRatio,0,360,false);
45057
45176
 
45058
45177
  path.addPath(pointPath);
45059
45178
  ++count;
@@ -45081,7 +45200,7 @@ function ChartMultiPoint()
45081
45200
  {
45082
45201
  var range={ Min:null, Max:null };
45083
45202
  if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45084
- if (!this.MapCache || this.MapCache.size<=0) return;
45203
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45085
45204
  var xPointCount=this.ChartFrame.XPointCount;
45086
45205
 
45087
45206
  for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
@@ -45110,7 +45229,7 @@ function ChartMultiPoint()
45110
45229
  }
45111
45230
  }
45112
45231
 
45113
- // 多文本集合 支持横屏
45232
+ // 多文本集合2.0 支持横屏
45114
45233
  function ChartMultiText()
45115
45234
  {
45116
45235
  this.newMethod=IChartPainting; //派生
@@ -45118,58 +45237,38 @@ function ChartMultiText()
45118
45237
  delete this.newMethod;
45119
45238
 
45120
45239
  this.ClassName="ChartMultiText";
45121
- this.Texts=[]; //[ {Index:, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 }} ]
45240
+ this.Texts=[]; //[ {Date:, Time, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 }} ]
45122
45241
  this.Font=g_JSChartResource.DefaultTextFont;
45123
45242
  this.Color=g_JSChartResource.DefaultTextColor;
45124
45243
  this.IsHScreen=false; //是否横屏
45125
45244
 
45126
- this.BuildKey=function(item)
45127
- {
45128
- if (IFrameSplitOperator.IsNumber(item.Time))
45129
- {
45130
- var key=`${item.Date}-${item.Time}`;
45131
- }
45132
- else
45133
- {
45134
- var key=`${item.Date}`;
45135
- }
45136
-
45137
- return key;
45138
- }
45245
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
45246
+ this.GetKValue=ChartData.GetKValue;
45139
45247
 
45140
- this.GetShowTextData=function()
45248
+ this.BuildCacheData=function()
45141
45249
  {
45142
- var xPointCount=this.ChartFrame.XPointCount;
45143
- var offset=this.Data.DataOffset;
45250
+ var mapData=new Map();
45251
+ this.MapCache=mapData;
45252
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45144
45253
 
45145
- var mapText=new Map(); //key='date-time' value={ Data:[] }
45146
- for(var i=0; i<this.Texts.length; ++i)
45254
+ for(var i=0;i<this.Texts.length;++i)
45147
45255
  {
45148
45256
  var item=this.Texts[i];
45149
- if (!item.Text) continue;
45150
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
45151
-
45152
- var index=item.Index-offset;
45153
- if (index>=0 && index<xPointCount)
45257
+ var key=this.BuildKey(item);
45258
+ if (mapData.has(key))
45154
45259
  {
45155
- var key=this.BuildKey(item);
45156
- if (mapText.has(key))
45157
- {
45158
- var textItem=mapText.get(key);
45159
- textItem.Data.push(item);
45160
- }
45161
- else
45162
- {
45163
- var textItem={ Data:[item] };
45164
- mapText.set(key, textItem);
45165
- }
45260
+ var mapItem=mapData.get(key);
45261
+ mapItem.Data.push(item);
45262
+ }
45263
+ else
45264
+ {
45265
+ mapData.set(key,{ Data:[item] });
45166
45266
  }
45167
45267
  }
45168
-
45169
- return mapText;
45170
45268
  }
45171
45269
 
45172
- this.DrawAllText=function(mapText)
45270
+
45271
+ this.DrawAllText=function()
45173
45272
  {
45174
45273
  var bHScreen=(this.ChartFrame.IsHScreen===true);
45175
45274
  var isMinute=this.IsMinuteFrame();
@@ -45206,21 +45305,29 @@ function ChartMultiText()
45206
45305
  if (!kItem) continue;
45207
45306
 
45208
45307
  var key=this.BuildKey(kItem);
45209
- if (!mapText.has(key)) continue;
45308
+ if (!this.MapCache.has(key)) continue;
45309
+ var mapItem=this.MapCache.get(key);
45310
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45210
45311
 
45211
45312
  var left=xOffset;
45212
45313
  var right=xOffset+dataWidth;
45213
45314
  if (right>chartright) break;
45214
45315
  var x=left+(right-left)/2;
45215
45316
 
45216
- var textItem=mapText.get(key);
45217
- for(var k=0;k<textItem.Data.length;++k)
45317
+ for(var k=0;k<mapItem.Data.length;++k)
45218
45318
  {
45219
- var item=textItem.Data[k];
45319
+ var item=mapItem.Data[k];
45220
45320
  var y=top;
45221
45321
  if (item.Value=="TOP") y=top;
45222
45322
  else if (item.Value=="BOTTOM") y=bottom;
45223
- else y=this.ChartFrame.GetYFromData(item.Value, false);
45323
+ else
45324
+ {
45325
+ var price=item.Value;
45326
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
45327
+
45328
+ y=this.ChartFrame.GetYFromData(price, false);
45329
+ }
45330
+
45224
45331
 
45225
45332
  if (item.Color) this.Canvas.fillStyle = item.Color;
45226
45333
  else this.Canvas.fillStyle = this.Color;
@@ -45305,18 +45412,16 @@ function ChartMultiText()
45305
45412
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
45306
45413
  if (this.IsShowIndexTitleOnly()) return;
45307
45414
  if (this.IsHideScriptIndex()) return;
45308
- if (!this.Data || this.Data.length<=0) return;
45309
- if (!this.Texts) return;
45415
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
45416
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45417
+ if (!this.MapCache || this.MapCache.size<=0) return;
45310
45418
 
45311
45419
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45312
45420
 
45313
- var mapText=this.GetShowTextData();
45314
- if (mapText.size<=0) return;
45315
-
45316
45421
  this.Canvas.save();
45317
45422
  this.ClipClient(this.IsHScreen);
45318
45423
 
45319
- this.DrawAllText(mapText);
45424
+ this.DrawAllText();
45320
45425
 
45321
45426
  this.Canvas.restore();
45322
45427
  }
@@ -45326,21 +45431,29 @@ function ChartMultiText()
45326
45431
  var range={ Min:null, Max:null };
45327
45432
  if (!this.Texts) return range;
45328
45433
 
45434
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45435
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45329
45436
  var xPointCount=this.ChartFrame.XPointCount;
45330
- var start=this.Data.DataOffset;
45331
- var end=start+xPointCount;
45332
45437
 
45333
- for(var i in this.Texts)
45438
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45334
45439
  {
45335
- var item=this.Texts[i];
45336
- if (!IFrameSplitOperator.IsNumber(item.Value)) continue;
45440
+ var kItem=this.Data.Data[i];
45441
+ var key=this.BuildKey(kItem);
45442
+ if (!this.MapCache.has(key)) continue;
45443
+ var mapItem=this.MapCache.get(key);
45444
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45337
45445
 
45338
- if (item.Index>=start && item.Index<end)
45446
+ for(k=0;k<mapItem.Data.length;++k)
45339
45447
  {
45340
- if (range.Max==null) range.Max=item.Value;
45341
- else if (range.Max<item.Value) range.Max=item.Value;
45342
- if (range.Min==null) range.Min=item.Value;
45343
- else if (range.Min>item.Value) range.Min=item.Value;
45448
+ var item=mapItem.Data[k];
45449
+ var value=item.Value;
45450
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
45451
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45452
+
45453
+ if (range.Max==null) range.Max=value;
45454
+ else if (range.Max<value) range.Max=value;
45455
+ if (range.Min==null) range.Min=value;
45456
+ else if (range.Min>value) range.Min=value;
45344
45457
  }
45345
45458
  }
45346
45459
 
@@ -45857,7 +45970,7 @@ function ChartMultiHtmlDom()
45857
45970
  }
45858
45971
  }
45859
45972
 
45860
- //绘制SVG图标
45973
+ //绘制SVG图标 2.0
45861
45974
  function ChartDrawSVG()
45862
45975
  {
45863
45976
  this.newMethod=IChartPainting; //派生
@@ -61471,6 +61584,41 @@ function DynamicChartTitlePainting()
61471
61584
  return aryText;
61472
61585
  }
61473
61586
 
61587
+ this.ForamtMultiBarTitle=function(dataIndex, dataInfo)
61588
+ {
61589
+ if (!dataInfo.GetItemCallback) return null;
61590
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61591
+ var kItem=dataInfo.Data.Data[dataIndex];
61592
+ if (!kItem) return null;
61593
+
61594
+ var group=dataInfo.GetItemCallback(kItem);
61595
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61596
+
61597
+ var aryText=[];
61598
+ for(var i=0;i<group.Data.length;++i)
61599
+ {
61600
+ var item=group.Data[i];
61601
+ var config=item.ColorConfig;
61602
+
61603
+ var color=null;
61604
+ if (config.BGColor) color=config.BGColor;
61605
+ else if (config.Color) color=config.Color;
61606
+
61607
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61608
+
61609
+ var value=item.Data.Value;
61610
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61611
+
61612
+ var value2=item.Data.Value2;
61613
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=ChartData.GetKValue(kItem, item.Data.Value2);
61614
+ aryText.push({ Text:`[${this.FormatValue(value, dataInfo)}, ${this.FormatValue(value2, dataInfo)}] `, Color:color});
61615
+ }
61616
+
61617
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
61618
+
61619
+ return aryText;
61620
+ }
61621
+
61474
61622
  this.FormatVPVRTitle=function(pt, dataInfo)
61475
61623
  {
61476
61624
  var chart=dataInfo.Chart;
@@ -61814,6 +61962,12 @@ function DynamicChartTitlePainting()
61814
61962
  if (!aryText) return null;
61815
61963
  return { Text:null, ArrayText:aryText };
61816
61964
  }
61965
+ else if (item.DataType=="ChartMultiBar")
61966
+ {
61967
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
61968
+ if (!aryText) return null;
61969
+ return { Text:null, ArrayText:aryText };
61970
+ }
61817
61971
 
61818
61972
  value=item.Data.Data[dataIndex];
61819
61973
 
@@ -62239,6 +62393,11 @@ function DynamicChartTitlePainting()
62239
62393
  aryText=this.ForamtMultiPointTitle(dataIndex, item);
62240
62394
  if (!aryText) continue;
62241
62395
  }
62396
+ else if (item.DataType=="ChartMultiBar")
62397
+ {
62398
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
62399
+ if (!aryText) continue;
62400
+ }
62242
62401
  else
62243
62402
  {
62244
62403
  valueText=this.FormatValue(value,item);
@@ -123267,7 +123426,7 @@ function ScriptIndex(name,script,args,option)
123267
123426
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123268
123427
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123269
123428
 
123270
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123429
+ chart.Data=hqChart.GetKData(); //绑定K线
123271
123430
  chart.PointGroup=varItem.Draw.DrawData;
123272
123431
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123273
123432
  chart.BuildCacheData();
@@ -123290,17 +123449,18 @@ function ScriptIndex(name,script,args,option)
123290
123449
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123291
123450
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123292
123451
 
123293
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123452
+ chart.Data=hqChart.GetKData();//绑定K线
123294
123453
  chart.Bars=varItem.Draw.DrawData;
123295
-
123296
- var titleIndex=windowIndex+1;
123297
- var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
123298
- titleData.IsShow=false;
123299
- titleData.DataType="MULTI_BAR";
123300
- hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123454
+ chart.BuildCacheData();
123301
123455
 
123302
123456
  this.SetChartIndexName(chart);
123303
123457
  hqChart.ChartPaint.push(chart);
123458
+
123459
+ var titleIndex=windowIndex+1;
123460
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
123461
+ titleData.DataType="ChartMultiBar";
123462
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123463
+ hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123304
123464
  }
123305
123465
 
123306
123466
  this.CreateMultiText=function(hqChart,windowIndex,varItem,i)
@@ -123311,8 +123471,10 @@ function ScriptIndex(name,script,args,option)
123311
123471
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123312
123472
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123313
123473
 
123314
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123474
+ chart.Data=hqChart.GetKData();//绑定K线
123315
123475
  chart.Texts=varItem.Draw.DrawData;
123476
+ chart.BuildCacheData();
123477
+
123316
123478
  this.SetChartIndexName(chart);
123317
123479
  hqChart.ChartPaint.push(chart);
123318
123480
  }
@@ -123325,7 +123487,7 @@ function ScriptIndex(name,script,args,option)
123325
123487
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123326
123488
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123327
123489
 
123328
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123490
+ chart.Data=hqChart.GetKData();//绑定K线
123329
123491
  chart.Family=varItem.Draw.DrawData.Family;
123330
123492
  chart.AryIcon= varItem.Draw.DrawData.Icon;
123331
123493
  chart.BuildCacheData();
@@ -123341,10 +123503,8 @@ function ScriptIndex(name,script,args,option)
123341
123503
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123342
123504
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123343
123505
 
123344
- if (hqChart.ChartPaint[0].IsMinuteFrame())
123345
- chart.Data=hqChart.SourceData;
123346
- else
123347
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123506
+
123507
+ chart.Data=hqChart.GetKData()
123348
123508
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
123349
123509
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
123350
123510
  if (varItem.Draw.BuildKeyCallback) chart.BuildKeyCallback=varItem.Draw.BuildKeyCallback;
@@ -124852,11 +125012,7 @@ function OverlayScriptIndex(name,script,args,option)
124852
125012
  chart.ChartFrame=frame.Frame;
124853
125013
  chart.Identify=overlayIndex.Identify;
124854
125014
 
124855
- if (hqChart.ChartPaint[0].IsMinuteFrame())
124856
- chart.Data=hqChart.SourceData;
124857
- else
124858
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
124859
-
125015
+ chart.Data=hqChart.GetKData();
124860
125016
  chart.Family=varItem.Draw.Icon.Family;
124861
125017
  chart.TextFont=g_JSChartResource.TIPICON.TextFont;
124862
125018
 
@@ -125004,7 +125160,7 @@ function OverlayScriptIndex(name,script,args,option)
125004
125160
  chart.ChartFrame=frame.Frame;
125005
125161
  chart.Identify=overlayIndex.Identify;
125006
125162
 
125007
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125163
+ chart.Data=hqChart.GetKData();//绑定K线
125008
125164
  chart.PointGroup=varItem.Draw.DrawData;
125009
125165
  chart.BuildCacheData();
125010
125166
 
@@ -125054,14 +125210,16 @@ function OverlayScriptIndex(name,script,args,option)
125054
125210
  chart.ChartFrame=frame.Frame;
125055
125211
  chart.Identify=overlayIndex.Identify;
125056
125212
 
125057
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125213
+ chart.Data=hqChart.GetKData();//绑定K线
125058
125214
  chart.Bars=varItem.Draw.DrawData;
125215
+ chart.BuildCacheData();
125059
125216
 
125060
125217
  var titleIndex=windowIndex+1;
125061
125218
  var titlePaint=hqChart.TitlePaint[titleIndex];
125062
- var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
125063
- titleData.IsShow=false;
125064
- titleData.DataType="MULTI_BAR";
125219
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
125220
+ titleData.DataType="ChartMultiBar";
125221
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
125222
+
125065
125223
  titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
125066
125224
 
125067
125225
  this.SetChartIndexName(chart);
@@ -125079,8 +125237,10 @@ function OverlayScriptIndex(name,script,args,option)
125079
125237
  chart.ChartFrame=frame.Frame;
125080
125238
  chart.Identify=overlayIndex.Identify;
125081
125239
 
125082
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125240
+ chart.Data=hqChart.GetKData();//绑定K线
125083
125241
  chart.Texts=varItem.Draw.DrawData;
125242
+ chart.BuildCacheData();
125243
+
125084
125244
  this.SetChartIndexName(chart);
125085
125245
  frame.ChartPaint.push(chart);
125086
125246
  }
@@ -125096,7 +125256,7 @@ function OverlayScriptIndex(name,script,args,option)
125096
125256
  chart.ChartFrame=frame.Frame;
125097
125257
  chart.Identify=overlayIndex.Identify;
125098
125258
 
125099
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125259
+ chart.Data=hqChart.GetKData();//绑定K线
125100
125260
  chart.Family=varItem.Draw.DrawData.Family;
125101
125261
  chart.AryIcon= varItem.Draw.DrawData.Icon;
125102
125262
  chart.BuildCacheData();
@@ -125114,11 +125274,8 @@ function OverlayScriptIndex(name,script,args,option)
125114
125274
  chart.ChartBorder=frame.Frame.ChartBorder;
125115
125275
  chart.ChartFrame=frame.Frame;
125116
125276
  chart.Identify=overlayIndex.Identify;
125117
-
125118
- if (hqChart.ChartPaint[0].IsMinuteFrame())
125119
- chart.Data=hqChart.SourceData;
125120
- else
125121
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125277
+ chart.Data=hqChart.GetKData();
125278
+
125122
125279
 
125123
125280
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
125124
125281
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
@@ -126223,7 +126380,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126223
126380
  drawItem.Text=draw.Text;
126224
126381
  drawItem.Name=draw.Name;
126225
126382
  drawItem.DrawType=draw.DrawType;
126226
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126383
+ drawItem.DrawData=draw.DrawData;
126227
126384
  outVarItem.Draw=drawItem;
126228
126385
 
126229
126386
  result.push(outVarItem);
@@ -126274,8 +126431,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126274
126431
  drawItem.Text=draw.Text;
126275
126432
  drawItem.Name=draw.Name;
126276
126433
  drawItem.DrawType=draw.DrawType;
126277
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126278
- this.GetKLineData(drawItem.DrawData, hqChart);
126434
+ drawItem.DrawData=draw.DrawData;
126279
126435
  outVarItem.Draw=drawItem;
126280
126436
  result.push(outVarItem);
126281
126437
  }
@@ -126770,8 +126926,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126770
126926
  drawItem.Text=draw.Text;
126771
126927
  drawItem.Name=draw.Name;
126772
126928
  drawItem.DrawType=draw.DrawType;
126773
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126774
- this.GetKLineData(drawItem.DrawData, hqChart);
126929
+ drawItem.DrawData=draw.DrawData;
126775
126930
  outVarItem.Draw=drawItem;
126776
126931
  result.push(outVarItem);
126777
126932
  }
@@ -152220,7 +152375,7 @@ function HQChartScriptWorker()
152220
152375
 
152221
152376
 
152222
152377
 
152223
- var HQCHART_VERSION="1.1.14335";
152378
+ var HQCHART_VERSION="1.1.14348";
152224
152379
 
152225
152380
  function PrintHQChartVersion()
152226
152381
  {