hqchart 1.1.14320 → 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
  {
@@ -35907,199 +35940,292 @@ function ChartSimpleRadar()
35907
35940
  delete this.newMethod;
35908
35941
 
35909
35942
  this.ClassName='ChartSimpleRadar'; //类名
35910
- this.BorderPoint=[]; //边框点
35911
- this.DataPoint=[]; //数据点
35912
- this.CenterPoint={};
35913
- this.StartAngle=0;
35914
- this.Color='rgb(198,198,198)';
35915
- this.AreaColor='rgba(242,154,118,0.4)'; //面积图颜色
35943
+
35944
+ this.AreaColor='rgba(242,154,118,0.4)'; //
35916
35945
  this.AreaLineColor='rgb(242,154,118)';
35917
- this.TitleFont=24*GetDevicePixelRatio()+'px 微软雅黑';
35918
- this.TitleColor='rgb(102,102,102)';
35919
- this.BGColor = ['rgb(255,255,255)', 'rgb(224,224,224)']//背景色
35946
+
35947
+ this.TitleColor=g_JSChartResource.ChartSimpleRadar.TextColor;
35948
+ this.TextFontConfig=CloneData(g_JSChartResource.ChartSimpleRadar.TextFont);
35949
+ this.Offset=CloneData(g_JSChartResource.ChartSimpleRadar.Offset);
35950
+ this.BorderColor=g_JSChartResource.ChartSimpleRadar.BorderColor;
35951
+ this.AryBGColor=g_JSChartResource.ChartSimpleRadar.AryBGColor.slice();//背景色
35952
+ this.AryAreaConfig=g_JSChartResource.ChartSimpleRadar.AryArea.slice(); //面积图颜色
35953
+
35954
+ this.StartAngle=270;
35955
+ this.Radius=50;
35956
+ this.AryBorder=[1, 0.75, 0.5, 0.25];
35957
+ this.AryIndex; //指标{ Name:, Max:100, Min:0 },
35920
35958
 
35921
- this.DrawBorder=function() //画边框
35959
+ this.CenterPoint={};
35960
+ this.RectClient={ };
35961
+ this.AryIndexCache=[];
35962
+ this.MapDataCache=new Map(); //key=name value={ Data:[] }
35963
+ this.TextFont;
35964
+
35965
+
35966
+ this.ReloadResource=function(resource)
35922
35967
  {
35923
- if (this.BorderPoint.length<=0) return;
35968
+ this.TitleColor=g_JSChartResource.ChartSimpleRadar.TextColor;
35969
+ this.TextFontConfig=CloneData(g_JSChartResource.ChartSimpleRadar.TextFont);
35970
+ this.Offset=CloneData(g_JSChartResource.ChartSimpleRadar.Offset);
35971
+ this.BorderColor=g_JSChartResource.ChartSimpleRadar.BorderColor;
35972
+ this.AryBGColor=g_JSChartResource.ChartSimpleRadar.AryBGColor.slice();//背景色
35973
+ this.AryAreaConfig=g_JSChartResource.ChartSimpleRadar.AryArea.slice(); //面积图颜色
35974
+ }
35924
35975
 
35925
- this.Canvas.font=this.TitleFont;
35926
- this.Canvas.strokeStyle = this.Color;
35927
- const aryBorder=[1,0.8,0.6,0.4,0.2];
35928
- for (let j in aryBorder)
35976
+ this.DrawBorder=function() //画边框
35977
+ {
35978
+ this.Canvas.strokeStyle = this.BorderColor;
35979
+ this.Canvas.font=this.TextFont;
35980
+ for(var i=0;i<this.AryBorder.length;++i)
35929
35981
  {
35930
- var rate = aryBorder[j];
35931
- var isFirstDraw=true;
35932
- for(let i in this.BorderPoint)
35982
+ var rate = this.AryBorder[i];
35983
+ var radius=this.RectClient.Radius*rate;
35984
+ var bFirstDraw=true;
35985
+ for(var j=0;j<this.AryIndexCache.length;++j)
35933
35986
  {
35934
- var item=this.BorderPoint[i];
35935
- item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180) * rate;
35936
- item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180) * rate;
35937
- if (isFirstDraw)
35987
+ var item=this.AryIndexCache[j];
35988
+ var x = this.CenterPoint.X + radius * Math.cos(item.Angle * Math.PI / 180);
35989
+ var y = this.CenterPoint.Y + radius * Math.sin(item.Angle * Math.PI / 180);
35990
+ if (bFirstDraw)
35938
35991
  {
35939
35992
  this.Canvas.beginPath();
35940
- this.Canvas.moveTo(item.X,item.Y);
35941
- isFirstDraw=false;
35993
+ this.Canvas.moveTo(x,y);
35994
+ bFirstDraw=false;
35942
35995
  }
35943
35996
  else
35944
35997
  {
35945
- this.Canvas.lineTo(item.X,item.Y);
35998
+ this.Canvas.lineTo(x,y);
35946
35999
  }
35947
36000
  }
35948
36001
 
35949
36002
  this.Canvas.closePath();
35950
36003
  this.Canvas.stroke();
35951
- this.Canvas.fillStyle = this.BGColor[j%2==0?0:1];
35952
- this.Canvas.fill();
36004
+
36005
+ if (IFrameSplitOperator.IsNonEmptyArray(this.AryBGColor))
36006
+ {
36007
+ this.Canvas.fillStyle = this.AryBGColor[i%this.AryBGColor.length];
36008
+ this.Canvas.fill();
36009
+ }
35953
36010
  }
35954
36011
 
35955
36012
  this.Canvas.beginPath();
35956
- for(let i in this.BorderPoint)
36013
+ for(var i=0;i<this.AryIndexCache.length;++i)
35957
36014
  {
35958
- var item=this.BorderPoint[i];
35959
- item.X = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);
35960
- item.Y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);
36015
+ var item=this.AryIndexCache[i];
36016
+ var x = this.CenterPoint.X + item.Radius * Math.cos(item.Angle * Math.PI / 180);
36017
+ var y = this.CenterPoint.Y + item.Radius * Math.sin(item.Angle * Math.PI / 180);
35961
36018
  this.Canvas.moveTo(this.CenterPoint.X,this.CenterPoint.Y);
35962
- this.Canvas.lineTo(item.X,item.Y);
35963
- this.DrawText(item);
36019
+ this.Canvas.lineTo(x,y);
36020
+ this.DrawText(item, x, y);
35964
36021
  }
