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.
@@ -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
  {
@@ -44813,98 +44846,219 @@ function ChartMultiPoint()
44813
44846
  delete this.newMethod;
44814
44847
 
44815
44848
  this.ClassName="ChartMultiPoint";
44816
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
44849
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
44817
44850
 
44818
44851
 
44819
44852
  this.IsHScreen=false;
44820
44853
  this.LineWidth=1;
44821
44854
  this.PointRadius=5;
44822
44855
 
44856
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44857
+ this.GetKValue=ChartData.GetKValue;
44858
+
44859
+ this.BuildKey=function(item)
44860
+ {
44861
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44862
+ else return item.Date;
44863
+ }
44864
+
44865
+ this.GetItem=function(kItem)
44866
+ {
44867
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44868
+
44869
+ var key=this.BuildKey(kItem);
44870
+ if (!this.MapCache.has(key)) return null;
44871
+
44872
+ return this.MapCache.get(key);
44873
+ }
44874
+
44875
+ this.BuildCacheData=function()
44876
+ {
44877
+ var mapData=new Map();
44878
+ this.MapCache=mapData;
44879
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44880
+
44881
+ for(var i=0; i<this.PointGroup.length; ++i)
44882
+ {
44883
+ var groupItem=this.PointGroup[i];
44884
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44885
+
44886
+ var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44887
+ if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
44888
+
44889
+ for(var j=0; j<groupItem.Point.length; ++j)
44890
+ {
44891
+ var point=groupItem.Point[j];
44892
+ var key=this.BuildKey(point);
44893
+
44894
+ var item={ Data:point, ColorConfig:clrConfig }
44895
+ if (mapData.has(key))
44896
+ {
44897
+ var mapItem=mapData.get(key);
44898
+ mapItem.Data.push(item);
44899
+ }
44900
+ else
44901
+ {
44902
+ mapData.set(key,{ Data:[item] });
44903
+ }
44904
+ }
44905
+ }
44906
+ }
44907
+
44823
44908
  this.Draw=function()
44824
44909
  {
44825
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
44826
- if (!this.Data || this.Data.length<=0) return;
44910
+ if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44911
+ if (this.IsShowIndexTitleOnly()) return;
44912
+ if (this.IsHideScriptIndex()) return;
44913
+
44914
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44827
44915
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44916
+ if (!this.MapCache || this.MapCache.size<=0) return;
44828
44917
 
44829
44918
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44830
44919
  var xPointCount=this.ChartFrame.XPointCount;
44831
- var offset=this.Data.DataOffset;
44832
- var pixel=GetDevicePixelRatio();
44920
+ var dataWidth=this.ChartFrame.DataWidth;
44921
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44922
+ var isMinute=this.IsMinuteFrame();
44923
+
44924
+ var border=this.GetBorder();
44925
+ if (this.IsHScreen)
44926
+ {
44927
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44928
+ var chartright=border.BottomEx;
44929
+ var chartLeft=border.TopEx;
44930
+ }
44931
+ else
44932
+ {
44933
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44934
+ var chartright=border.RightEx;
44935
+ var chartLeft=border.LeftEx;
44936
+ }
44937
+
44938
+ //计算所有的点位置
44939
+ var mapPoint=new Map();
44940
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44941
+ {
44942
+ var kItem=this.Data.Data[i];
44943
+ var key=this.BuildKey(kItem);
44944
+ if (!this.MapCache.has(key)) continue;
44945
+ var mapItem=this.MapCache.get(key);
44946
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44947
+
44948
+ if (isMinute)
44949
+ {
44950
+ var x=this.ChartFrame.GetXFromIndex(j);
44951
+ }
44952
+ else
44953
+ {
44954
+ var left=xOffset;
44955
+ var right=xOffset+dataWidth;
44956
+ if (right>chartright) break;
44957
+ var x=left+(right-left)/2;
44958
+ }
44959
+
44960
+ this.CalculateItem(mapItem, kItem, x, mapPoint);
44961
+ }
44962
+
44963
+ if (mapPoint.size<=0) return;
44833
44964
 
44834
44965
  this.Canvas.save();
44835
44966
  this.ClipClient(this.IsHScreen);
44836
-
44837
- for(var i=0; i<this.PointGroup.length; ++i)
44967
+
44968
+ this.DrawAllPoint(mapPoint);
44969
+
44970
+ this.Canvas.restore();
44971
+ }
44972
+
44973
+ this.CalculateItem=function(groupItem, kItem, x, mapPoint)
44974
+ {
44975
+ for(var i=0; i<groupItem.Data.length; ++i)
44976
+ {
44977
+ var item=groupItem.Data[i];
44978
+ var value=item.Data.Value;
44979
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
44980
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
44981
+
44982
+ var y=this.ChartFrame.GetYFromData(value,false);
44983
+
44984
+ var strConfig=JSON.stringify(item.ColorConfig);
44985
+ if (!mapPoint.has(strConfig)) mapPoint.set(strConfig, { AryPoint:[]});
44986
+ var mapItem=mapPoint.get(strConfig);
44987
+
44988
+ mapItem.AryPoint.push({ X:x, Y:y, Data:item });
44989
+ }
44990
+ }
44991
+
44992
+ this.DrawAllPoint=function(mapPoint)
44993
+ {
44994
+ var pixelRatio=GetDevicePixelRatio();
44995
+
44996
+ for(var mapItem of mapPoint)
44838
44997
  {
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;
44998
+ var aryPoint=mapItem[1].AryPoint;
44999
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
45000
+ var config=null;
44846
45001
  var path=new Path2D();
44847
45002
  var count=0;
44848
-
44849
- for(var j=0; j<item.Point.length; ++j)
45003
+ for(var i=0;i<aryPoint.length;++i)
44850
45004
  {
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);
45005
+ var item=aryPoint[i];
45006
+ if (!config) config=item.Data.ColorConfig;
44859
45007
 
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);
45008
+ var pointPath = new Path2D();
45009
+ if (this.IsHScreen)
45010
+ pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
45011
+ else
45012
+ pointPath.arc(item.X,item.Y,config.Radius**pixelRatio,0,360,false);
44865
45013
 
44866
- path.addPath(pointPath);
44867
- ++count;
44868
- }
45014
+ path.addPath(pointPath);
45015
+ ++count;
44869
45016
  }
