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.
@@ -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
  {
@@ -35243,15 +35276,7 @@ function ChartOverlayKLine()
35243
35276
 
35244
35277
  if (!this.MainData || !this.Data) return range;
35245
35278
 
35246
- var firstOpen=null; //主线数据第1个收盘价
35247
- for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length && j<xPointCount;++i,++j)
35248
- {
35249
- var data=this.MainData.Data[i];
35250
- if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
35251
- firstOpen=data.Close;
35252
- break;
35253
- }
35254
-
35279
+ var firstOpen=this.GetFirstOpen();
35255
35280
  if (firstOpen==null) return range;
35256
35281
 
35257
35282
  var firstOverlayOpen=null;
@@ -44849,7 +44874,7 @@ function ChartMultiLine()
44849
44874
  }
44850
44875
  }
44851
44876
 
44852
- // 线段集合 支持横屏
44877
+ // 多个点集合 支持横屏
44853
44878
  function ChartMultiPoint()
44854
44879
  {
44855
44880
  this.newMethod=IChartPainting; //派生
@@ -44857,98 +44882,219 @@ function ChartMultiPoint()
44857
44882
  delete this.newMethod;
44858
44883
 
44859
44884
  this.ClassName="ChartMultiPoint";
44860
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
44885
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
44861
44886
 
44862
44887
 
44863
44888
  this.IsHScreen=false;
44864
44889
  this.LineWidth=1;
44865
44890
  this.PointRadius=5;
44866
44891
 
44892
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
44893
+ this.GetKValue=ChartData.GetKValue;
44894
+
44895
+ this.BuildKey=function(item)
44896
+ {
44897
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
44898
+ else return item.Date;
44899
+ }
44900
+
44901
+ this.GetItem=function(kItem)
44902
+ {
44903
+ if (!this.MapCache || this.MapCache.size<=0) return null;
44904
+
44905
+ var key=this.BuildKey(kItem);
44906
+ if (!this.MapCache.has(key)) return null;
44907
+
44908
+ return this.MapCache.get(key);
44909
+ }
44910
+
44911
+ this.BuildCacheData=function()
44912
+ {
44913
+ var mapData=new Map();
44914
+ this.MapCache=mapData;
44915
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44916
+
44917
+ for(var i=0; i<this.PointGroup.length; ++i)
44918
+ {
44919
+ var groupItem=this.PointGroup[i];
44920
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
44921
+
44922
+ var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
44923
+ if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
44924
+
44925
+ for(var j=0; j<groupItem.Point.length; ++j)
44926
+ {
44927
+ var point=groupItem.Point[j];
44928
+ var key=this.BuildKey(point);
44929
+
44930
+ var item={ Data:point, ColorConfig:clrConfig }
44931
+ if (mapData.has(key))
44932
+ {
44933
+ var mapItem=mapData.get(key);
44934
+ mapItem.Data.push(item);
44935
+ }
44936
+ else
44937
+ {
44938
+ mapData.set(key,{ Data:[item] });
44939
+ }
44940
+ }
44941
+ }
44942
+ }
44943
+
44867
44944
  this.Draw=function()
44868
44945
  {
44869
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
44870
- if (!this.Data || this.Data.length<=0) return;
44946
+ if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
44947
+ if (this.IsShowIndexTitleOnly()) return;
44948
+ if (this.IsHideScriptIndex()) return;
44949
+
44950
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
44871
44951
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44952
+ if (!this.MapCache || this.MapCache.size<=0) return;
44872
44953
 
44873
44954
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44874
44955
  var xPointCount=this.ChartFrame.XPointCount;
44875
- var offset=this.Data.DataOffset;
44876
- var pixel=GetDevicePixelRatio();
44956
+ var dataWidth=this.ChartFrame.DataWidth;
44957
+ var distanceWidth=this.ChartFrame.DistanceWidth;
44958
+ var isMinute=this.IsMinuteFrame();
44959
+
44960
+ var border=this.GetBorder();
44961
+ if (this.IsHScreen)
44962
+ {
44963
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44964
+ var chartright=border.BottomEx;
44965
+ var chartLeft=border.TopEx;
44966
+ }
44967
+ else
44968
+ {
44969
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
44970
+ var chartright=border.RightEx;
44971
+ var chartLeft=border.LeftEx;
44972
+ }
44973
+
44974
+ //计算所有的点位置
44975
+ var mapPoint=new Map();
44976
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
44977
+ {
44978
+ var kItem=this.Data.Data[i];
44979
+ var key=this.BuildKey(kItem);
44980
+ if (!this.MapCache.has(key)) continue;
44981
+ var mapItem=this.MapCache.get(key);
44982
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44983
+
44984
+ if (isMinute)
44985
+ {
44986
+ var x=this.ChartFrame.GetXFromIndex(j);
44987
+ }
44988
+ else
44989
+ {
44990
+ var left=xOffset;
44991
+ var right=xOffset+dataWidth;
44992
+ if (right>chartright) break;
44993
+ var x=left+(right-left)/2;
44994
+ }
44995
+
44996
+ this.CalculateItem(mapItem, kItem, x, mapPoint);
44997
+ }
44998
+
44999
+ if (mapPoint.size<=0) return;
44877
45000
 
44878
45001
  this.Canvas.save();
44879
45002
  this.ClipClient(this.IsHScreen);
44880
-
44881
- for(var i=0; i<this.PointGroup.length; ++i)
45003
+
45004
+ this.DrawAllPoint(mapPoint);
45005
+
45006
+ this.Canvas.restore();
45007
+ }
45008
+
45009
+ this.CalculateItem=function(groupItem, kItem, x, mapPoint)
45010
+ {
45011
+ for(var i=0; i<groupItem.Data.length; ++i)
44882
45012
  {
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;
45013
+ var item=groupItem.Data[i];
45014
+ var value=item.Data.Value;
45015
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
45016
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45017
+
45018
+ var y=this.ChartFrame.GetYFromData(value,false);
45019
+
45020
+ var strConfig=JSON.stringify(item.ColorConfig);
45021
+ if (!mapPoint.has(strConfig)) mapPoint.set(strConfig, { AryPoint:[]});
45022
+ var mapItem=mapPoint.get(strConfig);
45023
+
45024
+ mapItem.AryPoint.push({ X:x, Y:y, Data:item });
45025
+ }
45026
+ }
45027
+
45028
+ this.DrawAllPoint=function(mapPoint)
45029
+ {
45030
+ var pixelRatio=GetDevicePixelRatio();
45031
+
45032
+ for(var mapItem of mapPoint)
45033
+ {
45034
+ var aryPoint=mapItem[1].AryPoint;
45035
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
45036
+ var config=null;
44890
45037
  var path=new Path2D();
44891
45038
  var count=0;
44892
-
44893
- for(var j=0; j<item.Point.length; ++j)
45039
+ for(var i=0;i<aryPoint.length;++i)
44894
45040
  {
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);
45041
+ var item=aryPoint[i];
45042
+ if (!config) config=item.Data.ColorConfig;
44903
45043
 
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);
45044
+ var pointPath = new Path2D();
45045
+ if (this.IsHScreen)
45046
+ pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
45047
+ else
45048
+ pointPath.arc(item.X,item.Y,config.Radius*pixelRatio,0,360,false);
44909
45049
 
44910
- path.addPath(pointPath);
44911
- ++count;
44912
- }
45050
+ path.addPath(pointPath);
45051
+ ++count;
44913
45052
  }
