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.
@@ -22482,7 +22482,34 @@ function HQTradeHScreenFrame()
22482
22482
  }
22483
22483
  }
22484
22484
 
22485
- if (frame!=null) return frame.GetYData(x);
22485
+ if (frame!=null)
22486
+ {
22487
+ var xValue= frame.GetYData(x);
22488
+
22489
+ if (frame.GetMainOverlayFrame)
22490
+ {
22491
+ var aryOverlayFrame=frame.GetMainOverlayFrame();
22492
+ if (aryOverlayFrame)
22493
+ {
22494
+ if (aryOverlayFrame[0]) //左侧
22495
+ {
22496
+ var leftFrame=aryOverlayFrame[0];
22497
+ var value=leftFrame.GetYData(x);
22498
+ outObject.RightYValue=xValue;
22499
+ xValue=value;
22500
+ }
22501
+
22502
+ if (aryOverlayFrame[1]) //右侧
22503
+ {
22504
+ var rightFrame=aryOverlayFrame[1];
22505
+ var value=rightFrame.GetYData(x);
22506
+ outObject.RightYValue=value;
22507
+ }
22508
+ }
22509
+ }
22510
+
22511
+ return xValue;
22512
+ }
22486
22513
  }
22487
22514
  }
22488
22515
 
@@ -28605,6 +28632,198 @@ function ChartKLine()
28605
28632
  this.PtMin=ptMin;
28606
28633
  }
28607
28634
 
