hqchart 1.1.14734 → 1.1.14742

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.
@@ -2984,6 +2984,18 @@ var JSCHART_MENU_ID=
2984
2984
  CMD_REPORT_CHANGE_COLUMN_ID:105, //报价列表 切换列 Arg[Column, ]
2985
2985
  }
2986
2986
 
2987
+ var JSCHART_TRADE_STATUS_ID=
2988
+ {
2989
+ START_ID:1000, //8:45~9:15
2990
+ BEFORE_OPEN_ID:2000, //9:15~9:25 是开盘集合竞价阶段
2991
+ TRADE_ID:3000, //9:25~14:57 是连续竞价阶段
2992
+ AFTER_CLOSE_ID:4000, //14:57~15:00 是收盘集合竞价阶段
2993
+ CLOSE_ID:5000, //15:00 后,首先发 CLOSE 标志
2994
+ ENDTR_ID:6000, //交易结束
2995
+ //上面状态个位数 是停牌状态 如3001 连续交易时间段停牌
2996
+ SUSP_ID:1, //停牌
2997
+ }
2998
+
2987
2999
 
2988
3000
  function PhoneDBClick()
2989
3001
  {
@@ -3200,6 +3212,8 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3200
3212
 
3201
3213
  //图形中的单元选中状态
3202
3214
  MapIndexChartCache:new Map(), //key 指标GUID
3215
+
3216
+ TradeStatus:null, //当前交易状态 { Date, Time:数据最后更新的时间, Status: }
3203
3217
  };
3204
3218
 
3205
3219
  this.VerticalDrag; //通过X轴左右拖动数据(手势才有)
@@ -11723,6 +11737,26 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
11723
11737
  {
11724
11738
  return false;
11725
11739
  }
11740
+
11741
+ //更新交易状态
11742
+ this.UpdateTradeStatusData=function(data, option)
11743
+ {
11744
+ if (option)
11745
+ {
11746
+ //是否清空
11747
+ if (option.IsClear===true) this.GlobalOption.TradeStatus=null;
11748
+ }
11749
+
11750
+ if (!data) return false;
11751
+
11752
+ if (IFrameSplitOperator.IsNumber(data.Date) && IFrameSplitOperator.IsNumber(data.Time) && IFrameSplitOperator.IsNumber(data.Status))
11753
+ {
11754
+ this.GlobalOption.TradeStatus={ Date:data.Date, Time:data.Time, Status:data.Status };
11755
+ return true;
11756
+ }
11757
+
11758
+ return false;
11759
+ }
11726
11760
  }
11727
11761
 
11728
11762
  function GetDevicePixelRatio()
@@ -12258,6 +12292,40 @@ function ChartBorder()
12258
12292
  {
12259
12293
  return this.TitleHeight;
12260
12294
  }
12295
+
12296
+ //是否显示单日集合竞价 盘前
12297
+ this.IsShowBeforeOpen=function()
12298
+ {
12299
+ if (this.LeftExtendWidth<10) return false;
12300
+
12301
+ return true;
12302
+ }
12303
+
12304
+ //是否显示单日集合竞价 盘后
12305
+ this.IsShowAfterClose=function()
12306
+ {
12307
+ if (this.RightExtendWidth<10) return false;
12308
+
12309
+ return true;
12310
+ }
12311
+
12312
+ //是否显示多日集合竞价 盘前
12313
+ this.IsShowMultiDayBeforeOpen=function()
12314
+ {
12315
+ if (!this.MultiDayMinute) return false;
12316
+ if (this.MultiDayMinute.Count<=1 || this.MultiDayMinute.Left<=0) return false;
12317
+
12318
+ return true;
12319
+ }
12320
+
12321
+ //是否显示多日集合竞价 盘后
12322
+ this.IsShowMultiDayAfterClose=function()
12323
+ {
12324
+ if (!this.MultiDayMinute) return false;
12325
+ if (this.MultiDayMinute.Count<=1 || this.MultiDayMinute.Right<=0) return false;
12326
+
12327
+ return true;
12328
+ }
12261
12329
  }
12262
12330
 
12263
12331
  //框架外部挂接
@@ -54236,7 +54304,7 @@ function FrameSplitY()
54236
54304
 
