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.
@@ -28399,6 +28399,12 @@ function IChartPainting()
28399
28399
 
28400
28400
  }
28401
28401
 
28402
+ this.BuildKey=function(item)
28403
+ {
28404
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
28405
+ else return item.Date;
28406
+ }
28407
+
28402
28408
  //数据导出 数据格式 [{ Title:数据名称, Data:[] }]
28403
28409
  //this.ExportData=function(aryKData) { }
28404
28410
 
@@ -35232,15 +35238,7 @@ function ChartOverlayKLine()
35232
35238
 
35233
35239
  if (!this.MainData || !this.Data) return range;
35234
35240
 
35235
- var firstOpen=null; //主线数据第1个收盘价
35236
- for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length && j<xPointCount;++i,++j)
35237
- {
35238
- var data=this.MainData.Data[i];
35239
- if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
35240
- firstOpen=data.Close;
35241
- break;
35242
- }
35243
-
35241
+ var firstOpen=this.GetFirstOpen();
35244
35242
  if (firstOpen==null) return range;
35245
35243
 
35246
35244
  var firstOverlayOpen=null;
@@ -44344,159 +44342,285 @@ function ChartMultiBar()
44344
44342
  delete this.newMethod;
44345
44343
 
44346
44344
  this.ClassName="ChartMultiBar";
44347
- this.Bars=[]; // [ {Point:[ {Index, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
44345
+ this.Bars=[]; // [ {Point:[ {Date, Time, Value, Value2 }, ], Color:, Width: , Type: 0 实心 1 空心 }, ]
44348
44346
  this.IsHScreen=false;
44349
44347
 
44348
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44349
+ this.GetKValue=ChartData.GetKValue;
44350
+
44351
+ this.GetItem=function(kItem)
44352
+ {
44353
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44354
+
44355
+ var key=this.BuildKey(kItem);
44356
+ if (!this.MapCache.has(key)) return null;
44357
+
44358
+ return this.MapCache.get(key);
44359
+ }
44360
+
44361
+ this.BuildCacheData=function()
44362
+ {
44363
+ var mapData=new Map();
44364
+ this.MapCache=mapData;
44365
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Bars)) return;
44366
+
44367
+ for(var i=0; i<this.Bars.length; ++i)
44368
+ {
44369
+ var groupItem=this.Bars[i];
44370
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44371
+
44372
+ var clrConfig= { Color:groupItem.Color, Width:5, Name:groupItem.Name, Type:0 };
44373
+ if (IFrameSplitOperator.IsNumber(groupItem.Width)) clrConfig.Width=groupItem.Width;
44374
+ if (IFrameSplitOperator.IsNumber(groupItem.Type)) clrConfig.Type=groupItem.Type;
44375
+
44376
+ for(var j=0; j<groupItem.Point.length; ++j)
44377
+ {
44378
+ var point=groupItem.Point[j];
44379
+ var key=this.BuildKey(point);
44380
+
44381
+ var item={ Data:point, ColorConfig:clrConfig }
44382
+ if (mapData.has(key))
44383
+ {
44384
+ var mapItem=mapData.get(key);
44385
+ mapItem.Data.push(item);
44386
+ }
44387
+ else
44388
+ {
44389
+ mapData.set(key,{ Data:[item] });
44390
+ }
44391
+ }
44392
+ }
44393
+ }
44394
+
44350
44395
  this.Draw=function()
44351
44396
  {
44352
44397
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44353
44398
  if (this.IsShowIndexTitleOnly()) return;
44354
44399
  if (this.IsHideScriptIndex()) return;
44355
- if (!this.Data || this.Data.length<=0) return;
44400
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44401
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Bars)) return;
44402
+ if (!this.MapCache || this.MapCache.size<=0) return;
44356
44403
 
44357
44404
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44358
44405
  var xPointCount=this.ChartFrame.XPointCount;
44359
- var offset=this.Data.DataOffset;
44360
44406
  var dataWidth=this.ChartFrame.DataWidth;
44361
- var pixelRatio=GetDevicePixelRatio();
44407
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44408
+ var isMinute=this.IsMinuteFrame();
44362
44409
 
