hqchart 1.1.14533 → 1.1.14542

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.
@@ -4545,6 +4545,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4545
4545
  if (IFrameSplitOperator.IsBool(item.PriceGap.Enable)) klineChart.PriceGap.Enable=item.PriceGap.Enable;
4546
4546
  if (IFrameSplitOperator.IsNumber(item.PriceGap.Count)) klineChart.PriceGap.Count=item.PriceGap.Count;
4547
4547
  }
4548
+
4549
+ if (IFrameSplitOperator.IsBool(item.EnablePrediction)) klineChart.PredictionConfig.Enable=item.EnablePrediction;
4548
4550
  }
4549
4551
 
4550
4552
  if(option.KLineTitle)
@@ -27829,7 +27831,7 @@ function ChartData()
27829
27831
  return result;
27830
27832
  }
27831
27833
 
27832
- this.MergeMinuteData=function(data) //合并数据
27834
+ this.MergeMinuteData=function(data, period) //合并数据
27833
27835
  {
27834
27836
  if (!this.Data || this.Data.length<=0)
27835
27837
  {
@@ -27837,6 +27839,7 @@ function ChartData()
27837
27839
  return true;
27838
27840
  }
27839
27841
 
27842
+ var bDayPeriod=ChartData.IsDayPeriod(period, true);
27840
27843
  var sourceFirstItem=this.Data[0];
27841
27844
  var firstItemID=0;
27842
27845
  var firstItem=null;
@@ -27850,11 +27853,23 @@ function ChartData()
27850
27853
  break;
27851
27854
  }
27852
27855
 
27853
- if (item.Date==sourceFirstItem.Date && item.Time>=sourceFirstItem.Time)
27856
+ if (bDayPeriod)
27854
27857
  {
27855
- firstItemID=i;
27856
- firstItem=item;
27857
- break;
27858
+ if (item.Date==sourceFirstItem.Date)
27859
+ {
27860
+ firstItemID=i;
27861
+ firstItem=item;
27862
+ break;
27863
+ }
27864
+ }
27865
+ else
27866
+ {
27867
+ if (item.Date==sourceFirstItem.Date && item.Time>=sourceFirstItem.Time)
27868
+ {
27869
+ firstItemID=i;
27870
+ firstItem=item;
27871
+ break;
27872
+ }
27858
27873
  }
27859
27874
  }
27860
27875
 
@@ -27867,11 +27882,23 @@ function ChartData()
27867
27882
  var date=this.Data[i].Date;
27868
27883
  var time=this.Data[i].Time;
27869
27884
 
27870
- if (firstItem.Date>date || (firstItem.Date==date && firstItem.Time>=time) )
27885
+ if (bDayPeriod)
27871
27886
  {
27872
- index=i;
27873
- if (firstItem.Date==date && firstItem.Time==time) bFind=true;
27874
- break;
27887
+ if (firstItem.Date>date || firstItem.Date==date)
27888
+ {
27889
+ index=i;
27890
+ if (firstItem.Date==date) bFind=true;
27891
+ break;
27892
+ }
27893
+ }
27894
+ else
27895
+ {
27896
+ if (firstItem.Date>date || (firstItem.Date==date && firstItem.Time>=time) )
27897
+ {
27898
+ index=i;
27899
+ if (firstItem.Date==date && firstItem.Time==time) bFind=true;
27900
+ break;
27901
+ }
27875
27902
  }
27876
27903
  }
27877
27904
 
@@ -29785,9 +29812,30 @@ function ChartKLine()
29785
29812
  DownAreaColor:g_JSChartResource.HLCArea.DownAreaColor,
29786
29813
  }
29787
29814
 
29788
- //虚线柱子
29815
+ //虚线柱子 (非交易日)
29789
29816
  this.VirtualBarConfig={ Color:g_JSChartResource.VirtualKLine.Color, LineDash:g_JSChartResource.VirtualKLine.LineDash };
29790
29817
 
29818
+ //预测线配置
29819
+ this.PredictionConfig=
29820
+ {
29821
+ Line:
29822
+ {
29823
+ Color:g_JSChartResource.PredictionKLine.Line.Color,
29824
+ LineDash:g_JSChartResource.PredictionKLine.Line.LineDash,
29825
+ LineWidth:g_JSChartResource.PredictionKLine.Line.LineWidth
29826
+ },
29827
+
29828
+ Bar:
29829
+ {
29830
+ UpColor:g_JSChartResource.PredictionKLine.Bar.UpColor,
29831
+ DownColor:g_JSChartResource.PredictionKLine.Bar.DownColor,
29832
+ UnchangeColor:g_JSChartResource.PredictionKLine.Bar.UnchangeColor ,
29833
+ DrawType:g_JSChartResource.PredictionKLine.Bar.DrawType
29834
+ },
29835
+ Enable:false, //是否启动
29836
+ };
29837
+ this.AryPredictionCache=[]; //预测数据
29838
+
29791
29839
  //DrawType==14 自定义图形
