hqchart 1.1.15037 → 1.1.15043

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hqchart",
3
- "version": "1.1.15037",
3
+ "version": "1.1.15043",
4
4
  "description": "HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接",
5
5
  "main": "lib/main.js",
6
6
  "scripts": {
@@ -422,7 +422,13 @@ function JSChart(divElement, bOffscreen, bCacheCanvas)
422
422
 
423
423
  if (option.DrawTool) //画图工具
424
424
  {
425
- if (option.DrawTool.StorageKey && chart.ChartDrawStorage) chart.ChartDrawStorage.Load(option.DrawTool.StorageKey);
425
+ var item=option.DrawTool;
426
+ if (chart.ChartDrawStorage)
427
+ {
428
+ if (item.StorageKey) chart.ChartDrawStorage.Load(item.StorageKey);
429
+ if (IFrameSplitOperator.IsBool(item.EnableCrossPeriod)) chart.ChartDrawStorage.EnableCrossPeriod=item.EnableCrossPeriod;
430
+ }
431
+
426
432
  }
427
433
 
428
434
  if (option.KeyboardMove)
@@ -3316,7 +3322,11 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
3316
3322
  this.EnableVerticalDrag=false;
3317
3323
 
3318
3324
  //十字光标长留(手势才有)
3319
- this.ClickModel={ IsShowCorssCursor:false, PreventHide:false, IsClickButton:false }; //PreventHide 阻止隐藏十字光标
3325
+ this.ClickModel=
3326
+ {
3327
+ IsShowCorssCursor:false, PreventHide:false, IsClickButton:false,
3328
+ AutoClose:{ Enable:false, Timer:null, DelayTime:3000 },
3329
+ }; //PreventHide 阻止隐藏十字光标 AutoClose=延迟关闭
3320
3330
  this.EnableClickModel=false;
3321
3331
 
3322
3332
  //标题栏显示最新数据
@@ -5703,6 +5713,7 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
5703
5713
 
5704
5714
 
5705
5715
  this.StopDragTimer();
5716
+ this.StopAutoCloseCorssCursor();
5706
5717
 
5707
5718
  var isSingleTouch=this.IsSingleTouch(e);
5708
5719
  if (this.EnableScrollUpDown==false || !isSingleTouch || //多点触屏
@@ -6220,6 +6231,29 @@ function JSChartContainer(uielement, OffscreenElement, cacheElement)
6220
6231
  return true;
6221
6232
  }
6222
6233
 
6234
+ this.StopAutoCloseCorssCursor=function()
6235
+ {
6236
+ if (!this.ClickModel.AutoClose.Timer) return;
6237
+
6238
+ clearTimeout(this.ClickModel.AutoClose.Timer);
6239
+ this.ClickModel.AutoClose.Timer=null;
6240
+ }
6241
+
6242
+ //自动关闭十字光标
6243
+ this.DelayAutoCloseCorssCursor=function()
6244
+ {
6245
+ if (!this.ClickModel.AutoClose.Enable) return false;
6246
+
6247
+ this.StopAutoCloseCorssCursor();
6248
+
6249
+ this.ClickModel.AutoClose.Timer=setTimeout(()=>
6250
+ {
6251
+ this.ClickModel.IsShowCorssCursor=false;
6252
+ this.DrawDynamicInfo();
6253
+
6254
+ }, this.ClickModel.AutoClose.DelayTime)
6255
+ }
6256
+
6223
6257
  this.MoveCorssCursor=function(point,e)
6224
6258
  {
6225
6259
  var pixelTatio = GetDevicePixelRatio();
@@ -64602,10 +64636,89 @@ function IChartDrawPicture()
64602
64636
  }
64603
64637
  }
64604
64638
 