44870
45017
 
44871
- if (count>0 && (bgColor || color))
45018
+ if (count>0 && config)
44872
45019
  {
44873
- this.Canvas.lineWidth=lineWidth*pixel;
44874
- this.Canvas.fillStyle=bgColor; //背景填充颜色
44875
- this.Canvas.strokeStyle=color;
45020
+ if (config.BGColor)
45021
+ {
45022
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
45023
+ this.Canvas.fill(path);
45024
+ }
44876
45025
 
44877
- if (bgColor) this.Canvas.fill(path);
44878
- if (color) this.Canvas.stroke(path);
45026
+ if (config.Color)
45027
+ {
45028
+ this.Canvas.lineWidth=config.LineWidth*pixelRatio;
45029
+ this.Canvas.strokeStyle=config.Color;
45030
+ this.Canvas.stroke(path);
45031
+ }
44879
45032
  }
44880
-
44881
45033
  }
44882
-
44883
- this.Canvas.restore();
44884
45034
  }
44885
45035
 
44886
45036
  this.GetMaxMin=function()
44887
45037
  {
44888
45038
  var range={ Min:null, Max:null };
45039
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45040
+ if (!this.MapCache || this.MapCache.size<=0) return;
44889
45041
  var xPointCount=this.ChartFrame.XPointCount;
44890
- var start=this.Data.DataOffset;
44891
- var end=start+xPointCount;
44892
45042
 
44893
- for(var i=0; i<this.PointGroup.length; ++i)
45043
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44894
45044
  {
44895
- var item=this.PointGroup[i];
44896
- if (!IFrameSplitOperator.IsNonEmptyArray(item.Point)) continue;
45045
+ var kItem=this.Data.Data[i];
45046
+ var key=this.BuildKey(kItem);
45047
+ if (!this.MapCache.has(key)) continue;
45048
+ var mapItem=this.MapCache.get(key);
45049
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44897
45050
 
44898
- for(var j=0; j<item.Point.length; ++j)
45051
+ for(k=0;k<mapItem.Data.length;++k)
44899
45052
  {
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
- }
45053
+ var item=mapItem.Data[k];
45054
+ var value=item.Data.Value;
45055
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
45056
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45057
+
45058
+ if (range.Max==null) range.Max=value;
45059
+ else if (range.Max<value) range.Max=value;
45060
+ if (range.Min==null) range.Min=value;
45061
+ else if (range.Min>value) range.Min=value;
44908
45062
  }
44909
45063
  }
