hqchart 1.1.14330 → 1.1.14340

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.
@@ -6771,6 +6771,9 @@ var JSCHART_MENU_ID=
6771
6771
  CMD_MODIFY_INDEX_PARAM:45, //指标删除修改 [windowIndex, ]
6772
6772
  CMD_MODIFY_OVERLAY_INDEX_PARAM:46, //叠加指标修改 [windowIndex, ID ]
6773
6773
 
6774
+ CMD_LOCK_CROSSCURSOR:47, //锁十字光标
6775
+ CMD_UNLOCK_CROSSCURSOR:48, //解锁十字光标
6776
+
6774
6777
 
6775
6778
  CMD_REPORT_CHANGE_BLOCK_ID:100, //报价列表 切换板块ID
6776
6779
  CMD_REPORT_COLUMN_SORT_ID:101, //报价列表 表头排序 Arg[列序号, 排序方向]
@@ -14112,6 +14115,12 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
14112
14115
  var sendData={ e:null, WindowIndex:param, Type:2, Identify:aryArgs[1] };
14113
14116
  this.ShowModifyIndexParamDialog(sendData);
14114
14117
  break;
14118
+ case JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR:
14119
+ if (srcParam) this.LockCorssCursor(srcParam);
14120
+ break;
14121
+ case JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR:
14122
+ if (this.IsLockCorssCursor()) this.UnlockCorssCursor({ Draw:true })
14123
+ break;
14115
14124
  }
14116
14125
  }
14117
14126
 
@@ -14198,13 +14207,13 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
14198
14207
  if (!this.JSPopMenu) return;
14199
14208
  var x=data.X, y=data.Y;
14200
14209
  var frameID=data.FrameID;
14201
- var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
14210
+ var menuData={ Menu:this.GetRightMenuData(frameID, data), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
14202
14211
  menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
14203
14212
 
14204
14213
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CREATE_RIGHT_MENU);
14205
14214
  if (event && event.Callback)
14206
14215
  {
14207
- var sendData={ MenuData:menuData, FrameID:frameID };
14216
+ var sendData={ MenuData:menuData, FrameID:frameID, Data:data };
14208
14217
  event.Callback(event, sendData, this);
14209
14218
  }
14210
14219
 
@@ -24621,9 +24630,9 @@ function HQTradeFrame()
24621
24630
  return null;
24622
24631
  }
24623
24632
 
24624
- this.GetXFromIndex=function(index)
24633
+ this.GetXFromIndex=function(index,isLimit)
24625
24634
  {
24626
- return this.SubFrame[0].Frame.GetXFromIndex(index);
24635
+ return this.SubFrame[0].Frame.GetXFromIndex(index,isLimit);
24627
24636
  }
24628
24637
 
24629
24638
  this.GetYFromData=function(value)
@@ -27623,15 +27632,15 @@ function ChartData()
27623
27632
  this.FindDataIndexByDateTime=function(aryDateTime) //aryDateTime=[ { Date:, Time:, Index:-1 }, ......]