29792
29840
  this.FFKChart;
29793
29841
 
@@ -29925,6 +29973,22 @@ function ChartKLine()
29925
29973
  this.OrderFlow.UnchagneColor= { BG:g_JSChartResource.OrderFlow.UnchagneColor.BG, Border:g_JSChartResource.OrderFlow.UnchagneColor.Border };
29926
29974
  this.OrderFlow.Text={ Color: g_JSChartResource.OrderFlow.Text.Color , Family:g_JSChartResource.OrderFlow.Text.Family, FontMaxSize:g_JSChartResource.OrderFlow.Text.FontMaxSize, MaxValue:g_JSChartResource.OrderFlow.Text.MaxValue };
29927
29975
  this.OrderFlow.Line={ UpDownColor: g_JSChartResource.OrderFlow.Line.UpDownColor, MiddleColor:g_JSChartResource.OrderFlow.Line.MiddleColor };
29976
+
29977
+ this.PredictionConfig.Line=
29978
+ {
29979
+ Color:g_JSChartResource.PredictionKLine.Line.Color,
29980
+ LineDash:g_JSChartResource.PredictionKLine.Line.LineDash,
29981
+ LineWidth:g_JSChartResource.PredictionKLine.Line.LineWidth
29982
+ };
29983
+
29984
+ this.PredictionConfig.Bar=
29985
+ {
29986
+ UpColor:g_JSChartResource.PredictionKLine.Bar.UpColor,
29987
+ DownColor:g_JSChartResource.PredictionKLine.Bar.DownColor,
29988
+ UnchangeColor:g_JSChartResource.PredictionKLine.Bar.UnchangeColor,
29989
+ DrawType:g_JSChartResource.PredictionKLine.Bar.DrawType
29990
+ };
29991
+
29928
29992
  }
29929
29993
 
29930
29994
  this.ClearCustomKLine=function()
@@ -30295,6 +30359,8 @@ function ChartKLine()
30295
30359
  this.DrawKRange.Start=this.Data.DataOffset;
30296
30360
 
30297
30361
  var preKItemInfo=null;
30362
+ var prePoint=null;
30363
+ var xEnd=null; //最后一个点
30298
30364
  for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
