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.
@@ -2846,6 +2846,9 @@ var JSCHART_MENU_ID=
2846
2846
  CMD_MODIFY_INDEX_PARAM:45, //指标删除修改 [windowIndex, ]
2847
2847
  CMD_MODIFY_OVERLAY_INDEX_PARAM:46, //叠加指标修改 [windowIndex, ID ]
2848
2848
 
2849
+ CMD_LOCK_CROSSCURSOR:47, //锁十字光标
2850
+ CMD_UNLOCK_CROSSCURSOR:48, //解锁十字光标
2851
+
2849
2852
 
2850
2853
  CMD_REPORT_CHANGE_BLOCK_ID:100, //报价列表 切换板块ID
2851
2854
  CMD_REPORT_COLUMN_SORT_ID:101, //报价列表 表头排序 Arg[列序号, 排序方向]
@@ -10187,6 +10190,12 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10187
10190
  var sendData={ e:null, WindowIndex:param, Type:2, Identify:aryArgs[1] };
10188
10191
  this.ShowModifyIndexParamDialog(sendData);
10189
10192
  break;
10193
+ case JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR:
10194
+ if (srcParam) this.LockCorssCursor(srcParam);
10195
+ break;
10196
+ case JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR:
10197
+ if (this.IsLockCorssCursor()) this.UnlockCorssCursor({ Draw:true })
10198
+ break;
10190
10199
  }
10191
10200
  }
10192
10201
 
@@ -10273,13 +10282,13 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
10273
10282
  if (!this.JSPopMenu) return;
10274
10283
  var x=data.X, y=data.Y;
10275
10284
  var frameID=data.FrameID;
10276
- var menuData={ Menu:this.GetRightMenuData(frameID), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
10285
+ var menuData={ Menu:this.GetRightMenuData(frameID, data), Position:JSPopMenu.POSITION_ID.RIGHT_MENU_ID };
10277
10286
  menuData.ClickCallback=(data)=>{ this.OnClickRightMenu(data); }
10278
10287
 
10279
10288
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CREATE_RIGHT_MENU);
10280
10289
  if (event && event.Callback)
10281
10290
  {
10282
- var sendData={ MenuData:menuData, FrameID:frameID };
10291
+ var sendData={ MenuData:menuData, FrameID:frameID, Data:data };
10283
10292
  event.Callback(event, sendData, this);
10284
10293
  }
10285
10294
 
@@ -20696,9 +20705,9 @@ function HQTradeFrame()
20696
20705
  return null;
20697
20706
  }
20698
20707
 
20699
- this.GetXFromIndex=function(index)
20708
+ this.GetXFromIndex=function(index,isLimit)
20700
20709
  {
20701
- return this.SubFrame[0].Frame.GetXFromIndex(index);
20710
+ return this.SubFrame[0].Frame.GetXFromIndex(index,isLimit);
20702
20711
  }
20703
20712
 
20704
20713
  this.GetYFromData=function(value)
@@ -23698,15 +23707,15 @@ function ChartData()
23698
23707
  this.FindDataIndexByDateTime=function(aryDateTime) //aryDateTime=[ { Date:, Time:, Index:-1 }, ......]