27624
27633
  {
27625
27634
  var findCount=0;
27626
- for(var i in aryDateTime)
27635
+ for(var i=0;i<aryDateTime.length;++i)
27627
27636
  {
27628
27637
  aryDateTime[i].Index=-1;
27629
27638
  }
27630
27639
 
27631
- for(var i in this.Data)
27640
+ for(var i=0;i<this.Data.length;++i)
27632
27641
  {
27633
27642
  var item=this.Data[i];
27634
- for(var j in aryDateTime)
27643
+ for(var j=0;j<aryDateTime.length;++j)
27635
27644
  {
27636
27645
  var findItem=aryDateTime[j];
27637
27646
  if (findItem.Index>=0) continue;
@@ -27640,7 +27649,7 @@ function ChartData()
27640
27649
  {
27641
27650
  if (findItem.Date==item.Date && findItem.Time==item.Time)
27642
27651
  {
27643
- findItem.Index=parseInt(i);
27652
+ findItem.Index=i;
27644
27653
  ++findCount;
27645
27654
  break;
27646
27655
  }
@@ -27649,7 +27658,7 @@ function ChartData()
27649
27658
  {
27650
27659
  if (findItem.Date==item.Date)
27651
27660
  {
27652
- findItem.Index=parseInt(i);
27661
+ findItem.Index=i;
27653
27662
  ++findCount;
27654
27663
  break;
27655
27664
  }
@@ -28273,6 +28282,30 @@ ChartData.GetPeriodName=function(period)
28273
28282
  }
28274
28283
 
28275
28284
 
28285
+ ChartData.GetKValue=function(kItem, valueName)
28286
+ {
28287
+ if (!kItem) return null;
28288
+
28289
+ switch(valueName)
28290
+ {
28291
+ case "HIGH":
28292
+ case "H":
28293
+ return kItem.High;
28294
+ case "L":
28295
+ case "LOW":
28296
+ return kItem.Low;
28297
+ case "C":
28298
+ case "CLOSE":
28299
+ return kItem.Close;
28300
+ case "O":
28301
+ case "OPEN":
28302
+ return KItem.Open;
28303
+ default:
28304
+ return null;
28305
+ }
28306
+ }
28307
+
28308
+
28276
28309
 
28277
28310
  function TooltipData() //提示信息
28278
28311
  {
@@ -35199,15 +35232,7 @@ function ChartOverlayKLine()
35199
35232
 
35200
35233
  if (!this.MainData || !this.Data) return range;
35201
35234
 
35202
- var firstOpen=null; //主线数据第1个收盘价
35203
- for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length && j<xPointCount;++i,++j)
35204
- {
35205
- var data=this.MainData.Data[i];
35206
- if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
35207
- firstOpen=data.Close;
35208
- break;
35209
- }
35210
-
35235
+ var firstOpen=this.GetFirstOpen();
35211
35236
  if (firstOpen==null) return range;
35212
35237
 
35213
35238
  var firstOverlayOpen=null;
@@ -44805,7 +44830,7 @@ function ChartMultiLine()
44805
44830
  }
44806
44831
  }
44807
44832
 
44808
- // 线段集合 支持横屏
44833
+ // 多个点集合 支持横屏
44809
44834
  function ChartMultiPoint()
44810
44835
  {
44811
44836
  this.newMethod=IChartPainting; //派生
@@ -44813,98 +44838,219 @@ function ChartMultiPoint()
44813
44838
  delete this.newMethod;
44814
44839
 
44815
44840
  this.ClassName="ChartMultiPoint";
44816
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
44841
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
44817
44842
 
44818
44843
 
44819
44844
  this.IsHScreen=false;
44820
44845
  this.LineWidth=1;
44821
44846
  this.PointRadius=5;
44822
44847
 
44848
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44849
+ this.GetKValue=ChartData.GetKValue;
44850
+
44851
+ this.BuildKey=function(item)
44852
+ {
44853
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44854
+ else return item.Date;
44855
+ }
44856
+
44857
+ this.GetItem=function(kItem)
44858
+ {
44859
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44860
+
44861
+ var key=this.BuildKey(kItem);
44862
+ if (!this.MapCache.has(key)) return null;
44863
+
44864
+ return this.MapCache.get(key);
44865
+ }
44866
+
44867
+ this.BuildCacheData=function()
44868
+ {
44869
+ var mapData=new Map();
44870
+ this.MapCache=mapData;
44871
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44872
+
44873
+ for(var i=0; i<this.PointGroup.length; ++i)
44874
+ {
44875
+ var groupItem=this.PointGroup[i];
44876
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44877
+
44878
+ var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44879
+ if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
44880
+
44881
+ for(var j=0; j<groupItem.Point.length; ++j)
44882
+ {
44883
+ var point=groupItem.Point[j];
44884
+ var key=this.BuildKey(point);
44885
+
44886
+ var item={ Data:point, ColorConfig:clrConfig }
44887
+ if (mapData.has(key))
44888
+ {
44889
+ var mapItem=mapData.get(key);
44890
+ mapItem.Data.push(item);
44891
+ }
44892
+ else
44893
+ {
44894
+ mapData.set(key,{ Data:[item] });
44895
+ }
44896
+ }
44897
+ }
44898
+ }
44899
+
44823
44900
  this.Draw=function()
44824
44901
  {
44825
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
44826
- if (!this.Data || this.Data.length<=0) return;
44902
+ if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44903
+ if (this.IsShowIndexTitleOnly()) return;
44904
+ if (this.IsHideScriptIndex()) return;
44905
+
44906
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44827
44907
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44908
+ if (!this.MapCache || this.MapCache.size<=0) return;
44828
44909
 
44829
44910
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44830
44911
  var xPointCount=this.ChartFrame.XPointCount;
44831
- var offset=this.Data.DataOffset;
44832
- var pixel=GetDevicePixelRatio();
44912
+ var dataWidth=this.ChartFrame.DataWidth;
44913
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44914
+ var isMinute=this.IsMinuteFrame();
44915
+
44916
+ var border=this.GetBorder();
44917
+ if (this.IsHScreen)
44918
+ {
44919
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44920
+ var chartright=border.BottomEx;
44921
+ var chartLeft=border.TopEx;
44922
+ }
44923
+ else
44924
+ {
44925
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44926
+ var chartright=border.RightEx;
44927
+ var chartLeft=border.LeftEx;
44928
+ }
44929
+
44930
+ //计算所有的点位置
44931
+ var mapPoint=new Map();
44932
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44933
+ {
44934
+ var kItem=this.Data.Data[i];
44935
+ var key=this.BuildKey(kItem);
44936
+ if (!this.MapCache.has(key)) continue;
44937
+ var mapItem=this.MapCache.get(key);
44938
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44939
+
44940
+ if (isMinute)
44941
+ {
44942
+ var x=this.ChartFrame.GetXFromIndex(j);
44943
+ }
44944
+ else
44945
+ {
44946
+ var left=xOffset;
44947
+ var right=xOffset+dataWidth;
44948
+ if (right>chartright) break;
44949
+ var x=left+(right-left)/2;
44950
+ }
44951
+
44952
+ this.CalculateItem(mapItem, kItem, x, mapPoint);
44953
+ }
44954
+
44955
+ if (mapPoint.size<=0) return;
44833
44956
 
44834
44957
  this.Canvas.save();
44835
44958
  this.ClipClient(this.IsHScreen);
44836
-
44837
- for(var i=0; i<this.PointGroup.length; ++i)
44959
+
44960
+ this.DrawAllPoint(mapPoint);
44961
+
44962
+ this.Canvas.restore();
44963
+ }
44964
+
44965
+ this.CalculateItem=function(groupItem, kItem, x, mapPoint)
44966
+ {
44967
+ for(var i=0; i<groupItem.Data.length; ++i)
44838
44968
  {
44839
- var item=this.PointGroup[i];
44840
- var color=item.Color;
44841
- var bgColor=item.BGColor;
44842
- var lineWidth=this.LineWidth;
44843
- var radius=this.PointRadius;
44844
- if (IFrameSplitOperator.IsNumber(item.LineWidth)) lineWidth=item.LineWidth;
44845
- if (IFrameSplitOperator.IsNumber(item.PointRadius)) radius=item.PointRadius;
44969
+ var item=groupItem.Data[i];
44970
+ var value=item.Data.Value;
44971
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44972
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44973
+
44974
+ var y=this.ChartFrame.GetYFromData(value,false);
44975
+
44976
+ var strConfig=JSON.stringify(item.ColorConfig);
44977
+ if (!mapPoint.has(strConfig)) mapPoint.set(strConfig, { AryPoint:[]});
44978
+ var mapItem=mapPoint.get(strConfig);
44979
+
44980
+ mapItem.AryPoint.push({ X:x, Y:y, Data:item });
44981
+ }
44982
+ }
44983
+
44984
+ this.DrawAllPoint=function(mapPoint)
44985
+ {
44986
+ var pixelRatio=GetDevicePixelRatio();
44987
+
44988
+ for(var mapItem of mapPoint)
44989
+ {
44990
+ var aryPoint=mapItem[1].AryPoint;
44991
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
44992
+ var config=null;
44846
44993
  var path=new Path2D();
44847
44994
  var count=0;
44848
-
44849
- for(var j=0; j<item.Point.length; ++j)
44995
+ for(var i=0;i<aryPoint.length;++i)
44850
44996
  {
44851
- var point=item.Point[j];
44852
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
44853
-
44854
- var index=point.Index-offset;
44855
- if (index>=0 && index<xPointCount)
44856
- {
44857
- var x=this.ChartFrame.GetXFromIndex(index);
44858
- var y=this.ChartFrame.GetYFromData(point.Value, false);
44997
+ var item=aryPoint[i];
44998
+ if (!config) config=item.Data.ColorConfig;
44859
44999
 
44860
- var pointPath = new Path2D();
44861
- if (this.IsHScreen)
44862
- pointPath.arc(y,x,radius*pixel,0,360,false);
44863
- else
44864
- pointPath.arc(x,y,radius*pixel,0,360,false);
45000
+ var pointPath = new Path2D();
45001
+ if (this.IsHScreen)
45002
+ pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
45003
+ else
45004
+ pointPath.arc(item.X,item.Y,config.Radius*pixelRatio,0,360,false);
44865
45005
 
44866
- path.addPath(pointPath);
44867
- ++count;
44868
- }
45006
+ path.addPath(pointPath);
45007
+ ++count;
44869
45008
  }
44870
45009
 
44871
- if (count>0 && (bgColor || color))
45010
+ if (count>0 && config)
44872
45011
  {
44873
- this.Canvas.lineWidth=lineWidth*pixel;
44874
- this.Canvas.fillStyle=bgColor; //背景填充颜色
44875
- this.Canvas.strokeStyle=color;
45012
+ if (config.BGColor)
45013
+ {
45014
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
45015
+ this.Canvas.fill(path);
45016
+ }
44876
45017
 
44877
- if (bgColor) this.Canvas.fill(path);
44878
- if (color) this.Canvas.stroke(path);
45018
+ if (config.Color)
45019
+ {
45020
+ this.Canvas.lineWidth=config.LineWidth*pixelRatio;
45021
+ this.Canvas.strokeStyle=config.Color;
45022
+ this.Canvas.stroke(path);
45023
+ }
44879
45024
  }
44880
-
44881
45025
  }
44882
-
44883
- this.Canvas.restore();
44884
45026
  }
44885
45027
 
44886
45028
  this.GetMaxMin=function()
44887
45029
  {
44888
45030
  var range={ Min:null, Max:null };
45031
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45032
+ if (!this.MapCache || this.MapCache.size<=0) return;
44889
45033
  var xPointCount=this.ChartFrame.XPointCount;
44890
- var start=this.Data.DataOffset;
44891
- var end=start+xPointCount;
44892
45034
 
44893
- for(var i=0; i<this.PointGroup.length; ++i)
45035
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44894
45036
  {
44895
- var item=this.PointGroup[i];
44896
- if (!IFrameSplitOperator.IsNonEmptyArray(item.Point)) continue;
45037
+ var kItem=this.Data.Data[i];
45038
+ var key=this.BuildKey(kItem);
45039
+ if (!this.MapCache.has(key)) continue;
45040
+ var mapItem=this.MapCache.get(key);
45041
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44897
45042
 
44898
- for(var j=0; j<item.Point.length; ++j)
45043
+ for(k=0;k<mapItem.Data.length;++k)
44899
45044
  {
44900
- var point=item.Point[j];
44901
- if (point.Index>=start && point.Index<end)
44902
- {
44903
- if (range.Max==null) range.Max=point.Value;
44904
- else if (range.Max<point.Value) range.Max=point.Value;
44905
- if (range.Min==null) range.Min=point.Value;
44906
- else if (range.Min>point.Value) range.Min=point.Value;
44907
- }
45045
+ var item=mapItem.Data[k];
45046
+ var value=item.Data.Value;
45047
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
45048
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45049
+
45050
+ if (range.Max==null) range.Max=value;
45051
+ else if (range.Max<value) range.Max=value;
45052
+ if (range.Min==null) range.Min=value;
45053
+ else if (range.Min>value) range.Min=value;
44908
45054
  }
44909
45055
  }
44910
45056
 
@@ -45171,6 +45317,8 @@ function ChartMultiSVGIconV2()
45171
45317
  this.IconRect=[]; //0=序号,1=区域
45172
45318
 
45173
45319
  this.MapCache=null; //key=date/date-time value={ Data:[] }
45320
+ this.GetKValue=ChartData.GetKValue;
45321
+
45174
45322
 
45175
45323
  this.BuildKey=function(item)
45176
45324
  {
@@ -45285,28 +45433,7 @@ function ChartMultiSVGIconV2()
45285
45433
 
45286
45434
  this.Canvas.restore();
45287
45435
  }
45288
-
45289
- this.GetKValue=function(kItem, valueName)
45290
- {
45291
- switch(valueName)
45292
- {
45293
- case "HIGH":
45294
- case "H":
45295
- return kItem.High;
45296
- case "L":
45297
- case "LOW":
45298
- return kItem.Low;
45299
- case "C":
45300
- case "CLOSE":
45301
- return kItem.Close;
45302
- case "O":
45303
- case "OPEN":
45304
- return KItem.Open;
45305
- default:
45306
- return null;
45307
- }
45308
- }
45309
-
45436
+
45310
45437
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
45311
45438
  {
45312
45439
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -61262,24 +61389,29 @@ function DynamicChartTitlePainting()
61262
61389
 
61263
61390
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
61264
61391
  {
61265
- if (!IFrameSplitOperator.IsNonEmptyArray(dataInfo.PointGroup)) return null;
61392
+ if (!dataInfo.GetItemCallback) return null;
61393
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61394
+ var kItem=dataInfo.Data.Data[dataIndex];
61395
+ if (!kItem) return null;
61396
+
61397
+ var group=dataInfo.GetItemCallback(kItem);
61398
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61266
61399
 
61267
61400
  var aryText=[];
61268
- for(var i=0;i<dataInfo.PointGroup.length;++i)
61401
+ for(var i=0;i<group.Data.length;++i)
61269
61402
  {
61270
- var groupItem=dataInfo.PointGroup[i];
61271
- for(var j=0;j<groupItem.Point.length;++j)
61272
- {
61273
- var item=groupItem.Point[j];
61274
- if (item.Index==dataIndex)
61275
- {
61276
- var item={ Text:item.Value.toFixed(2)};
61277
- if (aryText.length==0) item.Name=dataInfo.Name;
61278
- item.Color=groupItem.BGColor;
61279
- aryText.push(item);
61280
- break;
61281
- }
61282
- }
61403
+ var item=group.Data[i];
61404
+ var config=item.ColorConfig;
61405
+
61406
+ var color=null;
61407
+ if (config.BGColor) color=config.BGColor;
61408
+ else if (config.Color) color=config.Color;
61409
+
61410
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61411
+
61412
+ var value=item.Data.Value;
61413
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61414
+ aryText.push({ Text:this.FormatValue(value, dataInfo), Color:color});
61283
61415
  }
61284
61416
 
61285
61417
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -62050,6 +62182,11 @@ function DynamicChartTitlePainting()
62050
62182
  aryText=this.FromatStackedBarTitle(value, item);
62051
62183
  if (!aryText) continue;
62052
62184
  }
62185
+ else if (item.DataType=="ChartMultiPoint")
62186
+ {
62187
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
62188
+ if (!aryText) continue;
62189
+ }
62053
62190
  else
62054
62191
  {
62055
62192
  valueText=this.FormatValue(value,item);
@@ -84030,18 +84167,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84030
84167
  {
84031
84168
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
84032
84169
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
84033
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
84170
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio}}, e);
84034
84171
 
84035
84172
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
84036
84173
  if (event)
84037
84174
  {
84038
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
84175
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, Point:{ X:x*pixelTatio, Y:y*pixelTatio}, CursorIndex:this.CursorIndex, };
84039
84176
  event.Callback(event,data,this);
84040
84177
  }
84041
84178
  }
84042
84179
 
84043
84180
  //右键菜单数据
84044
- this.GetRightMenuData=function(frameID)
84181
+ this.GetRightMenuData=function(frameID, option)
84045
84182
  {
84046
84183
  var windowCount=this.Frame.SubFrame.length; //窗口个数
84047
84184
  var klineChart=this.ChartPaint[0];
@@ -84084,6 +84221,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84084
84221
  var bPopMinuteChart=false;
84085
84222
  if (this.PopMinuteChart) bPopMinuteChart=true;
84086
84223
 
84224
+ var kItem=null;
84225
+ if (frameID>=0 && option && IFrameSplitOperator.IsNumber(option.CursorIndex))
84226
+ {
84227
+ var kData=this.GetKData();
84228
+ if (kData && IFrameSplitOperator.IsNonEmptyArray(kData.Data))
84229
+ {
84230
+ var dataIndex=kData.DataOffset+option.CursorIndex;
84231
+ if (dataIndex>=0 && dataIndex<kData.Data.length) kItem=kData.Data[dataIndex];
84232
+ }
84233
+ }
84234
+
84087
84235
  var aryMenu=
84088
84236
  [
84089
84237
  {
@@ -84366,6 +84514,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84366
84514
  }
84367
84515
  }
84368
84516
  }
84517
+ else if (item.Name=="其他设置")
84518
+ {
84519
+ if (kItem)
84520
+ {
84521
+ var bLocked=this.IsLockCorssCursor();
84522
+ if (bLocked)
84523
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR }, Checked:bLocked });
84524
+ else
84525
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR, Args:[{ KItem:{Date:kItem.Date, Time:kItem.Time}, Draw:true }] }, Checked:bLocked });
84526
+ }
84527
+ }
84369
84528
  }