64605
- this.UpdateXValue=function() //通过datetime更新x的索引
64639
+ this.GetkData=function()
64606
64640
  {
64607
- if (!this.Frame) return false;
64641
+ if (!this.Frame) return null;
64608
64642
  var data=this.Frame.Data;
64643
+ if (!data) return null;
64644
+
64645
+ return data;
64646
+ }
64647
+
64648
+ //周期变动 X重新定位
64649
+ this.ChangePeriod=function(period)
64650
+ {
64651
+ var kData=this.GetkData();
64652
+ if (!kData) return;
64653
+
64654
+ var aryDateTime=[];
64655
+ for(var i=0; i<this.Value.length; ++i)
64656
+ {
64657
+ var item=this.Value[i];
64658
+ if (!item.DateTime) break;
64659
+ var dateTime={ Date:item.DateTime.Date, Time:0, Match:null };
64660
+ if (IFrameSplitOperator.IsNumber(item.DateTime.Time)) dateTime.Time=item.DateTime.Time;
64661
+ aryDateTime[i]=dateTime;
64662
+ }
64663
+
64664
+ var findCount=0;
64665
+ var perData=null;
64666
+ var perIndex=-1;
64667
+ for(var i=0, j=0;i<kData.Data.length;++i)
64668
+ {
64669
+ var kItem=kData.Data[i];
64670
+
64671
+ for(j=0;j<aryDateTime.length;++j)
64672
+ {
64673
+ var item=aryDateTime[j];
64674
+ if (item.Match) continue;
64675
+
64676
+ if (ChartData.IsDayPeriod(period, true))
64677
+ {
64678
+ if (kItem.Date>item.Date)
64679
+ {
64680
+ item.Match={ KItem:perData, Index:perIndex };
64681
+ ++findCount;
64682
+ }
64683
+ }
64684
+ else if (ChartData.IsMinutePeriod(period, true))
64685
+ {
64686
+ if (kItem.Date>item.Date || (kItem.Date==item.Date && kItem.Time>item.Time))
64687
+ {
64688
+ item.Match={ KItem:perData, Index:perIndex };
64689
+ ++findCount;
64690
+ }
64691
+ }
64692
+ }
64693
+
64694
+ perData=kItem;
64695
+ perIndex=i;
64696
+
64697
+ if (findCount>=aryDateTime.length) break;
64698
+ }
64699
+
64700
+ for(var i=0;i<aryDateTime.length;++i)
64701
+ {
64702
+ var item=aryDateTime[i];
64703
+ var valueItem=this.Value[i];
64704
+ if (item.Match && item.Match.KItem)
64705
+ {
64706
+ valueItem.DateTime={ Date:item.Match.Date, Time:item.Match.Time };
64707
+ valueItem.XValue=item.Match.Index;
64708
+ }
64709
+ else
64710
+ {
64711
+ valueItem.DateTime=null;
64712
+ valueItem.XValue=null;
64713
+ }
64714
+ }
64715
+
64716
+ this.Period=period;
64717
+ }
64718
+
64719
+ this.UpdateXValue=function() //通过datetime更新x的索引
64720
+ {
64721
+ var data=this.GetkData();
64609
64722
  if (!data) return false;
64610
64723
 
64611
64724
  var aryDateTime=[];
@@ -76315,9 +76428,12 @@ function ChartDrawTVShortPosition()
76315
76428
 
76316
76429
  function ChartDrawStorage()
76317
76430
  {
76318
- this.DrawData=new Map(); //画图工具数据 key=symbol-Period, value=Map() Key:Guid, Value:{Guid, Symbol, Period, ClassName, Value}
76431
+ //this.DrawData=new Map(); //画图工具数据 key=symbol-Period, value=Map() Key:Guid, Value:{ Guid, Symbol, Period, ClassName, Value }
76432
+ this.DrawDataV2=new Map(); //画图工具数据 key=symbol, value=Map() Key:Guid, Value:{ Guid, Symbol, Period, ClassName, Value }
76433
+
76319
76434
  this.StorageKey;
76320
- this.GetEventCallback; //事件回调
76435
+ this.GetEventCallback; //事件回调
76436
+ this.EnableCrossPeriod=false; //跨周期
76321
76437
 
76322
76438
  this.Load=function(key) //从本地读取画图工具
76323
76439
  {
@@ -76330,18 +76446,39 @@ function ChartDrawStorage()
76330
76446
  if (typeof(cacheValue) != "string") return;
76331
76447
 
76332
76448
  var saveData=JSON.parse(cacheValue);
76333
- for(var i in saveData)
76334
- {
76335
- var item=saveData[i];
76336
- var drawMap=new Map();
76449
+ if (!saveData) return;
76337
76450
 
76338
- for(var j in item.Value)
76451
+ if (IFrameSplitOperator.IsNonEmptyArray(saveData)) //老版本 key=symbol-Period
76452
+ {
76453
+ for(var i=0;i<saveData.length;++i)
76339
76454
  {
76340
- var drawItem=item.Value[j];
76341
- drawMap.set(drawItem.Key, drawItem.Value);
76455
+ var item=saveData[i];
76456
+ for(var j=0;j<item.Value.length;++j)
76457
+ {
76458
+ var drawItem=item.Value[j];
76459
+ var symbol=drawItem.Value.Symbol;
76460
+ if (!this.DrawDataV2.has(symbol))
76461
+ this.DrawDataV2.set(symbol, {Symbol:symbol, MapPicture: new Map() });
76462
+
76463
+ var stockItem=this.DrawDataV2.get(symbol);
76464
+ stockItem.MapPicture.set(drawItem.Value.Guid, drawItem.Value);
76465
+ }
76342
76466
  }
76467
+ }
76468
+ else if (saveData.Ver==2.0 && IFrameSplitOperator.IsNonEmptyArray(saveData.Data))
76469
+ {
76470
+ for(var i=0;i<saveData.Data.length;++i)
76471
+ {
76472
+ var item=saveData.Data[i]; //{ Symbol:, AryPicture:[ { Guid, Symbol, Period, ClassName, Value }, ] }
76473
+ var stockItem={ Symbol:item.Symbol, MapPicture:new Map() };
76474
+ for(var j=0; j<item.AryPicture.length;++j)
76475
+ {
76476
+ var drawItem=item.AryPicture[j];
76477
+ stockItem.MapPicture.set(drawItem.Guid, drawItem);
76478
+ }
76343
76479
 
76344
- this.DrawData.set(item.Key,drawMap);
76480
+ this.DrawDataV2.set(stockItem.Symbol,stockItem);
76481
+ }
76345
76482
  }
76346
76483
  }
76347
76484
 
@@ -76350,89 +76487,95 @@ function ChartDrawStorage()
76350
76487
  if (!this.StorageKey) return;
76351
76488
 
76352
76489
  var saveData=[];
76353
- for(var stock of this.DrawData)
76490
+ for(var mapItem of this.DrawDataV2)
76354
76491
  {
76355
- var key=stock[0];
76356
- var value=stock[1];
76357
- var itemData={ Key:key, Value:[]};
76492
+ var symbol=mapItem[0];
76493
+ var stockItem=mapItem[1];
76358
76494
 
76359
- for(var drawItem of value)
76495
+ var itemData={ Symbol:symbol, AryPicture:[] };
76496
+
76497
+ for(var pictureItem of stockItem.MapPicture)
76360
76498
  {
76361
- if (drawItem[1] && drawItem[1].EnableSave===false) continue;
76499
+ var drawItem=pictureItem[1];
76500
+ if (drawItem.EnableSave===false) continue;
76362
76501
 
76363
- itemData.Value.push({Key:drawItem[0], Value:drawItem[1]});
76502
+ itemData.AryPicture.push(drawItem);
76364
76503
  }
76365
76504
 
76366
- if (IFrameSplitOperator.IsNonEmptyArray(itemData.Value))
76505
+ if (IFrameSplitOperator.IsNonEmptyArray(itemData.AryPicture))
76367
76506
  saveData.push(itemData);
76368
76507
  }
76369
76508
 
76370
76509
  JSConsole.Chart.Log(`[ChartDrawStorage::Save] save to localStorage, key=${this.StorageKey}`);
76371
- var strData=JSON.stringify(saveData);
76510
+ var strData=JSON.stringify({Ver:2.0, Data:saveData});
76372
76511
  localStorage[this.StorageKey]=strData;
76373
76512
  }
76374
76513
 
76375
- this.GetItemKey=function(obj) //生成每个画图工具的key
76376
- {
76377
- var strKey=`${obj.Symbol}-${obj.Period}`;
76378
- return strKey;
76379
- }
76380
-
76381
76514
  this.SaveDrawData=function(drawPicture) //保存一个画图工具
76382
76515
  {
76383
- var strKey=this.GetItemKey(drawPicture);
76516
+ var symbol=drawPicture.Symbol;
76384
76517
  var data=drawPicture.ExportStorageData();
76385
76518
  if (!data) return;
76386
76519
 
76387
- if (this.DrawData.has(strKey)) //更新
76520
+ if (this.DrawDataV2.has(symbol)) //更新
76388
76521
  {
76389
- JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] Upate: key, drawPicture, data', strKey, drawPicture,data);
76390
- this.DrawData.get(strKey).set(data.Guid, data);
76522
+ JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] Upate: symbol, drawPicture, data', symbol, drawPicture, data);
76523
+ var stockItem=this.DrawDataV2.get(symbol);
76524
+ stockItem.MapPicture.set(data.Guid, data);
76391
76525
  }
76392
76526
  else //新增
76393
76527
  {
76394
- JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] Insert: key, drawPicture, data', strKey, drawPicture,data);
76395
- var newData=new Map();
76396
- newData.set(data.Guid, data);
76397
- this.DrawData.set(strKey,newData);
76528
+ JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] Insert: symbol, drawPicture, data', symbol, drawPicture,data);
76529
+ var stockItem={ Symbol:symbol, MapPicture:new Map() } ;
76530
+ stockItem.set(data.Guid, data);
76531
+ this.DrawDataV2.set(symbol,newData);
76398
76532
  }
