hqchart 1.1.13144 → 1.1.13152

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.13144",
3
+ "version": "1.1.13152",
4
4
  "description": "HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接",
5
5
  "main": "lib/main.js",
6
6
  "scripts": {
@@ -18590,7 +18590,34 @@ function HQTradeHScreenFrame()
18590
18590
  }
18591
18591
  }
18592
18592
 
18593
- if (frame!=null) return frame.GetYData(x);
18593
+ if (frame!=null)
18594
+ {
18595
+ var xValue= frame.GetYData(x);
18596
+
18597
+ if (frame.GetMainOverlayFrame)
18598
+ {
18599
+ var aryOverlayFrame=frame.GetMainOverlayFrame();
18600
+ if (aryOverlayFrame)
18601
+ {
18602
+ if (aryOverlayFrame[0]) //左侧
18603
+ {
18604
+ var leftFrame=aryOverlayFrame[0];
18605
+ var value=leftFrame.GetYData(x);
18606
+ outObject.RightYValue=xValue;
18607
+ xValue=value;
18608
+ }
18609
+
18610
+ if (aryOverlayFrame[1]) //右侧
18611
+ {
18612
+ var rightFrame=aryOverlayFrame[1];
18613
+ var value=rightFrame.GetYData(x);
18614
+ outObject.RightYValue=value;
18615
+ }
18616
+ }
18617
+ }
18618
+
18619
+ return xValue;
18620
+ }
18594
18621
  }
18595
18622
  }
18596
18623
 
@@ -24713,6 +24740,198 @@ function ChartKLine()
24713
24740
  this.PtMin=ptMin;
24714
24741
  }
24715
24742
 