44914
45053
 
44915
- if (count>0 && (bgColor || color))
45054
+ if (count>0 && config)
44916
45055
  {
44917
- this.Canvas.lineWidth=lineWidth*pixel;
44918
- this.Canvas.fillStyle=bgColor; //背景填充颜色
44919
- this.Canvas.strokeStyle=color;
45056
+ if (config.BGColor)
45057
+ {
45058
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
45059
+ this.Canvas.fill(path);
45060
+ }
44920
45061
 
44921
- if (bgColor) this.Canvas.fill(path);
44922
- if (color) this.Canvas.stroke(path);
45062
+ if (config.Color)
45063
+ {
45064
+ this.Canvas.lineWidth=config.LineWidth*pixelRatio;
45065
+ this.Canvas.strokeStyle=config.Color;
45066
+ this.Canvas.stroke(path);
45067
+ }
44923
45068
  }
44924
-
44925
45069
  }
44926
-
44927
- this.Canvas.restore();
44928
45070
  }
44929
45071
 
44930
45072
  this.GetMaxMin=function()
44931
45073
  {
44932
45074
  var range={ Min:null, Max:null };
45075
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
45076
+ if (!this.MapCache || this.MapCache.size<=0) return;
44933
45077
  var xPointCount=this.ChartFrame.XPointCount;
44934
- var start=this.Data.DataOffset;
44935
- var end=start+xPointCount;
44936
45078
 
44937
- for(var i=0; i<this.PointGroup.length; ++i)
45079
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
44938
45080
  {
44939
- var item=this.PointGroup[i];
44940
- if (!IFrameSplitOperator.IsNonEmptyArray(item.Point)) continue;
45081
+ var kItem=this.Data.Data[i];
45082
+ var key=this.BuildKey(kItem);
45083
+ if (!this.MapCache.has(key)) continue;
45084
+ var mapItem=this.MapCache.get(key);
45085
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
44941
45086
 
44942
- for(var j=0; j<item.Point.length; ++j)
45087
+ for(k=0;k<mapItem.Data.length;++k)
44943
45088
  {
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
- }
45089
+ var item=mapItem.Data[k];
45090
+ var value=item.Data.Value;
45091
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
45092
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
45093
+
45094
+ if (range.Max==null) range.Max=value;
45095
+ else if (range.Max<value) range.Max=value;
45096
+ if (range.Min==null) range.Min=value;
45097
+ else if (range.Min>value) range.Min=value;
44952
45098
  }
44953
45099
  }