44910
45064
 
@@ -45171,6 +45325,8 @@ function ChartMultiSVGIconV2()
45171
45325
  this.IconRect=[]; //0=序号,1=区域
45172
45326
 
45173
45327
  this.MapCache=null; //key=date/date-time value={ Data:[] }
45328
+ this.GetKValue=ChartData.GetKValue;
45329
+
45174
45330
 
45175
45331
  this.BuildKey=function(item)
45176
45332
  {
@@ -45285,28 +45441,7 @@ function ChartMultiSVGIconV2()
45285
45441
 
45286
45442
  this.Canvas.restore();
45287
45443
  }
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
-
45444
+
45310
45445
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
45311
45446
  {
45312
45447
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -61262,24 +61397,29 @@ function DynamicChartTitlePainting()
61262
61397
 
61263
61398
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
61264
61399
  {
61265
- if (!IFrameSplitOperator.IsNonEmptyArray(dataInfo.PointGroup)) return null;
61400
+ if (!dataInfo.GetItemCallback) return null;
61401
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61402
+ var kItem=dataInfo.Data.Data[dataIndex];
61403
+ if (!kItem) return null;
61404
+
61405
+ var group=dataInfo.GetItemCallback(kItem);
61406
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61266
61407
 
61267
61408
  var aryText=[];
61268
- for(var i=0;i<dataInfo.PointGroup.length;++i)
61409
+ for(var i=0;i<group.Data.length;++i)
61269
61410
  {
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
- }
61411
+ var item=group.Data[i];
61412
+ var config=item.ColorConfig;
61413
+
61414
+ var color=null;
61415
+ if (config.BGColor) color=config.BGColor;
61416
+ else if (config.Color) color=config.Color;
61417
+
61418
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61419
+
61420
+ var value=item.Data.Value;
61421
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61422
+ aryText.push({ Text:this.FormatValue(value, dataInfo), Color:color});
61283
61423
  }
61284
61424
 
61285
61425
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -62050,6 +62190,11 @@ function DynamicChartTitlePainting()
62050
62190
  aryText=this.FromatStackedBarTitle(value, item);
62051
62191
  if (!aryText) continue;
62052
62192
  }
62193
+ else if (item.DataType=="ChartMultiPoint")
62194
+ {
62195
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
62196
+ if (!aryText) continue;
62197
+ }
62053
62198
  else
62054
62199
  {
62055
62200
  valueText=this.FormatValue(value,item);
@@ -84030,18 +84175,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84030
84175
  {
84031
84176
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
84032
84177
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
84033
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
84178
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio}}, e);
84034
84179
 
84035
84180
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
84036
84181
  if (event)
84037
84182
  {
84038
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
84183
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, Point:{ X:x*pixelTatio, Y:y*pixelTatio}, CursorIndex:this.CursorIndex, };
84039
84184
  event.Callback(event,data,this);
84040
84185
  }
84041
84186
  }
84042
84187
 
84043
84188
  //右键菜单数据
