hqchart 1.1.14538 → 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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hqchart",
3
- "version": "1.1.14538",
3
+ "version": "1.1.14542",
4
4
  "description": "HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接",
5
5
  "main": "lib/main.js",
6
6
  "scripts": {
@@ -1079,6 +1079,10 @@ function JSDialogModifyDraw()
1079
1079
  bShowLineColor=false;
1080
1080
  bAdvanced=true;
1081
1081
  }
1082
+ else if (chart.ClassName=="ChartDrawPictureIconFont")
1083
+ {
1084
+ bShowFontZoom=true;
1085
+ }
1082
1086
 
1083
1087
  if (this.ColorButton)
1084
1088
  {
@@ -576,6 +576,8 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
576
576
  if (IFrameSplitOperator.IsBool(item.PriceGap.Enable)) klineChart.PriceGap.Enable=item.PriceGap.Enable;
577
577
  if (IFrameSplitOperator.IsNumber(item.PriceGap.Count)) klineChart.PriceGap.Count=item.PriceGap.Count;
578
578
  }
579
+
580
+ if (IFrameSplitOperator.IsBool(item.EnablePrediction)) klineChart.PredictionConfig.Enable=item.EnablePrediction;
579
581
  }
580
582
 
581
583
  if(option.KLineTitle)
@@ -23860,7 +23862,7 @@ function ChartData()
23860
23862
  return result;
23861
23863
  }
23862
23864
 
23863
- this.MergeMinuteData=function(data) //合并数据
23865
+ this.MergeMinuteData=function(data, period) //合并数据
23864
23866
  {
23865
23867
  if (!this.Data || this.Data.length<=0)
23866
23868
  {
@@ -23868,6 +23870,7 @@ function ChartData()
23868
23870
  return true;
23869
23871
  }
23870
23872
 
23873
+ var bDayPeriod=ChartData.IsDayPeriod(period, true);
23871
23874
  var sourceFirstItem=this.Data[0];
23872
23875
  var firstItemID=0;
23873
23876
  var firstItem=null;
@@ -23881,11 +23884,23 @@ function ChartData()
23881
23884
  break;
23882
23885
  }
23883
23886
 
23884
- if (item.Date==sourceFirstItem.Date && item.Time>=sourceFirstItem.Time)
23887
+ if (bDayPeriod)
23885
23888
  {
23886
- firstItemID=i;
23887
- firstItem=item;
23888
- break;
23889
+ if (item.Date==sourceFirstItem.Date)
23890
+ {
23891
+ firstItemID=i;
23892
+ firstItem=item;
23893
+ break;
23894
+ }
23895
+ }
23896
+ else
23897
+ {
23898
+ if (item.Date==sourceFirstItem.Date && item.Time>=sourceFirstItem.Time)
23899
+ {
23900
+ firstItemID=i;
23901
+ firstItem=item;
23902
+ break;
23903
+ }
23889
23904
  }
23890
23905
  }
23891
23906
 
@@ -23898,11 +23913,23 @@ function ChartData()
23898
23913
  var date=this.Data[i].Date;
23899
23914
  var time=this.Data[i].Time;
23900
23915
 
23901
- if (firstItem.Date>date || (firstItem.Date==date && firstItem.Time>=time) )
23916
+ if (bDayPeriod)
23902
23917
  {
23903
- index=i;
23904
- if (firstItem.Date==date && firstItem.Time==time) bFind=true;
23905
- break;
23918
+ if (firstItem.Date>date || firstItem.Date==date)
23919
+ {
23920
+ index=i;
23921
+ if (firstItem.Date==date) bFind=true;
23922
+ break;
23923
+ }
23924
+ }
23925
+ else
23926
+ {
23927
+ if (firstItem.Date>date || (firstItem.Date==date && firstItem.Time>=time) )
23928
+ {
23929
+ index=i;
23930
+ if (firstItem.Date==date && firstItem.Time==time) bFind=true;
23931
+ break;
23932
+ }
23906
23933
  }