23699
23708
  {
23700
23709
  var findCount=0;
23701
- for(var i in aryDateTime)
23710
+ for(var i=0;i<aryDateTime.length;++i)
23702
23711
  {
23703
23712
  aryDateTime[i].Index=-1;
23704
23713
  }
23705
23714
 
23706
- for(var i in this.Data)
23715
+ for(var i=0;i<this.Data.length;++i)
23707
23716
  {
23708
23717
  var item=this.Data[i];
23709
- for(var j in aryDateTime)
23718
+ for(var j=0;j<aryDateTime.length;++j)
23710
23719
  {
23711
23720
  var findItem=aryDateTime[j];
23712
23721
  if (findItem.Index>=0) continue;
@@ -23715,7 +23724,7 @@ function ChartData()
23715
23724
  {
23716
23725
  if (findItem.Date==item.Date && findItem.Time==item.Time)
23717
23726
  {
23718
- findItem.Index=parseInt(i);
23727
+ findItem.Index=i;
23719
23728
  ++findCount;
23720
23729
  break;
23721
23730
  }
@@ -23724,7 +23733,7 @@ function ChartData()
23724
23733
  {
23725
23734
  if (findItem.Date==item.Date)
23726
23735
  {
23727
- findItem.Index=parseInt(i);
23736
+ findItem.Index=i;
23728
23737
  ++findCount;
23729
23738
  break;
23730
23739
  }
@@ -24348,6 +24357,30 @@ ChartData.GetPeriodName=function(period)
24348
24357
  }
24349
24358
 
24350
24359
 
24360
+ ChartData.GetKValue=function(kItem, valueName)
24361
+ {
24362
+ if (!kItem) return null;
24363
+
24364
+ switch(valueName)
24365
+ {
24366
+ case "HIGH":
24367
+ case "H":
24368
+ return kItem.High;
24369
+ case "L":
24370
+ case "LOW":
24371
+ return kItem.Low;
24372
+ case "C":
24373
+ case "CLOSE":
24374
+ return kItem.Close;
24375
+ case "O":
24376
+ case "OPEN":
24377
+ return KItem.Open;
24378
+ default:
24379
+ return null;
24380
+ }
24381
+ }
24382
+
24383
+
24351
24384
 
24352
24385
  function TooltipData() //提示信息
24353
24386
  {
@@ -40888,98 +40921,219 @@ function ChartMultiPoint()
40888
40921
  delete this.newMethod;
40889
40922
 
40890
40923
  this.ClassName="ChartMultiPoint";
40891
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
40924
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
40892
40925
 
40893
40926
 
40894
40927
  this.IsHScreen=false;
40895
40928
  this.LineWidth=1;
40896
40929
  this.PointRadius=5;
40897
40930
 
40931
+ this.MapCache=null; //key=date/date-time value={ Data:[] }
40932
+ this.GetKValue=ChartData.GetKValue;
40933
+
40934
+ this.BuildKey=function(item)
40935
+ {
40936
+ if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
40937
+ else return item.Date;
40938
+ }
40939
+
40940
+ this.GetItem=function(kItem)
40941
+ {
40942
+ if (!this.MapCache || this.MapCache.size<=0) return null;
40943
+
40944
+ var key=this.BuildKey(kItem);
40945
+ if (!this.MapCache.has(key)) return null;
40946
+
40947
+ return this.MapCache.get(key);
40948
+ }
40949
+
40950
+ this.BuildCacheData=function()
40951
+ {
40952
+ var mapData=new Map();
40953
+ this.MapCache=mapData;
40954
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
40955
+
40956
+ for(var i=0; i<this.PointGroup.length; ++i)
40957
+ {
40958
+ var groupItem=this.PointGroup[i];
40959
+ if (!groupItem || !IFrameSplitOperator.IsNonEmptyArray(groupItem.Point)) continue;
40960
+
40961
+ var clrConfig= { Color:groupItem.Color, BGColor:groupItem.BGColor, LineWidth:this.LineWidth, Radius:this.PointRadius, Name:groupItem.Name };
40962
+ if (IFrameSplitOperator.IsNumber(groupItem.PointRadius)) clrConfig.Radius=groupItem.PointRadius;
40963
+
40964
+ for(var j=0; j<groupItem.Point.length; ++j)
40965
+ {
40966
+ var point=groupItem.Point[j];
40967
+ var key=this.BuildKey(point);
40968
+
40969
+ var item={ Data:point, ColorConfig:clrConfig }
40970
+ if (mapData.has(key))
40971
+ {
40972
+ var mapItem=mapData.get(key);
40973
+ mapItem.Data.push(item);
40974
+ }
40975
+ else
40976
+ {
40977
+ mapData.set(key,{ Data:[item] });
40978
+ }
40979
+ }
40980
+ }
40981
+ }
40982
+
40898
40983
  this.Draw=function()
40899
40984
  {
40900
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
40901
- if (!this.Data || this.Data.length<=0) return;
40985
+ if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
40986
+ if (this.IsShowIndexTitleOnly()) return;
40987
+ if (this.IsHideScriptIndex()) return;
40988
+
40989
+ if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return; //k线数据
40902
40990
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
40991
+ if (!this.MapCache || this.MapCache.size<=0) return;
40903
40992
 
40904
40993
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
40905
40994
  var xPointCount=this.ChartFrame.XPointCount;
40906
- var offset=this.Data.DataOffset;
40907
- var pixel=GetDevicePixelRatio();
40995
+ var dataWidth=this.ChartFrame.DataWidth;
40996
+ var distanceWidth=this.ChartFrame.DistanceWidth;
40997
+ var isMinute=this.IsMinuteFrame();
40998
+
40999
+ var border=this.GetBorder();
41000
+ if (this.IsHScreen)
41001
+ {
41002
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
41003
+ var chartright=border.BottomEx;
41004
+ var chartLeft=border.TopEx;
41005
+ }
41006
+ else
41007
+ {
41008
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
41009
+ var chartright=border.RightEx;
41010
+ var chartLeft=border.LeftEx;
41011
+ }
41012
+
41013
+ //计算所有的点位置
41014
+ var mapPoint=new Map();
41015
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
41016
+ {
41017
+ var kItem=this.Data.Data[i];
41018
+ var key=this.BuildKey(kItem);
41019
+ if (!this.MapCache.has(key)) continue;
41020
+ var mapItem=this.MapCache.get(key);
41021
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
41022
+
41023
+ if (isMinute)
41024
+ {
41025
+ var x=this.ChartFrame.GetXFromIndex(j);
41026
+ }
41027
+ else
41028
+ {
41029
+ var left=xOffset;
41030
+ var right=xOffset+dataWidth;
41031
+ if (right>chartright) break;
41032
+ var x=left+(right-left)/2;
41033
+ }
41034
+
41035
+ this.CalculateItem(mapItem, kItem, x, mapPoint);
41036
+ }
41037
+
41038
+ if (mapPoint.size<=0) return;
40908
41039
 
40909
41040
  this.Canvas.save();
40910
41041
  this.ClipClient(this.IsHScreen);
40911
-
40912
- for(var i=0; i<this.PointGroup.length; ++i)
41042
+
41043
+ this.DrawAllPoint(mapPoint);
41044
+
41045
+ this.Canvas.restore();
41046
+ }
41047
+
41048
+ this.CalculateItem=function(groupItem, kItem, x, mapPoint)
41049
+ {
41050
+ for(var i=0; i<groupItem.Data.length; ++i)
40913
41051
  {
40914
- var item=this.PointGroup[i];
40915
- var color=item.Color;
40916
- var bgColor=item.BGColor;
40917
- var lineWidth=this.LineWidth;
40918
- var radius=this.PointRadius;
40919
- if (IFrameSplitOperator.IsNumber(item.LineWidth)) lineWidth=item.LineWidth;
40920
- if (IFrameSplitOperator.IsNumber(item.PointRadius)) radius=item.PointRadius;
41052
+ var item=groupItem.Data[i];
41053
+ var value=item.Data.Value;
41054
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
41055
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
41056
+
41057
+ var y=this.ChartFrame.GetYFromData(value,false);
41058
+
41059
+ var strConfig=JSON.stringify(item.ColorConfig);
41060
+ if (!mapPoint.has(strConfig)) mapPoint.set(strConfig, { AryPoint:[]});
41061
+ var mapItem=mapPoint.get(strConfig);
41062
+
41063
+ mapItem.AryPoint.push({ X:x, Y:y, Data:item });
41064
+ }
41065
+ }
41066
+
41067
+ this.DrawAllPoint=function(mapPoint)
41068
+ {
41069
+ var pixelRatio=GetDevicePixelRatio();
41070
+
41071
+ for(var mapItem of mapPoint)
41072
+ {
41073
+ var aryPoint=mapItem[1].AryPoint;
41074
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
41075
+ var config=null;
40921
41076
  var path=new Path2D();
40922
41077
  var count=0;
40923
-
40924
- for(var j=0; j<item.Point.length; ++j)
41078
+ for(var i=0;i<aryPoint.length;++i)
40925
41079
  {
40926
- var point=item.Point[j];
40927
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
40928
-
40929
- var index=point.Index-offset;
40930
- if (index>=0 && index<xPointCount)
40931
- {
40932
- var x=this.ChartFrame.GetXFromIndex(index);
40933
- var y=this.ChartFrame.GetYFromData(point.Value, false);
41080
+ var item=aryPoint[i];
41081
+ if (!config) config=item.Data.ColorConfig;
40934
41082
 
40935
- var pointPath = new Path2D();
40936
- if (this.IsHScreen)
40937
- pointPath.arc(y,x,radius*pixel,0,360,false);
40938
- else
40939
- pointPath.arc(x,y,radius*pixel,0,360,false);
41083
+ var pointPath = new Path2D();
41084
+ if (this.IsHScreen)
41085
+ pointPath.arc(item.Y,item.X,config.Radius*pixelRatio,0,360,false);
41086
+ else
41087
+ pointPath.arc(item.X,item.Y,config.Radius**pixelRatio,0,360,false);
40940
41088
 
40941
- path.addPath(pointPath);
40942
- ++count;
40943
- }
41089
+ path.addPath(pointPath);
41090
+ ++count;
40944
41091
  }
40945
41092
 
40946
- if (count>0 && (bgColor || color))
41093
+ if (count>0 && config)
40947
41094
  {
40948
- this.Canvas.lineWidth=lineWidth*pixel;
40949
- this.Canvas.fillStyle=bgColor; //背景填充颜色
40950
- this.Canvas.strokeStyle=color;
41095
+ if (config.BGColor)
41096
+ {
41097
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
41098
+ this.Canvas.fill(path);
41099
+ }
40951
41100
 
40952
- if (bgColor) this.Canvas.fill(path);
40953
- if (color) this.Canvas.stroke(path);
41101
+ if (config.Color)
41102
+ {
41103
+ this.Canvas.lineWidth=config.LineWidth*pixelRatio;
41104
+ this.Canvas.strokeStyle=config.Color;
41105
+ this.Canvas.stroke(path);
41106
+ }
40954
41107
  }
40955
-
40956
41108
  }
40957
-
40958
- this.Canvas.restore();
40959
41109
  }
40960
41110
 
40961
41111
  this.GetMaxMin=function()
40962
41112
  {
40963
41113
  var range={ Min:null, Max:null };
41114
+ if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
41115
+ if (!this.MapCache || this.MapCache.size<=0) return;
40964
41116
  var xPointCount=this.ChartFrame.XPointCount;
40965
- var start=this.Data.DataOffset;
40966
- var end=start+xPointCount;
40967
41117
 
40968
- for(var i=0; i<this.PointGroup.length; ++i)
41118
+ for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
40969
41119
  {
40970
- var item=this.PointGroup[i];
40971
- if (!IFrameSplitOperator.IsNonEmptyArray(item.Point)) continue;
41120
+ var kItem=this.Data.Data[i];
41121
+ var key=this.BuildKey(kItem);
41122
+ if (!this.MapCache.has(key)) continue;
41123
+ var mapItem=this.MapCache.get(key);
41124
+ if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
40972
41125
 
40973
- for(var j=0; j<item.Point.length; ++j)
41126
+ for(k=0;k<mapItem.Data.length;++k)
40974
41127
  {
40975
- var point=item.Point[j];
40976
- if (point.Index>=start && point.Index<end)
40977
- {
40978
- if (range.Max==null) range.Max=point.Value;
40979
- else if (range.Max<point.Value) range.Max=point.Value;
40980
- if (range.Min==null) range.Min=point.Value;
40981
- else if (range.Min>point.Value) range.Min=point.Value;
40982
- }
41128
+ var item=mapItem.Data[k];
41129
+ var value=item.Data.Value;
41130
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=this.GetKValue(kItem,item.Data.Value);
41131
+ if (!IFrameSplitOperator.IsNumber(value)) continue;
41132
+
41133
+ if (range.Max==null) range.Max=value;
41134
+ else if (range.Max<value) range.Max=value;
41135
+ if (range.Min==null) range.Min=value;
41136
+ else if (range.Min>value) range.Min=value;
40983
41137
  }
40984
41138
  }
40985
41139
 
@@ -41246,6 +41400,8 @@ function ChartMultiSVGIconV2()
41246
41400
  this.IconRect=[]; //0=序号,1=区域
41247
41401
 
41248
41402
  this.MapCache=null; //key=date/date-time value={ Data:[] }
41403
+ this.GetKValue=ChartData.GetKValue;
41404
+
41249
41405
 
41250
41406
  this.BuildKey=function(item)
41251
41407
  {
@@ -41360,28 +41516,7 @@ function ChartMultiSVGIconV2()
41360
41516
 
41361
41517
  this.Canvas.restore();
41362
41518
  }
41363
-
41364
- this.GetKValue=function(kItem, valueName)
41365
- {
41366
- switch(valueName)
41367
- {
41368
- case "HIGH":
41369
- case "H":
41370
- return kItem.High;
41371
- case "L":
41372
- case "LOW":
41373
- return kItem.Low;
41374
- case "C":
41375
- case "CLOSE":
41376
- return kItem.Close;
41377
- case "O":
41378
- case "OPEN":
41379
- return KItem.Open;
41380
- default:
41381
- return null;
41382
- }
41383
- }
41384
-
41519
+
41385
41520
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
41386
41521
  {
41387
41522
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -57337,24 +57472,29 @@ function DynamicChartTitlePainting()
57337
57472
 
57338
57473
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
57339
57474
  {
57340
- if (!IFrameSplitOperator.IsNonEmptyArray(dataInfo.PointGroup)) return null;
57475
+ if (!dataInfo.GetItemCallback) return null;
57476
+ if (!dataInfo.Data || !IFrameSplitOperator.IsNonEmptyArray(dataInfo.Data.Data)) return null;
57477
+ var kItem=dataInfo.Data.Data[dataIndex];
57478
+ if (!kItem) return null;
57479
+
57480
+ var group=dataInfo.GetItemCallback(kItem);
57481
+ if (!group || !IFrameSplitOperator.IsNonEmptyArray(group.Data)) return null;
57341
57482
 
57342
57483
  var aryText=[];
57343
- for(var i=0;i<dataInfo.PointGroup.length;++i)
57484
+ for(var i=0;i<group.Data.length;++i)
57344
57485
  {
57345
- var groupItem=dataInfo.PointGroup[i];
57346
- for(var j=0;j<groupItem.Point.length;++j)
57347
- {
57348
- var item=groupItem.Point[j];
57349
- if (item.Index==dataIndex)
57350
- {
57351
- var item={ Text:item.Value.toFixed(2)};
57352
- if (aryText.length==0) item.Name=dataInfo.Name;
57353
- item.Color=groupItem.BGColor;
57354
- aryText.push(item);
57355
- break;
57356
- }
57357
- }
57486
+ var item=group.Data[i];
57487
+ var config=item.ColorConfig;
57488
+
57489
+ var color=null;
57490
+ if (config.BGColor) color=config.BGColor;
57491
+ else if (config.Color) color=config.Color;
57492
+
57493
+ if (config.Name) aryText.push({ Text:`${config.Name}:`, Color:color });
57494
+
57495
+ var value=item.Data.Value;
57496
+ if (IFrameSplitOperator.IsString(item.Data.Value)) value=ChartData.GetKValue(kItem, item.Data.Value);
57497
+ aryText.push({ Text:this.FormatValue(value, dataInfo), Color:color});
57358
57498
  }
57359
57499
 
57360
57500
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -58125,6 +58265,11 @@ function DynamicChartTitlePainting()
58125
58265
  aryText=this.FromatStackedBarTitle(value, item);
58126
58266
  if (!aryText) continue;
58127
58267
  }
58268
+ else if (item.DataType=="ChartMultiPoint")
58269
+ {
58270
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
58271
+ if (!aryText) continue;
58272
+ }
58128
58273
  else
58129
58274
  {
58130
58275
  valueText=this.FormatValue(value,item);
@@ -80105,18 +80250,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80105
80250
  {
80106
80251
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
80107
80252
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
80108
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
80253
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio}}, e);
80109
80254
 
80110
80255
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
80111
80256
  if (event)
80112
80257
  {
80113
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
80258
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, Point:{ X:x*pixelTatio, Y:y*pixelTatio}, CursorIndex:this.CursorIndex, };
80114
80259
  event.Callback(event,data,this);
80115
80260
  }
80116
80261
  }
80117
80262
 
80118
80263
  //右键菜单数据
80119
- this.GetRightMenuData=function(frameID)
80264
+ this.GetRightMenuData=function(frameID, option)
80120
80265
  {
80121
80266
  var windowCount=this.Frame.SubFrame.length; //窗口个数
80122
80267
  var klineChart=this.ChartPaint[0];
@@ -80159,6 +80304,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80159
80304
  var bPopMinuteChart=false;
80160
80305
  if (this.PopMinuteChart) bPopMinuteChart=true;
80161
80306
 
80307
+ var kItem=null;
80308
+ if (frameID>=0 && option && IFrameSplitOperator.IsNumber(option.CursorIndex))
80309
+ {
80310
+ var kData=this.GetKData();
80311
+ if (kData && IFrameSplitOperator.IsNonEmptyArray(kData.Data))
80312
+ {
80313
+ var dataIndex=kData.DataOffset+option.CursorIndex;
80314
+ if (dataIndex>=0 && dataIndex<kData.Data.length) kItem=kData.Data[dataIndex];
80315
+ }
80316
+ }
80317
+
80162
80318
  var aryMenu=
80163
80319
  [
80164
80320
  {
@@ -80441,6 +80597,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
80441
80597
  }
80442
80598
  }
80443
80599
  }
80600
+ else if (item.Name=="其他设置")
80601
+ {
80602
+ if (kItem)
80603
+ {
80604
+ var bLocked=this.IsLockCorssCursor();
80605
+ if (bLocked)
80606
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_UNLOCK_CROSSCURSOR }, Checked:bLocked });
80607
+ else
80608
+ item.SubMenu.push({ Name:"锁十字光标", Data:{ ID: JSCHART_MENU_ID.CMD_LOCK_CROSSCURSOR, Args:[{ KItem:{Date:kItem.Date, Time:kItem.Time}, Draw:true }] }, Checked:bLocked });
80609
+ }
80610
+ }
80444
80611
  }