54237
54305
  this.RightFrameSplitY();
54238
54306
  this.MainOverlayFrameSplitY(); //主图Y轴绑定叠加Y轴坐标
54239
- this.CallAcutionSplitY(this.SplitCount,splitData);
54307
+ this.CallAcutionSplitYV2(splitData, this.Frame.HorizontalInfo.slice());
54240
54308
 
54241
54309
  if (this.EnableRemoveZero) this.RemoveZero(this.Frame.HorizontalInfo);
54242
54310
 
@@ -54317,6 +54385,173 @@ function FrameSplitY()
54317
54385
  }
54318
54386
  }
54319
54387
 
54388
+ this.CallAcutionSplitYV2=function(splitData, aryHorizontalInfo)
54389
+ {
54390
+ if (!this.IsCallAuctionFrame()) return;
54391
+ if (!IFrameSplitOperator.IsNonEmptyArray(aryHorizontalInfo)) return;
54392
+
54393
+ var aryCallAcution=this.GetCallAcutionSplitYV2(splitData,aryHorizontalInfo);
54394
+ if (!aryCallAcution) return;
54395
+
54396
+ for(var i=0; i<this.Frame.HorizontalInfo.length; ++i) //把显示的数据迁移到 Message[2] Message[3]
54397
+ {
54398
+ var item=this.Frame.HorizontalInfo[i];
54399
+ if (aryCallAcution.IsBeforeData)
54400
+ {
54401
+ item.Message[2]=item.Message[0];
54402
+ item.Message[0]=null;
54403
+ }
54404
+
54405
+ if (aryCallAcution.IsAfterData && (this.ShareAfterVol==0 || this.ShareAfterVol==2) )
54406
+ {
54407
+ item.Message[3]=item.Message[1];
54408
+ item.Message[1]=null;
54409
+ }
54410
+ }
54411
+
54412
+ //集合竞价的坐标插入最后
54413
+ for(var i=0; i<aryCallAcution.HorizontalInfo.length; ++i)
54414
+ {
54415
+ var item=aryCallAcution.HorizontalInfo[i];
54416
+ this.Frame.HorizontalInfo.push(item);
54417
+ }
54418
+ }
54419
+
54420
+ this.GetCallAcutionSplitYV2=function(splitData, arySource)
54421
+ {
54422
+ if (!this.IsCallAuctionFrame()) return null;
54423
+
54424
+ var bBeforeData=(this.IsBeforeData==true && this.BeforeOpenData && (this.BeforeOpenData.Ver==2.0 || this.BeforeOpenData.Ver==3.0));
54425
+ var bAfterData=(this.IsAfterData==true && this.AfterCloseData && (this.AfterCloseData.Ver==2.0 || this.AfterCloseData.Ver==3.0));
54426
+
54427
+ var bottom=this.Frame.ChartBorder.GetBottomEx();
54428
+ var height=this.Frame.ChartBorder.GetHeightEx();
54429
+ var bHScreen=this.Frame.IsHScreen;
54430
+ if (this.Frame.IsHScreen)
54431
+ {
54432
+ var border=this.Frame.GetBorder();
54433
+ var width=border.RightEx-border.LeftEx;
54434
+ }
54435
+
54436
+ if (bBeforeData || bAfterData)
54437
+ {
54438
+ var aryHorizontalInfo=[];
54439
+ for(var i=0;i<arySource.length;++i)
54440
+ {
54441
+ var hItem=arySource[i];
54442
+ if (!hItem || !IFrameSplitOperator.IsNumber(hItem.Value)) continue;
54443
+ var y=this.Frame.GetYFromData(hItem.Value);
54444
+
54445
+ var item=new CoordinateInfo();
54446
+ item.Value=hItem.Value;
54447
+ item.LineType=8;
54448
+ if (bBeforeData)
54449
+ {
54450
+ if (bHScreen)
54451
+ {
54452
+ var value=(y-border.LeftEx)/width*(this.BeforeOpenData.VolMax-this.BeforeOpenData.VolMin)+this.BeforeOpenData.VolMin;
54453
+ }
54454
+ else
54455
+ {
54456
+ var value=(bottom-y)/height*(this.BeforeOpenData.VolMax-this.BeforeOpenData.VolMin)+this.BeforeOpenData.VolMin;
54457
+ }
54458
+
54459
+ item.Message[0]=this.FormatValueString(value);
54460
+ }
54461
+
54462
+ if (bAfterData && (this.ShareAfterVol==0 || this.ShareAfterVol==2) )
54463
+ {
54464
+ if (bHScreen)
54465
+ {
54466
+ var value=(y-border.LeftEx)/width*(this.AfterCloseData.VolMax-this.AfterCloseData.VolMin)+this.AfterCloseData.VolMin;
54467
+ }
54468
+ else
54469
+ {
54470
+ var value=(bottom-y)/height*(this.AfterCloseData.VolMax-this.AfterCloseData.VolMin)+this.AfterCloseData.VolMin;
54471
+ }
54472
+
54473
+ item.Message[1]=this.FormatValueString(value);
54474
+ }
54475
+
54476
+ aryHorizontalInfo.push(item);
54477
+ }
54478
+
54479
+ return { HorizontalInfo:aryHorizontalInfo, IsBeforeData:bBeforeData, IsAfterData:bAfterData };
54480
+ }
54481
+
54482
+ var bMultiDayBeforeData=false, bMultiDayAfterData=false;
54483
+ var beforeDayData=null, afterDayData=null;
54484
+ if (this.MultiDayBeforeOpenData && IFrameSplitOperator.IsNonEmptyArray(this.MultiDayBeforeOpenData))
54485
+ {
54486
+ bMultiDayBeforeData=true;
54487
+ var firstDayData=this.MultiDayBeforeOpenData[0];
54488
+ if (firstDayData.Ver==2.0 || firstDayData.Ver==3.0)
54489
+ beforeDayData=firstDayData;
54490
+ }
54491
+
54492
+ if (this.MultiDayAfterCloseData && IFrameSplitOperator.IsNonEmptyArray(this.MultiDayAfterCloseData))
54493
+ {
54494
+ bMultiDayAfterData=true;
54495
+ var firstDayData=this.MultiDayAfterCloseData[0];
54496
+ if (firstDayData.Ver==2.0 || firstDayData.Ver==3.0)
54497
+ afterDayData=firstDayData;
54498
+ }
54499
+
54500
+ if (bMultiDayBeforeData || bMultiDayAfterData)
54501
+ {
54502
+ var aryHorizontalInfo=[];
54503
+ for(var i=0;i<arySource.length;++i)
54504
+ {
54505
+ var hItem=arySource[i];
54506
+ if (!hItem || !IFrameSplitOperator.IsNumber(hItem.Value)) continue;
54507
+ var y=this.Frame.GetYFromData(hItem.Value);
54508
+
54509
+ var item=new CoordinateInfo();
54510
+ item.Value=hItem.Value;
54511
+ item.LineType=9;
54512
+
54513
+ var isVaild=false;
54514
+ if (beforeDayData)
54515
+ {
54516
+ if (bHScreen)
54517
+ {
54518
+ var value=(y-border.LeftEx)/width*(beforeDayData.VolMax-beforeDayData.VolMin)+beforeDayData.VolMin;
54519
+ }
54520
+ else
54521
+ {
54522
+ var value=(bottom-y)/height*(beforeDayData.VolMax-beforeDayData.VolMin)+beforeDayData.VolMin;
54523
+ }
54524
+
54525
+ item.Message[0]=this.FormatValueString(value);
54526
+ isVaild=true;
54527
+ }
54528
+
54529
+ if (afterDayData && (this.ShareAfterVol==0 || this.ShareAfterVol==2))
54530
+ {
54531
+ if (bHScreen)
54532
+ {
54533
+ var value=(y-border.LeftEx)/width*(afterDayData.VolMax-afterDayData.VolMin)+afterDayData.VolMin;
54534
+ }
54535
+ else
54536
+ {
54537
+ var value=(bottom-y)/height*(afterDayData.VolMax-afterDayData.VolMin)+afterDayData.VolMin;
54538
+ }
54539
+
54540
+ item.Message[1]=this.FormatValueString(value);
54541
+ isVaild=true;
54542
+ }
54543
+
54544
+ if (isVaild) aryHorizontalInfo.push(item);
54545
+ }
54546
+
54547
+ if (IFrameSplitOperator.IsNonEmptyArray(aryHorizontalInfo))
54548
+ return { HorizontalInfo:aryHorizontalInfo, IsBeforeData:bMultiDayBeforeData, IsAfterData:bMultiDayAfterData };
54549
+ }
54550
+
54551
+ return null;
54552
+ }
54553
+
54554
+ /* 废弃 使用 CallAcutionSplitYV2
54320
54555
  this.CallAcutionSplitY=function(count,splitData)
54321
54556
  {
54322
54557
  if (!this.IsCallAuctionFrame()) return;
@@ -54347,6 +54582,7 @@ function FrameSplitY()
54347
54582
  this.Frame.HorizontalInfo.push(item);
54348
54583
  }
54349
54584
  }
54585
+ */
54350
54586
 
