hqchart 1.1.14330 → 1.1.14336

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.
@@ -6815,6 +6815,9 @@ var JSCHART_MENU_ID=
6815
6815
  CMD_MODIFY_INDEX_PARAM:45, //指标删除修改 [windowIndex, ]
6816
6816
  CMD_MODIFY_OVERLAY_INDEX_PARAM:46, //叠加指标修改 [windowIndex, ID ]
6817
6817
 
6818
+ CMD_LOCK_CROSSCURSOR:47, //锁十字光标
6819
+ CMD_UNLOCK_CROSSCURSOR:48, //解锁十字光标
6820
+
6818
6821
 
6819
6822
  CMD_REPORT_CHANGE_BLOCK_ID:100, //报价列表 切换板块ID
6820
6823
  CMD_REPORT_COLUMN_SORT_ID:101, //报价列表 表头排序 Arg[列序号, 排序方向]
@@ -14156,6 +14159,12 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
14156
14159
  var sendData={ e:null, WindowIndex:param, Type:2, Identify:aryArgs[1] };
14157
14160
  this.ShowModifyIndexParamDialog(sendData);
14158
14161
  break;
14162
+ case JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR:
14163
+ if (srcParam) this.LockCorssCursor(srcParam);
14164
+ break;
14165
+ case JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR:
14166
+ if (this.IsLockCorssCursor()) this.UnlockCorssCursor({ Draw:true })
14167
+ break;
14159
14168
  }
14160
14169
  }
14161
14170
 
@@ -14242,13 +14251,13 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
14242
14251
  if (!this.JSPopMenu) return;
14243
14252
  var x=data.X, y=data.Y;
14244
14253
  var frameID=data.FrameID;
14245
- var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
14254
+ var menuData={ Menu:this.GetRightMenuData(frameID, data), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
14246
14255
  menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
14247
14256
 
14248
14257
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CREATE_RIGHT_MENU);
14249
14258
  if (event && event.Callback)
14250
14259
  {
14251
- var sendData={ MenuData:menuData, FrameID:frameID };
14260
+ var sendData={ MenuData:menuData, FrameID:frameID, Data:data };
14252
14261
  event.Callback(event, sendData, this);
14253
14262
  }
14254
14263
 
@@ -24665,9 +24674,9 @@ function HQTradeFrame()
24665
24674
  return null;
24666
24675
  }
24667
24676
 
24668
- this.GetXFromIndex=function(index)
24677
+ this.GetXFromIndex=function(index,isLimit)
24669
24678
  {
24670
- return this.SubFrame[0].Frame.GetXFromIndex(index);
24679
+ return this.SubFrame[0].Frame.GetXFromIndex(index,isLimit);
24671
24680
  }
24672
24681
 
24673
24682
  this.GetYFromData=function(value)
@@ -27667,15 +27676,15 @@ function ChartData()
27667
27676
  this.FindDataIndexByDateTime=function(aryDateTime) //aryDateTime=[ { Date:, Time:, Index:-1 }, ......]