23907
23934
  }
23908
23935
 
@@ -25816,9 +25843,30 @@ function ChartKLine()
25816
25843
  DownAreaColor:g_JSChartResource.HLCArea.DownAreaColor,
25817
25844
  }
25818
25845
 
25819
- //虚线柱子
25846
+ //虚线柱子 (非交易日)
25820
25847
  this.VirtualBarConfig={ Color:g_JSChartResource.VirtualKLine.Color, LineDash:g_JSChartResource.VirtualKLine.LineDash };
25821
25848
 
25849
+ //预测线配置
25850
+ this.PredictionConfig=
25851
+ {
25852
+ Line:
25853
+ {
25854
+ Color:g_JSChartResource.PredictionKLine.Line.Color,
25855
+ LineDash:g_JSChartResource.PredictionKLine.Line.LineDash,
25856
+ LineWidth:g_JSChartResource.PredictionKLine.Line.LineWidth
25857
+ },
25858
+
25859
+ Bar:
25860
+ {
25861
+ UpColor:g_JSChartResource.PredictionKLine.Bar.UpColor,
25862
+ DownColor:g_JSChartResource.PredictionKLine.Bar.DownColor,
25863
+ UnchangeColor:g_JSChartResource.PredictionKLine.Bar.UnchangeColor ,
25864
+ DrawType:g_JSChartResource.PredictionKLine.Bar.DrawType
25865
+ },
25866
+ Enable:false, //是否启动
25867
+ };
25868
+ this.AryPredictionCache=[]; //预测数据
25869
+
25822
25870
  //DrawType==14 自定义图形
25823
25871
  this.FFKChart;
25824
25872
 
@@ -25956,6 +26004,22 @@ function ChartKLine()
25956
26004
  this.OrderFlow.UnchagneColor= { BG:g_JSChartResource.OrderFlow.UnchagneColor.BG, Border:g_JSChartResource.OrderFlow.UnchagneColor.Border };
25957
26005
  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 };
25958
26006
  this.OrderFlow.Line={ UpDownColor: g_JSChartResource.OrderFlow.Line.UpDownColor, MiddleColor:g_JSChartResource.OrderFlow.Line.MiddleColor };
26007
+
26008
+ this.PredictionConfig.Line=
26009
+ {
26010
+ Color:g_JSChartResource.PredictionKLine.Line.Color,
26011
+ LineDash:g_JSChartResource.PredictionKLine.Line.LineDash,
26012
+ LineWidth:g_JSChartResource.PredictionKLine.Line.LineWidth
26013
+ };
26014
+
26015
+ this.PredictionConfig.Bar=
26016
+ {
26017
+ UpColor:g_JSChartResource.PredictionKLine.Bar.UpColor,
26018
+ DownColor:g_JSChartResource.PredictionKLine.Bar.DownColor,
26019
+ UnchangeColor:g_JSChartResource.PredictionKLine.Bar.UnchangeColor,
26020
+ DrawType:g_JSChartResource.PredictionKLine.Bar.DrawType
26021
+ };
26022
+
25959
26023
  }
25960
26024
 
25961
26025
  this.ClearCustomKLine=function()
@@ -26326,6 +26390,8 @@ function ChartKLine()
26326
26390
  this.DrawKRange.Start=this.Data.DataOffset;
26327
26391
 
26328
26392
  var preKItemInfo=null;
26393
+ var prePoint=null;
26394
+ var xEnd=null; //最后一个点
26329
26395
  for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