24743
+ this.DrawKagi=function() //卡吉图
24744
+ {
24745
+ var isHScreen=(this.ChartFrame.IsHScreen===true);
24746
+ var dataWidth=this.ChartFrame.DataWidth;
24747
+ var distanceWidth=this.ChartFrame.DistanceWidth;
24748
+ var xPointCount=this.ChartFrame.XPointCount;
24749
+
24750
+ if (isHScreen)
24751
+ {
24752
+ var border=this.ChartBorder.GetHScreenBorder();
24753
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
24754
+ var chartright=border.BottomEx;
24755
+ var left=border.TopEx+g_JSChartResource.FrameLeftMargin;
24756
+ }
24757
+ else
24758
+ {
24759
+ var border=this.ChartBorder.GetBorder();
24760
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
24761
+ var chartright=border.RightEx;
24762
+ var left=border.Left+g_JSChartResource.FrameLeftMargin;
24763
+ }
24764
+
24765
+ var ptMax={X:null,Y:null,Value:null,Align:'left'};
24766
+ var ptMin={X:null,Y:null,Value:null,Align:'left'};
24767
+ this.ShowRange.Start=this.Data.DataOffset;
24768
+ this.ShowRange.End=this.ShowRange.Start;
24769
+ this.ShowRange.DataCount=0;
24770
+ this.ShowRange.ShowCount=xPointCount;
24771
+ this.DrawKRange.Start=this.Data.DataOffset;
24772
+
24773
+ var lineWidth=2*GetDevicePixelRatio();
24774
+ this.Canvas.lineWidth=lineWidth;
24775
+ var preItem={ Item:null, X:left, Y:null };
24776
+ var index=this.Data.DataOffset-1;
24777
+ if (index>=0 && index<this.Data.Data.length)
24778
+ {
24779
+ var item=this.Data.Data[index];
24780
+ preItem.Item=item;
24781
+ if (item.Direction==1) //上
24782
+ {
24783
+ preItem.Y=this.GetYFromData(item.High,false);
24784
+ }
24785
+ else if (item.Direction==2)
24786
+ {
24787
+ preItem.Y=this.GetYFromData(item.Low,false);
24788
+ }
24789
+ }
24790
+
24791
+
24792
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
24793
+ {
24794
+ var data=this.Data.Data[i];
24795
+ this.ShowRange.End=i;
24796
+ if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
24797
+
24798
+ var left=xOffset;
24799
+ var right=xOffset+dataWidth;
24800
+ if (right>chartright) break;
24801
+ var x=left+(right-left)/2;
24802
+ var yLow=this.GetYFromData(data.Low,false);
24803
+ var yHigh=this.GetYFromData(data.High,false);
24804
+ this.DrawKRange.End=i;
24805
+
24806
+ if (ptMax.Value==null || ptMax.Value<data.High) //求最大值
24807
+ {
24808
+ ptMax.X=x;
24809
+ ptMax.Y=yHigh;
24810
+ ptMax.Value=data.High;
24811
+ ptMax.Align=j<xPointCount/2?'left':'right';
24812
+ }
24813
+
24814
+ if (ptMin.Value==null || ptMin.Value>data.Low) //求最小值
24815
+ {
24816
+ ptMin.X=x;
24817
+ ptMin.Y=yLow;
24818
+ ptMin.Value=data.Low;
24819
+ ptMin.Align=j<xPointCount/2?'left':'right';
24820
+ }
24821
+
24822
+ var xFixed=ToFixedPoint2(lineWidth,x);
24823
+
24824
+ if (preItem.Item)
24825
+ {
24826
+ this.Canvas.beginPath();
24827
+ var yFixed=ToFixedPoint2(lineWidth,preItem.Y);
24828
+
24829
+ this.Canvas.moveTo(preItem.X, yFixed);
24830
+ this.Canvas.lineTo(xFixed, yFixed);
24831
+ var prePrice=null;
24832
+ if (preItem.Item.Direction==1) prePrice=preItem.Item.Low;
24833
+ else if (preItem.Item.Direction==2) prePrice=preItem.Item.High;
24834
+
24835
+ if (data.Direction==1)
24836
+ {
24837
+ if (data.High<prePrice)
24838
+ {
24839
+ this.Canvas.lineTo(xFixed, yHigh);
24840
+ this.Canvas.strokeStyle=this.DownColor;
24841
+ this.Canvas.stroke();
24842
+ }
24843
+ else
24844
+ {
24845
+ var yPrePrice=this.GetYFromData(prePrice,false);
24846
+ this.Canvas.lineTo(xFixed, yPrePrice);
24847
+ this.Canvas.strokeStyle=this.DownColor;
24848
+ this.Canvas.stroke();
24849
+
24850
+ this.Canvas.beginPath();
24851
+ this.Canvas.moveTo(xFixed, yPrePrice);
24852
+ this.Canvas.lineTo(xFixed, yHigh);
24853
+ this.Canvas.strokeStyle=this.UpColor;
24854
+ this.Canvas.stroke();
24855
+ }
24856
+
24857
+ }
24858
+ else if (data.Direction==2)
24859
+ {
24860
+ if (data.Low>prePrice)
24861
+ {
24862
+ this.Canvas.lineTo(xFixed, yLow);
24863
+ this.Canvas.strokeStyle=this.DownColor; //阳线
24864
+ this.Canvas.stroke();
24865
+ }
24866
+ else
24867
+ {
24868
+ var yPrePrice=this.GetYFromData(prePrice,false);
24869
+ this.Canvas.lineTo(xFixed, yPrePrice);
24870
+ this.Canvas.strokeStyle=this.DownColor; //阳线
24871
+ this.Canvas.stroke();
24872
+
24873
+ this.Canvas.beginPath();
24874
+ this.Canvas.moveTo(xFixed, yPrePrice);
24875
+ this.Canvas.lineTo(xFixed, yLow);
24876
+ this.Canvas.strokeStyle=this.UpColor;
24877
+ this.Canvas.stroke();
24878
+ }
24879
+ }
24880
+
24881
+ }
24882
+ else
24883
+ {
24884
+ this.Canvas.beginPath();
24885
+ if (data.Direction==1)
24886
+ {
24887
+ this.Canvas.moveTo(xFixed, yLow);
24888
+ this.Canvas.lineTo(xFixed, yHigh);
24889
+ }
24890
+ else if (data.Direction==2)
24891
+ {
24892
+ this.Canvas.moveTo(xFixed, yHigh);
24893
+ this.Canvas.lineTo(xFixed, yLow);
24894
+ }
24895
+ this.Canvas.stroke();
24896
+ }
24897
+
24898
+ /*
24899
+ if (data.YClose<data.Close)
24900
+ {
24901
+ this.Canvas.strokeStyle=this.UpColor; //阳线
24902
+ this.Canvas.fillStyle=this.UpColor;
24903
+ }
24904
+ else if (data.YClose>data.Close)
24905
+ {
24906
+ this.Canvas.strokeStyle=this.DownColor; //阴线
24907
+ this.Canvas.fillStyle=this.DownColor;
24908
+ }
24909
+
24910
+ this.Canvas.beginPath();
24911
+ if (isHScreen)
24912
+ {
24913
+ this.Canvas.moveTo(yHigh,ToFixedPoint(x));
24914
+ this.Canvas.lineTo(yLow,ToFixedPoint(x));
24915
+ }
24916
+ else
24917
+ {
24918
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yHigh);
24919
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yLow);
24920
+ }
24921
+ this.Canvas.stroke();
24922
+ */
24923
+
24924
+ preItem.Item=data;
24925
+ preItem.X=x;
24926
+
24927
+ if (data.Direction==1) preItem.Y=yHigh; //上
24928
+ else if (data.Direction==2) preItem.Y=yLow //下
24929
+ }
24930
+
24931
+ this.PtMax=ptMax;
24932
+ this.PtMin=ptMin;
24933
+ }
24934
+
24716
24935
  this.DrawTrade=function() //交易系统