27668
27677
  {
27669
27678
  var findCount=0;
27670
- for(var i in aryDateTime)
27679
+ for(var i=0;i<aryDateTime.length;++i)
27671
27680
  {
27672
27681
  aryDateTime[i].Index=-1;
27673
27682
  }
27674
27683
 
27675
- for(var i in this.Data)
27684
+ for(var i=0;i<this.Data.length;++i)
27676
27685
  {
27677
27686
  var item=this.Data[i];
27678
- for(var j in aryDateTime)
27687
+ for(var j=0;j<aryDateTime.length;++j)
27679
27688
  {
27680
27689
  var findItem=aryDateTime[j];
27681
27690
  if (findItem.Index>=0) continue;
@@ -27684,7 +27693,7 @@ function ChartData()
27684
27693
  {
27685
27694
  if (findItem.Date==item.Date && findItem.Time==item.Time)
27686
27695
  {
27687
- findItem.Index=parseInt(i);
27696
+ findItem.Index=i;
27688
27697
  ++findCount;
27689
27698
  break;
27690
27699
  }
@@ -27693,7 +27702,7 @@ function ChartData()
27693
27702
  {
27694
27703
  if (findItem.Date==item.Date)
27695
27704
  {
27696
- findItem.Index=parseInt(i);
27705
+ findItem.Index=i;
27697
27706
  ++findCount;
27698
27707
  break;
27699
27708
  }
@@ -28317,6 +28326,30 @@ ChartData.GetPeriodName=function(period)
28317
28326
  }
28318
28327
 
28319
28328
 
28329
+ ChartData.GetKValue=function(kItem, valueName)
28330
+ {
28331
+ if (!kItem) return null;
28332
+
28333
+ switch(valueName)
28334
+ {
28335
+ case "HIGH":
28336
+ case "H":
28337
+ return kItem.High;
28338
+ case "L":
28339
+ case "LOW":
28340
+ return kItem.Low;
28341
+ case "C":
28342
+ case "CLOSE":
28343
+ return kItem.Close;
28344
+ case "O":
28345
+ case "OPEN":
28346
+ return KItem.Open;
28347
+ default:
28348
+ return null;
28349
+ }
28350
+ }
28351
+
28352
+
28320
28353
 
28321
28354
  function TooltipData() //提示信息
28322
28355
  {
@@ -44857,98 +44890,219 @@ function ChartMultiPoint()
44857
44890
  delete this.newMethod;
44858
44891
 
44859
44892
  this.ClassName="ChartMultiPoint";
44860
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
44893
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
44861
44894
 
44862
44895
 
44863
44896
  this.IsHScreen=false;
44864
44897
  this.LineWidth=1;
44865
44898
  this.PointRadius=5;
44866
44899
 
44900
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44901
+ this.GetKValue=ChartData.GetKValue;
44902
+
44903
+ this.BuildKey=function(item)
44904
+ {
44905
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44906
+ else return item.Date;
44907
+ }
44908
+
44909
+ this.GetItem=function(kItem)
44910
+ {
44911
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44912
+
44913
+ var key=this.BuildKey(kItem);
44914
+ if (!this.MapCache.has(key)) return null;
44915
+
44916
+ return this.MapCache.get(key);
44917
+ }
44918
+
44919
+ this.BuildCacheData=function()
44920
+ {
44921
+ var mapData=new Map();
44922
+ this.MapCache=mapData;
44923
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44924
+
44925
+ for(var i=0; i<this.PointGroup.length; ++i)
44926
+ {
44927
+ var groupItem=this.PointGroup[i];
44928
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44929
+
44930
+ var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44931
+ if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
44932
+
44933
+ for(var j=0; j<groupItem.Point.length; ++j)
44934
+ {
44935
+ var point=groupItem.Point[j];
44936
+ var key=this.BuildKey(point);
44937
+
44938
+ var item={ Data:point, ColorConfig:clrConfig }
44939
+ if (mapData.has(key))
44940
+ {
44941
+ var mapItem=mapData.get(key);
44942
+ mapItem.Data.push(item);
44943
+ }
44944
+ else
44945
+ {
44946
+ mapData.set(key,{ Data:[item] });
44947
+ }
44948
+ }
44949
+ }
44950
+ }
44951
+
44867
44952
  this.Draw=function()
44868
44953
  {
44869
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
44870
- if (!this.Data || this.Data.length<=0) return;
44954
+ if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44955
+ if (this.IsShowIndexTitleOnly()) return;
44956
+ if (this.IsHideScriptIndex()) return;
44957
+
44958
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44871
44959
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44960
+ if (!this.MapCache || this.MapCache.size<=0) return;
44872
44961
 
44873
44962
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44874
44963
  var xPointCount=this.ChartFrame.XPointCount;
44875
- var offset=this.Data.DataOffset;
44876
- var pixel=GetDevicePixelRatio();
44964
+ var dataWidth=this.ChartFrame.DataWidth;
44965
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44966
+ var isMinute=this.IsMinuteFrame();
44967
+
44968
+ var border=this.GetBorder();
44969
+ if (this.IsHScreen)
44970
+ {
44971
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44972
+ var chartright=border.BottomEx;
44973
+ var chartLeft=border.TopEx;
44974
+ }
44975
+ else
44976
+ {
44977
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44978
+ var chartright=border.RightEx;
44979
+ var chartLeft=border.LeftEx;
44980
+ }
44981
+
44982
+ //计算所有的点位置
44983
+ var mapPoint=new Map();
44984
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44985
+ {
44986
+ var kItem=this.Data.Data[i];
44987
+ var key=this.BuildKey(kItem);
44988
+ if (!this.MapCache.has(key)) continue;
44989
+ var mapItem=this.MapCache.get(key);
44990
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44991
+
44992
+ if (isMinute)
44993
+ {
44994
+ var x=this.ChartFrame.GetXFromIndex(j);
44995
+ }
44996
+ else
44997
+ {
44998
+ var left=xOffset;
44999
+ var right=xOffset+dataWidth;
45000
+ if (right>chartright) break;
45001
+ var x=left+(right-left)/2;
45002
+ }
45003
+
45004
+ this.CalculateItem(mapItem, kItem, x, mapPoint);
45005
+ }
45006
+
45007
+ if (mapPoint.size<=0) return;
44877
45008
 
44878
45009
  this.Canvas.save();
44879
45010
  this.ClipClient(this.IsHScreen);
44880
-
44881
- for(var i=0; i<this.PointGroup.length; ++i)
45011
+
45012
+ this.DrawAllPoint(mapPoint);
45013
+
45014
+ this.Canvas.restore();
45015
+ }
45016
+
45017
+ this.CalculateItem=function(groupItem, kItem, x, mapPoint)
45018
+ {
45019
+ for(var i=0; i<groupItem.Data.length; ++i)
45020
+ {
45021
+ var item=groupItem.Data[i];
45022
+ var value=item.Data.Value;
45023
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
45024
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45025
+
45026
+ var y=this.ChartFrame.GetYFromData(value,false);
45027
+
45028
+ var strConfig=JSON.stringify(item.ColorConfig);
45029
+ if (!mapPoint.has(strConfig)) mapPoint.set(strConfig, { AryPoint:[]});
45030
+ var mapItem=mapPoint.get(strConfig);
45031
+
45032
+ mapItem.AryPoint.push({ X:x, Y:y, Data:item });
45033
+ }
45034
+ }
45035
+
45036
+ this.DrawAllPoint=function(mapPoint)
45037
+ {
45038
+ var pixelRatio=GetDevicePixelRatio();
45039
+
45040
+ for(var mapItem of mapPoint)
44882
45041
  {
44883
- var item=this.PointGroup[i];
44884
- var color=item.Color;
44885
- var bgColor=item.BGColor;
44886
- var lineWidth=this.LineWidth;
44887
- var radius=this.PointRadius;
44888
- if (IFrameSplitOperator.IsNumber(item.LineWidth)) lineWidth=item.LineWidth;
44889
- if (IFrameSplitOperator.IsNumber(item.PointRadius)) radius=item.PointRadius;
45042
+ var aryPoint=mapItem[1].AryPoint;
45043
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
45044
+ var config=null;
44890
45045
  var path=new Path2D();
44891
45046
  var count=0;
44892
-
44893
- for(var j=0; j<item.Point.length; ++j)
45047
+ for(var i=0;i<aryPoint.length;++i)
44894
45048
  {
44895
- var point=item.Point[j];
44896
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
44897
-
44898
- var index=point.Index-offset;
44899
- if (index>=0 && index<xPointCount)
44900
- {
44901
- var x=this.ChartFrame.GetXFromIndex(index);
44902
- var y=this.ChartFrame.GetYFromData(point.Value, false);
45049
+ var item=aryPoint[i];
45050
+ if (!config) config=item.Data.ColorConfig;
44903
45051
 
44904
- var pointPath = new Path2D();
44905
- if (this.IsHScreen)
44906
- pointPath.arc(y,x,radius*pixel,0,360,false);
44907
- else
44908
- pointPath.arc(x,y,radius*pixel,0,360,false);
45052
+ var pointPath = new Path2D();
45053
+ if (this.IsHScreen)
45054
+ pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
45055
+ else
45056
+ pointPath.arc(item.X,item.Y,config.Radius**pixelRatio,0,360,false);
44909
45057
 
44910
- path.addPath(pointPath);
44911
- ++count;
44912
- }
45058
+ path.addPath(pointPath);
45059
+ ++count;
44913
45060
  }
44914
45061
 
44915
- if (count>0 && (bgColor || color))
45062
+ if (count>0 && config)
44916
45063
  {
44917
- this.Canvas.lineWidth=lineWidth*pixel;
44918
- this.Canvas.fillStyle=bgColor; //背景填充颜色
44919
- this.Canvas.strokeStyle=color;
45064
+ if (config.BGColor)
45065
+ {
45066
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
45067
+ this.Canvas.fill(path);
45068
+ }
44920
45069
 
44921
- if (bgColor) this.Canvas.fill(path);
44922
- if (color) this.Canvas.stroke(path);
45070
+ if (config.Color)
45071
+ {
45072
+ this.Canvas.lineWidth=config.LineWidth*pixelRatio;
45073
+ this.Canvas.strokeStyle=config.Color;
45074
+ this.Canvas.stroke(path);
45075
+ }
44923
45076
  }
44924
-
44925
45077
  }
44926
-
44927
- this.Canvas.restore();
44928
45078
  }
44929
45079
 
44930
45080
  this.GetMaxMin=function()
44931
45081
  {
44932
45082
  var range={ Min:null, Max:null };
45083
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45084
+ if (!this.MapCache || this.MapCache.size<=0) return;
44933
45085
  var xPointCount=this.ChartFrame.XPointCount;
44934
- var start=this.Data.DataOffset;
44935
- var end=start+xPointCount;
44936
45086
 
44937
- for(var i=0; i<this.PointGroup.length; ++i)
45087
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44938
45088
  {
44939
- var item=this.PointGroup[i];
44940
- if (!IFrameSplitOperator.IsNonEmptyArray(item.Point)) continue;
45089
+ var kItem=this.Data.Data[i];
45090
+ var key=this.BuildKey(kItem);
45091
+ if (!this.MapCache.has(key)) continue;
45092
+ var mapItem=this.MapCache.get(key);
45093
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44941
45094
 
44942
- for(var j=0; j<item.Point.length; ++j)
45095
+ for(k=0;k<mapItem.Data.length;++k)
44943
45096
  {
44944
- var point=item.Point[j];
44945
- if (point.Index>=start && point.Index<end)
44946
- {
44947
- if (range.Max==null) range.Max=point.Value;
44948
- else if (range.Max<point.Value) range.Max=point.Value;
44949
- if (range.Min==null) range.Min=point.Value;
44950
- else if (range.Min>point.Value) range.Min=point.Value;
44951
- }
45097
+ var item=mapItem.Data[k];
45098
+ var value=item.Data.Value;
45099
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
45100
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45101
+
45102
+ if (range.Max==null) range.Max=value;
45103
+ else if (range.Max<value) range.Max=value;
45104
+ if (range.Min==null) range.Min=value;
45105
+ else if (range.Min>value) range.Min=value;
44952
45106
  }
44953
45107
  }
44954
45108
 
@@ -45215,6 +45369,8 @@ function ChartMultiSVGIconV2()
45215
45369
  this.IconRect=[]; //0=序号,1=区域
45216
45370
 
45217
45371
  this.MapCache=null; //key=date/date-time value={ Data:[] }
45372
+ this.GetKValue=ChartData.GetKValue;
45373
+
45218
45374
 
45219
45375
  this.BuildKey=function(item)
45220
45376
  {
@@ -45329,28 +45485,7 @@ function ChartMultiSVGIconV2()
45329
45485
 
45330
45486
  this.Canvas.restore();
45331
45487
  }
45332
-
45333
- this.GetKValue=function(kItem, valueName)
45334
- {
45335
- switch(valueName)
45336
- {
45337
- case "HIGH":
45338
- case "H":
45339
- return kItem.High;
45340
- case "L":
45341
- case "LOW":
45342
- return kItem.Low;
45343
- case "C":
45344
- case "CLOSE":
45345
- return kItem.Close;
45346
- case "O":
45347
- case "OPEN":
45348
- return KItem.Open;
45349
- default:
45350
- return null;
45351
- }
45352
- }
45353
-
45488
+
45354
45489
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
45355
45490
  {
45356
45491
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -61306,24 +61441,29 @@ function DynamicChartTitlePainting()
61306
61441
 
61307
61442
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
61308
61443
  {
61309
- if (!IFrameSplitOperator.IsNonEmptyArray(dataInfo.PointGroup)) return null;
61444
+ if (!dataInfo.GetItemCallback) return null;
61445
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61446
+ var kItem=dataInfo.Data.Data[dataIndex];
61447
+ if (!kItem) return null;
61448
+
61449
+ var group=dataInfo.GetItemCallback(kItem);
61450
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61310
61451
 
61311
61452
  var aryText=[];
61312
- for(var i=0;i<dataInfo.PointGroup.length;++i)
61453
+ for(var i=0;i<group.Data.length;++i)
61313
61454
  {
61314
- var groupItem=dataInfo.PointGroup[i];
61315
- for(var j=0;j<groupItem.Point.length;++j)
61316
- {
61317
- var item=groupItem.Point[j];
61318
- if (item.Index==dataIndex)
61319
- {
61320
- var item={ Text:item.Value.toFixed(2)};
61321
- if (aryText.length==0) item.Name=dataInfo.Name;
61322
- item.Color=groupItem.BGColor;
61323
- aryText.push(item);
61324
- break;
61325
- }
61326
- }
61455
+ var item=group.Data[i];
61456
+ var config=item.ColorConfig;
61457
+
61458
+ var color=null;
61459
+ if (config.BGColor) color=config.BGColor;
61460
+ else if (config.Color) color=config.Color;
61461
+
61462
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61463
+
61464
+ var value=item.Data.Value;
61465
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61466
+ aryText.push({ Text:this.FormatValue(value, dataInfo), Color:color});
61327
61467
  }
61328
61468
 
61329
61469
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -62094,6 +62234,11 @@ function DynamicChartTitlePainting()
62094
62234
  aryText=this.FromatStackedBarTitle(value, item);
62095
62235
  if (!aryText) continue;
62096
62236
  }
62237
+ else if (item.DataType=="ChartMultiPoint")
62238
+ {
62239
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
62240
+ if (!aryText) continue;
62241
+ }
62097
62242
  else
62098
62243
  {
62099
62244
  valueText=this.FormatValue(value,item);
@@ -84074,18 +84219,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84074
84219
  {
84075
84220
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
84076
84221
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
84077
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
84222
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio}}, e);
84078
84223
 
84079
84224
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
84080
84225
  if (event)
84081
84226
  {
84082
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
84227
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, Point:{ X:x*pixelTatio, Y:y*pixelTatio}, CursorIndex:this.CursorIndex, };
84083
84228
  event.Callback(event,data,this);
84084
84229
  }
84085
84230
  }
84086
84231
 
84087
84232
  //右键菜单数据
84088
- this.GetRightMenuData=function(frameID)
84233
+ this.GetRightMenuData=function(frameID, option)
84089
84234
  {
84090
84235
  var windowCount=this.Frame.SubFrame.length; //窗口个数
84091
84236
  var klineChart=this.ChartPaint[0];
@@ -84128,6 +84273,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84128
84273
  var bPopMinuteChart=false;
84129
84274
  if (this.PopMinuteChart) bPopMinuteChart=true;
84130
84275
 
84276
+ var kItem=null;
84277
+ if (frameID>=0 && option && IFrameSplitOperator.IsNumber(option.CursorIndex))
84278
+ {
84279
+ var kData=this.GetKData();
84280
+ if (kData && IFrameSplitOperator.IsNonEmptyArray(kData.Data))
84281
+ {
84282
+ var dataIndex=kData.DataOffset+option.CursorIndex;
84283
+ if (dataIndex>=0 && dataIndex<kData.Data.length) kItem=kData.Data[dataIndex];
84284
+ }
84285
+ }
84286
+
84131
84287
  var aryMenu=
84132
84288
  [
84133
84289
  {
@@ -84410,6 +84566,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84410
84566
  }
84411
84567
  }
84412
84568
  }
84569
+ else if (item.Name=="其他设置")
84570
+ {
84571
+ if (kItem)
84572
+ {
84573
+ var bLocked=this.IsLockCorssCursor();
84574
+ if (bLocked)
84575
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR }, Checked:bLocked });
84576
+ else
84577
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR, Args:[{ KItem:{Date:kItem.Date, Time:kItem.Time}, Draw:true }] }, Checked:bLocked });
84578
+ }
84579
+ }
84413
84580
  }