44954
45100
 
@@ -45215,6 +45361,8 @@ function ChartMultiSVGIconV2()
45215
45361
  this.IconRect=[]; //0=序号,1=区域
45216
45362
 
45217
45363
  this.MapCache=null; //key=date/date-time value={ Data:[] }
45364
+ this.GetKValue=ChartData.GetKValue;
45365
+
45218
45366
 
45219
45367
  this.BuildKey=function(item)
45220
45368
  {
@@ -45329,28 +45477,7 @@ function ChartMultiSVGIconV2()
45329
45477
 
45330
45478
  this.Canvas.restore();
45331
45479
  }
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
-
45480
+
45354
45481
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
45355
45482
  {
45356
45483
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -61306,24 +61433,29 @@ function DynamicChartTitlePainting()
61306
61433
 
61307
61434
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
61308
61435
  {
61309
- if (!IFrameSplitOperator.IsNonEmptyArray(dataInfo.PointGroup)) return null;
61436
+ if (!dataInfo.GetItemCallback) return null;
61437
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
61438
+ var kItem=dataInfo.Data.Data[dataIndex];
61439
+ if (!kItem) return null;
61440
+
61441
+ var group=dataInfo.GetItemCallback(kItem);
61442
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
61310
61443
 
61311
61444
  var aryText=[];
61312
- for(var i=0;i<dataInfo.PointGroup.length;++i)
61445
+ for(var i=0;i<group.Data.length;++i)
61313
61446
  {
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
- }
61447
+ var item=group.Data[i];
61448
+ var config=item.ColorConfig;
61449
+
61450
+ var color=null;
61451
+ if (config.BGColor) color=config.BGColor;
61452
+ else if (config.Color) color=config.Color;
61453
+
61454
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
61455
+
61456
+ var value=item.Data.Value;
61457
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
61458
+ aryText.push({ Text:this.FormatValue(value, dataInfo), Color:color});
61327
61459
  }
61328
61460
 
61329
61461
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -62094,6 +62226,11 @@ function DynamicChartTitlePainting()
62094
62226
  aryText=this.FromatStackedBarTitle(value, item);
62095
62227
  if (!aryText) continue;
62096
62228
  }
62229
+ else if (item.DataType=="ChartMultiPoint")
62230
+ {
62231
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
62232
+ if (!aryText) continue;
62233
+ }
62097
62234
  else
62098
62235
  {
62099
62236
  valueText=this.FormatValue(value,item);
@@ -84074,18 +84211,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84074
84211
  {
84075
84212
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
84076
84213
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
84077
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
84214
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio}}, e);
84078
84215
 
84079
84216
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
84080
84217
  if (event)
84081
84218
  {
84082
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
84219
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, Point:{ X:x*pixelTatio, Y:y*pixelTatio}, CursorIndex:this.CursorIndex, };
84083
84220
  event.Callback(event,data,this);
84084
84221
  }
84085
84222
  }
84086
84223
 
