hqchart 1.1.13339 → 1.1.13350

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.
@@ -4270,13 +4270,22 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
4270
4270
  if (IFrameSplitOperator.IsBool(item.IsShowKLineDivTooltip)) chart.IsShowKLineDivTooltip=item.IsShowKLineDivTooltip;
4271
4271
  if (option.KLine.MaxRequestMinuteDayCount>0) chart.MaxRequestMinuteDayCount=option.KLine.MaxRequestMinuteDayCount;
4272
4272
  if (option.KLine.DrawType) chart.KLineDrawType=option.KLine.DrawType;
4273
- if (option.KLine.FirstShowDate>19910101) chart.CustomShow={ Date:option.KLine.FirstShowDate, PageSize:option.KLine.PageSize };
4273
+ if (option.KLine.FirstShowDate>19910101) chart.CustomShow={ Date:option.KLine.FirstShowDate, PageSize:option.KLine.PageSize }; //!!已弃用 新的格式"CustomShow"
4274
4274
  if (option.KLine.RightSpaceCount>0) chart.RightSpaceCount=option.KLine.RightSpaceCount;
4275
4275
  if (option.KLine.ZoomType>0) chart.ZoomType=option.KLine.ZoomType;
4276
4276
  if (option.KLine.DataWidth>=1) chart.KLineSize={ DataWidth:option.KLine.DataWidth };
4277
4277
  if (IFrameSplitOperator.IsNumber(option.KLine.RightFormula)) chart.RightFormula=option.KLine.RightFormula;
4278
4278
  }
4279
4279
 
4280
+ //自定义显示位置
4281
+ if (option.CustomShow && IFrameSplitOperator.IsPlusNumber(option.CustomShow.Date))
4282
+ {
4283
+ var item=option.CustomShow;
4284
+ chart.CustomShow={ Date:item.Date };
4285
+ if (IFrameSplitOperator.IsNumber(item.Time)) chart.CustomShow.Time=item.Time;
4286
+ if (IFrameSplitOperator.IsPlusNumber(item.PageSize)) chart.CustomShow.PageSize=item.PageSize;
4287
+ }
4288
+
4280
4289
  if (option.EnableFlowCapital)
4281
4290
  {
4282
4291
  var item=option.EnableFlowCapital;
@@ -5797,12 +5806,6 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
5797
5806
  }
5798
5807
  }
5799
5808
 
5800
- this.ChangMainDataControl=function(dataControl)
5801
- {
5802
- if (this.JSChartContainer && typeof(this.JSChartContainer.SetMainDataConotrl)=='function')
5803
- this.JSChartContainer.SetMainDataConotrl(dataControl);
5804
- }
5805
-
5806
5809
  this.AddOverlayIndex=function(obj) //{WindowIndex:窗口ID, IndexName:指标ID, Identify:叠加指标ID(可选), API}
5807
5810
  {
5808
5811
  if (this.JSChartContainer && typeof(this.JSChartContainer.AddOverlayIndex)=='function')
@@ -12007,7 +12010,9 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
12007
12010
  let sendData={ DrawPicture: drawPicture };
12008
12011
  event.Callback(event,sendData,this);
12009
12012
  }
12010
- else if (drawPicture.FinishedCallback) drawPicture.FinishedCallback(drawPicture);
12013
+
12014
+ //单个回调
12015
+ if (drawPicture.FinishedCallback) drawPicture.FinishedCallback(drawPicture);
12011
12016
 
12012
12017
  if (drawPicture.OnFinish) drawPicture.OnFinish();
12013
12018
 
@@ -13541,6 +13546,11 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
13541
13546
  if (deleteCount>0) this.ChartPaintEx=paint;
13542
13547
  }
13543
13548
  }
13549
+
13550
+ this.ClearCurrnetDrawPicture=function()
13551
+ {
13552
+ this.CurrentChartDrawPicture=null;
13553
+ }
13544
13554
  }
13545
13555
 
13546
13556
  function GetDevicePixelRatio()
@@ -59681,6 +59691,7 @@ IChartDrawPicture.ArrayDrawPricture=
59681
59691
  { Name:"PriceRange", ClassName:"ChartPriceRange", Create:function() { return new ChartPriceRange(); }},