76399
76533
 
76400
- JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] All draw data: ', this.DrawData);
76534
+ JSConsole.Chart.Log('[ChartDrawStorage::SaveDrawData] All draw data: ', this.DrawDataV2);
76401
76535
 
76402
76536
  this.Save();
76403
76537
  }
76404
76538
 
76405
76539
  this.DeleteDrawData=function(drawPicture) //删除一个画图工具
76406
76540
  {
76407
- var strKey=this.GetItemKey(drawPicture);
76408
- if (!this.DrawData.has(strKey)) return;
76541
+ var symbol=drawPicture.Symbol;
76542
+ if (!this.DrawDataV2.has(symbol)) return;
76409
76543
 
76410
- var mapDraw=this.DrawData.get(strKey);
76411
- if (!mapDraw.has(drawPicture.Guid)) return;
76544
+ var stockItem=this.DrawDataV2.get(symbol);
76545
+ if (!stockItem.MapPicture.has(drawPicture.Guid)) return;
76412
76546
 
76413
- mapDraw.delete(drawPicture.Guid);
76547
+ stockItem.MapPicture.delete(drawPicture.Guid);
76414
76548
  this.Save();
76415
76549
  }
76416
76550
 
76417
76551
  this.Clear=function()
76418
76552
  {
76419
- this.DrawData=new Map();
76553
+ this.DrawDataV2=new Map();
76420
76554
  this.Save();
76421
76555
  }