84370
84529
 
84371
84530
  return aryMenu;
@@ -85969,19 +86128,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
85969
86128
  if (option && option.Draw) this.Draw();
85970
86129
  }
85971
86130
 
86131
+ //option={ KItem:{ Date:, Time:}}
85972
86132
  this.LockCorssCursor=function(option)
85973
86133
  {
85974
- if (this.CursorIndex<0) return false;
85975
- var kData=this.GetKData();
85976
- if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86134
+ if (option && option.KItem) //指定日期时间
86135
+ {
86136
+ var kData=this.GetKData();
86137
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
85977
86138
 
85978
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
85979
- var kItem=kData.Data[dataIndex];
85980
- if (!kItem) return false;
86139
+ var kItem={ Date:option.KItem.Date, Time:option.KItem.Time, Index:-1};
86140
+ kData.FindDataIndexByDateTime([kItem]);
86141
+ if (kItem.Index<0) return false;
85981
86142
 
85982
- var xItem=this.GlobalOption.LockCorssCursor.X;
85983
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
85984
- xItem.Enable=true;
86143
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86144
+ xItem.KLine={ DataIndex:kItem.Index, Date:kItem.Date, Time:kItem.Time };
86145
+ xItem.Enable=true;
86146
+ }
86147
+ else
86148
+ {
86149
+ if (this.CursorIndex<0) return false;
86150
+ var kData=this.GetKData();
86151
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86152
+
86153
+ var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
86154
+ var kItem=kData.Data[dataIndex];
86155
+ if (!kItem) return false;
86156
+
86157
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86158
+ xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
86159
+ xItem.Enable=true;
86160
+ }
85985
86161
 
85986
86162
  if (option && option.Draw) this.Draw();
85987
86163
  return true;
@@ -86004,7 +86180,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86004
86180
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
86005
86181
 
86006
86182
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
86007
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
86183
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
86008
86184
 
86009
86185
  var border=this.Frame.ChartBorder.GetBorder();
86010
86186
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -88077,18 +88253,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88077
88253
  {
88078
88254
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
88079
88255
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
88080
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
88256
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} }, e);
88081
88257
 