54351
54587
  this.IsCallAuctionFrame=function()
54352
54588
  {
@@ -54357,6 +54593,7 @@ function FrameSplitY()
54357
54593
  return this.HQChart.IsCallAuctionFrame(this.Frame.Identify);
54358
54594
  }
54359
54595
 
54596
+ /* 废弃 使用 GetCallAcutionSplitYV2
54360
54597
  this.GetCallAcutionSplitY=function(count,splitData)
54361
54598
  {
54362
54599
  if (!this.IsCallAuctionFrame()) return null;
@@ -54451,6 +54688,7 @@ function FrameSplitY()
54451
54688
 
54452
54689
  return null;
54453
54690
  }
54691
+ */
54454
54692
 
54455
54693
  this.RightFrameSplitY=function()
54456
54694
  {
@@ -60110,7 +60348,17 @@ function DynamicMinuteTitlePainting()
60110
60348
  {
60111
60349
  this.OnDrawEventCallback(null);
60112
60350
 
60113
- if (this.IsAlwaysShowLastData)
60351
+ var bShowLastData=this.IsAlwaysShowLastData
60352
+ if (this.DrawStatus && this.DrawStatus.IsTitleShowLatestData)
60353
+ {
60354
+ var status=this.DrawStatus;
60355
+ if (!IFrameSplitOperator.IsNumber(status.FrameID) || status.FrameID<0)
60356
+ bShowLastData=true;
60357
+ else if (status.CorssCursorTouchEnd && status.IsOnTouch==false)
60358
+ bShowLastData=true;
60359
+ }
60360
+
60361
+ if (bShowLastData)
60114
60362
  {
60115
60363
  this.Canvas.save();
60116
60364
  this.DrawLastDataItem();
@@ -91175,6 +91423,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
91175
91423
  this.UpdateCallCationData(beforeOpenData,afterCloseData);
91176
91424
  this.UpdateLineColorData(aryColorData,data.stock[0].date);
91177
91425
  this.UpdateLatestMinuteData(aryMinuteData, data.stock[0].date, data.stock[0]);
91426
+ this.UpdateTradeStatusData(data.TradeStatus);
91178
91427
  this.UpdateHistoryMinuteUI(updateTime);
91179
91428
  this.RecvMinuteDataEvent({FunctionName:"RecvMinuteData"} );
91180
91429
  this.RequestOverlayMinuteData(); //请求叠加数据 (主数据下载完再下载)
@@ -91201,6 +91450,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
91201
91450
 
91202
91451
  this.ColorLineData=aryColorData;
91203
91452
 
91453
+ this.UpdateTradeStatusData(data.TradeStatus);
91204
91454
  this.UpdateMinuteUI(data.stock[0], {FunctionName:"RecvMinuteData", Day:{ IsFirstData:bFirstData} });
91205
91455
 
91206
91456
  if (data.AutoUpdate===false) //不执行自动更新
@@ -230,7 +230,6 @@ HQData.Minute_RequestMinuteData=function(data, callback)
230
230
 
231
231
  var lastPrice=stockItem.minute[stockItem.minute.length-1].price;
232
232
 
233
-
234
233
  if (bBuySellBar) //盘口分析
235
234
  {
236
235
  var aryBuy=[];
@@ -271,6 +270,95 @@ HQData.Minute_RequestMinuteData=function(data, callback)
271
270
  }, 50);
272
271
  }
273
272
 
273
+ HQData.Minute_RequestMinuteDataV2=function(data, callback)
274
+ {
275
+ data.PreventDefault=true;
276
+ var symbol=data.Request.Data.symbol[0]; //请求的股票代码
277
+ var callcation=data.Request.Data.callcation; //集合竞价
278
+ console.log(`[HQData::Minute_RequestMinuteDataV2] Symbol=${symbol}`);
279
+
280
+ setTimeout(()=>
281
+ {
282
+ var fullData=HQData.GetDayMinuteDataBySymbol(symbol);
283
+ var srcStock=fullData[0];
284
+ var stockItem={ date:srcStock.date, minute:srcStock.minute, yclose:srcStock.yclose, symbol:symbol, name:symbol };
285
+
286
+ if (callcation.Before)
287
+ {
288
+ var TEST_BEFORE_DATA=
289
+ [
290
+ [8.52, 50000, 30000, 1, 200000],
291
+ [8.53, 55000, 40000, 0, 80000],
292
+ [8.52, 40000, 60000, 1, 80000],
293
+ [8.55, 30000, 21000, 2, 44000],
294
+ [8.51, 21000, 25000, 2, 40000],
295
+ [8.50, 36000, 55000, 2, 60000],
296
+ [8.49, 10000, 20000, 2, 33000],
297
+ ];
298
+
299
+ var date=new Date(parseInt(stockItem.date/10000),(stockItem.date/100%100-1),stockItem.date%100, 9, 15, 0);
300
+ var count=10*60; //9:15-9:25
301
+ var before=[];
302
+ for(var i=0;i<count;++i)
303
+ {
304
+ var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
305
+ var testIndex=Math.floor(Math.random()*10)%TEST_BEFORE_DATA.length;
306
+ var testData=TEST_BEFORE_DATA[testIndex];
307
+ var item=[ time, null, null, null, null, null ];
308
+ if (i%20==0 || i==count-1)
309
+ {
310
+ item=[ time, testData[0], testData[1], testData[2], testData[3], (testData[1]+testData[2])*1.5 ];
311
+ }
312
+ before.push(item);
313
+ date.setSeconds(date.getSeconds()+1);
314
+ }
315
+
316
+ //before.length=200;
317
+ var beforeinfo={ totalcount:count, ver:2.0 };
318
+
319
+ stockItem.before=before;
320
+ stockItem.beforeinfo=beforeinfo;
321
+
322
+ var TEST_AFTER_DATA=
323
+ [
324
+ [8.51, 40000, 30000, 1, 80000],
325
+ [8.51, 55000, 60000, 0, 150000],
326
+ [8.51, 30000, 60000, 1, 160000],
327
+ [8.51, 35000, 21000, 2, 50000],
328
+ [8.51, 21000, 35000, 2, 70000],
329
+ [8.51, 26000, 55000, 2, 100000],
330
+ [8.51, 30000, 10000, 2, 50000],
331
+ ];
332
+
333
+ var date=new Date(parseInt(stockItem.date/10000),(stockItem.date/100%100-1),stockItem.date%100, 14, 57, 0);
334
+ var count=3*60; //14:57-15:00
335
+ var after=[];
336
+ for(var i=0;i<count;++i)
337
+ {
338
+ var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
339
+ var testIndex=Math.floor(Math.random()*10)%TEST_AFTER_DATA.length;
340
+ var testData=TEST_AFTER_DATA[testIndex];
341
+ var item=[ time, null, null, null, null, null ];
342
+ if (i%10==0 || i==count-1)
343
+ {
344
+ item=[ time, testData[0], testData[1], testData[2], testData[3], (testData[1]+testData[2])*1.5 ];
345
+ }
346
+ after.push(item);
347
+ date.setSeconds(date.getSeconds()+1);
348
+ }
349
+
350
+ var afterinfo={ totalcount:count, ver:2.0 };
351
+ stockItem.after=after;
352
+ stockItem.afterinfo=afterinfo;
353
+ }
354
+
355
+ //stockItem.minute.length=0;
356
+
357
+ var hqchartData={code:0, stock:[stockItem] };
358
+ callback(hqchartData);
359
+ }, 50);
360
+ }
361
+
274
362
  HQData.Minute_RequestPopMinuteData=function(data, callback)
275
363
  {
276
364
  data.PreventDefault=true;