59682
59692
  { Name:"DateRange", ClassName:"ChartDateRange", Create:function() { return new ChartDateRange(); }},
59683
59693
  { Name:"InfoLine", ClassName:"ChartInfoLine", Create:function() { return new ChartInfoLine(); }},
59694
+ { Name:"TrendAngle", ClassName:"ChartTrendAngle", Create:function() { return new ChartTrendAngle(); }}
59684
59695
  ];
59685
59696
 
59686
59697
  IChartDrawPicture.MapIonFont=new Map(
@@ -59845,6 +59856,103 @@ function ChartDrawPictureLine()
59845
59856
  }
59846
59857
  }
59847
59858
 
59859
+ //趋势线角度
59860
+ function ChartTrendAngle()
59861
+ {
59862
+ this.newMethod=ChartDrawPictureLine; //派生
59863
+ this.newMethod();
59864
+ delete this.newMethod;
59865
+
59866
+ this.ClassName='ChartTrendAngle';
59867
+ this.AngleLineLength=100;
59868
+ this.AngleLineDash=[3,3];
59869
+ this.Font=12*GetDevicePixelRatio() +"px 微软雅黑";
59870
+ this.Super_SetOption=this.SetOption; //父类函数
59871
+
59872
+ this.SetOption=function(option)
59873
+ {
59874
+ if (this.Super_SetOption) this.Super_SetOption(option);
59875
+ if (option)
59876
+ {
59877
+ if (IFrameSplitOperator.IsNumber(option.AngleLineLength)) this.AngleLineLength=option.AngleLineLength;
59878
+ if (option.Font) this.Font=option.Font;
59879
+ if (option.AngleLineDash) this.AngleLineDash=option.AngleLineDash;
59880
+ }
59881
+ }
59882
+
59883
+ this.Draw=function()
59884
+ {
59885
+ this.LinePoint=[];
59886
+ if (this.IsFrameMinSize()) return;
59887
+ if (!this.IsShow) return;
59888
+
59889
+ var drawPoint=this.CalculateDrawPoint( {IsCheckX:true, IsCheckY:false} );
59890
+ if (!drawPoint) return;
59891
+ if (drawPoint.length!=2) return;
59892
+
59893
+ this.ClipFrame();
59894
+
59895
+ var ptStart=drawPoint[0];
59896
+ var ptEnd=drawPoint[1];
59897
+
59898
+ this.SetLineWidth();
59899
+ this.Canvas.strokeStyle=this.LineColor;
59900
+ this.Canvas.beginPath();
59901
+ this.Canvas.moveTo(ptStart.X,ptStart.Y);
59902
+ this.Canvas.lineTo(ptEnd.X,ptEnd.Y);
59903
+ this.Canvas.stroke();
59904
+ this.RestoreLineWidth();
59905
+
59906
+ this.DrawAngle(ptStart, ptEnd);
59907
+
59908
+ var line={Start:ptStart, End:ptEnd};
59909
+ this.LinePoint.push(line);
59910
+
59911
+ this.DrawPoint(drawPoint); //画点
59912
+ this.Canvas.restore();
59913
+ }
59914
+
59915
+ this.DrawAngle=function(ptStart, ptEnd)
59916
+ {
59917
+ var pixelRatio=GetDevicePixelRatio();
59918
+ var angle=this.CalculateAngle(ptStart.X, ptStart.Y, ptEnd.X, ptEnd.Y); //角度
59919
+ var lineLength=this.AngleLineLength*pixelRatio; //角度线长度
59920
+ var ptRight={ X:ptStart.X+lineLength, Y:ptStart.Y };
59921
+
59922
+ if (this.AngleLineDash) this.Canvas.setLineDash(this.AngleLineDash); //画虚线
59923
+
59924
+ this.Canvas.lineWidth=1*GetDevicePixelRatio();
59925
+ this.Canvas.beginPath();
59926
+ this.Canvas.moveTo(ToFixedPoint(ptStart.X),ToFixedPoint(ptStart.Y));
59927
+ this.Canvas.lineTo(ToFixedPoint(ptRight.X),ToFixedPoint(ptRight.Y));
59928
+ this.Canvas.stroke();
59929
+
59930
+ this.Canvas.beginPath();
59931
+ if (angle<=180)
59932
+ {
59933
+ this.Canvas.arc(ptStart.X,ToFixedPoint(ptStart.Y),lineLength,0,(Math.PI / 180)*(360-angle), true);
59934
+ var text=`${angle.toFixed(0)}°`;
59935
+ }
59936
+ else
59937
+ {
59938
+ this.Canvas.arc(ptStart.X,ToFixedPoint(ptStart.Y),lineLength,0,(Math.PI / 180)*(360-angle), false);
59939
+ var text=`${(angle-360).toFixed(0)}°`;
59940
+ }
59941
+
59942
+ this.Canvas.stroke();
59943
+
59944
+ this.Canvas.textAlign="left";
59945
+ this.Canvas.textBaseline="middle";
59946
+ this.Canvas.font=this.Font;
59947
+ this.Canvas.fillStyle=this.LineColor;
59948
+
59949
+ if (this.AngleLineDash) this.Canvas.setLineDash([]);
59950
+
59951
+
59952
+ this.Canvas.fillText(text,ptRight.X+5,ptRight.Y);
59953
+ }
59954
+ }
59955
+
59848
59956
  //画图工具-涂鸦线段 Y轴关联数值, X轴不关联