84414
84581
 
84415
84582
  return aryMenu;
@@ -86013,19 +86180,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86013
86180
  if (option && option.Draw) this.Draw();
86014
86181
  }
86015
86182
 
86183
+ //option={ KItem:{ Date:, Time:}}
86016
86184
  this.LockCorssCursor=function(option)
86017
86185
  {
86018
- if (this.CursorIndex<0) return false;
86019
- var kData=this.GetKData();
86020
- if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86186
+ if (option && option.KItem) //指定日期时间
86187
+ {
86188
+ var kData=this.GetKData();
86189
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86021
86190
 
86022
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
86023
- var kItem=kData.Data[dataIndex];
86024
- if (!kItem) return false;
86191
+ var kItem={ Date:option.KItem.Date, Time:option.KItem.Time, Index:-1};
86192
+ kData.FindDataIndexByDateTime([kItem]);
86193
+ if (kItem.Index<0) return false;
86025
86194
 
86026
- var xItem=this.GlobalOption.LockCorssCursor.X;
86027
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
86028
- xItem.Enable=true;
86195
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86196
+ xItem.KLine={ DataIndex:kItem.Index, Date:kItem.Date, Time:kItem.Time };
86197
+ xItem.Enable=true;
86198
+ }
86199
+ else
86200
+ {
86201
+ if (this.CursorIndex<0) return false;
86202
+ var kData=this.GetKData();
86203
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86204
+
86205
+ var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
86206
+ var kItem=kData.Data[dataIndex];
86207
+ if (!kItem) return false;
86208
+
86209
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86210
+ xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
86211
+ xItem.Enable=true;
86212
+ }
86029
86213
 
86030
86214
  if (option && option.Draw) this.Draw();
86031
86215
  return true;
@@ -86048,7 +86232,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86048
86232
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
86049
86233
 
86050
86234
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
86051
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
86235
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
86052
86236
 
86053
86237
  var border=this.Frame.ChartBorder.GetBorder();
86054
86238
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -88121,18 +88305,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88121
88305
  {
88122
88306
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
88123
88307
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
88124
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
88308
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} }, e);
88125
88309
 