76422
76556
 
76423
- this.GetDrawData=function(obj) //获取已有的画图工具数据{Symbol: , Period:, }
76557
+ this.GetDrawData=function(obj) //获取已有的画图工具数据{ Symbol: , Period:, }
76424
76558
  {
76425
- var data=[];
76426
- var strKey=this.GetItemKey(obj);
76427
- if (!this.DrawData.has(strKey)) return data;
76559
+ var aryData=[];
76560
+ var symbol=obj.Symbol;
76561
+
76562
+ if (!this.DrawDataV2.has(symbol)) return aryData;
76428
76563
 
76429
- var stockData=this.DrawData.get(strKey);
76430
- for(var item of stockData)
76564
+ var stockItem=this.DrawDataV2.get(symbol);
76565
+ for(var mapItem of stockItem.MapPicture)
76431
76566
  {
76432
- data.push(item[1]);
76567
+ var drawItem=mapItem[1];
76568
+ if (this.EnableCrossPeriod)
76569
+ {
76570
+ aryData.push(drawItem);
76571
+ }
76572
+ else
76573
+ {
76574
+ if (drawItem.Period==obj.Period) aryData.push(drawItem);
76575
+ }
76433
76576
  }
76434
76577
 
76435
- return data;
76578
+ return aryData;
76436
76579
  }