30299
30365
  {
30300
30366
  var data=this.Data.Data[i];
@@ -30308,6 +30374,13 @@ function ChartKLine()
30308
30374
  var yClose=this.GetYFromData(data.Close,false);
30309
30375
  this.DrawKRange.End=i;
30310
30376
 
30377
+ if (data.IsVirtual && this.PredictionConfig.Enable) //预测数据|虚拟数据
30378
+ {
30379
+ this.AryPredictionCache.push({ PrePoint:prePoint, Point:{ X:x, Y:yClose }});
30380
+ prePoint={ X:x, Y:yClose};
30381
+ continue;
30382
+ }
30383
+
30311
30384
  if (bFirstPoint)
30312
30385
  {
30313
30386
  if (isHScreen)
@@ -30328,6 +30401,9 @@ function ChartKLine()
30328
30401
  else this.Canvas.lineTo(x,yClose);
30329
30402
  }
30330
30403
 
30404
+ xEnd=x;
30405
+ prePoint={ X:x, Y:yClose};
30406
+
30331
30407
  if (i==this.Data.Data.length-1)
30332
30408
  {
30333
30409
  ptLast={ X:x, Y:yClose, XLeft:left, XRight:right, KItem:data, ChartRight:chartright };
@@ -30359,12 +30435,12 @@ function ChartKLine()
30359
30435
  this.Canvas.stroke();
30360
30436
  if (isHScreen)
30361
30437
  {
30362
- this.Canvas.lineTo(border.Left,x);
30438
+ this.Canvas.lineTo(border.Left,xEnd);
30363
30439
  this.Canvas.lineTo(border.Left,firstPoint.Y);
30364
30440
  }
30365
30441
  else
30366
30442
  {
30367
- this.Canvas.lineTo(x,border.Bottom);
30443
+ this.Canvas.lineTo(xEnd,border.Bottom);
30368
30444
  this.Canvas.lineTo(firstPoint.X,border.Bottom);
30369
30445
  }
30370
30446
  this.Canvas.closePath();
@@ -30427,11 +30503,12 @@ function ChartKLine()
30427
30503
  var mapBreakPoint=this.BuildBreakPoint(); //断点
30428
30504
 
30429
30505
  var preKItemInfo=null;
30506
+ var prePoint=null;
30430
30507
  for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
30431
30508
  {
30432
30509
  var data=this.Data.Data[i];
30433
30510
  this.ShowRange.End=i;
30434
- if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
30511
+ if (!data || data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
30435
30512
 
30436
30513
  var left=xOffset;
30437
30514
  var right=xOffset+dataWidth;
@@ -30440,6 +30517,13 @@ function ChartKLine()
30440
30517
  var yClose=this.GetYFromData(data.Close,false);
30441
30518
  this.DrawKRange.End=i;
30442
30519
 
30520
+ if (data.IsVirtual && this.PredictionConfig.Enable) //预测数据|虚拟数据
30521
+ {
30522
+ this.AryPredictionCache.push({ PrePoint:prePoint, Point:{ X:x, Y:yClose }});
30523
+ prePoint={ X:x, Y:yClose};
30524
+ continue;
30525
+ }
30526
+
30443
30527
  if (bFirstPoint)
30444
30528
  {
30445
30529
  if (isHScreen) this.Canvas.moveTo(yClose,x);
@@ -30453,6 +30537,8 @@ function ChartKLine()
30453
30537
  }
30454
30538
  ++drawCount;
30455
30539
 
30540
+ prePoint={ X:x, Y:yClose};
30541
+
30456
30542
  if (this.PriceGap.Enable)
30457
30543
  {
30458
30544
  var yLow=this.GetYFromData(data.Low, false);
@@ -30527,6 +30613,7 @@ function ChartKLine()
30527
30613
  }
30528
30614
 
30529
30615
  var preKItemInfo=null;
30616
+ var prePoint=null; //上一个点的位置
30530
30617
  for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
30531
30618
  {
30532
30619
  var data=this.Data.Data[i];
@@ -30576,6 +30663,10 @@ function ChartKLine()
30576
30663
  {
30577
30664
  this.DrawVirtualBar(data, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
30578
30665
  }
30666
+ else if (data.IsVirtual && this.PredictionConfig.Enable)
30667
+ {
30668
+ this.DrawPredictionBar(data, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
30669
+ }
30579
30670
  else if (kLineOption)
30580
30671
  {
30581
30672
  var barColor=kLineOption.Color;
@@ -30657,6 +30748,8 @@ function ChartKLine()
30657
30748
  if (value>0)
30658
30749
  this.AryPriceGapCache.push({ Data:[preKItemInfo, kItemInfo], Type:value });
30659
30750
  }
30751
+
30752
+ prePoint={ X:x, Y:yClose }; //上一个点
30660
30753
 
30661
30754
  preKItemInfo=kItemInfo;
30662
30755
  }
@@ -31528,6 +31621,82 @@ function ChartKLine()
31528
31621
  this.Canvas.setLineDash([]);
31529
31622
  }
31530
31623
 
31624
+ this.DrawPredictionBar=function(data, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen)
31625
+ {
31626
+ var config=this.PredictionConfig.Bar;
31627
+ var drawType=this.DrawType;
31628
+ if (IFrameSplitOperator.IsNumber(config.DrawType)) drawType=config.DrawType;
31629
+
31630
+ if (data.Open<data.Close) //阳线
31631
+ {
31632
+ this.DrawKBar_Up(data, dataWidth, config.UpColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
31633
+ }
31634
+ else if (data.Open>data.Close) //阴线
31635
+ {
31636
+ this.DrawKBar_Down(data, dataWidth, config.DownColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
31637
+ }
31638
+ else
31639
+ {
31640
+ this.DrawKBar_Unchagne(data, dataWidth, config.UnchangeColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
31641
+ }
31642
+ }
31643
+
31644
+ this.DrawPredictionLine=function()
31645
+ {
31646
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.AryPredictionCache)) return;
31647
+
31648
+ this.Canvas.save();
31649
+
31650
+ var bHScreen=(this.ChartFrame.IsHScreen===true);
31651
+ var bFirstPoint=true;
31652
+ var drawCount=0;
31653
+ for(var i=0;i<this.AryPredictionCache.length;++i)
31654
+ {
31655
+ var item=this.AryPredictionCache[i];
31656
+ if (bFirstPoint)
31657
+ {
31658
+ bFirstPoint=false;
31659
+ this.Canvas.beginPath();
31660
+ if (item.PrePoint)
31661
+ {
31662
+ var pt=item.PrePoint;
31663
+ if (bHScreen) this.Canvas.moveTo(pt.Y,pt.X); //横屏坐标轴对调
31664
+ else this.Canvas.moveTo(pt.X,pt.Y);
31665
+
31666
+ var pt=item.Point;
31667
+ if (bHScreen) this.Canvas.lineTo(pt.Y,pt.X);
31668
+ else this.Canvas.lineTo(pt.X,pt.Y);
31669
+ }
31670
+ else if (item.Point)
31671
+ {
31672
+ var pt=item.Point;
31673
+ if (bHScreen) this.Canvas.moveTo(pt.Y,pt.X); //横屏坐标轴对调
31674
+ else this.Canvas.moveTo(pt.X,pt.Y);
31675
+ }
31676
+ }
31677
+ else
31678
+ {
31679
+ var pt=item.Point;
31680
+ if (bHScreen) this.Canvas.lineTo(pt.Y,pt.X);
31681
+ else this.Canvas.lineTo(pt.X,pt.Y);
31682
+ }
31683
+
31684
+ ++drawCount;
31685
+ }
31686
+
31687
+ if (drawCount>0)
31688
+ {
31689
+ var pixelRatio=GetDevicePixelRatio();
31690
+ var config=this.PredictionConfig.Line;
31691
+ this.Canvas.strokeStyle=config.Color;
31692
+ if (IFrameSplitOperator.IsNumber(config.LineWidth)) this.Canvas.lineWidth=config.LineWidth*pixelRatio;
31693
+ if (IFrameSplitOperator.IsNonEmptyArray(config.LineDash)) this.Canvas.setLineDash(config.LineDash)
31694
+ this.Canvas.stroke();
31695
+ }
31696
+
31697
+ this.Canvas.restore();
31698
+ }
31699
+
31531
31700
  this.DrawRenkoCandle=function() //砖型K线
31532
31701
  {
31533
31702
  var isHScreen=(this.ChartFrame.IsHScreen===true);
@@ -32344,6 +32513,7 @@ function ChartKLine()
32344
32513
  this.PtMin={X:null,Y:null,Value:null,Align:'left'}; //清空最小
32345
32514
  this.DrawKRange={ Start:null, End:null };
32346
32515
  this.AryPriceGapCache=[];
32516
+ this.AryPredictionCache=[];
32347
32517
 
32348
32518
  this.ChartFrame.ChartKLine={Max:null, Min:null }; //保存K线上 显示最大最小值坐标
32349
32519
 
@@ -32384,6 +32554,7 @@ function ChartKLine()
32384
32554
  {
32385
32555
  this.DrawCloseLine();
32386
32556
  this.Canvas.restore();
32557
+ this.DrawPredictionLine();
32387
32558
  if (this.PriceGap.Enable) this.DrawPriceGap();
32388
32559
  return;
32389
32560
  }
@@ -32456,6 +32627,7 @@ function ChartKLine()
32456
32627
 
32457
32628
  this.Canvas.restore();
32458
32629
 
32630
+ this.DrawPredictionLine();
32459
32631
  if (this.PriceGap.Enable) this.DrawPriceGap();
32460
32632
 
32461
32633
  if (this.IsShowMaxMinPrice) //标注最大值最小值
@@ -39235,6 +39407,7 @@ function ChartVolStick()
39235
39407
  var value=this.Data.Data[i];
39236
39408
  var kItem=this.HistoryData.Data[i];
39237
39409
  if (value==null || kItem==null) continue;
39410
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
39238
39411
  if (value==0) continue;
39239
39412
 
39240
39413
  var left=xOffset;
@@ -76172,6 +76345,24 @@ function JSChartResource()
76172
76345
  LineDash:[2,2]
76173
76346
  };
76174
76347
 
76348
+ this.PredictionKLine=
76349
+ {
76350
+ Line:
76351
+ {
76352
+ Color:"rgb(100,100,100)",
76353
+ LineDash:[3,5],
76354
+ LineWidth:2,
76355
+ },
76356
+
76357
+ Bar:
76358
+ {
76359
+ UpColor:"rgb(65,105,225)",
76360
+ DownColor:"rgb(65,105,225)",
76361
+ UnchangeColor:"rgb(65,105,225s)" ,
76362
+ DrawType:3
76363
+ }
76364
+ };
76365
+
76175
76366
  this.PriceGapStyple=
76176
76367
  {
76177
76368
  Line:{ Color:"rgb(186,186,186)" },
@@ -77572,6 +77763,28 @@ function JSChartResource()
77572
77763
  if (item.LineDash) this.VirtualKLine.LineDash=item.LineDash;
77573
77764
  }
77574
77765
 
77766
+ if (style.PredictionKLine)
77767
+ {
77768
+ if (style.PredictionKLine.Line)
77769
+ {
77770
+ var item=style.PredictionKLine.Line;
77771
+ var dest=this.PredictionKLine.Line;
77772
+ if (item.Color) dest.Color=item.Color;
77773
+ if (item.LineDash) dest.LineDash=item.LineDash;
77774
+ if (IFrameSplitOperator.IsNumber(item.LineWidth)) dest.LineWidth=item.LineWidth;
77775
+ }
77776
+
77777
+ if (style.PredictionKLine.Bar)
77778
+ {
77779
+ var item=style.PredictionKLine.Bar;
77780
+ var dest=this.PredictionKLine.Bar;
77781
+ if (item.UpColor) dest.UpColor=item.UpColor;
77782
+ if (item.DownColor) dest.DownColor=item.DownColor;
77783
+ if (item.UnchangeColor) dest.UnchangeColor=item.UnchangeColor;
77784
+ if (IFrameSplitOperator.IsNumber(item.DrawType) || item.DrawType===null) dest.DrawType=item.DrawType;
77785
+ }
77786
+ }
77787
+
77575
77788
  if (style.PriceGapStyple)
77576
77789
  {
77577
77790
  var item=style.PriceGapStyple;
@@ -81883,7 +82096,15 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
81883
82096
  this.Symbol=data.symbol;
81884
82097
  this.Name=data.name;
81885
82098
 
81886
- this.BindMainData(bindData,this.PageSize);
82099
+ var chartOperator=null; //额外的图形控制
82100
+ if (data && data.ChartOperator)
82101
+ {
82102
+ var item=data.ChartOperator;
82103
+ chartOperator={ };
82104
+ if (item.IsShowAll===true) chartOperator.IsShowAll=true; //全部显示
82105
+ }
82106
+
82107
+ this.BindMainData(bindData,this.PageSize,chartOperator);
81887
82108
  if (this.AfterBindMainData) this.AfterBindMainData("RecvHistoryData");
81888
82109
  this.Frame.SetSizeChage(true);
81889
82110
 
@@ -82443,9 +82664,90 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82443
82664
  });
82444
82665
  }
82445
82666
 
82667
+
82668
+ this.RecvRealtimeDataV2=function(data)
82669
+ {
82670
+ var aryRealtimeData=KLineChartContainer.JsonDataToRealtimeDataV2(data,this.Symbol);
82671
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryRealtimeData)) return;
82672
+
82673
+ var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
82674
+ var lastSourceDataCount=this.SourceData.Data.length;
82675
+ if (!this.SourceData.MergeMinuteData(aryRealtimeData, this.Period)) return;
82676
+
82677
+ var bindData=new ChartData();
82678
+ bindData.Data=this.SourceData.Data;
82679
+ bindData.Period=this.Period;
82680
+ bindData.Right=this.Right;
82681
+ bindData.DataType=this.SourceData.DataType;
82682
+ bindData.Symbol=this.Symbol;
82683
+
82684
+ //if (bindData.Right>0 && ChartData.IsDayPeriod(bindData.Period,true) && MARKET_SUFFIX_NAME.IsSHSZStockA(this.Symbol) && !this.IsApiPeriod) //复权(A股日线数据才复权)
82685
+ if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsEnableRight(bindData.Period,this.Symbol,this.RightFormula) && !this.IsApiPeriod && ChartData.IsDayPeriod(bindData.Period,true)) //复权
82686
+ {
82687
+ var rightData=bindData.GetRightData(bindData.Right,{ AlgorithmType: this.RightFormula });
82688
+ bindData.Data=rightData;
82689
+ }
82690
+
82691
+ if (!this.IsApiPeriod)
82692
+ {
82693
+ if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false)) //周期数据 (0= 日线,4=1分钟线 不需要处理)
82694
+ {
82695
+ var periodData=bindData.GetPeriodData(bindData.Period);
82696
+ bindData.Data=periodData;
82697
+ }
82698
+ }
82699
+
82700
+ var kLineCalculate=this.GetKLineCalulate();
82701
+ if (kLineCalculate) //额外的K线图形计算
82702
+ {
82703
+ var newBindData=kLineCalculate.RecvHistoryData(bindData, { Symbol:this.Symbol, Function:"RecvRealtimeData" });
82704
+ bindData=newBindData;
82705
+ this.FlowCapitalReady=true;
82706
+ }
82707
+
82708
+ this.UpdateMainData(bindData,lastDataCount);//更新主图数据
82709
+ this.UpdateOverlayRealtimeDataV2(data); //更新叠加股票数据
82710
+ this.BindInstructionIndexData(bindData); //执行指示脚本
82711
+
82712
+ for(var i=0; i<this.Frame.SubFrame.length; ++i)
82713
+ {
82714
+ this.BindIndexData(i,bindData, { CheckRunCount:true });
82715
+ }
82716
+
82717
+ this.BindAllOverlayIndexData(bindData, { CheckRunCount:true, SyncExecute:true }); //同步模式叠加指标
82718
+
82719
+ //刷新画图
82720
+ this.UpdataDataoffset(); //更新数据偏移
82721
+ this.UpdatePointByCursorIndex(1); //更新十字光标位子
82722
+ this.UpdateFrameMaxMin(); //调整坐标最大 最小值
82723
+ this.Frame.SetSizeChage(true);
82724
+ this.Draw();
82725
+
82726
+ this.SendKLineUpdateEvent(bindData);
82727
+ this.UpdateDOMTooltip(0, bindData);
82728
+ this.UpdateHQFloatTooltip(bindData);
82729
+
82730
+ //叠加指标计算
82731
+ this.BindAllOverlayIndexData(bindData, { CheckRunCount:true,SyncExecute:false }); //异步模式叠加指标
82732
+
82733
+ if (this.mapEvent.has(JSCHART_EVENT_ID.ON_RECV_REALTIME_DATA))
82734
+ {
82735
+ var event=this.mapEvent.get(JSCHART_EVENT_ID.ON_RECV_REALTIME_DATA);
82736
+ var data={ HistoryData:bindData, Stock:{Symbol:this.Symbol, Name:this.Name } }
82737
+ event.Callback(event,data,this);
82738
+ }
82739
+ }
82740
+
82446
82741
  this.RecvRealtimeData=function(data)