88126
88310
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
88127
88311
  if (event)
88128
88312
  {
88129
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
88313
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} };
88130
88314
  event.Callback(event,data,this);
88131
88315
  }
88132
88316
  }
88133
88317
 
88134
88318
  //右键菜单数据
88135
- this.GetRightMenuData=function(frameID)
88319
+ this.GetRightMenuData=function(frameID, option)
88136
88320
  {
88137
88321
  var windowCount=this.Frame.SubFrame.length; //窗口个数
88138
88322
 
@@ -88259,11 +88443,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88259
88443
  }
88260
88444
 
88261
88445
 
88262
- //删除菜单
88446
+
88263
88447
  for(var i=0;i<aryMenu.length;++i)
88264
88448
  {
88265
88449
  var item=aryMenu[i];
88266
- if (item.Name=="叠加品种")
88450
+ if (item.Name=="叠加品种") //删除菜单
88267
88451
  {
88268
88452
  for(var j=0;j<item.SubMenu.length;++j)
88269
88453
  {
@@ -88275,6 +88459,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88275
88459
  }
88276
88460
  }
88277
88461
  }
88462
+ else if (item.Name=="其他设置")
88463
+ {
88464
+
88465
+ }
88278
88466
  }
88279
88467
 
88280
88468
  return aryMenu;