28635
+ this.DrawKagi=function() //卡吉图
28636
+ {
28637
+ var isHScreen=(this.ChartFrame.IsHScreen===true);
28638
+ var dataWidth=this.ChartFrame.DataWidth;
28639
+ var distanceWidth=this.ChartFrame.DistanceWidth;
28640
+ var xPointCount=this.ChartFrame.XPointCount;
28641
+
28642
+ if (isHScreen)
28643
+ {
28644
+ var border=this.ChartBorder.GetHScreenBorder();
28645
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
28646
+ var chartright=border.BottomEx;
28647
+ var left=border.TopEx+g_JSChartResource.FrameLeftMargin;
28648
+ }
28649
+ else
28650
+ {
28651
+ var border=this.ChartBorder.GetBorder();
28652
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
28653
+ var chartright=border.RightEx;
28654
+ var left=border.Left+g_JSChartResource.FrameLeftMargin;
28655
+ }
28656
+
28657
+ var ptMax={X:null,Y:null,Value:null,Align:'left'};
28658
+ var ptMin={X:null,Y:null,Value:null,Align:'left'};
28659
+ this.ShowRange.Start=this.Data.DataOffset;
28660
+ this.ShowRange.End=this.ShowRange.Start;
28661
+ this.ShowRange.DataCount=0;
28662
+ this.ShowRange.ShowCount=xPointCount;
28663
+ this.DrawKRange.Start=this.Data.DataOffset;
28664
+
28665
+ var lineWidth=2*GetDevicePixelRatio();
28666
+ this.Canvas.lineWidth=lineWidth;
28667
+ var preItem={ Item:null, X:left, Y:null };
28668
+ var index=this.Data.DataOffset-1;
28669
+ if (index>=0 && index<this.Data.Data.length)
28670
+ {
28671
+ var item=this.Data.Data[index];
28672
+ preItem.Item=item;
28673
+ if (item.Direction==1) //上
28674
+ {
28675
+ preItem.Y=this.GetYFromData(item.High,false);
28676
+ }
28677
+ else if (item.Direction==2)
28678
+ {
28679
+ preItem.Y=this.GetYFromData(item.Low,false);
28680
+ }
28681
+ }
28682
+
28683
+
28684
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
28685
+ {
28686
+ var data=this.Data.Data[i];
28687
+ this.ShowRange.End=i;
28688
+ if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
28689
+
28690
+ var left=xOffset;
28691
+ var right=xOffset+dataWidth;
28692
+ if (right>chartright) break;
28693
+ var x=left+(right-left)/2;
28694
+ var yLow=this.GetYFromData(data.Low,false);
28695
+ var yHigh=this.GetYFromData(data.High,false);
28696
+ this.DrawKRange.End=i;
28697
+
28698
+ if (ptMax.Value==null || ptMax.Value<data.High) //求最大值
28699
+ {
28700
+ ptMax.X=x;
28701
+ ptMax.Y=yHigh;
28702
+ ptMax.Value=data.High;
28703
+ ptMax.Align=j<xPointCount/2?'left':'right';
28704
+ }
28705
+
28706
+ if (ptMin.Value==null || ptMin.Value>data.Low) //求最小值
28707
+ {
28708
+ ptMin.X=x;
28709
+ ptMin.Y=yLow;
28710
+ ptMin.Value=data.Low;
28711
+ ptMin.Align=j<xPointCount/2?'left':'right';
28712
+ }
28713
+
28714
+ var xFixed=ToFixedPoint2(lineWidth,x);
28715
+
28716
+ if (preItem.Item)
28717
+ {
28718
+ this.Canvas.beginPath();
28719
+ var yFixed=ToFixedPoint2(lineWidth,preItem.Y);
28720
+
28721
+ this.Canvas.moveTo(preItem.X, yFixed);
28722
+ this.Canvas.lineTo(xFixed, yFixed);
28723
+ var prePrice=null;
28724
+ if (preItem.Item.Direction==1) prePrice=preItem.Item.Low;
28725
+ else if (preItem.Item.Direction==2) prePrice=preItem.Item.High;
28726
+
28727
+ if (data.Direction==1)
28728
+ {
28729
+ if (data.High<prePrice)
28730
+ {
28731
+ this.Canvas.lineTo(xFixed, yHigh);
28732
+ this.Canvas.strokeStyle=this.DownColor;
28733
+ this.Canvas.stroke();
28734
+ }
28735
+ else
28736
+ {
28737
+ var yPrePrice=this.GetYFromData(prePrice,false);
28738
+ this.Canvas.lineTo(xFixed, yPrePrice);
28739
+ this.Canvas.strokeStyle=this.DownColor;
28740
+ this.Canvas.stroke();
28741
+
28742
+ this.Canvas.beginPath();
28743
+ this.Canvas.moveTo(xFixed, yPrePrice);
28744
+ this.Canvas.lineTo(xFixed, yHigh);
28745
+ this.Canvas.strokeStyle=this.UpColor;
28746
+ this.Canvas.stroke();
28747
+ }
28748
+
28749
+ }
28750
+ else if (data.Direction==2)
28751
+ {
28752
+ if (data.Low>prePrice)
28753
+ {
28754
+ this.Canvas.lineTo(xFixed, yLow);
28755
+ this.Canvas.strokeStyle=this.DownColor; //阳线
28756
+ this.Canvas.stroke();
28757
+ }
28758
+ else
28759
+ {
28760
+ var yPrePrice=this.GetYFromData(prePrice,false);
28761
+ this.Canvas.lineTo(xFixed, yPrePrice);
28762
+ this.Canvas.strokeStyle=this.DownColor; //阳线
28763
+ this.Canvas.stroke();
28764
+
28765
+ this.Canvas.beginPath();
28766
+ this.Canvas.moveTo(xFixed, yPrePrice);
28767
+ this.Canvas.lineTo(xFixed, yLow);
28768
+ this.Canvas.strokeStyle=this.UpColor;
28769
+ this.Canvas.stroke();
28770
+ }
28771
+ }
28772
+
28773
+ }
28774
+ else
28775
+ {
28776
+ this.Canvas.beginPath();
28777
+ if (data.Direction==1)
28778
+ {
28779
+ this.Canvas.moveTo(xFixed, yLow);
28780
+ this.Canvas.lineTo(xFixed, yHigh);
28781
+ }
28782
+ else if (data.Direction==2)
28783
+ {
28784
+ this.Canvas.moveTo(xFixed, yHigh);
28785
+ this.Canvas.lineTo(xFixed, yLow);
28786
+ }
28787
+ this.Canvas.stroke();
28788
+ }
28789
+
28790
+ /*
28791
+ if (data.YClose<data.Close)
28792
+ {
28793
+ this.Canvas.strokeStyle=this.UpColor; //阳线
28794
+ this.Canvas.fillStyle=this.UpColor;
28795
+ }
28796
+ else if (data.YClose>data.Close)
28797
+ {
28798
+ this.Canvas.strokeStyle=this.DownColor; //阴线
28799
+ this.Canvas.fillStyle=this.DownColor;
28800
+ }
28801
+
28802
+ this.Canvas.beginPath();
28803
+ if (isHScreen)
28804
+ {
28805
+ this.Canvas.moveTo(yHigh,ToFixedPoint(x));
28806
+ this.Canvas.lineTo(yLow,ToFixedPoint(x));
28807
+ }
28808
+ else
28809
+ {
28810
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yHigh);
28811
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yLow);
28812
+ }
28813
+ this.Canvas.stroke();
28814
+ */
28815
+
28816
+ preItem.Item=data;
28817
+ preItem.X=x;
28818
+
28819
+ if (data.Direction==1) preItem.Y=yHigh; //上
28820
+ else if (data.Direction==2) preItem.Y=yLow //下
28821
+ }
28822
+
28823
+ this.PtMax=ptMax;
28824
+ this.PtMin=ptMin;
28825
+ }
28826
+
28608
28827
  this.DrawTrade=function() //交易系统