82447
82742
  {
82448
82743
  if (this.IsOnTouch==true) return; //正在操作中不更新数据
82744
+
82745
+ if (data.Ver==3.0)
82746
+ {
82747
+ this.RecvRealtimeDataV2(data);
82748
+ return;
82749
+ }
82750
+
82449
82751
  var realtimeData=KLineChartContainer.JsonDataToRealtimeData(data,this.Symbol);
82450
82752
  if (!realtimeData) return;
82451
82753
 
@@ -82626,6 +82928,47 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82626
82928
  }
82627
82929
  }
82628
82930
 
82931
+ this.UpdateOverlayRealtimeDataV2=function(data)
82932
+ {
82933
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.OverlayChartPaint)) return;
82934
+
82935
+ for(var i=0; i<this.OverlayChartPaint.length; ++i)
82936
+ {
82937
+ var item=this.OverlayChartPaint[i];
82938
+ if (!item.Symbol) continue;
82939
+ if (!item.MainData) continue; //等待主图股票数据未下载完
82940
+ if (item.Status!=OVERLAY_STATUS_ID.STATUS_FINISHED_ID) continue;
82941
+ var aryRealtimeData=KLineChartContainer.JsonDataToRealtimeDataV2(data,item.Symbol); //获取叠加股票的最新数据
82942
+ if (!aryRealtimeData) continue;
82943
+ var sourceData=item.SourceData; //叠加股票的所有数据
82944
+ sourceData.MergeMinuteData(aryRealtimeData, this.Period);
82945
+
82946
+ var bindData=new ChartData();
82947
+ bindData.Data=sourceData.Data;
82948
+ bindData.Period=this.Period;
82949
+ bindData.Right=this.Right;
82950
+ bindData.DataType=0;
82951
+
82952
+ //if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsSHSZStockA(data.symbol) && !this.IsApiPeriod) //复权数据 ,A股才有有复权
82953
+ if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsEnableRight(bindData.Right, data.Symbol) && !this.IsApiPeriod)
82954
+ {
82955
+ var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });
82956
+ bindData.Data=rightData;
82957
+ }
82958
+
82959
+ var aryOverlayData=this.SourceData.GetOverlayData(bindData.Data, this.IsApiPeriod); //和主图数据拟合以后的数据
82960
+ bindData.Data=aryOverlayData;
82961
+
82962
+ if (ChartData.IsDayPeriod(bindData.Period,false) && !this.IsApiPeriod) //周期数据
82963
+ {
82964
+ var periodData=bindData.GetPeriodData(bindData.Period);
82965
+ bindData.Data=periodData;
82966
+ }
82967
+
82968
+ item.Data=bindData;
82969
+ }
82970
+ }
82971
+
82629
82972
  this.RequestMinuteRealtimeData=function()