84044
- this.GetRightMenuData=function(frameID)
84189
+ this.GetRightMenuData=function(frameID, option)
84045
84190
  {
84046
84191
  var windowCount=this.Frame.SubFrame.length; //窗口个数
84047
84192
  var klineChart=this.ChartPaint[0];
@@ -84084,6 +84229,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84084
84229
  var bPopMinuteChart=false;
84085
84230
  if (this.PopMinuteChart) bPopMinuteChart=true;
84086
84231
 
84232
+ var kItem=null;
84233
+ if (frameID>=0 && option && IFrameSplitOperator.IsNumber(option.CursorIndex))
84234
+ {
84235
+ var kData=this.GetKData();
84236
+ if (kData && IFrameSplitOperator.IsNonEmptyArray(kData.Data))
84237
+ {
84238
+ var dataIndex=kData.DataOffset+option.CursorIndex;
84239
+ if (dataIndex>=0 && dataIndex<kData.Data.length) kItem=kData.Data[dataIndex];
84240
+ }
84241
+ }
84242
+
84087
84243
  var aryMenu=
84088
84244
  [
84089
84245
  {
@@ -84366,6 +84522,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84366
84522
  }
84367
84523
  }
84368
84524
  }
84525
+ else if (item.Name=="其他设置")
84526
+ {
84527
+ if (kItem)
84528
+ {
84529
+ var bLocked=this.IsLockCorssCursor();
84530
+ if (bLocked)
84531
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR }, Checked:bLocked });
84532
+ else
84533
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR, Args:[{ KItem:{Date:kItem.Date, Time:kItem.Time}, Draw:true }] }, Checked:bLocked });
84534
+ }
84535
+ }
84369
84536
  }
84370
84537
 
84371
84538
  return aryMenu;
@@ -85969,19 +86136,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
85969
86136
  if (option && option.Draw) this.Draw();
85970
86137
  }
85971
86138
 
86139
+ //option={ KItem:{ Date:, Time:}}
85972
86140
  this.LockCorssCursor=function(option)
85973
86141
  {
85974
- if (this.CursorIndex<0) return false;
85975
- var kData=this.GetKData();
85976
- if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86142
+ if (option && option.KItem) //指定日期时间
86143
+ {
86144
+ var kData=this.GetKData();
86145
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
85977
86146
 
85978
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
85979
- var kItem=kData.Data[dataIndex];
85980
- if (!kItem) return false;
86147
+ var kItem={ Date:option.KItem.Date, Time:option.KItem.Time, Index:-1};
86148
+ kData.FindDataIndexByDateTime([kItem]);
86149
+ if (kItem.Index<0) return false;
85981
86150
 
85982
- var xItem=this.GlobalOption.LockCorssCursor.X;
85983
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
85984
- xItem.Enable=true;
86151
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86152
+ xItem.KLine={ DataIndex:kItem.Index, Date:kItem.Date, Time:kItem.Time };
86153
+ xItem.Enable=true;
86154
+ }
86155
+ else
86156
+ {
86157
+ if (this.CursorIndex<0) return false;
86158
+ var kData=this.GetKData();
86159
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86160
+
86161
+ var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
86162
+ var kItem=kData.Data[dataIndex];
86163
+ if (!kItem) return false;
86164
+
86165
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86166
+ xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
86167
+ xItem.Enable=true;
86168
+ }
85985
86169
 
85986
86170
  if (option && option.Draw) this.Draw();
85987
86171
  return true;
@@ -86004,7 +86188,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86004
86188
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
86005
86189
 
86006
86190
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
86007
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
86191
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
86008
86192
 
86009
86193
  var border=this.Frame.ChartBorder.GetBorder();
86010
86194
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -88077,18 +88261,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88077
88261
  {
88078
88262
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
88079
88263
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
88080
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
88264
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} }, e);
88081
88265
 
88082
88266
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
88083
88267
  if (event)
88084
88268
  {
88085
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
88269
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} };
88086
88270
  event.Callback(event,data,this);
88087
88271
  }
88088
88272
  }
88089
88273
 
88090
88274
  //右键菜单数据
88091
- this.GetRightMenuData=function(frameID)
88275
+ this.GetRightMenuData=function(frameID, option)
88092
88276
  {
88093
88277
  var windowCount=this.Frame.SubFrame.length; //窗口个数
88094
88278
 
@@ -88215,11 +88399,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88215
88399
  }