35965
36022
  this.Canvas.stroke();
36023
+
36024
+ }
36025
+
36026
+ this.GetRadarRate=function(indexItem, value)
36027
+ {
36028
+ var range={ Max:100, Min:0 };
36029
+ if (IFrameSplitOperator.IsNumber(indexItem.Max)) range.Max=indexItem.Max;
36030
+ if (IFrameSplitOperator.IsNumber(indexItem.Min)) range.Min=indexItem.Min;
36031
+
36032
+ if (value>range.Max) value=range.Max;
36033
+ else if (value<range.Min) value=range.Min;
36034
+
36035
+ return (value-range.Min)/(range.Max-range.Min);
35966
36036
  }
35967
36037
 
35968
36038
  this.DrawArea=function()
35969
36039
  {
35970
- if (!this.DataPoint || this.DataPoint.length<=0) return;
36040
+ if (this.MapDataCache.size<=0) return;
35971
36041
 
35972
- this.Canvas.fillStyle = this.AreaColor;
35973
- this.Canvas.strokeStyle = this.AreaLineColor;
35974
- this.Canvas.beginPath();
35975
- var isFirstDraw=true;
35976
- for(let i in this.DataPoint)
36042
+ var index=0;
36043
+ for(var mapItem of this.MapDataCache)
35977
36044
  {
35978
- var item=this.DataPoint[i];
35979
- if (isFirstDraw)
36045
+ var mapData=mapItem[1].MapData;
36046
+
36047
+ var bFirstDraw=true;
36048
+ var pointCount=0;
36049
+ for(var i=0;i<this.AryIndexCache.length;++i)
35980
36050
  {
35981
- this.Canvas.beginPath();
35982
- this.Canvas.moveTo(item.X,item.Y);
35983
- isFirstDraw=false;
36051
+ var indexItem=this.AryIndexCache[i];
36052
+ if (!indexItem.Data || !indexItem.Data.Name) continue;
36053
+ if (!mapData.has(indexItem.Data.Name)) continue;
36054
+ var item=mapData.get(indexItem.Data.Name);
36055
+ if (!item.Data && !IFrameSplitOperator.IsNumber(item.Data.Value)) conintue;
36056
+
36057
+ var widthRate=this.GetRadarRate(indexItem, item.Data.Value);
36058
+ var x = this.CenterPoint.X+indexItem.Radius*widthRate*Math.cos(indexItem.Angle * Math.PI / 180);
36059
+ var y = this.CenterPoint.Y+indexItem.Radius*widthRate*Math.sin(indexItem.Angle * Math.PI / 180);
36060
+
36061
+ if (bFirstDraw)
36062
+ {
36063
+ this.Canvas.beginPath();
36064
+ this.Canvas.moveTo(x,y);
36065
+ bFirstDraw=false;
36066
+ ++pointCount;
36067
+ }
36068
+ else
36069
+ {
36070
+ this.Canvas.lineTo(x,y);
36071
+ ++pointCount;
36072
+ }
35984
36073
  }
35985
- else
36074
+
36075
+ if (pointCount>0)
35986
36076
  {
35987
- this.Canvas.lineTo(item.X,item.Y);
36077
+ this.Canvas.closePath();
36078
+
36079
+ var config=this.AryAreaConfig[index%this.AryAreaConfig.length];
36080
+ if (config.Color)
36081
+ {
36082
+ this.Canvas.fillStyle = config.Color;
36083
+ this.Canvas.fill();
36084
+ }
36085
+
36086
+ if (config.LineColor)
36087
+ {
36088
+ this.Canvas.strokeStyle = config.LineColor;
36089
+ this.Canvas.stroke();
36090
+ }
35988
36091
  }
35989
- }
35990
36092
 
35991
- this.Canvas.closePath();
35992
- this.Canvas.fill();
35993
- this.Canvas.stroke();
36093
+ ++index;
36094
+ }
35994
36095
  }
35995
36096
 