26330
26396
  {
26331
26397
  var data=this.Data.Data[i];
@@ -26339,6 +26405,13 @@ function ChartKLine()
26339
26405
  var yClose=this.GetYFromData(data.Close,false);
26340
26406
  this.DrawKRange.End=i;
26341
26407
 
26408
+ if (data.IsVirtual && this.PredictionConfig.Enable) //预测数据|虚拟数据
26409
+ {
26410
+ this.AryPredictionCache.push({ PrePoint:prePoint, Point:{ X:x, Y:yClose }});
26411
+ prePoint={ X:x, Y:yClose};
26412
+ continue;
26413
+ }
26414
+
26342
26415
  if (bFirstPoint)
26343
26416
  {
26344
26417
  if (isHScreen)
@@ -26359,6 +26432,9 @@ function ChartKLine()
26359
26432
  else this.Canvas.lineTo(x,yClose);
26360
26433
  }
26361
26434
 
26435
+ xEnd=x;
26436
+ prePoint={ X:x, Y:yClose};
26437
+
26362
26438
  if (i==this.Data.Data.length-1)
26363
26439
  {
26364
26440
  ptLast={ X:x, Y:yClose, XLeft:left, XRight:right, KItem:data, ChartRight:chartright };
@@ -26390,12 +26466,12 @@ function ChartKLine()
26390
26466
  this.Canvas.stroke();
26391
26467
  if (isHScreen)
26392
26468
  {
26393
- this.Canvas.lineTo(border.Left,x);
26469
+ this.Canvas.lineTo(border.Left,xEnd);
26394
26470
  this.Canvas.lineTo(border.Left,firstPoint.Y);
26395
26471
  }
26396
26472
  else
26397
26473
  {
26398
- this.Canvas.lineTo(x,border.Bottom);
26474
+ this.Canvas.lineTo(xEnd,border.Bottom);
26399
26475
  this.Canvas.lineTo(firstPoint.X,border.Bottom);
26400
26476
  }
26401
26477
  this.Canvas.closePath();
@@ -26458,11 +26534,12 @@ function ChartKLine()
26458
26534
  var mapBreakPoint=this.BuildBreakPoint(); //断点
26459
26535
 
26460
26536
  var preKItemInfo=null;
26537
+ var prePoint=null;
26461
26538
  for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
26462
26539
  {
26463
26540
  var data=this.Data.Data[i];
26464
26541
  this.ShowRange.End=i;
26465
- if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
26542
+ if (!data || data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
26466
26543
 
26467
26544
  var left=xOffset;
26468
26545
  var right=xOffset+dataWidth;
@@ -26471,6 +26548,13 @@ function ChartKLine()
26471
26548
  var yClose=this.GetYFromData(data.Close,false);
26472
26549
  this.DrawKRange.End=i;
26473
26550
 
26551
+ if (data.IsVirtual && this.PredictionConfig.Enable) //预测数据|虚拟数据
26552
+ {
26553
+ this.AryPredictionCache.push({ PrePoint:prePoint, Point:{ X:x, Y:yClose }});
26554
+ prePoint={ X:x, Y:yClose};
26555
+ continue;
26556
+ }
26557
+
26474
26558
  if (bFirstPoint)
26475
26559
  {
26476
26560
  if (isHScreen) this.Canvas.moveTo(yClose,x);
@@ -26484,6 +26568,8 @@ function ChartKLine()
26484
26568
  }
26485
26569
  ++drawCount;
26486
26570
 
26571
+ prePoint={ X:x, Y:yClose};
26572
+
26487
26573
  if (this.PriceGap.Enable)
26488
26574
  {
26489
26575
  var yLow=this.GetYFromData(data.Low, false);
@@ -26558,6 +26644,7 @@ function ChartKLine()
26558
26644
  }
26559
26645
 
26560
26646
  var preKItemInfo=null;
26647
+ var prePoint=null; //上一个点的位置
26561
26648
  for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
26562
26649
  {
26563
26650
  var data=this.Data.Data[i];
@@ -26607,6 +26694,10 @@ function ChartKLine()
26607
26694
  {
26608
26695
  this.DrawVirtualBar(data, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
26609
26696
  }
26697
+ else if (data.IsVirtual && this.PredictionConfig.Enable)
26698
+ {
26699
+ this.DrawPredictionBar(data, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
26700
+ }
26610
26701
  else if (kLineOption)
26611
26702
  {
26612
26703
  var barColor=kLineOption.Color;
@@ -26688,6 +26779,8 @@ function ChartKLine()
26688
26779
  if (value>0)
26689
26780
  this.AryPriceGapCache.push({ Data:[preKItemInfo, kItemInfo], Type:value });
26690
26781
  }
26782
+
26783
+ prePoint={ X:x, Y:yClose }; //上一个点
26691
26784
 
26692
26785
  preKItemInfo=kItemInfo;
26693
26786
  }
@@ -27559,6 +27652,82 @@ function ChartKLine()
27559
27652
  this.Canvas.setLineDash([]);
27560
27653
  }
27561
27654
 
27655
+ this.DrawPredictionBar=function(data, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen)
27656
+ {
27657
+ var config=this.PredictionConfig.Bar;
27658
+ var drawType=this.DrawType;
27659
+ if (IFrameSplitOperator.IsNumber(config.DrawType)) drawType=config.DrawType;
27660
+
27661
+ if (data.Open<data.Close) //阳线
27662
+ {
27663
+ this.DrawKBar_Up(data, dataWidth, config.UpColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
27664
+ }
27665
+ else if (data.Open>data.Close) //阴线
27666
+ {
27667
+ this.DrawKBar_Down(data, dataWidth, config.DownColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
27668
+ }
27669
+ else
27670
+ {
27671
+ this.DrawKBar_Unchagne(data, dataWidth, config.UnchangeColor, drawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
27672
+ }
27673
+ }
27674
+
27675
+ this.DrawPredictionLine=function()
27676
+ {
27677
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.AryPredictionCache)) return;
27678
+
27679
+ this.Canvas.save();
27680
+
27681
+ var bHScreen=(this.ChartFrame.IsHScreen===true);
27682
+ var bFirstPoint=true;
27683
+ var drawCount=0;
27684
+ for(var i=0;i<this.AryPredictionCache.length;++i)
27685
+ {
27686
+ var item=this.AryPredictionCache[i];
27687
+ if (bFirstPoint)
27688
+ {
27689
+ bFirstPoint=false;
27690
+ this.Canvas.beginPath();
27691
+ if (item.PrePoint)
27692
+ {
27693
+ var pt=item.PrePoint;
27694
+ if (bHScreen) this.Canvas.moveTo(pt.Y,pt.X); //横屏坐标轴对调
27695
+ else this.Canvas.moveTo(pt.X,pt.Y);
27696
+
27697
+ var pt=item.Point;
27698
+ if (bHScreen) this.Canvas.lineTo(pt.Y,pt.X);
27699
+ else this.Canvas.lineTo(pt.X,pt.Y);
27700
+ }
27701
+ else if (item.Point)
27702
+ {
27703
+ var pt=item.Point;
27704
+ if (bHScreen) this.Canvas.moveTo(pt.Y,pt.X); //横屏坐标轴对调
27705
+ else this.Canvas.moveTo(pt.X,pt.Y);
27706
+ }
27707
+ }
27708
+ else
27709
+ {
27710
+ var pt=item.Point;
27711
+ if (bHScreen) this.Canvas.lineTo(pt.Y,pt.X);
27712
+ else this.Canvas.lineTo(pt.X,pt.Y);
27713
+ }
27714
+
27715
+ ++drawCount;
27716
+ }
27717
+
27718
+ if (drawCount>0)
27719
+ {
27720
+ var pixelRatio=GetDevicePixelRatio();
27721
+ var config=this.PredictionConfig.Line;
27722
+ this.Canvas.strokeStyle=config.Color;
27723
+ if (IFrameSplitOperator.IsNumber(config.LineWidth)) this.Canvas.lineWidth=config.LineWidth*pixelRatio;
27724
+ if (IFrameSplitOperator.IsNonEmptyArray(config.LineDash)) this.Canvas.setLineDash(config.LineDash)
27725
+ this.Canvas.stroke();
27726
+ }
27727
+
27728
+ this.Canvas.restore();
27729
+ }
27730
+
27562
27731
  this.DrawRenkoCandle=function() //砖型K线
27563
27732
  {
27564
27733
  var isHScreen=(this.ChartFrame.IsHScreen===true);
@@ -28375,6 +28544,7 @@ function ChartKLine()
28375
28544
  this.PtMin={X:null,Y:null,Value:null,Align:'left'}; //清空最小
28376
28545
  this.DrawKRange={ Start:null, End:null };
28377
28546
  this.AryPriceGapCache=[];
28547
+ this.AryPredictionCache=[];
28378
28548
 
28379
28549
  this.ChartFrame.ChartKLine={Max:null, Min:null }; //保存K线上 显示最大最小值坐标
28380
28550
 
@@ -28415,6 +28585,7 @@ function ChartKLine()
28415
28585
  {
28416
28586
  this.DrawCloseLine();
28417
28587
  this.Canvas.restore();
28588
+ this.DrawPredictionLine();
28418
28589
  if (this.PriceGap.Enable) this.DrawPriceGap();
28419
28590
  return;
28420
28591
  }
@@ -28487,6 +28658,7 @@ function ChartKLine()
28487
28658
 
28488
28659
  this.Canvas.restore();
28489
28660
 
28661
+ this.DrawPredictionLine();
28490
28662
  if (this.PriceGap.Enable) this.DrawPriceGap();
28491
28663
 
28492
28664
  if (this.IsShowMaxMinPrice) //标注最大值最小值
@@ -35266,6 +35438,7 @@ function ChartVolStick()
35266
35438
  var value=this.Data.Data[i];
35267
35439
  var kItem=this.HistoryData.Data[i];
35268
35440
  if (value==null || kItem==null) continue;
35441
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
35269
35442
  if (value==0) continue;
35270
35443
 
35271
35444
  var left=xOffset;
@@ -72203,6 +72376,24 @@ function JSChartResource()
72203
72376
  LineDash:[2,2]
72204
72377
  };
72205
72378
 
72379
+ this.PredictionKLine=
72380
+ {
72381
+ Line:
72382
+ {
72383
+ Color:"rgb(100,100,100)",
72384
+ LineDash:[3,5],
72385
+ LineWidth:2,
72386
+ },
72387
+
72388
+ Bar:
72389
+ {
72390
+ UpColor:"rgb(65,105,225)",
72391
+ DownColor:"rgb(65,105,225)",
72392
+ UnchangeColor:"rgb(65,105,225s)" ,
72393
+ DrawType:3
72394
+ }
72395
+ };
72396
+
72206
72397
  this.PriceGapStyple=
72207
72398
  {
72208
72399
  Line:{ Color:"rgb(186,186,186)" },
@@ -73603,6 +73794,28 @@ function JSChartResource()
73603
73794
  if (item.LineDash) this.VirtualKLine.LineDash=item.LineDash;
73604
73795
  }
73605
73796
 
73797
+ if (style.PredictionKLine)
73798
+ {
73799
+ if (style.PredictionKLine.Line)
73800
+ {
73801
+ var item=style.PredictionKLine.Line;
73802
+ var dest=this.PredictionKLine.Line;
73803
+ if (item.Color) dest.Color=item.Color;
73804
+ if (item.LineDash) dest.LineDash=item.LineDash;
73805
+ if (IFrameSplitOperator.IsNumber(item.LineWidth)) dest.LineWidth=item.LineWidth;
73806
+ }
73807
+
73808
+ if (style.PredictionKLine.Bar)
73809
+ {
73810
+ var item=style.PredictionKLine.Bar;
73811
+ var dest=this.PredictionKLine.Bar;
73812
+ if (item.UpColor) dest.UpColor=item.UpColor;
73813
+ if (item.DownColor) dest.DownColor=item.DownColor;
73814
+ if (item.UnchangeColor) dest.UnchangeColor=item.UnchangeColor;
73815
+ if (IFrameSplitOperator.IsNumber(item.DrawType) || item.DrawType===null) dest.DrawType=item.DrawType;
73816
+ }
73817
+ }
73818
+
73606
73819
  if (style.PriceGapStyple)
73607
73820
  {
73608
73821
  var item=style.PriceGapStyple;
@@ -78482,9 +78695,90 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
78482
78695
  });
78483
78696
  }
78484
78697
 
78698
+
78699
+ this.RecvRealtimeDataV2=function(data)
78700
+ {
78701
+ var aryRealtimeData=KLineChartContainer.JsonDataToRealtimeDataV2(data,this.Symbol);
78702
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryRealtimeData)) return;
78703
+
78704
+ var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
78705
+ var lastSourceDataCount=this.SourceData.Data.length;
78706
+ if (!this.SourceData.MergeMinuteData(aryRealtimeData, this.Period)) return;
78707
+
78708
+ var bindData=new ChartData();
78709
+ bindData.Data=this.SourceData.Data;
78710
+ bindData.Period=this.Period;
78711
+ bindData.Right=this.Right;
78712
+ bindData.DataType=this.SourceData.DataType;
78713
+ bindData.Symbol=this.Symbol;
78714
+
78715
+ //if (bindData.Right>0 && ChartData.IsDayPeriod(bindData.Period,true) && MARKET_SUFFIX_NAME.IsSHSZStockA(this.Symbol) && !this.IsApiPeriod) //复权(A股日线数据才复权)
78716
+ if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsEnableRight(bindData.Period,this.Symbol,this.RightFormula) && !this.IsApiPeriod && ChartData.IsDayPeriod(bindData.Period,true)) //复权
78717
+ {
78718
+ var rightData=bindData.GetRightData(bindData.Right,{ AlgorithmType: this.RightFormula });
78719
+ bindData.Data=rightData;
78720
+ }
78721
+
78722
+ if (!this.IsApiPeriod)
78723
+ {
78724
+ if (ChartData.IsDayPeriod(bindData.Period,false) || ChartData.IsMinutePeriod(bindData.Period,false)) //周期数据 (0= 日线,4=1分钟线 不需要处理)
78725
+ {
78726
+ var periodData=bindData.GetPeriodData(bindData.Period);
78727
+ bindData.Data=periodData;
78728
+ }
78729
+ }
78730
+
78731
+ var kLineCalculate=this.GetKLineCalulate();
78732
+ if (kLineCalculate) //额外的K线图形计算
78733
+ {
78734
+ var newBindData=kLineCalculate.RecvHistoryData(bindData, { Symbol:this.Symbol, Function:"RecvRealtimeData" });
78735
+ bindData=newBindData;
78736
+ this.FlowCapitalReady=true;
78737
+ }
78738
+
78739
+ this.UpdateMainData(bindData,lastDataCount);//更新主图数据
78740
+ this.UpdateOverlayRealtimeDataV2(data); //更新叠加股票数据
78741
+ this.BindInstructionIndexData(bindData); //执行指示脚本
78742
+
78743
+ for(var i=0; i<this.Frame.SubFrame.length; ++i)
78744
+ {
78745
+ this.BindIndexData(i,bindData, { CheckRunCount:true });
78746
+ }
78747
+
78748
+ this.BindAllOverlayIndexData(bindData, { CheckRunCount:true, SyncExecute:true }); //同步模式叠加指标
78749
+
78750
+ //刷新画图
78751
+ this.UpdataDataoffset(); //更新数据偏移
78752
+ this.UpdatePointByCursorIndex(1); //更新十字光标位子
78753
+ this.UpdateFrameMaxMin(); //调整坐标最大 最小值
78754
+ this.Frame.SetSizeChage(true);
78755
+ this.Draw();
78756
+
78757
+ this.SendKLineUpdateEvent(bindData);
78758
+ this.UpdateDOMTooltip(0, bindData);
78759
+ this.UpdateHQFloatTooltip(bindData);
78760
+
78761
+ //叠加指标计算
78762
+ this.BindAllOverlayIndexData(bindData, { CheckRunCount:true,SyncExecute:false }); //异步模式叠加指标
78763
+
78764
+ if (this.mapEvent.has(JSCHART_EVENT_ID.ON_RECV_REALTIME_DATA))
78765
+ {
78766
+ var event=this.mapEvent.get(JSCHART_EVENT_ID.ON_RECV_REALTIME_DATA);
78767
+ var data={ HistoryData:bindData, Stock:{Symbol:this.Symbol, Name:this.Name } }
78768
+ event.Callback(event,data,this);
78769
+ }
78770
+ }
78771
+
78485
78772
  this.RecvRealtimeData=function(data)
78486
78773
  {
78487
78774
  if (this.IsOnTouch==true) return; //正在操作中不更新数据
78775
+
78776
+ if (data.Ver==3.0)
78777
+ {
78778
+ this.RecvRealtimeDataV2(data);
78779
+ return;
78780
+ }
78781
+
78488
78782
  var realtimeData=KLineChartContainer.JsonDataToRealtimeData(data,this.Symbol);
78489
78783
  if (!realtimeData) return;
78490
78784
 
@@ -78665,6 +78959,47 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
78665
78959
  }
78666
78960
  }