44363
- var drawBars=[];
44364
- for(var i in this.Bars)
44410
+ var border=this.GetBorder();
44411
+ if (this.IsHScreen)
44365
44412
  {
44366
- var item=this.Bars[i];
44367
- var drawPoints={ Point:[], Color:item.Color, Width:dataWidth, Type:0 };
44368
- if (item.Type>0) drawPoints.Type=item.Type;
44369
- if (item.Width>0)
44370
- {
44371
- drawPoints.Width=item.Width*pixelRatio;
44372
- if (drawPoints.Width>dataWidth) drawPoints.Width=dataWidth;
44373
- }
44374
- else
44375
- {
44376
- if(drawPoints.Width<4) drawPoints.Width=1*pixelRatio;
44377
- }
44378
-
44379
- for(var j in item.Point)
44380
- {
44381
- var point=item.Point[j];
44382
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
44383
-
44384
- var index=point.Index-offset;
44385
- if (index>=0 && index<xPointCount)
44386
- {
44387
- var x=this.ChartFrame.GetXFromIndex(index);
44388
- var y=this.ChartFrame.GetYFromData(point.Value);
44389
- var y2=this.ChartFrame.GetYFromData(point.Value2);
44390
- drawPoints.Point.push({X:x, Y:y, Y2:y2});
44391
- }
44392
- }
44393
-
44394
- if (drawPoints.Point.length>0) drawBars.push(drawPoints)
44413
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44414
+ var chartright=border.BottomEx;
44415
+ var chartLeft=border.TopEx;
44395
44416
  }
44396
-
44397
- for(var i in drawBars)
44417
+ else
44398
44418
  {
44399
- var item=drawBars[i];
44400
- if (item.Width>=4)
44401
- {
44402
- if (item.Type==1) this.DrawHollowBar(item);
44403
- else this.DrawFillBar(item);
44404
- }
44405
- else
44406
- {
44407
- this.DrawLineBar(item);
44408
- }
44419
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44420
+ var chartright=border.RightEx;
44421
+ var chartLeft=border.LeftEx;
44409
44422
  }
44410
- }
44411
44423
 
44412
- this.DrawLineBar=function(bar)
44413
- {
44414
- this.Canvas.strokeStyle=bar.Color;
44415
- var backupLineWidth=this.Canvas.lineWidth;
44416
- this.Canvas.lineWidth=bar.Width;
44417
- for(var i in bar.Point)
44424
+ //计算所有柱子位置
44425
+ var mapBar=new Map();
44426
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44418
44427
  {
44419
- var item=bar.Point[i];
44428
+ var kItem=this.Data.Data[i];
44429
+ var key=this.BuildKey(kItem);
44430
+ if (!this.MapCache.has(key)) continue;
44431
+ var mapItem=this.MapCache.get(key);
44432
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44420
44433
 
44421
- this.Canvas.beginPath();
44422
- if (this.IsHScreen)
44434
+ if (isMinute)
44423
44435
  {
44424
- this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));
44425
- this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));
44436
+ var x=this.ChartFrame.GetXFromIndex(j);
44426
44437
  }
44427
44438
  else
44428
44439
  {
44429
- this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));
44430
- this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));
44440
+ var left=xOffset;
44441
+ var right=xOffset+dataWidth;
44442
+ if (right>chartright) break;
44443
+ var x=left+(right-left)/2;
44431
44444
  }
44432
-
44433
- this.Canvas.stroke();
44445
+
44446
+ this.CalculateItem(mapItem, kItem, x, mapBar);
44434
44447
  }
44435
44448
 
44436
- this.Canvas.lineWidth=backupLineWidth;
44449
+ if (mapBar.size<=0) return;
44450
+
44451
+ this.Canvas.save();
44452
+ this.ClipClient(this.IsHScreen);
44453
+
44454
+ this.DrawAllBar(mapBar);
44455
+
44456
+ this.Canvas.restore();
44437
44457
  }
44438
44458
 
44439
- this.DrawFillBar=function(bar)
44459
+ this.CalculateItem=function(groupItem, kItem, x, mapBar)
44440
44460
  {
44441
- this.Canvas.fillStyle=bar.Color;
44442
- for(var i in bar.Point)
44461
+ for(var i=0; i<groupItem.Data.length; ++i)
44443
44462
  {
44444
- var item=bar.Point[i];
44445
- var x=item.X-(bar.Width/2);
44446
- var y=Math.min(item.Y,item.Y2);
44447
- var barWidth=bar.Width;
44448
- var barHeight=Math.abs(item.Y-item.Y2);
44449
- if (this.IsHScreen)
44450
- this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth));
44451
- else
44452
- this.Canvas.fillRect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight));
44463
+ var item=groupItem.Data[i];
44464
+ var value=item.Data.Value;
44465
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44466
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44467
+
44468
+ var value2=item.Data.Value2;
44469
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=this.GetKValue(kItem,item.Data.Value2);
44470
+ if (!IFrameSplitOperator.IsNumber(value2)) continue;
44471
+
44472
+ var y=this.ChartFrame.GetYFromData(value, false);
44473
+ var y2=this.ChartFrame.GetYFromData(value2, false);
44474
+
44475
+ var strConfig=JSON.stringify(item.ColorConfig);
44476
+ if (!mapBar.has(strConfig)) mapBar.set(strConfig, { AryBar:[]});
44477
+ var mapItem=mapBar.get(strConfig);
44478
+
44479
+ mapItem.AryBar.push({ X:x, Y:y, Y2:y2, Data:item });
44453
44480
  }
44454
44481
  }
44455
44482
 