@@ -123079,16 +123267,18 @@ function ScriptIndex(name,script,args,option)
123079
123267
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123080
123268
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123081
123269
 
123082
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123270
+ chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123083
123271
  chart.PointGroup=varItem.Draw.DrawData;
123084
123272
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123273
+ chart.BuildCacheData();
123274
+
123085
123275
  this.SetChartIndexName(chart);
123086
123276
  hqChart.ChartPaint.push(chart);
123087
123277
 
123088
- var titleIndex=windowIndex+1;
123278
+ var titleIndex=windowIndex+1;
123089
123279
  var titleData=new DynamicTitleData(chart.Data,chart.Name, null);
123090
123280
  titleData.DataType="ChartMultiPoint";
123091
- titleData.PointGroup=chart.PointGroup;
123281
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123092
123282
  hqChart.TitlePaint[titleIndex].Data[i]=titleData;
123093
123283
  }
123094
123284
 
@@ -124803,7 +124993,7 @@ function OverlayScriptIndex(name,script,args,option)
124803
124993
  frame.ChartPaint.push(chart);
124804
124994
  }
124805
124995
 
124806
- this.CreateMultiPoint=function(hqChart,windowIndex,varItem,i)
124996
+ this.CreateMultiPoint=function(hqChart,windowIndex,varItem,id)
124807
124997
  {
124808
124998
  var overlayIndex=this.OverlayIndex;
124809
124999
  var frame=overlayIndex.Frame;
@@ -124816,6 +125006,17 @@ function OverlayScriptIndex(name,script,args,option)
124816
125006
 
124817
125007
  chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
124818
125008
  chart.PointGroup=varItem.Draw.DrawData;
125009
+ chart.BuildCacheData();
125010
+
125011
+ var titleIndex=windowIndex+1;
125012
+ var titlePaint=hqChart.TitlePaint[titleIndex];
125013
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
125014
+ titleData.DataType="ChartMultiPoint";
125015
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
125016
+ titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
125017
+
125018
+ this.SetChartIndexName(chart);
125019
+
124819
125020
  frame.ChartPaint.push(chart);
124820
125021
  }