84087
84224
  //右键菜单数据
84088
- this.GetRightMenuData=function(frameID)
84225
+ this.GetRightMenuData=function(frameID, option)
84089
84226
  {
84090
84227
  var windowCount=this.Frame.SubFrame.length; //窗口个数
84091
84228
  var klineChart=this.ChartPaint[0];
@@ -84128,6 +84265,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84128
84265
  var bPopMinuteChart=false;
84129
84266
  if (this.PopMinuteChart) bPopMinuteChart=true;
84130
84267
 
84268
+ var kItem=null;
84269
+ if (frameID>=0 && option && IFrameSplitOperator.IsNumber(option.CursorIndex))
84270
+ {
84271
+ var kData=this.GetKData();
84272
+ if (kData && IFrameSplitOperator.IsNonEmptyArray(kData.Data))
84273
+ {
84274
+ var dataIndex=kData.DataOffset+option.CursorIndex;
84275
+ if (dataIndex>=0 && dataIndex<kData.Data.length) kItem=kData.Data[dataIndex];
84276
+ }
84277
+ }
84278
+
84131
84279
  var aryMenu=
84132
84280
  [
84133
84281
  {
@@ -84410,6 +84558,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84410
84558
  }
84411
84559
  }
84412
84560
  }
84561
+ else if (item.Name=="其他设置")
84562
+ {
84563
+ if (kItem)
84564
+ {
84565
+ var bLocked=this.IsLockCorssCursor();
84566
+ if (bLocked)
84567
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR }, Checked:bLocked });
84568
+ else
84569
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR, Args:[{ KItem:{Date:kItem.Date, Time:kItem.Time}, Draw:true }] }, Checked:bLocked });
84570
+ }
84571
+ }
84413
84572
  }
84414
84573
 
84415
84574
  return aryMenu;
@@ -86013,19 +86172,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86013
86172
  if (option && option.Draw) this.Draw();
86014
86173
  }
86015
86174
 
86175
+ //option={ KItem:{ Date:, Time:}}
86016
86176
  this.LockCorssCursor=function(option)
86017
86177
  {
86018
- if (this.CursorIndex<0) return false;
86019
- var kData=this.GetKData();
86020
- if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86178
+ if (option && option.KItem) //指定日期时间
86179
+ {
86180
+ var kData=this.GetKData();
86181
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86021
86182
 
86022
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
86023
- var kItem=kData.Data[dataIndex];
86024
- if (!kItem) return false;
86183
+ var kItem={ Date:option.KItem.Date, Time:option.KItem.Time, Index:-1};
86184
+ kData.FindDataIndexByDateTime([kItem]);
86185
+ if (kItem.Index<0) return false;
86025
86186
 
86026
- var xItem=this.GlobalOption.LockCorssCursor.X;
86027
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
86028
- xItem.Enable=true;
86187
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86188
+ xItem.KLine={ DataIndex:kItem.Index, Date:kItem.Date, Time:kItem.Time };
86189
+ xItem.Enable=true;
86190
+ }
86191
+ else
86192
+ {
86193
+ if (this.CursorIndex<0) return false;
86194
+ var kData=this.GetKData();
86195
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
86196
+
86197
+ var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
86198
+ var kItem=kData.Data[dataIndex];
86199
+ if (!kItem) return false;
86200
+
86201
+ var xItem=this.GlobalOption.LockCorssCursor.X;
86202
+ xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
86203
+ xItem.Enable=true;
86204
+ }
86029
86205
 
86030
86206
  if (option && option.Draw) this.Draw();
86031
86207
  return true;
@@ -86048,7 +86224,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86048
86224
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
86049
86225
 
86050
86226
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
86051
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
86227
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
86052
86228
 
86053
86229
  var border=this.Frame.ChartBorder.GetBorder();
86054
86230
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -88121,18 +88297,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88121
88297
  {
88122
88298
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
88123
88299
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
88124
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
88300
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} }, e);
88125
88301
 
88126
88302
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
88127
88303
  if (event)
88128
88304
  {
88129
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
88305
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} };
88130
88306
  event.Callback(event,data,this);
88131
88307
  }
88132
88308
  }
88133
88309
 
88134
88310
  //右键菜单数据