82630
82973
  {
82631
82974
  var self=this;
@@ -82747,7 +83090,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82747
83090
  if (this.IsApiPeriod) this.ReduceSourceData(); //减少数据
82748
83091
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
82749
83092
  if (!this.SourceData) return;
82750
- if (!this.SourceData.MergeMinuteData(aryMinuteData)) return;
83093
+ if (!this.SourceData.MergeMinuteData(aryMinuteData, this.Period)) return;
82751
83094
 
82752
83095
  JSConsole.Chart.Log(`[KLineChartContainer::RecvMinuteRealtimeDataV2] update kline by 1 minute data [${lastDataCount}->${this.SourceData.Data.length}], IsAutoSyncDataOffset=${this.IsAutoSyncDataOffset}`);
82753
83096
 
@@ -82830,7 +83173,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82830
83173
  if (this.IsApiPeriod) this.ReduceSourceData(); //减少数据
82831
83174
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
82832
83175
  var lastSourceDataCount=this.SourceData.Data.length;
82833
- if (!this.SourceData.MergeMinuteData(realtimeData)) return;
83176
+ if (!this.SourceData.MergeMinuteData(realtimeData, this.Period)) return;
82834
83177
 
82835
83178
  JSConsole.Chart.Log(`[KLineChartContainer::RecvMinuteRealtimeData] update kline by 1 minute data [${lastSourceDataCount}->${this.SourceData.Data.length}]`);
82836
83179
 
@@ -82901,7 +83244,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82901
83244
  var realtimeData=KLineChartContainer.JsonDataToMinuteRealtimeData(data,item.Symbol); //获取叠加股票的最新数据
82902
83245
  if (!realtimeData) continue;
82903
83246
  var sourceData=item.SourceData; //叠加股票的所有数据
82904
- if (!sourceData.MergeMinuteData(realtimeData)) return;
83247
+ if (!sourceData.MergeMinuteData(realtimeData,this.Period)) return;
82905
83248
 
82906
83249
  var bindData=new ChartData();
82907
83250
  bindData.Data=sourceData.Data;
@@ -87732,6 +88075,27 @@ KLineChartContainer.JsonDataToHistoryData=function(data)
87732
88075
  return aryDayData;
87733
88076
  }