35996
- this.DrawText=function(item)
36097
+ this.DrawText=function(item, x, y)
35997
36098
  {
35998
- if (!item.Text) return;
36099
+ if (!item.Data || !item.Data.Name) return;
35999
36100
 
36000
36101
  //JSConsole.Chart.Log(item.Text, item.Angle);
36001
36102
  this.Canvas.fillStyle = this.TitleColor;
36002
- var xText = item.X, yText = item.Y;
36103
+ var xText = x, yText =y;
36104
+
36105
+ var angle=item.Angle%360;
36003
36106
 
36004
36107
  //显示每个角度的位置
36005
- if (item.Angle > 0 && item.Angle < 45) {
36108
+ if (angle > 0 && angle < 45) {
36006
36109
  this.Canvas.textAlign = 'left';
36007
36110
  this.Canvas.textBaseline = 'middle';
36008
36111
  xText += 2;
36009
36112
  }
36010
- else if (item.Angle >= 0 && item.Angle < 90) {
36113
+ else if (angle >= 45 && angle < 90) {
36011
36114
  this.Canvas.textAlign = 'left';
36012
36115
  this.Canvas.textBaseline = 'top';
36013
36116
  xText += 2;
36014
36117
  }
36015
- else if (item.Angle >= 90 && item.Angle < 135) {
36118
+ else if (angle==90)
36119
+ {
36120
+ this.Canvas.textAlign = 'center';
36121
+ this.Canvas.textBaseline = 'top';
36122
+ yText+=2;
36123
+ }
36124
+ else if (angle >= 90 && angle < 135) {
36016
36125
  this.Canvas.textAlign = 'right';
36017
36126
  this.Canvas.textBaseline = 'top';
36018
36127
  xText -= 2;
36019
36128
  }
36020
- else if (item.Angle >= 135 && item.Angle < 180) {
36129
+ else if (angle >= 135 && angle < 180) {
36021
36130
  this.Canvas.textAlign = 'right';
36022
36131
  this.Canvas.textBaseline = 'top';
36023
36132
  xText -= 2;
36024
36133
  }
36025
- else if (item.Angle >= 180 && item.Angle < 225) {
36134
+ else if (angle >= 180 && angle < 225) {
36026
36135
  this.Canvas.textAlign = 'right';
36027
36136
  this.Canvas.textBaseline = 'middle';
36028
36137
  xText -= 2;
36029
36138
  }
36030
- else if (item.Angle >= 225 && item.Angle <= 270) {
36139
+ else if (angle >= 225 && angle <= 270) {
36031
36140
  this.Canvas.textAlign = 'center';
36032
36141
  this.Canvas.textBaseline = 'bottom';
36033
36142
  }
36034
- else if (item.Angle > 270 && item.Angle < 315) {
36143
+ else if (angle > 270 && angle < 315) {
36035
36144
  this.Canvas.textAlign = 'left';
36036
36145
  this.Canvas.textBaseline = 'bottom';
36037
36146
  xText += 2;
36038
36147
  }
36039
- else {
36148
+ else
36149
+ {
36040
36150
  this.Canvas.textAlign = 'left';
36041
36151
  this.Canvas.textBaseline = 'middle';
36042
36152
  xText += 2;
36043
36153
  }
36044
36154
 
36045
- this.Canvas.fillText(item.Text, xText, yText);
36155
+ this.Canvas.fillText(item.Data.Name, xText, yText);
36046
36156
  }
36047
36157
 
36048
36158
  this.Draw=function()
36049
36159
  {
36050
- this.BorderPoint=[];
36051
- this.DataPoint=[];
36052
- this.CenterPoint={};
36053
- if (!this.Data || !this.Data.Data || !(this.Data.Data.length>0))
36054
- this.CalculatePoints(null);
36055
- else
36056
- this.CalculatePoints(this.Data.Data);
36160
+ this.AryIndexCache=[];
36161
+ this.MapData=new Map();
36162
+ if (!IFrameSplitOperator.IsNonEmptyArray(this.AryIndex)) return;
36163
+
36164
+ this.CalculateSize();
36057
36165
 
36058
36166
  this.DrawBorder();
36167
+
36059
36168
  this.DrawArea();
36060
36169
  }
36061
36170
 
36062
- this.CalculatePoints=function(data)
36171
+ this.BuildCacheData=function()
36063
36172
  {
36064
- let left=this.ChartBorder.GetLeft();
36065
- let right=this.ChartBorder.GetRight();
36066
- let top=this.ChartBorder.GetTop();
36067
- let bottom=this.ChartBorder.GetBottom();
36068
- let width=this.ChartBorder.GetWidth();
36069
- let height=this.ChartBorder.GetHeight();
36173
+ this.MapDataCache=new Map();
36070
36174
 
36071
- let ptCenter={X:left+width/2, Y:top+height/2}; //中心点
36072
- let radius=Math.min(width/2,height/2)-2 //半径
36073
- let count=Math.max(5,data?data.length:0);
36074
- let averageAngle=360/count;
36075
- for(let i=0;i<count;++i)
36175
+ for(var i=0;i<this.Data.Data.length;++i)
36076
36176
  {
36077
- let ptBorder = { Index: i, Radius: radius, Angle: i * averageAngle + this.StartAngle };
36078
- let angle = ptBorder.Angle;
36177
+ var item=this.Data.Data[i];
36178
+ if (!this.MapDataCache.has(item.Group))
36179
+ {
36180
+ this.MapDataCache.set(item.Group, { MapData:new Map() })
36181
+ }
36182
+
36183
+ var mpaItem=this.MapDataCache.get(item.Group);
36184
+ mpaItem.MapData.set(item.Name, { Data:item });
36185
+ }
36186
+ }
36187
+
36188
+ this.CalculateSize=function(data)
36189
+ {
36190
+ var border=this.ChartBorder.GetBorder();
36191
+ var pixelRatio=GetDevicePixelRatio();
36192
+ this.TextFont=`${this.TextFontConfig.Size*pixelRatio}px ${ this.TextFontConfig.Name}`;
36193
+ var fontHeight=this.GetFontHeight(this.TextFont,"擎")+1;
36079
36194
 
36080
- if (data && i<data.length)
36195
+ var maxTextWidth=0;
36196
+ if (IFrameSplitOperator.IsNonEmptyArray(this.AryIndex))
36197
+ {
36198
+ for(var i=0;i<this.AryIndex.length;++i)
36081
36199
  {
36082
- var item=data[i];
36083
- let ptData={Index:i,Text:item.Text};
36084
- ptBorder.Text=item.Name;
36085
- if (!item.Value)
36086
- {
36087
- ptData.X=ptCenter.X;
36088
- ptData.Y=ptCenter.Y;
36089
- }
36090
- else
36091
- {
36092
- var value=item.Value;
36093
- if (value>=1) value=1;
36094
- var dataRadius=radius*value;
36095
- ptData.X=ptCenter.X+dataRadius*Math.cos(angle*Math.PI/180);
36096
- ptData.Y=ptCenter.Y+dataRadius*Math.sin(angle*Math.PI/180);
36097
- }
36200
+ var item=this.AryIndex[i];
36201
+ if (!item.Name) continue;
36202
+ var textWidth=this.Canvas.measureText(item.Name).width;
36203
+ if (maxTextWidth<textWidth) maxTextWidth=textWidth;
36204
+ }
36205
+ }
36206
+
36207
+ var radius=this.Radius*2*pixelRatio; //半径
36208
+ this.RectClient={ Width:radius*2, Height:radius*2, Radius:radius };
36209
+ this.RectClient.Right=border.Right+this.Offset.X-maxTextWidth;
36210
+ this.RectClient.Top=border.TopEx+this.Offset.Y+fontHeight;
36211
+ this.RectClient.Left=this.RectClient.Right-this.RectClient.Width;
36212
+ this.RectClient.Bottom=this.RectClient.Top+this.RectClient.Height;
36098
36213
 
36099
- this.DataPoint.push(ptData);
36214
+ var ptCenter={X:this.RectClient.Left+this.RectClient.Width/2, Y:this.RectClient.Top+this.RectClient.Height/2}; //中心点
36215
+
36216
+ var count=Math.max(5,this.AryIndex.length);
36217
+ var averageAngle=360/count;
36218
+ for(var i=0;i<count;++i)
36219
+ {
36220
+ var angle=i*averageAngle+this.StartAngle;
36221
+
36222
+ var indexItem={ Data:null, Index:i, Angle:angle, Radius:radius };
36223
+ if (this.AryIndex && this.AryIndex[i])
36224
+ {
36225
+ indexItem.Data=this.AryIndex[i];
36100
36226
  }
36101
36227
 
36102
- this.BorderPoint.push(ptBorder);
36228
+ this.AryIndexCache.push(indexItem);
36103
36229
  }
36104
36230
 
36105
36231
  this.CenterPoint=ptCenter;
@@ -36108,7 +36234,7 @@ function ChartSimpleRadar()
36108
36234
  //空数据
36109
36235
  this.DrawEmptyData=function()
36110
36236
  {
36111
- JSConsole.Chart.Log('[ChartPie::DrawEmptyData]')
36237
+ JSConsole.Chart.Log('[ChartSimpleRadar::DrawEmptyData]')
36112
36238
  }
36113
36239
  }
36114
36240
 
@@ -44764,98 +44890,219 @@ function ChartMultiPoint()
44764
44890
  delete this.newMethod;
44765
44891
 
44766
44892
  this.ClassName="ChartMultiPoint";
44767
- this.PointGroup=[]; // [ {Point:[ {Index, Value }, ], Color: }, ]
44893
+ this.PointGroup=[]; // [ {Point:[ {Date, Time, Value }, ], Color: }, ]
44768
44894
 
44769
44895
 
44770
44896
  this.IsHScreen=false;
44771
44897
  this.LineWidth=1;
44772
44898
  this.PointRadius=5;
44773
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
+
44774
44952
  this.Draw=function()
44775
44953
  {
44776
- if (!this.IsShow || this.ChartFrame.IsMinSize) return;
44777
- 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线数据
44778
44959
  if (!IFrameSplitOperator.IsNonEmptyArray(this.PointGroup)) return;
44960
+ if (!this.MapCache || this.MapCache.size<=0) return;
44779
44961
 
44780
44962
  this.IsHScreen=(this.ChartFrame.IsHScreen===true);
44781
44963
  var xPointCount=this.ChartFrame.XPointCount;
44782
- var offset=this.Data.DataOffset;
44783
- 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;
44784
45008
 
44785
45009
  this.Canvas.save();
44786
45010
  this.ClipClient(this.IsHScreen);
44787
-
44788
- 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)
44789
45020
  {
44790
- var item=this.PointGroup[i];
44791
- var color=item.Color;
44792
- var bgColor=item.BGColor;
44793
- var lineWidth=this.LineWidth;
44794
- var radius=this.PointRadius;
44795
- if (IFrameSplitOperator.IsNumber(item.LineWidth)) lineWidth=item.LineWidth;
44796
- if (IFrameSplitOperator.IsNumber(item.PointRadius)) radius=item.PointRadius;
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)
45041
+ {
45042
+ var aryPoint=mapItem[1].AryPoint;
45043
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryPoint)) continue;
45044
+ var config=null;
44797
45045
  var path=new Path2D();
44798
45046
  var count=0;
44799
-
44800
- for(var j=0; j<item.Point.length; ++j)
45047
+ for(var i=0;i<aryPoint.length;++i)
44801
45048
  {
44802
- var point=item.Point[j];
44803
- if (!IFrameSplitOperator.IsNumber(point.Index)) continue;
44804
-
44805
- var index=point.Index-offset;
44806
- if (index>=0 && index<xPointCount)
44807
- {
44808
- var x=this.ChartFrame.GetXFromIndex(index);
44809
- var y=this.ChartFrame.GetYFromData(point.Value, false);
45049
+ var item=aryPoint[i];
45050
+ if (!config) config=item.Data.ColorConfig;
44810
45051
 
44811
- var pointPath = new Path2D();
44812
- if (this.IsHScreen)
44813
- pointPath.arc(y,x,radius*pixel,0,360,false);
44814
- else
44815
- 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);
44816
45057
 
44817
- path.addPath(pointPath);
44818
- ++count;
44819
- }
45058
+ path.addPath(pointPath);
45059
+ ++count;
44820
45060
  }
44821
45061
 
44822
- if (count>0 && (bgColor || color))
45062
+ if (count>0 && config)
44823
45063
  {
44824
- this.Canvas.lineWidth=lineWidth*pixel;
44825
- this.Canvas.fillStyle=bgColor; //背景填充颜色
44826
- this.Canvas.strokeStyle=color;
45064
+ if (config.BGColor)
45065
+ {
45066
+ this.Canvas.fillStyle=config.BGColor; //背景填充颜色
45067
+ this.Canvas.fill(path);
45068
+ }
44827
45069
 
44828
- if (bgColor) this.Canvas.fill(path);
44829
- 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
+ }
44830
45076
  }
44831
-
44832
45077
  }
44833
-
44834
- this.Canvas.restore();
44835
45078
  }
44836
45079
 
44837
45080
  this.GetMaxMin=function()
44838
45081
  {
44839
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;
44840
45085
  var xPointCount=this.ChartFrame.XPointCount;
44841
- var start=this.Data.DataOffset;
44842
- var end=start+xPointCount;
44843
45086
 
44844
- 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)
44845
45088
  {
44846
- var item=this.PointGroup[i];
44847
- 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;
44848
45094
 
44849
- for(var j=0; j<item.Point.length; ++j)
45095
+ for(k=0;k<mapItem.Data.length;++k)
44850
45096
  {
44851
- var point=item.Point[j];
44852
- if (point.Index>=start && point.Index<end)
44853
- {
44854
- if (range.Max==null) range.Max=point.Value;
44855
- else if (range.Max<point.Value) range.Max=point.Value;
44856
- if (range.Min==null) range.Min=point.Value;
44857
- else if (range.Min>point.Value) range.Min=point.Value;
44858
- }
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;
44859
45106
  }
44860
45107
  }
44861
45108
 
@@ -45122,6 +45369,8 @@ function ChartMultiSVGIconV2()
45122
45369
  this.IconRect=[]; //0=序号,1=区域
45123
45370
 
45124
45371
  this.MapCache=null; //key=date/date-time value={ Data:[] }
45372
+ this.GetKValue=ChartData.GetKValue;
45373
+
45125
45374
 
45126
45375
  this.BuildKey=function(item)
45127
45376
  {
@@ -45236,28 +45485,7 @@ function ChartMultiSVGIconV2()
45236
45485
 
45237
45486
  this.Canvas.restore();
45238
45487
  }
45239
-
45240
- this.GetKValue=function(kItem, valueName)
45241
- {
45242
- switch(valueName)
45243
- {
45244
- case "HIGH":
45245
- case "H":
45246
- return kItem.High;
45247
- case "L":
45248
- case "LOW":
45249
- return kItem.Low;
45250
- case "C":
45251
- case "CLOSE":
45252
- return kItem.Close;
45253
- case "O":
45254
- case "OPEN":
45255
- return KItem.Open;
45256
- default:
45257
- return null;
45258
- }
45259
- }
45260
-
45488
+
45261
45489
  this.DrawItem=function(groupItem, kItem, x, drawInfo)
45262
45490
  {
45263
45491
  if (!IFrameSplitOperator.IsNonEmptyArray(groupItem.Data)) return;
@@ -61213,24 +61441,29 @@ function DynamicChartTitlePainting()
61213
61441
 
61214
61442
  this.ForamtMultiPointTitle=function(dataIndex, dataInfo)
61215
61443
  {
61216
- 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;
61217
61451
 
61218
61452
  var aryText=[];
61219
- for(var i=0;i<dataInfo.PointGroup.length;++i)
61453
+ for(var i=0;i<group.Data.length;++i)
61220
61454
  {
61221
- var groupItem=dataInfo.PointGroup[i];
61222
- for(var j=0;j<groupItem.Point.length;++j)
61223
- {
61224
- var item=groupItem.Point[j];
61225
- if (item.Index==dataIndex)
61226
- {
61227
- var item={ Text:item.Value.toFixed(2)};
61228
- if (aryText.length==0) item.Name=dataInfo.Name;
61229
- item.Color=groupItem.BGColor;
61230
- aryText.push(item);
61231
- break;
61232
- }
61233
- }
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});
61234
61467
  }
61235
61468
 
61236
61469
  if (!IFrameSplitOperator.IsNonEmptyArray(aryText)) return null;
@@ -62001,6 +62234,11 @@ function DynamicChartTitlePainting()
62001
62234
  aryText=this.FromatStackedBarTitle(value, item);
62002
62235
  if (!aryText) continue;
62003
62236
  }
62237
+ else if (item.DataType=="ChartMultiPoint")
62238
+ {
62239
+ aryText=this.ForamtMultiPointTitle(dataIndex, item);
62240
+ if (!aryText) continue;
62241
+ }
62004
62242
  else
62005
62243
  {
62006
62244
  valueText=this.FormatValue(value,item);
@@ -75005,6 +75243,20 @@ function JSChartResource()
75005
75243
  Offset:{ X:-5, Y:5 }
75006
75244
  }
75007
75245
 
75246
+ this.ChartSimpleRadar=
75247
+ {
75248
+ TextFont:{ Family:'微软雅黑' , Size:12 },
75249
+ BorderColor:"rgb(169,169,169)",
75250
+ Offset:{ X:-5, Y:5 },
75251
+ TextColor:"rgb(105,105,105)",
75252
+ AryBGColor:['rgba(255,255,255,0.9)', 'rgba(230, 234, 242,0.9)'],
75253
+ AryArea:
75254
+ [
75255
+ { Color:"rgba(242,154,118,0.4)", LineColor:"rgb(242,154,118)"},
75256
+ { Color:"rgba(121,197,228,0.4)", LineColor:"rgb(92,165,196)"},
75257
+ ],
75258
+ }
75259
+
75008
75260
  //手机端tooltip
75009
75261
  this.TooltipPaint = {
75010
75262
  BGColor:'rgba(250,250,250,0.8)', //背景色
@@ -76236,6 +76488,7 @@ function JSChartResource()
76236
76488
 
76237
76489
  if (style.ChartSimpleTable) this.SetChartSimpleTable(style.ChartSimpleTable);
76238
76490
  if (style.ChartSimplePie) this.SetChartSimplePie(style.ChartSimplePie);
76491
+ if (style.ChartSimpleRadar) this.SetChartSimpleRadar(style.ChartSimpleRadar);
76239
76492
 
76240
76493
  if (style.DRAWICON)
76241
76494
  {
@@ -77329,6 +77582,30 @@ function JSChartResource()
77329
77582
  }
77330
77583
  }
77331
77584
 
77585
+ this.SetChartSimpleRadar=function(style)
77586
+ {
77587
+ var dest=this.ChartSimpleRadar;
77588
+ if (style.TextFont)
77589
+ {
77590
+ var item=style.TextFont;
77591
+ if (item.Name) dest.TextFont.Name=item.Name;
77592
+ if (IFrameSplitOperator.IsNumber(item.Size)) dest.TextFont.Size=item.Size;
77593
+ }
77594
+
77595
+ if (style.BorderColor) dest.BorderColor=style.BorderColor;
77596
+ if (style.TextColor) dest.TextColor=style.TextColor;
77597
+
77598
+ if (style.Offset)
77599
+ {
77600
+ var item=style.Offset;
77601
+ if (IFrameSplitOperator.IsNumber(item.X)) dest.Offset.X=item.X;
77602
+ if (IFrameSplitOperator.IsNumber(item.Y)) dest.Offset.Y=item.Y;
77603
+ }
77604
+
77605
+ if (IFrameSplitOperator.IsNonEmptyArray(style.AryBGColor)) dest.AryBGColor=style.AryBGColor.slice();
77606
+ if (IFrameSplitOperator.IsNonEmptyArray(style.AryArea)) dest.AryArea=style.AryArea.slice();
77607
+ }
77608
+
77332
77609
  }
77333
77610
 
77334
77611
  var g_JSChartResource=new JSChartResource();
@@ -83942,18 +84219,18 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
83942
84219
  {
83943
84220
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
83944
84221
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
83945
- 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);
83946
84223
 
83947
84224
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
83948
84225
  if (event)
83949
84226
  {
83950
- 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, };
83951
84228
  event.Callback(event,data,this);
83952
84229
  }