59849
59957
  function ChartDrawGraffitiLine()
59850
59958
  {
@@ -68624,9 +68732,9 @@ function ChartInfoLine()
68624
68732
  labelInfo.PtStart=ptStart;
68625
68733
  labelInfo.PtEnd=ptEnd;
68626
68734
 
68627
- this.DrawLabel(labelInfo);
68628
-
68629
68735
  this.Canvas.restore();
68736
+
68737
+ this.DrawLabel(labelInfo);
68630
68738
  }
68631
68739
 
68632
68740
  this.DrawLabel=function(labelInfo)
@@ -72124,7 +72232,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72124
72232
  this.SourceDataLimit=new Map(); //每个周期缓存数据最大个数 key=周期 value=最大个数
72125
72233
  this.CtrlMoveStep=5; //Ctrl+(Left/Right) 移动数据个数
72126
72234
 
72127
- this.CustomShow=null; //首先显示的K线的起始日期 { Date:日期 PageSize:}
72235
+ this.CustomShow=null; //首先显示的K线的起始日期 { Date:日期, Time:时间, PageSize:}
72128
72236
  this.ZoomType=0; //缩放模式 0=最右边固定缩放, 1=十字光标两边缩放
72129
72237
  this.IsZoomLockRight=false;
72130
72238
  this.KLineSize=null; //{ DataWidth:, }
@@ -72710,47 +72818,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72710
72818
  var hisData=this.ChartOperator_Temp_GetHistroyData();
72711
72819
  if (!hisData) return; //数据还没有到达
72712
72820
 
72713
- var index=null;
72714
- if (ChartData.IsDayPeriod(this.Period,true))
72715
- {
72716
- for(var i=0;i<hisData.Data.length;++i)
72717
- {
72718
- var item=hisData.Data[i];
72719
- if (item.Date>=obj.Date)
72720
- {
72721
- index=i;
72722
- break;
72723
- }
72724
- }
72725
- }
72726
- else if (ChartData.IsMinutePeriod(this.Period,true))
72727
- {
72728
- let findTime=obj.Time;
72729
- if (IFrameSplitOperator.IsPlusNumber(findTime))
72730
- {
72731
- for(var i=0;i<hisData.Data.length;++i)
72732
- {
72733
- var item=hisData.Data[i];
72734
- if (item.Date>obj.Date || (item.Date==obj.Date && item.Time>=findTime))
72735
- {
72736
- index=i;
72737
- break;
72738
- }
72739
- }
72740
- }
72741
- else //只有日期
72742
- {
72743
- for(var i=0;i<hisData.Data.length;++i)
72744
- {
72745
- var item=hisData.Data[i];
72746
- if (item.Date>=obj.Date)
72747
- {
72748
- index=i;
72749
- break;
72750
- }
72751
- }
72752
- }
72753
- }
72821
+ var index=this.ChartOperator_GetIndex_ByDateTime(hisData, obj, this.Period, 0);
72754
72822
 