88135
- this.GetRightMenuData=function(frameID)
88311
+ this.GetRightMenuData=function(frameID, option)
88136
88312
  {
88137
88313
  var windowCount=this.Frame.SubFrame.length; //窗口个数
88138
88314
 
@@ -88259,11 +88435,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88259
88435
  }
88260
88436
 
88261
88437
 
88262
- //删除菜单
88438
+
88263
88439
  for(var i=0;i<aryMenu.length;++i)
88264
88440
  {
88265
88441
  var item=aryMenu[i];
88266
- if (item.Name=="叠加品种")
88442
+ if (item.Name=="叠加品种") //删除菜单
88267
88443
  {
88268
88444
  for(var j=0;j<item.SubMenu.length;++j)
88269
88445
  {
@@ -88275,6 +88451,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88275
88451
  }
88276
88452
  }
88277
88453
  }
88454
+ else if (item.Name=="其他设置")
88455
+ {
88456
+
88457
+ }
88278
88458
  }
88279
88459
 
88280
88460
  return aryMenu;
@@ -123079,16 +123259,18 @@ function ScriptIndex(name,script,args,option)
123079
123259
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
123080
123260
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
123081
123261
 
123082
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123262
+ chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
123083
123263
  chart.PointGroup=varItem.Draw.DrawData;
123084
123264
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123265
+ chart.BuildCacheData();
123266
+
123085
123267
  this.SetChartIndexName(chart);
123086
123268
  hqChart.ChartPaint.push(chart);
123087
123269
 
123088
- var titleIndex=windowIndex+1;
123270
+ var titleIndex=windowIndex+1;
123089
123271
  var titleData=new DynamicTitleData(chart.Data,chart.Name, null);
123090
123272
  titleData.DataType="ChartMultiPoint";
123091
- titleData.PointGroup=chart.PointGroup;
123273
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
123092
123274
  hqChart.TitlePaint[titleIndex].Data[i]=titleData;
123093
123275
  }
123094
123276
 
@@ -124803,7 +124985,7 @@ function OverlayScriptIndex(name,script,args,option)
124803
124985
  frame.ChartPaint.push(chart);
124804
124986
  }
124805
124987
 
124806
- this.CreateMultiPoint=function(hqChart,windowIndex,varItem,i)
124988
+ this.CreateMultiPoint=function(hqChart,windowIndex,varItem,id)
124807
124989
  {
124808
124990
  var overlayIndex=this.OverlayIndex;
124809
124991
  var frame=overlayIndex.Frame;
@@ -124816,6 +124998,17 @@ function OverlayScriptIndex(name,script,args,option)
124816
124998
 
124817
124999
  chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
124818
125000
  chart.PointGroup=varItem.Draw.DrawData;
125001
+ chart.BuildCacheData();
125002
+
125003
+ var titleIndex=windowIndex+1;
125004
+ var titlePaint=hqChart.TitlePaint[titleIndex];
125005
+ var titleData=new DynamicTitleData(chart.Data,varItem.Name,null);
125006
+ titleData.DataType="ChartMultiPoint";
125007
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
125008
+ titlePaint.OverlayIndex.get(overlayIndex.Identify).Data[id]=titleData;
125009
+
125010
+ this.SetChartIndexName(chart);
125011
+
124819
125012
  frame.ChartPaint.push(chart);
124820
125013
  }
124821
125014
 
@@ -126012,14 +126205,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126012
126205
  drawItem.Text=draw.Text;
126013
126206
  drawItem.Name=draw.Name;
126014
126207
  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
- }
126208
+ drawItem.DrawData=draw.DrawData;
126023
126209
 
126024
126210
  outVarItem.Draw=drawItem;
126025
126211
  result.push(outVarItem);
@@ -126566,14 +126752,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126566
126752
  drawItem.Text=draw.Text;
126567
126753
  drawItem.Name=draw.Name;
126568
126754
  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
- }
126755
+ drawItem.DrawData=draw.DrawData;
126577
126756
 
126578
126757
  outVarItem.Draw=drawItem;
126579
126758
  result.push(outVarItem);
@@ -152033,7 +152212,7 @@ function HQChartScriptWorker()
152033
152212
 
152034
152213
 
152035
152214
 
152036
- var HQCHART_VERSION="1.1.14329";
152215
+ var HQCHART_VERSION="1.1.14339";
152037
152216
 
152038
152217
  function PrintHQChartVersion()
152039
152218
  {