87734
88077
 
88078
+
88079
+ KLineChartContainer.JsonDataToRealtimeDataV2=function(data, symbol)
88080
+ {
88081
+ if (!IFrameSplitOperator.IsNonEmptyArray(data.stock)) return null;
88082
+
88083
+ var finder=null;
88084
+ for(var i=0;i<data.stock.length;++i)
88085
+ {
88086
+ var item=data.stock[i];
88087
+ if (item.symbol==symbol)
88088
+ {
88089
+ finder=item;
88090
+ break;
88091
+ }
88092
+ }
88093
+
88094
+ if (!finder) return null;
88095
+
88096
+ return KLineChartContainer.JsonDataToHistoryData(finder);
88097
+ }
88098
+
87735
88099
  KLineChartContainer.JsonDataToRealtimeData=function(data, symbol)
87736
88100
  {
87737
88101
  if (!data.stock) return null;
@@ -129412,6 +129776,23 @@ function GetBlackStyle()
129412
129776
  LineDash:[2,2]
129413
129777
  },
129414
129778
 
129779
+ PredictionKLine:
129780
+ {
129781
+ Line:
129782
+ {
129783
+ Color:"rgb(220,220,220)",
129784
+ LineDash:[3*GetDevicePixelRatio(),3*GetDevicePixelRatio()]
129785
+ },
129786
+
129787
+ Bar:
129788
+ {
129789
+ UpColor:"rgb(30,144,255)",
129790
+ DownColor:"rgb(30,144,255)",
129791
+ UnchangeColor:"rgb(30,144,255)" ,
129792
+ DrawType:3
129793
+ }
129794
+ },
129795
+
129415
129796
  PriceGapStyple:
129416
129797
  {
129417
129798
  Line:{ Color:"rgb(128,128,128)" },
@@ -149185,6 +149566,10 @@ function JSDialogModifyDraw()
149185
149566
  bShowLineColor=false;
149186
149567
  bAdvanced=true;
149187
149568
  }
149569
+ else if (chart.ClassName=="ChartDrawPictureIconFont")
149570
+ {
149571
+ bShowFontZoom=true;
149572
+ }
149188
149573
 
149189
149574
  if (this.ColorButton)
149190
149575
  {
@@ -149630,7 +150015,7 @@ function JSTooltipMinuteChart()
149630
150015
 
149631
150016
  this.BGColor=g_JSChartResource.PopMinuteChart.BGColor;
149632
150017
  this.BorderColor=g_JSChartResource.PopMinuteChart.BorderColor;
149633
- this.OnCreateCallback;
150018
+ this.OnCreatedCallback;
149634
150019
 
149635
150020
  this.Minute=
149636
150021
  {
@@ -149650,8 +150035,11 @@ function JSTooltipMinuteChart()
149650
150035
  {
149651
150036
  var item=CloneData(option.Option); //复制一份出来
149652
150037
  this.Minute.Option=Object.assign(this.Minute.Option,item);
150038
+
150039
+ if (IFrameSplitOperator.IsNonEmptyArray(option.Option.EventCallback)) this.Minute.Option.EventCallback=option.Option.EventCallback;
149653
150040
  }
149654
- if (option.OnCreateCallback) this.OnCreateCallback=option.OnCreateCallback;
150041
+ if (option.OnCreatedCallback) this.OnCreatedCallback=option.OnCreatedCallback;
150042
+
149655
150043
  }
149656
150044
  }