72755
72823
  if (index===null)
72756
72824
  {
@@ -72870,6 +72938,63 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
72870
72938
  this.UpdatePointByCursorIndex(); //更新十字光标位子
72871
72939
  }
72872
72940
 
72941
+ //定位K线的索引
72942
+ //searchType 0模糊匹配 1=精确匹配
72943
+ this.ChartOperator_GetIndex_ByDateTime=function(hisData, dateTime, period, searchType)
72944
+ {
72945
+ if (!hisData) return null; //数据还没有到达
72946
+ if (!IFrameSplitOperator.IsNonEmptyArray(hisData.Data)) return null;
72947
+ if (!IFrameSplitOperator.IsPlusNumber(dateTime.Date) || dateTime.Date<19810101) return null;
72948
+
72949
+ if (ChartData.IsDayPeriod(period, true))
72950
+ {
72951
+ for(var i=0;i<hisData.Data.length;++i)
72952
+ {
72953
+ var item=hisData.Data[i];
72954
+ if (searchType==1)
72955
+ {
72956
+ if (item.Date==dateTime.Date) return i;
72957
+ }
72958
+ else
72959
+ {
72960
+ if (item.Date>=dateTime.Date) return i;
72961
+ }
72962
+ }
72963
+
72964
+ return null;
72965
+ }
72966
+
72967
+ if (ChartData.IsMinutePeriod(period,true) || ChartData.IsMilliSecondPeriod(period))
72968
+ {
72969
+ var findTime=null;
72970
+ if (IFrameSplitOperator.IsNumber(dateTime.Time)) findTime=dateTime.Time;
72971
+ for(var i=0;i<hisData.Data.length;++i)
72972
+ {
72973
+ var item=hisData.Data[i];
72974
+ if (searchType==1) //精确匹配
72975
+ {
72976
+ if (findTime==null) return null;
72977
+ if (item.Date==dateTime.Date && item.Time==findTime) return i;
72978
+ }
72979
+ else
72980
+ {
72981
+ if (findTime==null) //只有日期
72982
+ {
72983
+ if (item.Date>=dateTime.Date) return i;
72984
+ }
72985
+ else
72986
+ {
72987
+ if (item.Date>dateTime.Date || (item.Date==dateTime.Date && item.Time>=findTime)) return i;
72988
+ }
72989
+ }
72990
+ }
72991
+
72992
+ return null;
72993
+ }
72994
+
72995
+ return null;
72996
+ }
72997
+
72873
72998
  this.OnWheel=function(e)
72874
72999
  {
72875
73000
  JSConsole.Chart.Log('[KLineChartContainer::OnWheel]',e);
@@ -73488,37 +73613,21 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
73488
73613
 
73489
73614
  this.SetCustomShow=function(customShow,hisData)
73490
73615
  {
73491
- if (!customShow || !customShow.Date || customShow.Date<19910101) return;
73492
-
73493
- var firstDate=customShow.Date;
73494
- var index=null;
73495
- for(var i =0;i<hisData.Data.length;++i)
73496
- {
73497
- var item=hisData.Data[i];
73498
- if (item.Date>=firstDate)
73499
- {
73500
- index=i;
73501
- break;
73502
- }
73503
- }
73616
+ var index=this.ChartOperator_GetIndex_ByDateTime(hisData,customShow, this.Period, 0);
73504
73617
  if (index===null)
73505
73618
  {
73506
- JSConsole.Chart.Log(`[KLineChartContainer::SetCustomShow] Can't find first date=${firstDate}`);
73619
+ JSConsole.Chart.Log("[KLineChartContainer::SetCustomShow] Can't find index by customShow=",customShow);
73507
73620
  return;
73508
73621
  }
73509
73622
 
73510
- var count=hisData.Data.length-index;
73511
- if (customShow.PageSize>0) count=customShow.PageSize;
73512
-
73513
- var customShowCount=count;
73514
- var pageSize=this.GetMaxMinPageSize();
73515
- if (count>pageSize.Max) customShowCount=pageSize.Max;
73516
- else if (count<pageSize.Min) customShowCount=pageSize.Min;
73517
-
73518
- for(var i in this.Frame.SubFrame)
73623
+ if (IFrameSplitOperator.IsPlusNumber(customShow.PageSize)) //调整一屏显示个数 否则使用默认的
73519
73624
  {
73520
- var item =this.Frame.SubFrame[i].Frame;
73521
- item.XPointCount=customShowCount;
73625
+ var showCount=customShow.PageSize;
73626
+ for(var i=0;i<this.Frame.SubFrame.length; ++i)
73627
+ {
73628
+ var item =this.Frame.SubFrame[i].Frame;
73629
+ item.XPointCount=showCount;
73630
+ }
73522
73631
  }
73523
73632
 
73524
73633
  this.ChartPaint[0].Data.DataOffset=index;
@@ -76806,6 +76915,14 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
76806
76915
  }
76807
76916
  }