78667
78961
 
78962
+ this.UpdateOverlayRealtimeDataV2=function(data)
78963
+ {
78964
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.OverlayChartPaint)) return;
78965
+
78966
+ for(var i=0; i<this.OverlayChartPaint.length; ++i)
78967
+ {
78968
+ var item=this.OverlayChartPaint[i];
78969
+ if (!item.Symbol) continue;
78970
+ if (!item.MainData) continue; //等待主图股票数据未下载完
78971
+ if (item.Status!=OVERLAY_STATUS_ID.STATUS_FINISHED_ID) continue;
78972
+ var aryRealtimeData=KLineChartContainer.JsonDataToRealtimeDataV2(data,item.Symbol); //获取叠加股票的最新数据
78973
+ if (!aryRealtimeData) continue;
78974
+ var sourceData=item.SourceData; //叠加股票的所有数据
78975
+ sourceData.MergeMinuteData(aryRealtimeData, this.Period);
78976
+
78977
+ var bindData=new ChartData();
78978
+ bindData.Data=sourceData.Data;
78979
+ bindData.Period=this.Period;
78980
+ bindData.Right=this.Right;
78981
+ bindData.DataType=0;
78982
+
78983
+ //if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsSHSZStockA(data.symbol) && !this.IsApiPeriod) //复权数据 ,A股才有有复权
78984
+ if (bindData.Right>0 && MARKET_SUFFIX_NAME.IsEnableRight(bindData.Right, data.Symbol) && !this.IsApiPeriod)
78985
+ {
78986
+ var rightData=bindData.GetRightData(bindData.Right, { AlgorithmType: this.RightFormula });
78987
+ bindData.Data=rightData;
78988
+ }
78989
+
78990
+ var aryOverlayData=this.SourceData.GetOverlayData(bindData.Data, this.IsApiPeriod); //和主图数据拟合以后的数据
78991
+ bindData.Data=aryOverlayData;
78992
+
78993
+ if (ChartData.IsDayPeriod(bindData.Period,false) && !this.IsApiPeriod) //周期数据
78994
+ {
78995
+ var periodData=bindData.GetPeriodData(bindData.Period);
78996
+ bindData.Data=periodData;
78997
+ }
78998
+
78999
+ item.Data=bindData;
79000
+ }
79001
+ }
79002
+
78668
79003
  this.RequestMinuteRealtimeData=function()