44456
- this.DrawHollowBar=function(bar) //空心柱子
44483
+
44484
+ this.DrawAllBar=function(mapBar)
44457
44485
  {
44458
- this.Canvas.strokeStyle=bar.Color;
44459
- var backupLineWidth=1;
44460
- for(var i in bar.Point)
44486
+ var pixelRatio=GetDevicePixelRatio();
44487
+
44488
+ for(var mapItem of mapBar)
44461
44489
  {
44462
- var item=bar.Point[i];
44463
- var x=item.X-(bar.Width/2);
44464
- var y=Math.min(item.Y,item.Y2);
44465
- var barWidth=bar.Width;
44466
- var barHeight=Math.abs(item.Y-item.Y2);
44467
- this.Canvas.beginPath();
44468
- if (this.IsHScreen)
44469
- this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedRect(barHeight),ToFixedRect(barWidth));
44470
- else
44471
- this.Canvas.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedRect(barWidth),ToFixedRect(barHeight));
44490
+ aryBar=mapItem[1].AryBar;
44491
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryBar)) continue;
44472
44492
 
44473
- this.Canvas.stroke();
44474
- }
44493
+ var config=null;
44494
+ var path=new Path2D();
44495
+ var count=0;
44496
+ var drawType=-1; //1=直线 2=实心 3=空心
44497
+ var barWidth=1;
44498
+ for(var i=0;i<aryBar.length;++i)
44499
+ {
44500
+ var item=aryBar[i];
44501
+ if (!config)
44502
+ {
44503
+ config=item.Data.ColorConfig;
44504
+ barWidth=config.Width*pixelRatio;
44505
+ if (barWidth>4)
44506
+ {
44507
+ if (config.Type==0) drawType=2; //实心
44508
+ else if (config.Type==1) drawType=3; //空心
44509
+ else continue;
44510
+ }
44511
+ else //太细了, 直线
44512
+ {
44513
+ drawType=1;
44514
+ }
44515
+ }
44475
44516
 
44476
- this.Canvas.lineWidth=backupLineWidth;
44517
+ if (drawType<=0) continue;
44518
+
44519
+ if (drawType==1)
44520
+ {
44521
+ this.Canvas.beginPath();
44522
+ if (this.IsHScreen)
44523
+ {
44524
+ this.Canvas.moveTo(ToFixedPoint(item.Y),ToFixedPoint(item.X));
44525
+ this.Canvas.lineTo(ToFixedPoint(item.Y2),ToFixedPoint(item.X));
44526
+ }
44527
+ else
44528
+ {
44529
+ this.Canvas.moveTo(ToFixedPoint(item.X),ToFixedPoint(item.Y));
44530
+ this.Canvas.lineTo(ToFixedPoint(item.X),ToFixedPoint(item.Y2));
44531
+ }
44532
+ ++count;
44533
+ }
44534
+ else if (drawType==2) //实心
44535
+ {
44536
+ var x=item.X-(barWidth/2);
44537
+ var y=Math.min(item.Y,item.Y2);
44538
+ var barWidth=barWidth;
44539
+ var barHeight=Math.abs(item.Y-item.Y2);
44540
+
44541
+ var barPath = new Path2D();
44542
+ if (this.IsHScreen)
44543
+ barPath.rect(ToFixedRect(y),ToFixedRect(x),ToFixedRect(barHeight),ToFixedRect(barWidth))
44544
+ else
44545
+ barPath.rect(ToFixedRect(x),ToFixedRect(y),ToFixedRect(barWidth),ToFixedRect(barHeight))
44546
+
44547
+ path.addPath(barPath);
44548
+ ++count;
44549
+ }
44550
+ else if (drawType==3) //空心
44551
+ {
44552
+ var x=item.X-(barWidth/2);
44553
+ var y=Math.min(item.Y,item.Y2);
44554
+ var barWidth=barWidth;
44555
+ var barHeight=Math.abs(item.Y-item.Y2);
44556
+
44557
+ var barPath = new Path2D();
44558
+ if (this.IsHScreen)
44559
+ barPath.rect(ToFixedPoint(y),ToFixedPoint(x),ToFixedPoint(barHeight),ToFixedPoint(barWidth))
44560
+ else
44561
+ barPath.rect(ToFixedPoint(x),ToFixedPoint(y),ToFixedPoint(barWidth),ToFixedPoint(barHeight))
44562
+
44563
+ path.addPath(barPath);
44564
+ ++count;
44565
+ }
44566
+ }
44567
+
44568
+
44569
+ if (count>0 && drawType>0 && config)
44570
+ {
44571
+ if (drawType==1)
44572
+ {
44573
+ this.Canvas.lineWidth=1*pixelRatio;
44574
+ this.Canvas.strokeStyle=config.Color;
44575
+ this.Canvas.stroke();
44576
+ }
44577
+ else if (drawType==2)
44578
+ {
44579
+ this.Canvas.fillStyle=config.Color; //背景填充颜色
44580
+ this.Canvas.fill(path);
44581
+ }
44582
+ else if (drawType==3)
44583
+ {
44584
+ this.Canvas.lineWidth=1*pixelRatio;
44585
+ this.Canvas.strokeStyle=config.Color;
44586
+ this.Canvas.stroke(path);
44587
+ }
44588
+ }
44589
+
44590
+ }
44477
44591
  }