76808
76917
  }
76918
+
76919
+ if (option.CustomShow && IFrameSplitOperator.IsPlusNumber(option.CustomShow.Date))
76920
+ {
76921
+ var item=option.CustomShow;
76922
+ this.CustomShow={ Date:item.Date };
76923
+ if (IFrameSplitOperator.IsNumber(item.Time)) this.CustomShow.Time=item.Time;
76924
+ if (IFrameSplitOperator.IsPlusNumber(item.PageSize)) this.CustomShow.PageSize=item.PageSize;
76925
+ }
76809
76926
  }
76810
76927
 
76811
76928
  this.ReloadChartDrawPicture();
@@ -77462,11 +77579,6 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
77462
77579
  return true;
77463
77580
  }
77464
77581
 
77465
- this.ClearCurrnetDrawPicture=function()
77466
- {
77467
- this.CurrentChartDrawPicture=null;
77468
- }
77469
-
77470
77582
  this.AddChartDrawPicture=function(obj)
77471
77583
  {
77472
77584
  if (!obj) return null;
@@ -135969,6 +136081,7 @@ function JSDialogDrawTool()
135969
136081
  { Title: '线段', ClassName: 'hqchart_drawtool icon-draw_line', Type:0, Data:{ ID:"线段" } },
135970
136082
  { Title: '线段信息', ClassName: 'hqchart_drawtool icon-infoline', Type:0, Data:{ ID:"InfoLine" } },
135971
136083
  { Title: '射线', ClassName: 'hqchart_drawtool icon-draw_rays', Type:0, Data:{ ID:"射线" } },
136084
+ { Title: "趋势线角度", ClassName:"hqchart_drawtool icon-qushixianjiaodu", Type:0, Data:{ ID:"TrendAngle" }},
135972
136085
  { Title: '标价线', ClassName: 'hqchart_drawtool icon-price_line', Type:0, Data:{ ID:"标价线" } },
135973
136086
  { Title: '垂直线', ClassName: 'hqchart_drawtool icon-vertical_line', Type:0, Data:{ ID:"垂直线" } },
135974
136087
  { Title: '十字线', ClassName: 'hqchart_drawtool icon-tubiao_shizixian', Type:0, Data:{ ID:"十字线" } },
@@ -136084,7 +136197,7 @@ function JSDialogDrawTool()
136084
136197
  this.LineColorIndex=0;
136085
136198
  this.RandomLineColor=["rgb(255,69,0)", "rgb(0,191,255)", "rgb(255,0,255)", "rgb(255,105,180)"];
136086
136199
  this.LineWidth=1*GetDevicePixelRatio();
136087
- this.ColumnCount=4;
136200
+ this.ColumnCount=5
136088
136201
 
136089
136202
  this.DragTitle=null;
136090
136203
 
@@ -136989,7 +137102,7 @@ function HQChartScriptWorker()
136989
137102
 
136990
137103
 
136991
137104
 
136992
- var HQCHART_VERSION="1.1.13338";
137105
+ var HQCHART_VERSION="1.1.13349";
136993
137106
 
136994
137107
  function PrintHQChartVersion()
136995
137108
  {