78669
79004
  {
78670
79005
  var self=this;
@@ -78786,7 +79121,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
78786
79121
  if (this.IsApiPeriod) this.ReduceSourceData(); //减少数据
78787
79122
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
78788
79123
  if (!this.SourceData) return;
78789
- if (!this.SourceData.MergeMinuteData(aryMinuteData)) return;
79124
+ if (!this.SourceData.MergeMinuteData(aryMinuteData, this.Period)) return;
78790
79125
 
78791
79126
  JSConsole.Chart.Log(`[KLineChartContainer::RecvMinuteRealtimeDataV2] update kline by 1 minute data [${lastDataCount}->${this.SourceData.Data.length}], IsAutoSyncDataOffset=${this.IsAutoSyncDataOffset}`);
78792
79127
 
@@ -78869,7 +79204,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
78869
79204
  if (this.IsApiPeriod) this.ReduceSourceData(); //减少数据
78870
79205
  var lastDataCount=this.GetHistoryDataCount(); //保存下上一次的数据个数
78871
79206
  var lastSourceDataCount=this.SourceData.Data.length;
78872
- if (!this.SourceData.MergeMinuteData(realtimeData)) return;
79207
+ if (!this.SourceData.MergeMinuteData(realtimeData, this.Period)) return;
78873
79208
 
78874
79209
  JSConsole.Chart.Log(`[KLineChartContainer::RecvMinuteRealtimeData] update kline by 1 minute data [${lastSourceDataCount}->${this.SourceData.Data.length}]`);
78875
79210
 
@@ -78940,7 +79275,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
78940
79275
  var realtimeData=KLineChartContainer.JsonDataToMinuteRealtimeData(data,item.Symbol); //获取叠加股票的最新数据
78941
79276
  if (!realtimeData) continue;
78942
79277
  var sourceData=item.SourceData; //叠加股票的所有数据
78943
- if (!sourceData.MergeMinuteData(realtimeData)) return;
79278
+ if (!sourceData.MergeMinuteData(realtimeData,this.Period)) return;
78944
79279
 
78945
79280
  var bindData=new ChartData();
78946
79281
  bindData.Data=sourceData.Data;
@@ -83771,6 +84106,27 @@ KLineChartContainer.JsonDataToHistoryData=function(data)
83771
84106
  return aryDayData;
83772
84107
  }