28609
28828
  {
28610
28829
  if (!this.TradeData) return;
@@ -29112,6 +29331,10 @@ function ChartKLine()
29112
29331
  {
29113
29332
  this.DrawHLCArea();
29114
29333
  }
29334
+ else if (this.DrawType==16)
29335
+ {
29336
+ this.DrawKagi();
29337
+ }
29115
29338
  else if (this.DrawType==17)
29116
29339
  {
29117
29340
  this.DrawOrderFlow_Style4();
@@ -52211,6 +52434,7 @@ function ChartCorssCursor()
52211
52434
 
52212
52435
  this.StringFormatY.Value=yValue;
52213
52436
  this.StringFormatY.FrameID=yValueExtend.FrameID;
52437
+ this.StringFormatY.RValue=yValueExtend.RightYValue; //右侧子坐标
52214
52438
  this.StringFormatY.Point={X:x, Y:y};
52215
52439
  this.StringFormatY.ClientPos=this.ClientPos;
52216
52440
 
@@ -53015,6 +53239,7 @@ function HQPriceStringFormat()
53015
53239
  {
53016
53240
  if (this.DataFormatType==1) this.Text=IFrameSplitOperator.FormatValueThousandsString(this.Value,defaultfloatPrecision);
53017
53241
  else this.Text=IFrameSplitOperator.FormatValueString(this.Value,defaultfloatPrecision,this.LanguageID);
53242
+ if (IFrameSplitOperator.IsNumber(this.RValue)) this.RText=IFrameSplitOperator.FormatValueString(this.RValue,defaultfloatPrecision,this.LanguageID);
53018
53243
  }
53019
53244
 
53020
53245
  if (this.GetEventCallback)
@@ -69652,20 +69877,24 @@ function RenkoCalculate()
69652
69877
  //
69653
69878
  function KagiCalculate()
69654
69879
  {
69655
- this.Symbol;
69656
- this.SourceData;
69657
- this.FloatPrecision=2; //品种小数位数
69658
- this.ATR={ Count:14 }; //使用ATR计算砖块大小
69880
+ this.newMethod=RenkoCalculate; //派生
69881
+ this.newMethod();
69882
+ delete this.newMethod;
69883
+
69884
+ this.ClassName="KagiCalculate";
69885
+ this.BrickSizeType=0;
69886
+ this.BrickSize=0.5; //固定大小
69659
69887
 
69660
69888
  this.RecvHistoryData=function(sourceData, option) //历史日线数据
69661
69889
  {
69662
69890
  this.Symbol=option.Symbol;
69663
69891
  this.SourceData=sourceData;
69664
69892
  this.FloatPrecision=GetfloatPrecision(this.Symbol);
69665
- return this.Calculate(sourceData);
69893
+ if (this.BrickSizeType==1) this.CalculateATR();
69894
+ return this.CalculateByClose(sourceData);
69666
69895
  }
69667
69896
 
69668
- this.Calculate=function(sourceData)
69897
+ this.CalculateByClose=function(sourceData)
69669
69898
  {
69670
69899
  var bindData=new ChartData();
69671
69900
  bindData.Data=[]
@@ -69676,13 +69905,139 @@ function KagiCalculate()
69676
69905
 
69677
69906
  if (!IFrameSplitOperator.IsNonEmptyArray(sourceData.Data)) return bindData;
69678
69907
 
69679
- var periodCount=this.ATR.Count;
69908
+ var brickSize=this.BrickSize;
69909
+ if (this.BrickSizeType==1) brickSize=this.ATR.BrickSize;
69680
69910
 
69681
69911
  var kItem=sourceData.Data[0];
69682
- this.LastData=HistoryData.Copy(kItem);
69683
- for(var i=1; i<sourceData.Data.length; )
69912
+ var kagiItem=HistoryData.Copy(kItem);
69913
+
69914
+ kagiItem.High=kagiItem.Low=kItem.Close;
69915
+ kagiItem.StartItem=kItem;
69916
+ kagiItem.Direction=0; //1 上 2=下
69917
+
69918
+ var T_MergeKData=function(dest, src)
69684
69919
  {
69920
+ dest.Vol+=src.Vol;
69921
+ dest.Amount+=src.Amount;
69685
69922
  }
69923
+
69924
+ var index=1;
69925
+ for( ;index<sourceData.Data.length;++index) //确定好方向
69926
+ {
69927
+ var kItem=sourceData.Data[index];
69928
+ if (kItem.Close>kagiItem.Close)
69929
+ {
69930
+ kagiItem.Direction=1;
69931
+ kagiItem.Close=kItem.Close;
69932
+ kagiItem.EndItem=kItem;
69933
+ kagiItem.High=kItem.Close;
69934
+ break;
69935
+ }
69936
+ else if (kItem.Close<kagiItem.Close)
69937
+ {
69938
+ kagiItem.Direction=2;
69939
+ kagiItem.Close=kItem.Close;
69940
+ kagiItem.EndItem=kItem;
69941
+ kagiItem.Low=kItem.Close;
69942
+ break;
69943
+ }
69944
+ }
69945
+
69946
+ var changeItem=null;
69947
+ for(++index; index<sourceData.Data.length;++index )
69948
+ {
69949
+ var kItem=sourceData.Data[index];
69950
+ if (kagiItem.Direction==1) //上
69951
+ {
69952
+ if (kItem.Close>=kagiItem.High)
69953
+ {
69954
+ kagiItem.Close=kItem.Close;
69955
+ kagiItem.High=kItem.Close;
69956
+ kagiItem.EndItem=kItem;
69957
+ changeItem=null;
69958
+ }
69959
+ else
69960
+ {
69961
+ if (!changeItem)
69962
+ {
69963
+ changeItem=HistoryData.Copy(kItem);
69964
+ changeItem.High=changeItem.Low=kItem.Close;
69965
+ }
69966
+ else
69967
+ {
69968
+ changeItem.Close=kItem.Close;
69969
+ if (changeItem.Low>kItem.Close) changeItem.Low=kItem.Close;
69970
+ }
69971
+
69972
+ if (Math.abs(changeItem.Low-kagiItem.High)>brickSize) //达到变盘点
69973
+ {
69974
+ bindData.Data.push(kagiItem);
69975
+
69976
+ var newItem=HistoryData.Copy(kItem);
69977
+ newItem.High=kagiItem.High;
69978
+ newItem.Low=kItem.Close;
69979
+ newItem.Direction=2; //1 上 2=下
69980
+ newItem.StartItem=kItem;
69981
+
69982
+ kagiItem=newItem;
69983
+ changeItem=null;
69984
+ }
69985
+ }
69986
+ }
69987
+ else if (kagiItem.Direction==2) //下
69988
+ {
69989
+ if (kItem.Close<=kagiItem.Low)
69990
+ {
69991
+ kagiItem.Close=kItem.Close;
69992
+ kagiItem.Low=kItem.Close;
69993
+ kagiItem.EndItem=kItem;
69994
+ }
69995
+ else
69996
+ {
69997
+ if (!changeItem)
69998
+ {
69999
+ changeItem=HistoryData.Copy(kItem);
70000
+ changeItem.High=changeItem.Low=kItem.Close;
70001
+ }
70002
+ else
70003
+ {
70004
+ changeItem.Close=kItem.Close;
70005
+ if (changeItem.High<kItem.Close) changeItem.High=kItem.Close;
70006
+ }
70007
+
70008
+ if (Math.abs(changeItem.High-kagiItem.Low)>brickSize) //达到变盘点
70009
+ {
70010
+ bindData.Data.push(kagiItem);
70011
+
70012
+ var newItem=HistoryData.Copy(kItem);
70013
+ newItem.High=kItem.Close;
70014
+ newItem.Low=kagiItem.Low;
70015
+ newItem.Direction=1; //1 上 2=下
70016
+ newItem.StartItem=kItem;
70017
+
70018
+ kagiItem=newItem;
70019
+ changeItem=null;
70020
+ }
70021
+ }
70022
+ }
70023
+ }
70024
+
70025
+ return bindData;
70026
+ }
70027
+
70028
+ //获取配置信息
70029
+ this.GetTitle=function()
70030
+ {
70031
+ if (this.BrickSizeType==1)
70032
+ {
70033
+ var text=`Kagi [ATR(${this.ATR.Count}), ${this.ATR.BrickSize}]`;
70034
+ }
70035
+ else
70036
+ {
70037
+ var text=`Kagi [Traditional]`;
70038
+ }
70039
+
70040
+ return text;
69686
70041
  }
69687
70042
  }
69688
70043
 
@@ -73290,12 +73645,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
73290
73645
  //删除某一个窗口的指标, bCallDestory=是否调用图形销毁函数
73291
73646
  this.DeleteIndexPaint=function(windowIndex, bCallDestroy)
73292
73647
  {
73293
- let paint=new Array(); //踢出当前窗口的指标画法
73294
- for(let i in this.ChartPaint)
73648
+ if (!this.Frame.SubFrame[windowIndex]) return;
73649
+ var subFrame=this.Frame.SubFrame[windowIndex].Frame;
73650
+ if (!subFrame) return;
73651
+
73652
+ var paint=[]; //踢出当前窗口的指标画法
73653
+ for(var i=0;i<this.ChartPaint.length; ++i)
73295
73654
  {
73296
- let item=this.ChartPaint[i];
73655
+ var item=this.ChartPaint[i];
73656
+ var bFind=(item.ChartFrame.Guid==subFrame.Guid || item.ChartFrame==subFrame);
73297
73657
 
73298
- if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)
73658
+ if (i==0 || !bFind)
73299
73659
  {
73300
73660
  paint.push(item);
73301
73661
  }
@@ -73308,7 +73668,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
73308
73668
  }
73309
73669
  }
73310
73670
 
73311
- var subFrame=this.Frame.SubFrame[windowIndex].Frame;
73671
+
73312
73672
  subFrame.YSpecificMaxMin=null; //清空指定最大最小值
73313
73673
  subFrame.IsLocked=false; //解除上锁
73314
73674
  subFrame.YSplitScale = null; //清空固定刻度
@@ -79042,6 +79402,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79042
79402
  }