83953
84230
  }
83954
84231
 
83955
84232
  //右键菜单数据
83956
- this.GetRightMenuData=function(frameID)
84233
+ this.GetRightMenuData=function(frameID, option)
83957
84234
  {
83958
84235
  var windowCount=this.Frame.SubFrame.length; //窗口个数
83959
84236
  var klineChart=this.ChartPaint[0];
@@ -83996,6 +84273,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
83996
84273
  var bPopMinuteChart=false;
83997
84274
  if (this.PopMinuteChart) bPopMinuteChart=true;
83998
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
+
83999
84287
  var aryMenu=
84000
84288
  [
84001
84289
  {
@@ -84278,6 +84566,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
84278
84566
  }
84279
84567
  }
84280
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
+ }
84281
84580
  }
84282
84581
 
84283
84582
  return aryMenu;
@@ -85881,19 +86180,36 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
85881
86180
  if (option && option.Draw) this.Draw();
85882
86181
  }
85883
86182
 
86183
+ //option={ KItem:{ Date:, Time:}}
85884
86184
  this.LockCorssCursor=function(option)
85885
86185
  {
85886
- if (this.CursorIndex<0) return false;
85887
- var kData=this.GetKData();
85888
- 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;
85889
86190
 
85890
- var dataIndex=kData.DataOffset+parseInt(this.CursorIndex.toFixed(0));
85891
- var kItem=kData.Data[dataIndex];
85892
- 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;
85893
86194
 
85894
- var xItem=this.GlobalOption.LockCorssCursor.X;
85895
- xItem.KLine={ DataIndex:dataIndex, Date:kItem.Date, Time:kItem.Time };
85896
- 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
+ }
85897
86213
 