83773
84108
 
84109
+
84110
+ KLineChartContainer.JsonDataToRealtimeDataV2=function(data, symbol)
84111
+ {
84112
+ if (!IFrameSplitOperator.IsNonEmptyArray(data.stock)) return null;
84113
+
84114
+ var finder=null;
84115
+ for(var i=0;i<data.stock.length;++i)
84116
+ {
84117
+ var item=data.stock[i];
84118
+ if (item.symbol==symbol)
84119
+ {
84120
+ finder=item;
84121
+ break;
84122
+ }
84123
+ }
84124
+
84125
+ if (!finder) return null;
84126
+
84127
+ return KLineChartContainer.JsonDataToHistoryData(finder);
84128
+ }
84129
+
83774
84130
  KLineChartContainer.JsonDataToRealtimeData=function(data, symbol)
83775
84131
  {
83776
84132
  if (!data.stock) return null;
@@ -268,6 +268,23 @@ function GetBlackStyle()
268
268
  LineDash:[2,2]
269
269
  },
270
270
 
271
+ PredictionKLine:
272
+ {
273
+ Line:
274
+ {
275
+ Color:"rgb(220,220,220)",
276
+ LineDash:[3*GetDevicePixelRatio(),3*GetDevicePixelRatio()]
277
+ },
278
+
279
+ Bar:
280
+ {
281
+ UpColor:"rgb(30,144,255)",
282
+ DownColor:"rgb(30,144,255)",
283
+ UnchangeColor:"rgb(30,144,255)" ,
284
+ DrawType:3
285
+ }
286
+ },
287
+
271
288
  PriceGapStyple:
272
289
  {
273
290
  Line:{ Color:"rgb(128,128,128)" },