24717
24936
  {
24718
24937
  if (!this.TradeData) return;
@@ -25220,6 +25439,10 @@ function ChartKLine()
25220
25439
  {
25221
25440
  this.DrawHLCArea();
25222
25441
  }
25442
+ else if (this.DrawType==16)
25443
+ {
25444
+ this.DrawKagi();
25445
+ }
25223
25446
  else if (this.DrawType==17)
25224
25447
  {
25225
25448
  this.DrawOrderFlow_Style4();
@@ -48319,6 +48542,7 @@ function ChartCorssCursor()
48319
48542
 
48320
48543
  this.StringFormatY.Value=yValue;
48321
48544
  this.StringFormatY.FrameID=yValueExtend.FrameID;
48545
+ this.StringFormatY.RValue=yValueExtend.RightYValue; //右侧子坐标
48322
48546
  this.StringFormatY.Point={X:x, Y:y};
48323
48547
  this.StringFormatY.ClientPos=this.ClientPos;
48324
48548
 
@@ -49123,6 +49347,7 @@ function HQPriceStringFormat()
49123
49347
  {
49124
49348
  if (this.DataFormatType==1) this.Text=IFrameSplitOperator.FormatValueThousandsString(this.Value,defaultfloatPrecision);
49125
49349
  else this.Text=IFrameSplitOperator.FormatValueString(this.Value,defaultfloatPrecision,this.LanguageID);
49350
+ if (IFrameSplitOperator.IsNumber(this.RValue)) this.RText=IFrameSplitOperator.FormatValueString(this.RValue,defaultfloatPrecision,this.LanguageID);
49126
49351
  }
49127
49352
 
49128
49353
  if (this.GetEventCallback)
@@ -65760,20 +65985,24 @@ function RenkoCalculate()
65760
65985
  //
65761
65986
  function KagiCalculate()
65762
65987
  {
65763
- this.Symbol;
65764
- this.SourceData;
65765
- this.FloatPrecision=2; //品种小数位数
65766
- this.ATR={ Count:14 }; //使用ATR计算砖块大小
65988
+ this.newMethod=RenkoCalculate; //派生
65989
+ this.newMethod();
65990
+ delete this.newMethod;
65991
+
65992
+ this.ClassName="KagiCalculate";
65993
+ this.BrickSizeType=0;
65994
+ this.BrickSize=0.5; //固定大小
65767
65995
 
65768
65996
  this.RecvHistoryData=function(sourceData, option) //历史日线数据
65769
65997
  {
65770
65998
  this.Symbol=option.Symbol;
65771
65999
  this.SourceData=sourceData;
65772
66000
  this.FloatPrecision=GetfloatPrecision(this.Symbol);
65773
- return this.Calculate(sourceData);
66001
+ if (this.BrickSizeType==1) this.CalculateATR();
66002
+ return this.CalculateByClose(sourceData);
65774
66003
  }
65775
66004
 
65776
- this.Calculate=function(sourceData)
66005
+ this.CalculateByClose=function(sourceData)
65777
66006
  {
65778
66007
  var bindData=new ChartData();
65779
66008
  bindData.Data=[]
@@ -65784,13 +66013,139 @@ function KagiCalculate()
65784
66013
 
65785
66014
  if (!IFrameSplitOperator.IsNonEmptyArray(sourceData.Data)) return bindData;
65786
66015
 
65787
- var periodCount=this.ATR.Count;
66016
+ var brickSize=this.BrickSize;
66017
+ if (this.BrickSizeType==1) brickSize=this.ATR.BrickSize;
65788
66018
 
65789
66019
  var kItem=sourceData.Data[0];
65790
- this.LastData=HistoryData.Copy(kItem);
65791
- for(var i=1; i<sourceData.Data.length; )
66020
+ var kagiItem=HistoryData.Copy(kItem);
66021
+
66022
+ kagiItem.High=kagiItem.Low=kItem.Close;
66023
+ kagiItem.StartItem=kItem;
66024
+ kagiItem.Direction=0; //1 上 2=下
66025
+
66026
+ var T_MergeKData=function(dest, src)
65792
66027
  {
66028
+ dest.Vol+=src.Vol;
66029
+ dest.Amount+=src.Amount;
65793
66030
  }
66031
+
66032
+ var index=1;
66033
+ for( ;index<sourceData.Data.length;++index) //确定好方向
66034
+ {
66035
+ var kItem=sourceData.Data[index];
66036
+ if (kItem.Close>kagiItem.Close)
66037
+ {
66038
+ kagiItem.Direction=1;
66039
+ kagiItem.Close=kItem.Close;
66040
+ kagiItem.EndItem=kItem;
66041
+ kagiItem.High=kItem.Close;
66042
+ break;
66043
+ }
66044
+ else if (kItem.Close<kagiItem.Close)
66045
+ {
66046
+ kagiItem.Direction=2;
66047
+ kagiItem.Close=kItem.Close;
66048
+ kagiItem.EndItem=kItem;
66049
+ kagiItem.Low=kItem.Close;
66050
+ break;
66051
+ }
66052
+ }
66053
+
66054
+ var changeItem=null;
66055
+ for(++index; index<sourceData.Data.length;++index )
66056
+ {
66057
+ var kItem=sourceData.Data[index];
66058
+ if (kagiItem.Direction==1) //上
66059
+ {
66060
+ if (kItem.Close>=kagiItem.High)
66061
+ {
66062
+ kagiItem.Close=kItem.Close;
66063
+ kagiItem.High=kItem.Close;
66064
+ kagiItem.EndItem=kItem;
66065
+ changeItem=null;
66066
+ }
66067
+ else
66068
+ {
66069
+ if (!changeItem)
66070
+ {
66071
+ changeItem=HistoryData.Copy(kItem);
66072
+ changeItem.High=changeItem.Low=kItem.Close;
66073
+ }
66074
+ else
66075
+ {
66076
+ changeItem.Close=kItem.Close;
66077
+ if (changeItem.Low>kItem.Close) changeItem.Low=kItem.Close;
66078
+ }
66079
+
66080
+ if (Math.abs(changeItem.Low-kagiItem.High)>brickSize) //达到变盘点
66081
+ {
66082
+ bindData.Data.push(kagiItem);
66083
+
66084
+ var newItem=HistoryData.Copy(kItem);
66085
+ newItem.High=kagiItem.High;
66086
+ newItem.Low=kItem.Close;
66087
+ newItem.Direction=2; //1 上 2=下
66088
+ newItem.StartItem=kItem;
66089
+
66090
+ kagiItem=newItem;
66091
+ changeItem=null;
66092
+ }
66093
+ }
66094
+ }
66095
+ else if (kagiItem.Direction==2) //下
66096
+ {
66097
+ if (kItem.Close<=kagiItem.Low)
66098
+ {
66099
+ kagiItem.Close=kItem.Close;
66100
+ kagiItem.Low=kItem.Close;
66101
+ kagiItem.EndItem=kItem;
66102
+ }
66103
+ else
66104
+ {
66105
+ if (!changeItem)
66106
+ {
66107
+ changeItem=HistoryData.Copy(kItem);
66108
+ changeItem.High=changeItem.Low=kItem.Close;
66109
+ }
66110
+ else
66111
+ {
66112
+ changeItem.Close=kItem.Close;
66113
+ if (changeItem.High<kItem.Close) changeItem.High=kItem.Close;
66114
+ }
66115
+
66116
+ if (Math.abs(changeItem.High-kagiItem.Low)>brickSize) //达到变盘点
66117
+ {
66118
+ bindData.Data.push(kagiItem);
66119
+
66120
+ var newItem=HistoryData.Copy(kItem);
66121
+ newItem.High=kItem.Close;
66122
+ newItem.Low=kagiItem.Low;
66123
+ newItem.Direction=1; //1 上 2=下
66124
+ newItem.StartItem=kItem;
66125
+
66126
+ kagiItem=newItem;
66127
+ changeItem=null;
66128
+ }
66129
+ }
66130
+ }
66131
+ }
66132
+
66133
+ return bindData;
66134
+ }
66135
+
66136
+ //获取配置信息
66137
+ this.GetTitle=function()
66138
+ {
66139
+ if (this.BrickSizeType==1)
66140
+ {
66141
+ var text=`Kagi [ATR(${this.ATR.Count}), ${this.ATR.BrickSize}]`;
66142
+ }
66143
+ else
66144
+ {
66145
+ var text=`Kagi [Traditional]`;
66146
+ }
66147
+
66148
+ return text;
65794
66149
  }
65795
66150
  }
65796
66151
 
@@ -69398,12 +69753,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
69398
69753
  //删除某一个窗口的指标, bCallDestory=是否调用图形销毁函数
69399
69754
  this.DeleteIndexPaint=function(windowIndex, bCallDestroy)
69400
69755
  {
69401
- let paint=new Array(); //踢出当前窗口的指标画法
69402
- for(let i in this.ChartPaint)
69756
+ if (!this.Frame.SubFrame[windowIndex]) return;
69757
+ var subFrame=this.Frame.SubFrame[windowIndex].Frame;
69758
+ if (!subFrame) return;
69759
+
69760
+ var paint=[]; //踢出当前窗口的指标画法
69761
+ for(var i=0;i<this.ChartPaint.length; ++i)
69403
69762
  {
69404
- let item=this.ChartPaint[i];
69763
+ var item=this.ChartPaint[i];
69764
+ var bFind=(item.ChartFrame.Guid==subFrame.Guid || item.ChartFrame==subFrame);
69405
69765
 
69406
- if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)
69766
+ if (i==0 || !bFind)
69407
69767
  {
69408
69768
  paint.push(item);
69409
69769
  }
@@ -69416,7 +69776,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
69416
69776
  }
69417
69777
  }
69418
69778
 
69419
- var subFrame=this.Frame.SubFrame[windowIndex].Frame;
69779
+
69420
69780
  subFrame.YSpecificMaxMin=null; //清空指定最大最小值
69421
69781
  subFrame.IsLocked=false; //解除上锁
69422
69782
  subFrame.YSplitScale = null; //清空固定刻度
@@ -75150,6 +75510,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
75150
75510
  }