79043
79403
 
79044
79404
  var subFrame=new SubFrameItem();
79405
+ frame.FrameData.SubFrameItem=subFrame;
79045
79406
  subFrame.Frame=frame;
79046
79407
  if (i==0)
79047
79408
  subFrame.Height=20;
@@ -79128,6 +79489,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79128
79489
  }
79129
79490
 
79130
79491
  var subFrame=new SubFrameItem();
79492
+ frame.FrameData.SubFrameItem=subFrame;
79131
79493
  subFrame.Frame=frame;
79132
79494
  subFrame.Height=10;
79133
79495
 
@@ -79199,12 +79561,16 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79199
79561
  //删除某一个窗口的指标
79200
79562
  this.DeleteIndexPaint=function(windowIndex,bCallDestroy)
79201
79563
  {
79202
- let paint=new Array(); //踢出当前窗口的指标画法
79203
- for(let i in this.ChartPaint)
79564
+ var subFrame=this.Frame.SubFrame[windowIndex].Frame;
79565
+ if (!subFrame) return;
79566
+
79567
+ var paint=[]; //踢出当前窗口的指标画法
79568
+ for(var i=0;i<this.ChartPaint.length;++i)
79204
79569
  {
79205
- let item=this.ChartPaint[i];
79570
+ var item=this.ChartPaint[i];
79571
+ var bFind=(item.ChartFrame.Guid==subFrame.Guid || item.ChartFrame==subFrame);
79206
79572
 
79207
- if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)
79573
+ if (i==0 || !bFind)
79208
79574
  {
79209
79575
  paint.push(item);
79210
79576
  }
@@ -79218,7 +79584,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79218
79584
  }