44478
44592
 
44479
44593
  this.GetMaxMin=function()
44480
44594
  {
44481
44595
  var range={ Min:null, Max:null };
44596
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
44597
+ if (!this.MapCache || this.MapCache.size<=0) return range;
44482
44598
  var xPointCount=this.ChartFrame.XPointCount;
44483
- var start=this.Data.DataOffset;
44484
- var end=start+xPointCount;
44485
- for(var i in this.Bars)
44599
+
44600
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44486
44601
  {
44487
- var item=this.Bars[i];
44488
- for(var j in item.Point)
44602
+ var kItem=this.Data.Data[i];
44603
+ var key=this.BuildKey(kItem);
44604
+ if (!this.MapCache.has(key)) continue;
44605
+ var mapItem=this.MapCache.get(key);
44606
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44607
+
44608
+ for(k=0;k<mapItem.Data.length;++k)
44489
44609
  {
44490
- var point=item.Point[j];
44491
- if (point.Index>=start && point.Index<end)
44492
- {
44493
- var minValue=Math.min(point.Value,point.Value2);
44494
- var maxValue=Math.max(point.Value,point.Value2);
44495
- if (range.Max==null) range.Max=maxValue;
44496
- else if (range.Max<maxValue) range.Max=maxValue;
44497
- if (range.Min==null) range.Min=minValue;
44498
- else if (range.Min>minValue) range.Min=minValue;
44499
- }
44610
+ var item=mapItem.Data[k];
44611
+ var value=item.Data.Value;
44612
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44613
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44614
+ var value2=item.Data.Value2;
44615
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=this.GetKValue(kItem,item.Data.Value2);
44616
+ if (!IFrameSplitOperator.IsNumber(value2)) continue;
44617
+
44618
+ var minValue=Math.min(value, value2);
44619
+ var maxValue=Math.max(value, value2);
44620
+ if (range.Max==null) range.Max=maxValue;
44621
+ else if (range.Max<maxValue) range.Max=maxValue;
44622
+ if (range.Min==null) range.Min=minValue;
44623
+ else if (range.Min>minValue) range.Min=minValue;
44500
44624
  }
44501
44625
  }
44502
44626
 
@@ -44838,7 +44962,7 @@ function ChartMultiLine()
44838
44962
  }
44839
44963
  }
44840
44964
 
44841
- // 线段集合 支持横屏
44965
+ // 多个点集合2.0 支持横屏
44842
44966
  function ChartMultiPoint()