80445
80612
 
80446
80613
  return aryMenu;
@@ -82044,19 +82211,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82044
82211
  if (option && option.Draw) this.Draw();
82045
82212
  }
82046
82213
 
82214
+ //option={ KItem:{ Date:, Time:}}
82047
82215
  this.LockCorssCursor=function(option)
82048
82216
  {
82049
- if (this.CursorIndex<0) return false;
82050
- var kData=this.GetKData();
82051
- if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
82217
+ if (option && option.KItem) //指定日期时间
82218
+ {
82219
+ var kData=this.GetKData();
82220
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
82052
82221
 
82053
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
82054
- var kItem=kData.Data[dataIndex];
82055
- if (!kItem) return false;
82222
+ var kItem={ Date:option.KItem.Date, Time:option.KItem.Time, Index:-1};
82223
+ kData.FindDataIndexByDateTime([kItem]);
82224
+ if (kItem.Index<0) return false;
82056
82225
 
82057
- var xItem=this.GlobalOption.LockCorssCursor.X;
82058
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
82059
- xItem.Enable=true;
82226
+ var xItem=this.GlobalOption.LockCorssCursor.X;
82227
+ xItem.KLine={ DataIndex:kItem.Index, Date:kItem.Date, Time:kItem.Time };
82228
+ xItem.Enable=true;
82229
+ }
82230
+ else
82231
+ {
82232
+ if (this.CursorIndex<0) return false;
82233
+ var kData=this.GetKData();
82234
+ if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return false;
82235
+
82236
+ var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
82237
+ var kItem=kData.Data[dataIndex];
82238
+ if (!kItem) return false;
82239
+
82240
+ var xItem=this.GlobalOption.LockCorssCursor.X;
82241
+ xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
82242
+ xItem.Enable=true;
82243
+ }
82060
82244
 
82061
82245
  if (option && option.Draw) this.Draw();
82062
82246
  return true;
@@ -82079,7 +82263,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
82079
82263
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
82080
82264
 
82081
82265
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
82082
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
82266
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
82083
82267
 
82084
82268
  var border=this.Frame.ChartBorder.GetBorder();
82085
82269
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -84152,18 +84336,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84152
84336
  {
84153
84337
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
84154
84338
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
84155
- this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId}, e);
84339
+ this.PopupRightMenuV2({X:e.offsetX, Y:e.offsetY, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} }, e);
84156
84340
 