75151
75511
 
75152
75512
  var subFrame=new SubFrameItem();
75513
+ frame.FrameData.SubFrameItem=subFrame;
75153
75514
  subFrame.Frame=frame;
75154
75515
  if (i==0)
75155
75516
  subFrame.Height=20;
@@ -75236,6 +75597,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
75236
75597
  }
75237
75598
 
75238
75599
  var subFrame=new SubFrameItem();
75600
+ frame.FrameData.SubFrameItem=subFrame;
75239
75601
  subFrame.Frame=frame;
75240
75602
  subFrame.Height=10;
75241
75603
 
@@ -75307,12 +75669,16 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
75307
75669
  //删除某一个窗口的指标
75308
75670
  this.DeleteIndexPaint=function(windowIndex,bCallDestroy)
75309
75671
  {
75310
- let paint=new Array(); //踢出当前窗口的指标画法
75311
- for(let i in this.ChartPaint)
75672
+ var subFrame=this.Frame.SubFrame[windowIndex].Frame;
75673
+ if (!subFrame) return;
75674
+
75675
+ var paint=[]; //踢出当前窗口的指标画法
75676
+ for(var i=0;i<this.ChartPaint.length;++i)
75312
75677
  {
75313
- let item=this.ChartPaint[i];
75678
+ var item=this.ChartPaint[i];
75679
+ var bFind=(item.ChartFrame.Guid==subFrame.Guid || item.ChartFrame==subFrame);
75314
75680
 
75315
- if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)
75681
+ if (i==0 || !bFind)
75316
75682
  {
75317
75683
  paint.push(item);
75318
75684
  }
@@ -75326,7 +75692,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
75326
75692
  }
75327
75693
 
75328
75694
  //清空指定最大最小值
75329
- var subFrame=this.Frame.SubFrame[windowIndex].Frame;
75695
+
75330
75696
  subFrame.YSpecificMaxMin=null;
75331
75697
  subFrame.IsLocked=false; //解除上锁
75332
75698
  subFrame.YSplitOperator.SplitType=subFrame.YSplitOperator.DefaultSplitType; //还原Y坐标分割模式
@@ -80649,6 +81015,7 @@ function KLineChartHScreenContainer(uielement)
80649
81015
  }
80650
81016
 
80651
81017
  var subFrame=new SubFrameItem();
81018
+ frame.FrameData.SubFrameItem=subFrame;
80652
81019
  subFrame.Frame=frame;
80653
81020
  if (i==0)
80654
81021
  subFrame.Height=20;
@@ -80793,6 +81160,7 @@ function MinuteChartHScreenContainer(uielement)
80793
81160
  }
80794
81161
 
80795
81162
  var subFrame=new SubFrameItem();
81163
+ frame.FrameData.SubFrameItem=subFrame;
80796
81164
  subFrame.Frame=frame;
80797
81165
  if (i==0)
80798
81166
  subFrame.Height=20;