44843
44967
  {
44844
44968
  this.newMethod=IChartPainting; //派生
@@ -44856,12 +44980,6 @@ function ChartMultiPoint()
44856
44980
  this.MapCache=null; //key=date/date-time value={ Data:[] }
44857
44981
  this.GetKValue=ChartData.GetKValue;
44858
44982
 
44859
- this.BuildKey=function(item)
44860
- {
44861
- if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44862
- else return item.Date;
44863
- }
44864
-
44865
44983
  this.GetItem=function(kItem)
44866
44984
  {
44867
44985
  if (!this.MapCache || this.MapCache.size<=0) return null;
@@ -44885,6 +45003,7 @@ function ChartMultiPoint()
44885
45003
 
44886
45004
  var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44887
45005
  if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
45006
+ if (IFrameSplitOperator.IsNumber(groupItem.LineWidth)) clrConfig.LineWidth=groupItem.LineWidth;
44888
45007
 
44889
45008
  for(var j=0; j<groupItem.Point.length; ++j)
44890
45009
  {
@@ -45009,7 +45128,7 @@ function ChartMultiPoint()
45009
45128
  if (this.IsHScreen)
45010
45129
  pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
45011
45130
  else
45012
- pointPath.arc(item.X,item.Y,config.Radius**pixelRatio,0,360,false);
45131
+ pointPath.arc(item.X,item.Y,config.Radius*pixelRatio,0,360,false);
45013
45132
 
45014
45133
  path.addPath(pointPath);
45015
45134
  ++count;
@@ -45037,7 +45156,7 @@ function ChartMultiPoint()
45037
45156
  {
45038
45157
  var range={ Min:null, Max:null };
45039
45158
  if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45040
- if (!this.MapCache || this.MapCache.size<=0) return;
45159
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45041
45160
  var xPointCount=this.ChartFrame.XPointCount;
45042
45161
 
45043
45162
  for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
@@ -45066,7 +45185,7 @@ function ChartMultiPoint()
45066
45185
  }
45067
45186
  }
45068
45187
 
45069
- // 多文本集合 支持横屏
45188
+ // 多文本集合2.0 支持横屏
45070
45189
  function ChartMultiText()
45071
45190
  {
45072
45191
  this.newMethod=IChartPainting; //派生
@@ -45074,58 +45193,38 @@ function ChartMultiText()
45074
45193
  delete this.newMethod;
45075
45194
 
45076
45195
  this.ClassName="ChartMultiText";
45077
- this.Texts=[]; //[ {Index:, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 }} ]
45196
+ this.Texts=[]; //[ {Date:, Time, Value:, Text:, Color:, Font: , Baseline:, Line:{ Color:, Dash:[虚线点], KData:"H/L", Offset:[5,10], Width:线粗细 }} ]
45078
45197
  this.Font=g_JSChartResource.DefaultTextFont;
45079
45198
  this.Color=g_JSChartResource.DefaultTextColor;
45080
45199
  this.IsHScreen=false; //是否横屏
45081
45200
 
45082
- this.BuildKey=function(item)
45083
- {
45084
- if (IFrameSplitOperator.IsNumber(item.Time))
45085
- {
45086
- var key=`${item.Date}-${item.Time}`;
45087
- }
45088
- else
45089
- {
45090
- var key=`${item.Date}`;
45091
- }
45092
-
45093
- return key;
45094
- }
45201
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
45202
+ this.GetKValue=ChartData.GetKValue;
45095
45203
 
45096
- this.GetShowTextData=function()
45204
+ this.BuildCacheData=function()
45097
45205
  {
45098
- var xPointCount=this.ChartFrame.XPointCount;
45099
- var offset=this.Data.DataOffset;
45206
+ var mapData=new Map();
45207
+ this.MapCache=mapData;
45208
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45100
45209
 
45101
- var mapText=new Map(); //key='date-time' value={ Data:[] }
45102
- for(var i=0; i<this.Texts.length; ++i)
45210
+ for(var i=0;i<this.Texts.length;++i)
45103
45211
  {
45104
45212
  var item=this.Texts[i];
45105
- if (!item.Text) continue;
45106
- if (!IFrameSplitOperator.IsNumber(item.Index)) continue;
45107
-
45108
- var index=item.Index-offset;
45109
- if (index>=0 && index<xPointCount)
45213
+ var key=this.BuildKey(item);
45214
+ if (mapData.has(key))
45110
45215
  {
45111
- var key=this.BuildKey(item);
45112
- if (mapText.has(key))
45113
- {
45114
- var textItem=mapText.get(key);
45115
- textItem.Data.push(item);
45116
- }
45117
- else
45118
- {
45119
- var textItem={ Data:[item] };
45120
- mapText.set(key, textItem);
45121
- }
45216
+ var mapItem=mapData.get(key);
45217
+ mapItem.Data.push(item);
45218
+ }
45219
+ else
45220
+ {
45221
+ mapData.set(key,{ Data:[item] });
45122
45222
  }
45123
45223
  }
45124
-
45125
- return mapText;
45126
45224
  }
45127
45225
 
45128
- this.DrawAllText=function(mapText)
45226
+
45227
+ this.DrawAllText=function()
45129
45228
  {
45130
45229
  var bHScreen=(this.ChartFrame.IsHScreen===true);
45131
45230
  var isMinute=this.IsMinuteFrame();
@@ -45162,21 +45261,29 @@ function ChartMultiText()
45162
45261
  if (!kItem) continue;
45163
45262
 
45164
45263
  var key=this.BuildKey(kItem);
45165
- if (!mapText.has(key)) continue;
45264
+ if (!this.MapCache.has(key)) continue;
45265
+ var mapItem=this.MapCache.get(key);
45266
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45166
45267
 
45167
45268
  var left=xOffset;
45168
45269
  var right=xOffset+dataWidth;
45169
45270
  if (right>chartright) break;
45170
45271
  var x=left+(right-left)/2;
45171
45272
 
45172
- var textItem=mapText.get(key);
45173
- for(var k=0;k<textItem.Data.length;++k)
45273
+ for(var k=0;k<mapItem.Data.length;++k)
45174
45274
  {
45175
- var item=textItem.Data[k];
45275
+ var item=mapItem.Data[k];
45176
45276
  var y=top;
45177
45277
  if (item.Value=="TOP") y=top;
45178
45278
  else if (item.Value=="BOTTOM") y=bottom;
45179
- else y=this.ChartFrame.GetYFromData(item.Value, false);
45279
+ else
45280
+ {
45281
+ var price=item.Value;
45282
+ if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
45283
+
45284
+ y=this.ChartFrame.GetYFromData(price, false);
45285
+ }
45286
+
45180
45287
 
45181
45288
  if (item.Color) this.Canvas.fillStyle = item.Color;
45182
45289
  else this.Canvas.fillStyle = this.Color;
@@ -45261,18 +45368,16 @@ function ChartMultiText()
45261
45368
  if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
45262
45369
  if (this.IsShowIndexTitleOnly()) return;
45263
45370
  if (this.IsHideScriptIndex()) return;
45264
- if (!this.Data || this.Data.length<=0) return;
45265
- if (!this.Texts) return;
45371
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
45372
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
45373
+ if (!this.MapCache || this.MapCache.size<=0) return;
45266
45374
 
45267
45375
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
45268
45376
 
45269
- var mapText=this.GetShowTextData();
45270
- if (mapText.size<=0) return;
45271
-
45272
45377
  this.Canvas.save();
45273
45378
  this.ClipClient(this.IsHScreen);
45274
45379
 
45275
- this.DrawAllText(mapText);
45380
+ this.DrawAllText();
45276
45381
 
45277
45382
  this.Canvas.restore();
45278
45383
  }
@@ -45282,21 +45387,29 @@ function ChartMultiText()
45282
45387
  var range={ Min:null, Max:null };
45283
45388
  if (!this.Texts) return range;
45284
45389
 
45390
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45391
+ if (!this.MapCache || this.MapCache.size<=0) return range;
45285
45392
  var xPointCount=this.ChartFrame.XPointCount;
45286
- var start=this.Data.DataOffset;
45287
- var end=start+xPointCount;
45288
45393
 
45289
- for(var i in this.Texts)
45394
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
45290
45395
  {
45291
- var item=this.Texts[i];
45292
- if (!IFrameSplitOperator.IsNumber(item.Value)) continue;
45396
+ var kItem=this.Data.Data[i];
45397
+ var key=this.BuildKey(kItem);
45398
+ if (!this.MapCache.has(key)) continue;
45399
+ var mapItem=this.MapCache.get(key);
45400
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
45293
45401
 
45294
- if (item.Index>=start && item.Index<end)
45402
+ for(k=0;k<mapItem.Data.length;++k)
45295
45403
  {
45296
- if (range.Max==null) range.Max=item.Value;
45297
- else if (range.Max<item.Value) range.Max=item.Value;
45298
- if (range.Min==null) range.Min=item.Value;
45299
- else if (range.Min>item.Value) range.Min=item.Value;
45404
+ var item=mapItem.Data[k];
45405
+ var value=item.Value;
45406
+ if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
45407
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45408
+
45409
+ if (range.Max==null) range.Max=value;
45410
+ else if (range.Max<value) range.Max=value;
45411
+ if (range.Min==null) range.Min=value;
45412
+ else if (range.Min>value) range.Min=value;
45300
45413
  }
45301
45414
  }
45302
45415
 
@@ -45813,7 +45926,7 @@ function ChartMultiHtmlDom()
45813
45926
  }
45814
45927
  }
45815
45928
 
45816
- //绘制SVG图标
45929
+ //绘制SVG图标 2.0
45817
45930
  function ChartDrawSVG()
45818
45931
  {
45819
45932
  this.newMethod=IChartPainting; //派生
@@ -61427,6 +61540,41 @@ function DynamicChartTitlePainting()
61427
61540
  return aryText;
61428
61541
  }
61429
61542
 
61543
+ this.ForamtMultiBarTitle=function(dataIndex, dataInfo)
61544
+ {
61545
+ if (!dataInfo.GetItemCallback) return null;
61546
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61547
+ var kItem=dataInfo.Data.Data[dataIndex];
61548
+ if (!kItem) return null;
61549
+
61550
+ var group=dataInfo.GetItemCallback(kItem);
61551
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61552
+
61553
+ var aryText=[];
61554
+ for(var i=0;i<group.Data.length;++i)
61555
+ {
61556
+ var item=group.Data[i];
61557
+ var config=item.ColorConfig;
61558
+
61559
+ var color=null;
61560
+ if (config.BGColor) color=config.BGColor;
61561
+ else if (config.Color) color=config.Color;
61562
+
61563
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61564
+
61565
+ var value=item.Data.Value;
61566
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61567
+
61568
+ var value2=item.Data.Value2;
61569
+ if (IFrameSplitOperator.IsString(item.Data.Value2)) value2=ChartData.GetKValue(kItem, item.Data.Value2);
61570
+ aryText.push({ Text:`[${this.FormatValue(value, dataInfo)}, ${this.FormatValue(value2, dataInfo)}] `, Color:color});
61571
+ }
61572
+
61573
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
61574
+
61575
+ return aryText;
61576
+ }
61577
+
61430
61578
  this.FormatVPVRTitle=function(pt, dataInfo)
61431
61579
  {
61432
61580
  var chart=dataInfo.Chart;
@@ -61770,6 +61918,12 @@ function DynamicChartTitlePainting()
61770
61918
  if (!aryText) return null;
61771
61919
  return { Text:null, ArrayText:aryText };
61772
61920
  }
61921
+ else if (item.DataType=="ChartMultiBar")
61922
+ {
61923
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
61924
+ if (!aryText) return null;
61925
+ return { Text:null, ArrayText:aryText };
61926
+ }
61773
61927
 
61774
61928
  value=item.Data.Data[dataIndex];
61775
61929
 
@@ -62195,6 +62349,11 @@ function DynamicChartTitlePainting()
62195
62349
  aryText=this.ForamtMultiPointTitle(dataIndex, item);
62196
62350
  if (!aryText) continue;
62197
62351
  }
62352
+ else if (item.DataType=="ChartMultiBar")
62353
+ {
62354
+ aryText=this.ForamtMultiBarTitle(dataIndex, item);
62355
+ if (!aryText) continue;
62356
+ }
62198
62357
  else
62199
62358
  {
62200
62359
  valueText=this.FormatValue(value,item);
@@ -123223,7 +123382,7 @@ function ScriptIndex(name,script,args,option)
123223
123382
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123224
123383
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123225
123384
 
123226
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123385
+ chart.Data=hqChart.GetKData(); //绑定K线
123227
123386
  chart.PointGroup=varItem.Draw.DrawData;
123228
123387
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123229
123388
  chart.BuildCacheData();
@@ -123246,17 +123405,18 @@ function ScriptIndex(name,script,args,option)
123246
123405
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123247
123406
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123248
123407
 
123249
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123408
+ chart.Data=hqChart.GetKData();//绑定K线
123250
123409
  chart.Bars=varItem.Draw.DrawData;
123251
-
123252
- var titleIndex=windowIndex+1;
123253
- var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
123254
- titleData.IsShow=false;
123255
- titleData.DataType="MULTI_BAR";
123256
- hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123410
+ chart.BuildCacheData();
123257
123411
 
123258
123412
  this.SetChartIndexName(chart);
123259
123413
  hqChart.ChartPaint.push(chart);
123414
+
123415
+ var titleIndex=windowIndex+1;
123416
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
123417
+ titleData.DataType="ChartMultiBar";
123418
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123419
+ hqChart.TitlePaint[titleIndex].Data[id]=titleData;
123260
123420
  }
123261
123421
 
123262
123422
  this.CreateMultiText=function(hqChart,windowIndex,varItem,i)
@@ -123267,8 +123427,10 @@ function ScriptIndex(name,script,args,option)
123267
123427
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123268
123428
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123269
123429
 
123270
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123430
+ chart.Data=hqChart.GetKData();//绑定K线
123271
123431
  chart.Texts=varItem.Draw.DrawData;
123432
+ chart.BuildCacheData();
123433
+
123272
123434
  this.SetChartIndexName(chart);
123273
123435
  hqChart.ChartPaint.push(chart);
123274
123436
  }