124821
125022
 
@@ -126012,14 +126213,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126012
126213
  drawItem.Text=draw.Text;
126013
126214
  drawItem.Name=draw.Name;
126014
126215
  drawItem.DrawType=draw.DrawType;
126015
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126016
- if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
126017
- {
126018
- for(var k=0; k<drawItem.DrawData.length; ++k)
126019
- {
126020
- this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
126021
- }
126022
- }
126216
+ drawItem.DrawData=draw.DrawData;
126023
126217
 
126024
126218
  outVarItem.Draw=drawItem;
126025
126219
  result.push(outVarItem);
@@ -126566,14 +126760,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126566
126760
  drawItem.Text=draw.Text;
126567
126761
  drawItem.Name=draw.Name;
126568
126762
  drawItem.DrawType=draw.DrawType;
126569
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126570
- if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
126571
- {
126572
- for(var k=0; k<drawItem.DrawData.length; ++k)
126573
- {
126574
- this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
126575
- }
126576
- }
126763
+ drawItem.DrawData=draw.DrawData;
126577
126764
 
126578
126765
  outVarItem.Draw=drawItem;
126579
126766
  result.push(outVarItem);
@@ -152033,7 +152220,7 @@ function HQChartScriptWorker()
152033
152220
 
152034
152221
 
152035
152222
 
152036
- var HQCHART_VERSION="1.1.14329";
152223
+ var HQCHART_VERSION="1.1.14335";
152037
152224
 
152038
152225
  function PrintHQChartVersion()
152039
152226
  {