88082
88258
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
88083
88259
  if (event)
88084
88260
  {
88085
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
88261
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} };
88086
88262
  event.Callback(event,data,this);
88087
88263
  }
88088
88264
  }
88089
88265
 
88090
88266
  //右键菜单数据
88091
- this.GetRightMenuData=function(frameID)
88267
+ this.GetRightMenuData=function(frameID, option)
88092
88268
  {
88093
88269
  var windowCount=this.Frame.SubFrame.length; //窗口个数
88094
88270
 
@@ -88215,11 +88391,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88215
88391
  }
88216
88392
 
88217
88393
 
88218
- //删除菜单
88394
+
88219
88395
  for(var i=0;i<aryMenu.length;++i)
88220
88396
  {
88221
88397
  var item=aryMenu[i];
88222
- if (item.Name=="叠加品种")
88398
+ if (item.Name=="叠加品种") //删除菜单
88223
88399
  {
88224
88400
  for(var j=0;j<item.SubMenu.length;++j)
88225
88401
  {
@@ -88231,6 +88407,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88231
88407
  }
88232
88408
  }
88233
88409
  }
88410
+ else if (item.Name=="其他设置")
88411
+ {
88412
+
88413
+ }
88234
88414
  }
88235
88415
 
88236
88416
  return aryMenu;