@@ -123281,7 +123443,7 @@ function ScriptIndex(name,script,args,option)
123281
123443
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123282
123444
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123283
123445
 
123284
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123446
+ chart.Data=hqChart.GetKData();//绑定K线
123285
123447
  chart.Family=varItem.Draw.DrawData.Family;
123286
123448
  chart.AryIcon= varItem.Draw.DrawData.Icon;
123287
123449
  chart.BuildCacheData();
@@ -123297,10 +123459,8 @@ function ScriptIndex(name,script,args,option)
123297
123459
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123298
123460
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123299
123461
 
123300
- if (hqChart.ChartPaint[0].IsMinuteFrame())
123301
- chart.Data=hqChart.SourceData;
123302
- else
123303
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123462
+
123463
+ chart.Data=hqChart.GetKData()
123304
123464
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
123305
123465
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
123306
123466
  if (varItem.Draw.BuildKeyCallback) chart.BuildKeyCallback=varItem.Draw.BuildKeyCallback;
@@ -124808,11 +124968,7 @@ function OverlayScriptIndex(name,script,args,option)
124808
124968
  chart.ChartFrame=frame.Frame;
124809
124969
  chart.Identify=overlayIndex.Identify;
124810
124970
 
124811
- if (hqChart.ChartPaint[0].IsMinuteFrame())
124812
- chart.Data=hqChart.SourceData;
124813
- else
124814
- chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
124815
-
124971
+ chart.Data=hqChart.GetKData();
124816
124972
  chart.Family=varItem.Draw.Icon.Family;