84157
84341
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
84158
84342
  if (event)
84159
84343
  {
84160
- var data={ X:x, Y:y, Event:e, FrameID:frameId };
84344
+ var data={ X:x, Y:y, Event:e, FrameID:frameId, CursorIndex:this.CursorIndex, Point:{ X:x*pixelTatio, Y:y*pixelTatio} };
84161
84345
  event.Callback(event,data,this);
84162
84346
  }
84163
84347
  }
84164
84348
 
84165
84349
  //右键菜单数据
84166
- this.GetRightMenuData=function(frameID)
84350
+ this.GetRightMenuData=function(frameID, option)
84167
84351
  {
84168
84352
  var windowCount=this.Frame.SubFrame.length; //窗口个数
84169
84353
 
@@ -84290,11 +84474,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84290
84474
  }
84291
84475
 
84292
84476
 
84293
- //删除菜单
84477
+
84294
84478
  for(var i=0;i<aryMenu.length;++i)
84295
84479
  {
84296
84480
  var item=aryMenu[i];
84297
- if (item.Name=="叠加品种")
84481
+ if (item.Name=="叠加品种") //删除菜单
84298
84482
  {
84299
84483
  for(var j=0;j<item.SubMenu.length;++j)
84300
84484
  {
@@ -84306,6 +84490,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
84306
84490
  }
84307
84491
  }
84308
84492
  }