85898
86214
  if (option && option.Draw) this.Draw();
85899
86215
  return true;
@@ -85916,7 +86232,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
85916
86232
  if (!kData || !IFrameSplitOperator.IsNonEmptyArray(kData.Data)) return position;
85917
86233
 
85918
86234
  position.CursorIndex=xItem.KLine.DataIndex-kData.DataOffset;
85919
- position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex);
86235
+ position.LastPoint.X=this.Frame.GetXFromIndex(position.CursorIndex, false);
85920
86236
 
85921
86237
  var border=this.Frame.ChartBorder.GetBorder();
85922
86238
  if (position.LastPoint.Y<border.Top || position.LastPoint.Y>border.Bottom) //超出图形框子, 调整为收盘价
@@ -87989,18 +88305,18 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
87989
88305
  {
87990
88306
  var pixelTatio = GetDevicePixelRatio(); //x,y 需要乘以放大倍速
87991
88307
  var frameId=this.Frame.PtInFrame(x*pixelTatio,y*pixelTatio);
87992
- 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);
87993
88309
 
87994
88310
  var event=this.GetEventCallback(JSCHART_EVENT_ID.ON_CONTEXT_MENU);
87995
88311
  if (event)
87996
88312
  {
87997
- 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} };
87998
88314
  event.Callback(event,data,this);