124817
124973
  chart.TextFont=g_JSChartResource.TIPICON.TextFont;
124818
124974
 
@@ -124960,7 +125116,7 @@ function OverlayScriptIndex(name,script,args,option)
124960
125116
  chart.ChartFrame=frame.Frame;
124961
125117
  chart.Identify=overlayIndex.Identify;
124962
125118
 
124963
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125119
+ chart.Data=hqChart.GetKData();//绑定K线
124964
125120
  chart.PointGroup=varItem.Draw.DrawData;
124965
125121
  chart.BuildCacheData();
124966
125122
 
@@ -125010,14 +125166,16 @@ function OverlayScriptIndex(name,script,args,option)
125010
125166
  chart.ChartFrame=frame.Frame;
125011
125167
  chart.Identify=overlayIndex.Identify;
125012
125168
 
125013
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125169
+ chart.Data=hqChart.GetKData();//绑定K线
125014
125170
  chart.Bars=varItem.Draw.DrawData;
125171
+ chart.BuildCacheData();
125015
125172
 
125016
125173
  var titleIndex=windowIndex+1;
125017
125174
  var titlePaint=hqChart.TitlePaint[titleIndex];
125018
- var titleData=new DynamicTitleData({ KData:chart.Data, BarData:chart.Bars },varItem.Name,null);
125019
- titleData.IsShow=false;
125020
- titleData.DataType="MULTI_BAR";
125175
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
125176
+ titleData.DataType="ChartMultiBar";
125177
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
125178
+
125021
125179
  titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