149657
150045
 
@@ -149709,7 +150097,7 @@ function JSTooltipMinuteChart()
149709
150097
 
149710
150098
  this.OnCreateHQChart=function(chart)
149711
150099
  {
149712
- if (this.OnCreateCallback) this.OnCreateCallback(chart);
150100
+ if (this.OnCreatedCallback) this.OnCreatedCallback(chart);
149713
150101
  }
149714
150102
 
149715
150103
  this.Destroy=function()
@@ -149901,7 +150289,7 @@ function JSTooltipKLineChart()
149901
150289
 
149902
150290
  this.BGColor=g_JSChartResource.PopMinuteChart.BGColor;
149903
150291
  this.BorderColor=g_JSChartResource.PopMinuteChart.BorderColor;
149904
- this.OnCreateCallback;
150292
+ this.OnCreatedCallback=null;
149905
150293
 
149906
150294
  this.KLine=
149907
150295
  {
@@ -149920,8 +150308,10 @@ function JSTooltipKLineChart()
149920
150308
  {
149921
150309
  var item=CloneData(option.Option); //复制一份出来
149922
150310
  this.KLine.Option=Object.assign(this.KLine.Option,item);
150311
+
150312
+ if (IFrameSplitOperator.IsNonEmptyArray(option.Option.EventCallback)) this.KLine.Option.EventCallback=option.Option.EventCallback;
149923
150313
  }
149924
- if (option.OnCreateCallback) this.OnCreateCallback=option.OnCreateCallback;
150314
+ if (option.OnCreatedCallback) this.OnCreatedCallback=option.OnCreatedCallback;
149925
150315
  }
149926
150316
  }
149927
150317
 
@@ -149968,7 +150358,7 @@ function JSTooltipKLineChart()
149968
150358
 
149969
150359
  this.OnCreateHQChart=function(chart)
149970
150360
  {
149971
- if (this.OnCreateCallback) this.OnCreateCallback(chart);
150361
+ if (this.OnCreatedCallback) this.OnCreatedCallback(chart);
149972
150362
  }
149973
150363
 
149974
150364
  this.Destroy=function()
@@ -150109,7 +150499,7 @@ JSTooltipKLineChart.GetKLineOption=function()
150109
150499
  {
150110
150500
  IsShowName:true, //不显示股票名称
150111
150501
  IsShowSettingInfo:true, //不显示周期/复权
150112
- //IsTitleShowLatestData:true,
150502
+ IsTitleShowLatestData:true,
150113
150503
  },
150114
150504
 
150115
150505
  Border: //边框
@@ -154773,7 +155163,7 @@ function HQChartScriptWorker()
154773
155163
 
154774
155164
 
154775
155165
 
154776
- var HQCHART_VERSION="1.1.14532";
155166
+ var HQCHART_VERSION="1.1.14541";
154777
155167
 
154778
155168
  function PrintHQChartVersion()
154779
155169
  {