79219
79585
 
79220
79586
  //清空指定最大最小值
79221
- var subFrame=this.Frame.SubFrame[windowIndex].Frame;
79587
+
79222
79588
  subFrame.YSpecificMaxMin=null;
79223
79589
  subFrame.IsLocked=false; //解除上锁
79224
79590
  subFrame.YSplitOperator.SplitType=subFrame.YSplitOperator.DefaultSplitType; //还原Y坐标分割模式
@@ -84541,6 +84907,7 @@ function KLineChartHScreenContainer(uielement)
84541
84907
  }
84542
84908
 
84543
84909
  var subFrame=new SubFrameItem();
84910
+ frame.FrameData.SubFrameItem=subFrame;
84544
84911
  subFrame.Frame=frame;
84545
84912
  if (i==0)
84546
84913
  subFrame.Height=20;
@@ -84685,6 +85052,7 @@ function MinuteChartHScreenContainer(uielement)
84685
85052
  }
84686
85053
 
84687
85054
  var subFrame=new SubFrameItem();
85055
+ frame.FrameData.SubFrameItem=subFrame;
84688
85056
  subFrame.Frame=frame;
84689
85057
  if (i==0)
84690
85058
  subFrame.Height=20;
@@ -131783,7 +132151,7 @@ function ScrollBarBGChart()
131783
132151
 
131784
132152
 
131785
132153
 
131786
- var HQCHART_VERSION="1.1.13143";
132154
+ var HQCHART_VERSION="1.1.13151";
131787
132155
 
131788
132156
  function PrintHQChartVersion()
131789
132157
  {
@@ -5,7 +5,7 @@
5
5
 
6
6
 
7
7
 
8
- var HQCHART_VERSION="1.1.13143";
8
+ var HQCHART_VERSION="1.1.13151";
9
9
 
10
10
  function PrintHQChartVersion()
11
11
  {