125022
125180
 
125023
125181
  this.SetChartIndexName(chart);
@@ -125035,8 +125193,10 @@ function OverlayScriptIndex(name,script,args,option)
125035
125193
  chart.ChartFrame=frame.Frame;
125036
125194
  chart.Identify=overlayIndex.Identify;
125037
125195
 
125038
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125196
+ chart.Data=hqChart.GetKData();//绑定K线
125039
125197
  chart.Texts=varItem.Draw.DrawData;
125198
+ chart.BuildCacheData();
125199
+
125040
125200
  this.SetChartIndexName(chart);
125041
125201
  frame.ChartPaint.push(chart);
125042
125202
  }
@@ -125052,7 +125212,7 @@ function OverlayScriptIndex(name,script,args,option)
125052
125212
  chart.ChartFrame=frame.Frame;
125053
125213
  chart.Identify=overlayIndex.Identify;
125054
125214
 
125055
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125215
+ chart.Data=hqChart.GetKData();//绑定K线
125056
125216
  chart.Family=varItem.Draw.DrawData.Family;
125057
125217
  chart.AryIcon= varItem.Draw.DrawData.Icon;
125058
125218
  chart.BuildCacheData();
@@ -125070,11 +125230,8 @@ function OverlayScriptIndex(name,script,args,option)
125070
125230
  chart.ChartBorder=frame.Frame.ChartBorder;
125071
125231
  chart.ChartFrame=frame.Frame;
125072
125232
  chart.Identify=overlayIndex.Identify;
125073
-
125074
- if (hqChart.ChartPaint[0].IsMinuteFrame())
125075
- chart.Data=hqChart.SourceData;
125076
- else
125077
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
125233
+ chart.Data=hqChart.GetKData();
125234
+
125078
125235
 
125079
125236
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.EnableTooltip)) chart.EnableTooltip=varItem.Draw.DrawData.EnableTooltip;
125080
125237
  if (IFrameSplitOperator.IsBool(varItem.Draw.DrawData.IsDrawFirst)) chart.IsDrawFirst=varItem.Draw.DrawData.IsDrawFirst;
@@ -126179,7 +126336,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126179
126336
  drawItem.Text=draw.Text;
126180
126337
  drawItem.Name=draw.Name;
126181
126338
  drawItem.DrawType=draw.DrawType;
126182
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126339
+ drawItem.DrawData=draw.DrawData;
126183
126340
  outVarItem.Draw=drawItem;
126184
126341
 
126185
126342
  result.push(outVarItem);
@@ -126230,8 +126387,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126230
126387
  drawItem.Text=draw.Text;
126231
126388
  drawItem.Name=draw.Name;
126232
126389
  drawItem.DrawType=draw.DrawType;
126233
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126234
- this.GetKLineData(drawItem.DrawData, hqChart);
126390
+ drawItem.DrawData=draw.DrawData;
126235
126391
  outVarItem.Draw=drawItem;
126236
126392
  result.push(outVarItem);
126237
126393
  }
@@ -126726,8 +126882,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126726
126882
  drawItem.Text=draw.Text;
126727
126883
  drawItem.Name=draw.Name;
126728
126884
  drawItem.DrawType=draw.DrawType;
126729
- drawItem.DrawData=this.FittingMultiText(draw.DrawData,date,time,hqChart);
126730
- this.GetKLineData(drawItem.DrawData, hqChart);
126885
+ drawItem.DrawData=draw.DrawData;
126731
126886
  outVarItem.Draw=drawItem;
126732
126887
  result.push(outVarItem);
126733
126888
  }
@@ -142572,7 +142727,7 @@ function ScrollBarBGChart()
142572
142727
 
142573
142728
 
142574
142729
 
142575
- var HQCHART_VERSION="1.1.14335";
142730
+ var HQCHART_VERSION="1.1.14348";
142576
142731
 
142577
142732
  function PrintHQChartVersion()
142578
142733
  {