@@ -123035,16 +123215,18 @@ function ScriptIndex(name,script,args,option)
123035
123215
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123036
123216
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123037
123217
 
123038
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123218
+ chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123039
123219
  chart.PointGroup=varItem.Draw.DrawData;
123040
123220
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123221
+ chart.BuildCacheData();
123222
+
123041
123223
  this.SetChartIndexName(chart);
123042
123224
  hqChart.ChartPaint.push(chart);
123043
123225
 
123044
- var titleIndex=windowIndex+1;
123226
+ var titleIndex=windowIndex+1;
123045
123227
  var titleData=new DynamicTitleData(chart.Data,chart.Name, null);
123046
123228
  titleData.DataType="ChartMultiPoint";
123047
- titleData.PointGroup=chart.PointGroup;
123229
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123048
123230
  hqChart.TitlePaint[titleIndex].Data[i]=titleData;
123049
123231
  }
123050
123232
 
@@ -124759,7 +124941,7 @@ function OverlayScriptIndex(name,script,args,option)
124759
124941
  frame.ChartPaint.push(chart);
124760
124942
  }
124761
124943
 
124762
- this.CreateMultiPoint=function(hqChart,windowIndex,varItem,i)
124944
+ this.CreateMultiPoint=function(hqChart,windowIndex,varItem,id)
124763
124945
  {
124764
124946
  var overlayIndex=this.OverlayIndex;
124765
124947
  var frame=overlayIndex.Frame;
@@ -124772,6 +124954,17 @@ function OverlayScriptIndex(name,script,args,option)
124772
124954
 
124773
124955
  chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
124774
124956
  chart.PointGroup=varItem.Draw.DrawData;
124957
+ chart.BuildCacheData();
124958
+
124959
+ var titleIndex=windowIndex+1;
124960
+ var titlePaint=hqChart.TitlePaint[titleIndex];
124961
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
124962
+ titleData.DataType="ChartMultiPoint";
124963
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
124964
+ titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
124965
+
124966
+ this.SetChartIndexName(chart);
124967
+
124775
124968
  frame.ChartPaint.push(chart);
124776
124969
  }