76437
76580
  }
76438
76581
 
@@ -86196,8 +86339,15 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86196
86339
 
86197
86340
  if (this.EnableClickModel===true)
86198
86341
  {
86199
- if (this.ClickModel.IsShowCorssCursor==true && this.ClickModel.PreventHide) return; //阻止隐藏
86200
- if (this.ClickModel.IsShowCorssCursor==true && this.TouchDrawCount>0 ) return;
86342
+ var bShowCorssCursor=false;
86343
+ if (this.ClickModel.IsShowCorssCursor==true && this.ClickModel.PreventHide) bShowCorssCursor=true; //阻止隐藏
86344
+ if (this.ClickModel.IsShowCorssCursor==true && this.TouchDrawCount>0 ) bShowCorssCursor=true;
86345
+
86346
+ if (bShowCorssCursor)
86347
+ {
86348
+ this.DelayAutoCloseCorssCursor(); //自动延迟关闭十字光标
86349
+ return;
86350
+ }
86201
86351
 
86202
86352
  this.ClickModel.IsShowCorssCursor=false;
86203
86353
  this.DrawDynamicInfo();
@@ -86210,7 +86360,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
86210
86360
  return;
86211
86361
  }
86212
86362
 
86213
- for(var i in this.ExtendChartPaint)
86363
+ for(var i=0; i<this.ExtendChartPaint.length; ++i)
86214
86364
  {
86215
86365
  var item=this.ExtendChartPaint[i];
86216
86366
  if (item.ClassName==='KLineTooltipPaint')
@@ -87746,7 +87896,16 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
87746
87896
  drawPicture.Option=this.ChartDrawOption;
87747
87897
 
87748
87898
  if (drawPicture.ImportStorageData) drawPicture.ImportStorageData(item);
87749
- drawPicture.UpdateXValue();
87899
+ if (drawPicture.Period!=this.Period)
87900
+ {
87901
+ drawPicture.ChangePeriod(this.Period);
87902
+ }
87903
+ else
87904
+ {
87905
+ drawPicture.UpdateXValue();
87906
+ }
87907
+
87908
+
87750
87909
  drawPicture.ValueToPoint();
87751
87910
 
87752
87911
  var self=this;
@@ -95544,7 +95703,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
95544
95703
  {
95545
95704
  if (!this.ChartDrawStorageCache || this.ChartDrawStorageCache.length<=0) return;
95546
95705
 
95547
- var self=this;
95706
+ var kData=this.GetKData();
95548
95707
  for(var i=0; i<this.ChartDrawStorageCache.length; ++i)
95549
95708
  {
95550
95709
  var item=this.ChartDrawStorageCache[i];