87999
88315
  }
88000
88316
  }
88001
88317
 
88002
88318
  //右键菜单数据
88003
- this.GetRightMenuData=function(frameID)
88319
+ this.GetRightMenuData=function(frameID, option)
88004
88320
  {
88005
88321
  var windowCount=this.Frame.SubFrame.length; //窗口个数
88006
88322
 
@@ -88127,11 +88443,11 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88127
88443
  }
88128
88444
 
88129
88445
 
88130
- //删除菜单
88446
+
88131
88447
  for(var i=0;i<aryMenu.length;++i)
88132
88448
  {
88133
88449
  var item=aryMenu[i];
88134
- if (item.Name=="叠加品种")
88450
+ if (item.Name=="叠加品种") //删除菜单
88135
88451
  {
88136
88452
  for(var j=0;j<item.SubMenu.length;++j)
88137
88453
  {
@@ -88143,6 +88459,10 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
88143
88459
  }
88144
88460
  }
88145
88461
  }
88462
+ else if (item.Name=="其他设置")
88463
+ {
88464
+
88465
+ }
88146
88466
  }
88147
88467
 
88148
88468
  return aryMenu;
@@ -112535,6 +112855,48 @@ function JSDraw(errorHandler,symbolData)
112535
112855
 
112536
112856
  return result={ DrawData:{ Data:aryCell, Radius:radius }, DrawType:"DRAW_SIMPLE_PIE" };
112537
112857
  }
112858
+
112859
+ this.RADAR_CELL=function(name, data, max, min)
112860
+ {
112861
+ var cellItem={ Name:name, Max:100, Min:0, Value:null };
112862
+ if (IFrameSplitOperator.IsNumber(data))
112863
+ {
112864
+ cellItem.Value=data;
112865
+ }
112866
+ else if (IFrameSplitOperator.IsString(data))
112867
+ {
112868
+ cellItem.Value=parseFloat(data);
112869
+ }
112870
+ else if (IFrameSplitOperator.IsNonEmptyArray(data))
112871
+ {
112872
+ var lastValue=data[data.length-1];
112873
+ if (IFrameSplitOperator.IsNumber(lastValue)) cellItem.Value=lastValue;
112874
+ else if (IFrameSplitOperator.IsString(lastValue)) cellItem.Value=parseFloat(lastValue);
112875
+ }
112876
+
112877
+ if (IFrameSplitOperator.IsNumber(max)) cellItem.Max=max;
112878
+ if (IFrameSplitOperator.IsNumber(min)) cellItem.Min=min;
112879
+
112880
+ return cellItem;
112881
+ }
112882
+
112883
+ this.DRAWRADAR=function(args)
112884
+ {
112885
+ var radius=args[0];
112886
+ var color=args[1];
112887
+
112888
+ var aryIndex=[];
112889
+ var aryData=[];
112890
+ for(var i=2;i<args.length;++i)
112891
+ {
112892
+ var item=args[i];
112893
+
112894
+ aryIndex.push({ Name:item.Name, Max:item.Max, Min:item.Min });
112895
+ aryData.push({ Value:item.Value, Name:item.Name, Group:"Default"});
112896
+ }
112897
+
112898
+ return result={ DrawData:{ Data:aryData, AryIndex:aryIndex, Radius:radius, AryArea:[{ LineColor:color }] }, DrawType:"DRAW_SIMPLE_RADAR" };
112899
+ }
112538
112900
  }
112539
112901
 
112540
112902
 
@@ -112589,7 +112951,7 @@ JSDraw.prototype.IsDrawFunction=function(name)
112589
112951
  'DRAWOVERLAYLINE',"FILLRGN", "FILLRGN2","FILLTOPRGN", "FILLBOTTOMRGN", "FILLVERTICALRGN","FLOATRGN","DRAWSL", "DRAWGBK2","DRAWGBK_DIV",
112590
112952
  "VERTLINE","HORLINE","TIPICON",
112591
112953
  "BUY","SELL","SELLSHORT","BUYSHORT",