88216
88400
 
88217
88401
 
88218
- //删除菜单
88402
+
88219
88403
  for(var i=0;i<aryMenu.length;++i)
88220
88404
  {
88221
88405
  var item=aryMenu[i];
88222
- if (item.Name=="叠加品种")
88406
+ if (item.Name=="叠加品种") //删除菜单
88223
88407
  {
88224
88408
  for(var j=0;j<item.SubMenu.length;++j)
88225
88409
  {
@@ -88231,6 +88415,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88231
88415
  }
88232
88416
  }
88233
88417
  }
88418
+ else if (item.Name=="其他设置")
88419
+ {
88420
+
88421
+ }
88234
88422
  }
88235
88423
 
88236
88424
  return aryMenu;
@@ -123035,16 +123223,18 @@ function ScriptIndex(name,script,args,option)
123035
123223
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123036
123224
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123037
123225
 
123038
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123226
+ chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123039
123227
  chart.PointGroup=varItem.Draw.DrawData;
123040
123228
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123229
+ chart.BuildCacheData();
123230
+
123041
123231
  this.SetChartIndexName(chart);
123042
123232
  hqChart.ChartPaint.push(chart);
123043
123233
 
123044
- var titleIndex=windowIndex+1;
123234
+ var titleIndex=windowIndex+1;
123045
123235
  var titleData=new DynamicTitleData(chart.Data,chart.Name, null);
123046
123236
  titleData.DataType="ChartMultiPoint";
123047
- titleData.PointGroup=chart.PointGroup;
123237
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123048
123238
  hqChart.TitlePaint[titleIndex].Data[i]=titleData;
123049
123239
  }
123050
123240
 
@@ -124759,7 +124949,7 @@ function OverlayScriptIndex(name,script,args,option)
124759
124949
  frame.ChartPaint.push(chart);
124760
124950
  }
124761
124951
 
124762
- this.CreateMultiPoint=function(hqChart,windowIndex,varItem,i)
124952
+ this.CreateMultiPoint=function(hqChart,windowIndex,varItem,id)
124763
124953
  {
124764
124954
  var overlayIndex=this.OverlayIndex;
124765
124955
  var frame=overlayIndex.Frame;
@@ -124772,6 +124962,17 @@ function OverlayScriptIndex(name,script,args,option)
124772
124962
 
124773
124963
  chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
124774
124964
  chart.PointGroup=varItem.Draw.DrawData;
124965
+ chart.BuildCacheData();
124966
+
124967
+ var titleIndex=windowIndex+1;
124968
+ var titlePaint=hqChart.TitlePaint[titleIndex];
124969
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
124970
+ titleData.DataType="ChartMultiPoint";
124971
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
124972
+ titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
124973
+
124974
+ this.SetChartIndexName(chart);
124975
+
124775
124976
  frame.ChartPaint.push(chart);
124776
124977
  }
124777
124978
 
@@ -125968,14 +126169,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125968
126169
  drawItem.Text=draw.Text;
125969
126170
  drawItem.Name=draw.Name;
125970
126171
  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
- }
126172
+ drawItem.DrawData=draw.DrawData;
125979
126173
 
125980
126174
  outVarItem.Draw=drawItem;
125981
126175
  result.push(outVarItem);
@@ -126522,14 +126716,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126522
126716
  drawItem.Text=draw.Text;
126523
126717
  drawItem.Name=draw.Name;
126524
126718
  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
- }
126719
+ drawItem.DrawData=draw.DrawData;
126533
126720
 
126534
126721
  outVarItem.Draw=drawItem;
126535
126722
  result.push(outVarItem);
@@ -142385,7 +142572,7 @@ function ScrollBarBGChart()
142385
142572
 
142386
142573
 
142387
142574
 
142388
- var HQCHART_VERSION="1.1.14329";
142575
+ var HQCHART_VERSION="1.1.14335";
142389
142576
 
142390
142577
  function PrintHQChartVersion()
142391
142578
  {