84493
+ else if (item.Name=="其他设置")
84494
+ {
84495
+
84496
+ }
84309
84497
  }
84310
84498
 
84311
84499
  return aryMenu;
@@ -1890,13 +1890,14 @@ HQData.APIIndex_MULTI_POINT=function(data, callback)
1890
1890
  BGColor:"rgb(255,215,0)",
1891
1891
  PointRadius:10,
1892
1892
  LineWidth:2,
1893
+ Name:"最低价",
1893
1894
  Point:[ ]
1894
1895
  };
1895
1896
 
1896
1897
  for(var i=kData.Data.length-1, j=0; i>=0 && j<6; i-=5, ++j)
1897
1898
  {
1898
1899
  var item=kData.Data[i];
1899
- point.Point.push({Date:item.Date, Time:item.Time, Value:item.Low});
1900
+ point.Point.push({Date:item.Date, Time:item.Time, Value:"LOW"});
1900
1901
  }
1901
1902
 
1902
1903
  pointData.Draw.DrawData.push(point);
@@ -1908,6 +1909,7 @@ HQData.APIIndex_MULTI_POINT=function(data, callback)
1908
1909
  BGColor:"rgb(30,144,255)",
1909
1910
  PointRadius:5,
1910
1911
  LineWidth:1,
1912
+ Name:"中间价",
1911
1913
  Point:[ ]
1912
1914
  };
1913
1915