112592
- "DRAWLASTBARICON","DRAWLASTBARNUMBER", "DRAWLASTBARTEXT","DRAWTABLE","DRAWPIE",
112954
+ "DRAWLASTBARICON","DRAWLASTBARNUMBER", "DRAWLASTBARTEXT","DRAWTABLE","DRAWPIE","DRAWRADAR",
112593
112955
  ]);
112594
112956
  if (setFunctionName.has(name)) return true;
112595
112957
 
@@ -119478,6 +119840,14 @@ function JSExecute(ast,option)
119478
119840
  node.Draw=this.Draw.DRAWPIE(args);
119479
119841
  node.Out=[];
119480
119842
  break;
119843
+ //雷达图
119844
+ case "RADAR_CELL":
119845
+ node.Out=this.Draw.RADAR_CELL(args[0],args[1],args[2],args[3]);
119846
+ break;
119847
+ case "DRAWRADAR":
119848
+ node.Draw=this.Draw.DRAWRADAR(args);
119849
+ node.Out=[];
119850
+ break;
119481
119851
 
119482
119852
  default:
119483
119853
  node.Out=this.Algorithm.CallFunction(funcName, args, node, this.SymbolData);
@@ -122494,6 +122864,35 @@ function ScriptIndex(name,script,args,option)
122494
122864
  hqChart.ChartPaint.push(chart);
122495
122865
  }
122496
122866
 
122867
+ this.CreateSimpleRadar=function(hqChart,windowIndex,varItem,id)
122868
+ {
122869
+ var chart=new ChartSimpleRadar();
122870
+ chart.Canvas=hqChart.Canvas;
122871
+ chart.Name=varItem.Name;
122872
+ chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
122873
+ chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
122874
+
122875
+ if (varItem.Draw && varItem.Draw.DrawData)
122876
+ {
122877
+ var drawData=varItem.Draw.DrawData;
122878
+ if (drawData.Data) chart.Data.Data=drawData.Data;
122879
+ if (drawData.AryIndex) chart.AryIndex=drawData.AryIndex;
122880
+ if (IFrameSplitOperator.IsPlusNumber(drawData.Radius)) chart.Radius=drawData.Radius;
122881
+ if (drawData.BorderColor) chart.BorderColor=drawData.BorderColor;
122882
+
122883
+ if (drawData.TextFont) chart.TextFontConfig=drawData.TextFont;
122884
+ if (drawData.TextColor) chart.TextColor=drawData.TextColor;
122885
+ if (drawData.BorderColor) chart.BorderColor=drawData.BorderColor;
122886
+ if (IFrameSplitOperator.IsNumber(drawData.XOffset)) chart.Offset.X=drawData.XOffset;
122887
+ if (IFrameSplitOperator.IsNumber(drawData.YOffset)) chart.Offset.Y=drawData.YOffset;
122888
+ if (IFrameSplitOperator.IsNonEmptyArray(drawData.AryArea)) chart.AryAreaConfig=drawData.AryArea;
122889
+
122890
+ chart.BuildCacheData();
122891
+ }
122892
+
122893
+ hqChart.ChartPaint.push(chart);
122894
+ }
122895
+
122497
122896
  this.CreateTradeIcon=function(hqChart,windowIndex,varItem,id)
122498
122897
  {
122499
122898
  var chart=new ChartTradeIcon();
@@ -122868,16 +123267,18 @@ function ScriptIndex(name,script,args,option)
122868
123267
  chart.ChartBorder=hqChart.Frame.SubFrame[windowIndex].Frame.ChartBorder;
122869
123268
  chart.ChartFrame=hqChart.Frame.SubFrame[windowIndex].Frame;
122870
123269
 
122871
- chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
123270
+ chart.Data=hqChart.ChartPaint[0].Data; //绑定K线
122872
123271
  chart.PointGroup=varItem.Draw.DrawData;
122873
123272
  if (varItem.Draw.Name) chart.Name=varItem.Draw.Name;
123273
+ chart.BuildCacheData();
123274
+
122874
123275
  this.SetChartIndexName(chart);
122875
123276
  hqChart.ChartPaint.push(chart);
122876
123277
 
122877
- var titleIndex=windowIndex+1;
123278
+ var titleIndex=windowIndex+1;
122878
123279
  var titleData=new DynamicTitleData(chart.Data,chart.Name, null);
122879
123280
  titleData.DataType="ChartMultiPoint";
122880
- titleData.PointGroup=chart.PointGroup;
123281
+ titleData.GetItemCallback=(kItem)=>{ return chart.GetItem(kItem); }
122881
123282
  hqChart.TitlePaint[titleIndex].Data[i]=titleData;
122882
123283
  }
122883
123284
 
@@ -123369,6 +123770,10 @@ function ScriptIndex(name,script,args,option)
123369
123770
  break;
123370
123771
  case "DRAW_SIMPLE_PIE":
123371
123772
  this.CreateSimplePie(hqChart,windowIndex,item,i);
123773
+ break;
123774
+ case "DRAW_SIMPLE_RADAR":
123775
+ this.CreateSimpleRadar(hqChart,windowIndex,item,i);
123776
+ break;
123372
123777
  case "BUY":
123373
123778
  case "SELL":
123374
123779
  case "SELLSHORT":
@@ -123721,7 +124126,10 @@ function OverlayScriptIndex(name,script,args,option)
123721
124126
  break;
123722
124127
  case "DRAW_SIMPLE_PIE":
123723
124128
  this.CreateSimplePie(hqChart,windowIndex,item,i);
123724
-
124129
+ break;
124130
+ case "DRAW_SIMPLE_RADAR":
124131
+ this.CreateSimpleRadar(hqChart,windowIndex,item,i);
124132
+ break;
123725
124133
  case "KLINE_BG":
123726
124134
  this.CreateBackgroud(hqChart,windowIndex,item,i);
123727
124135
  break;
@@ -124585,7 +124993,7 @@ function OverlayScriptIndex(name,script,args,option)
124585
124993
  frame.ChartPaint.push(chart);
124586
124994
  }
124587
124995
 
124588
- this.CreateMultiPoint=function(hqChart,windowIndex,varItem,i)
124996
+ this.CreateMultiPoint=function(hqChart,windowIndex,varItem,id)
124589
124997
  {
124590
124998
  var overlayIndex=this.OverlayIndex;
124591
124999
  var frame=overlayIndex.Frame;
@@ -124598,6 +125006,17 @@ function OverlayScriptIndex(name,script,args,option)
124598
125006
 
124599
125007
  chart.Data=hqChart.ChartPaint[0].Data;//绑定K线
124600
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
+
124601
125020
  frame.ChartPaint.push(chart);
124602
125021
  }