124777
124970
 
@@ -125968,14 +126161,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125968
126161
  drawItem.Text=draw.Text;
125969
126162
  drawItem.Name=draw.Name;
125970
126163
  drawItem.DrawType=draw.DrawType;
125971
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
125972
- if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
125973
- {
125974
- for(var k=0; k<drawItem.DrawData.length; ++k)
125975
- {
125976
- this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
125977
- }
125978
- }
126164
+ drawItem.DrawData=draw.DrawData;
125979
126165
 
125980
126166
  outVarItem.Draw=drawItem;
125981
126167
  result.push(outVarItem);
@@ -126522,14 +126708,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126522
126708
  drawItem.Text=draw.Text;
126523
126709
  drawItem.Name=draw.Name;
126524
126710
  drawItem.DrawType=draw.DrawType;
126525
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126526
- if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
126527
- {
126528
- for(var k=0; k<drawItem.DrawData.length; ++k)
126529
- {
126530
- this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
126531
- }
126532
- }
126711
+ drawItem.DrawData=draw.DrawData;
126533
126712
 
126534
126713
  outVarItem.Draw=drawItem;
126535
126714
  result.push(outVarItem);
@@ -142385,7 +142564,7 @@ function ScrollBarBGChart()
142385
142564
 
142386
142565
 
142387
142566
 
142388
- var HQCHART_VERSION="1.1.14329";
142567
+ var HQCHART_VERSION="1.1.14339";
142389
142568
 
142390
142569
  function PrintHQChartVersion()
142391
142570
  {