124603
125022
 
@@ -124789,6 +125208,39 @@ function OverlayScriptIndex(name,script,args,option)
124789
125208
  frame.ChartPaint.push(chart);
124790
125209
  }
124791
125210
 
125211
+ this.CreateSimpleRadar=function(hqChart,windowIndex,varItem,id)
125212
+ {
125213
+ var overlayIndex=this.OverlayIndex;
125214
+ var frame=overlayIndex.Frame;
125215
+ var chart=new ChartSimpleRadar();
125216
+ chart.Canvas=hqChart.Canvas;
125217
+ chart.Name=varItem.Name;
125218
+ chart.ChartBorder=frame.Frame.ChartBorder;
125219
+ chart.ChartFrame=frame.Frame;
125220
+ chart.Identify=overlayIndex.Identify;
125221
+ chart.HQChart=hqChart;
125222
+
125223
+ if (varItem.Draw && varItem.Draw.DrawData)
125224
+ {
125225
+ var drawData=varItem.Draw.DrawData;
125226
+ if (drawData.Data) chart.Data.Data=drawData.Data;
125227
+ if (drawData.AryIndex) chart.AryIndex=drawData.AryIndex;
125228
+ if (IFrameSplitOperator.IsPlusNumber(drawData.Radius)) chart.Radius=drawData.Radius;
125229
+ if (drawData.BorderColor) chart.BorderColor=drawData.BorderColor;
125230
+
125231
+ if (drawData.TextFont) chart.TextFontConfig=drawData.TextFont;
125232
+ if (drawData.TextColor) chart.TextColor=drawData.TextColor;
125233
+ if (drawData.BorderColor) chart.BorderColor=drawData.BorderColor;
125234
+ if (IFrameSplitOperator.IsNumber(drawData.XOffset)) chart.Offset.X=drawData.XOffset;
125235
+ if (IFrameSplitOperator.IsNumber(drawData.YOffset)) chart.Offset.Y=drawData.YOffset;
125236
+ if (IFrameSplitOperator.IsNonEmptyArray(drawData.AryArea)) chart.AryAreaConfig=drawData.AryArea;
125237
+
125238
+ chart.BuildCacheData();
125239
+ }
125240
+
125241
+ frame.ChartPaint.push(chart);
125242
+ }
125243
+
124792
125244
  this.CreateChartVericaltLine=function(hqChart,windowIndex,varItem,id)
124793
125245
  {
124794
125246
  var overlayIndex=this.OverlayIndex;
@@ -125761,14 +126213,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
125761
126213
  drawItem.Text=draw.Text;
125762
126214
  drawItem.Name=draw.Name;
125763
126215
  drawItem.DrawType=draw.DrawType;
125764
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
125765
- if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
125766
- {
125767
- for(var k=0; k<drawItem.DrawData.length; ++k)
125768
- {
125769
- this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
125770
- }
125771
- }
126216
+ drawItem.DrawData=draw.DrawData;
125772
126217
 
125773
126218
  outVarItem.Draw=drawItem;
125774
126219
  result.push(outVarItem);
@@ -126002,6 +126447,17 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126002
126447
  outVarItem.Draw=drawItem;
126003
126448
  result.push(outVarItem);
126004
126449
  }
126450
+ else if (draw.DrawType=="DRAW_SIMPLE_RADAR")
126451
+ {
126452
+ drawItem.Name=draw.Name;
126453
+ drawItem.Type=draw.Type;
126454
+
126455
+ drawItem.DrawType=draw.DrawType;
126456
+ drawItem.DrawData=draw.DrawData; //{ AryIndex:[ ], Data:[] };
126457
+
126458
+ outVarItem.Draw=drawItem;
126459
+ result.push(outVarItem);
126460
+ }
126005
126461
  else
126006
126462
  {
126007
126463
  var find=g_ScriptIndexChartFactory.Get(draw.DrawType); //外部挂接
@@ -126304,14 +126760,7 @@ function APIScriptIndex(name,script,args,option, isOverlay)
126304
126760
  drawItem.Text=draw.Text;
126305
126761
  drawItem.Name=draw.Name;
126306
126762
  drawItem.DrawType=draw.DrawType;
126307
- drawItem.DrawData=this.FittingMultiLine(draw.DrawData,date,time,hqChart);
126308
- if (IFrameSplitOperator.IsNonEmptyArray(drawItem.DrawData))
126309
- {
126310
- for(var k=0; k<drawItem.DrawData.length; ++k)
126311
- {
126312
- this.GetKLineData(drawItem.DrawData[k].Point, hqChart);
126313
- }
126314
- }
126763
+ drawItem.DrawData=draw.DrawData;
126315
126764
 
126316
126765
  outVarItem.Draw=drawItem;
126317
126766
  result.push(outVarItem);
@@ -127618,6 +128067,20 @@ function GetBlackStyle()
127618
128067
  BorderColor:"rgb(220,220,220)",
127619
128068
  },
127620
128069
 
128070
+ ChartSimpleRadar:
128071
+ {
128072
+ //TextFont:{ Family:'微软雅黑' , Size:12 },
128073
+ BorderColor:"rgb(230, 230, 230)",
128074
+ //Offset:{ X:-5, Y:5 },
128075
+ TextColor:"rgb(250, 250, 250)",
128076
+ AryBGColor:['rgba(63,61,82,0.9)','rgba(56,55,80,0.9)'],
128077
+ AryArea:
128078
+ [
128079
+ { Color:"rgba(242,154,118,0.4)", LineColor:"rgb(242,154,118)"},
128080
+ { Color:"rgba(121,197,228,0.4)", LineColor:"rgb(92,165,196)"},
128081
+ ],
128082
+ },
128083
+
127621
128084
  ChartDrawVolProfile:
127622
128085
  {
127623
128086
  BGColor:"rgba(244,250,254,0.3)",
@@ -151757,7 +152220,7 @@ function HQChartScriptWorker()
151757
152220
 
151758
152221
 
151759
152222
 
151760
- var HQCHART_VERSION="1.1.14319";
152223
+ var HQCHART_VERSION="1.1.14335";
151761
152224
 
151762
152225
  function PrintHQChartVersion()
151763
152226
  {