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.
@@ -22526,7 +22526,34 @@ function HQTradeHScreenFrame()
22526
22526
  }
22527
22527
  }
22528
22528
 
22529
- if (frame!=null) return frame.GetYData(x);
22529
+ if (frame!=null)
22530
+ {
22531
+ var xValue= frame.GetYData(x);
22532
+
22533
+ if (frame.GetMainOverlayFrame)
22534
+ {
22535
+ var aryOverlayFrame=frame.GetMainOverlayFrame();
22536
+ if (aryOverlayFrame)
22537
+ {
22538
+ if (aryOverlayFrame[0]) //左侧
22539
+ {
22540
+ var leftFrame=aryOverlayFrame[0];
22541
+ var value=leftFrame.GetYData(x);
22542
+ outObject.RightYValue=xValue;
22543
+ xValue=value;
22544
+ }
22545
+
22546
+ if (aryOverlayFrame[1]) //右侧
22547
+ {
22548
+ var rightFrame=aryOverlayFrame[1];
22549
+ var value=rightFrame.GetYData(x);
22550
+ outObject.RightYValue=value;
22551
+ }
22552
+ }
22553
+ }
22554
+
22555
+ return xValue;
22556
+ }
22530
22557
  }
22531
22558
  }
22532
22559
 
@@ -28649,6 +28676,198 @@ function ChartKLine()
28649
28676
  this.PtMin=ptMin;
28650
28677
  }
28651
28678
 
28679
+ this.DrawKagi=function() //卡吉图
28680
+ {
28681
+ var isHScreen=(this.ChartFrame.IsHScreen===true);
28682
+ var dataWidth=this.ChartFrame.DataWidth;
28683
+ var distanceWidth=this.ChartFrame.DistanceWidth;
28684
+ var xPointCount=this.ChartFrame.XPointCount;
28685
+
28686
+ if (isHScreen)
28687
+ {
28688
+ var border=this.ChartBorder.GetHScreenBorder();
28689
+ var xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
28690
+ var chartright=border.BottomEx;
28691
+ var left=border.TopEx+g_JSChartResource.FrameLeftMargin;
28692
+ }
28693
+ else
28694
+ {
28695
+ var border=this.ChartBorder.GetBorder();
28696
+ var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
28697
+ var chartright=border.RightEx;
28698
+ var left=border.Left+g_JSChartResource.FrameLeftMargin;
28699
+ }
28700
+
28701
+ var ptMax={X:null,Y:null,Value:null,Align:'left'};
28702
+ var ptMin={X:null,Y:null,Value:null,Align:'left'};
28703
+ this.ShowRange.Start=this.Data.DataOffset;
28704
+ this.ShowRange.End=this.ShowRange.Start;
28705
+ this.ShowRange.DataCount=0;
28706
+ this.ShowRange.ShowCount=xPointCount;
28707
+ this.DrawKRange.Start=this.Data.DataOffset;
28708
+
28709
+ var lineWidth=2*GetDevicePixelRatio();
28710
+ this.Canvas.lineWidth=lineWidth;
28711
+ var preItem={ Item:null, X:left, Y:null };
28712
+ var index=this.Data.DataOffset-1;
28713
+ if (index>=0 && index<this.Data.Data.length)
28714
+ {
28715
+ var item=this.Data.Data[index];
28716
+ preItem.Item=item;
28717
+ if (item.Direction==1) //上
28718
+ {
28719
+ preItem.Y=this.GetYFromData(item.High,false);
28720
+ }
28721
+ else if (item.Direction==2)
28722
+ {
28723
+ preItem.Y=this.GetYFromData(item.Low,false);
28724
+ }
28725
+ }
28726
+
28727
+
28728
+ for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth),++this.ShowRange.DataCount)
28729
+ {
28730
+ var data=this.Data.Data[i];
28731
+ this.ShowRange.End=i;
28732
+ if (data.Open==null || data.High==null || data.Low==null || data.Close==null) continue;
28733
+
28734
+ var left=xOffset;
28735
+ var right=xOffset+dataWidth;
28736
+ if (right>chartright) break;
28737
+ var x=left+(right-left)/2;
28738
+ var yLow=this.GetYFromData(data.Low,false);
28739
+ var yHigh=this.GetYFromData(data.High,false);
28740
+ this.DrawKRange.End=i;
28741
+
28742
+ if (ptMax.Value==null || ptMax.Value<data.High) //求最大值
28743
+ {
28744
+ ptMax.X=x;
28745
+ ptMax.Y=yHigh;
28746
+ ptMax.Value=data.High;
28747
+ ptMax.Align=j<xPointCount/2?'left':'right';
28748
+ }
28749
+
28750
+ if (ptMin.Value==null || ptMin.Value>data.Low) //求最小值
28751
+ {
28752
+ ptMin.X=x;
28753
+ ptMin.Y=yLow;
28754
+ ptMin.Value=data.Low;
28755
+ ptMin.Align=j<xPointCount/2?'left':'right';
28756
+ }
28757
+
28758
+ var xFixed=ToFixedPoint2(lineWidth,x);
28759
+
28760
+ if (preItem.Item)
28761
+ {
28762
+ this.Canvas.beginPath();
28763
+ var yFixed=ToFixedPoint2(lineWidth,preItem.Y);
28764
+
28765
+ this.Canvas.moveTo(preItem.X, yFixed);
28766
+ this.Canvas.lineTo(xFixed, yFixed);
28767
+ var prePrice=null;
28768
+ if (preItem.Item.Direction==1) prePrice=preItem.Item.Low;
28769
+ else if (preItem.Item.Direction==2) prePrice=preItem.Item.High;
28770
+
28771
+ if (data.Direction==1)
28772
+ {
28773
+ if (data.High<prePrice)
28774
+ {
28775
+ this.Canvas.lineTo(xFixed, yHigh);
28776
+ this.Canvas.strokeStyle=this.DownColor;
28777
+ this.Canvas.stroke();
28778
+ }
28779
+ else
28780
+ {
28781
+ var yPrePrice=this.GetYFromData(prePrice,false);
28782
+ this.Canvas.lineTo(xFixed, yPrePrice);
28783
+ this.Canvas.strokeStyle=this.DownColor;
28784
+ this.Canvas.stroke();
28785
+
28786
+ this.Canvas.beginPath();
28787
+ this.Canvas.moveTo(xFixed, yPrePrice);
28788
+ this.Canvas.lineTo(xFixed, yHigh);
28789
+ this.Canvas.strokeStyle=this.UpColor;
28790
+ this.Canvas.stroke();
28791
+ }
28792
+
28793
+ }
28794
+ else if (data.Direction==2)
28795
+ {
28796
+ if (data.Low>prePrice)
28797
+ {
28798
+ this.Canvas.lineTo(xFixed, yLow);
28799
+ this.Canvas.strokeStyle=this.DownColor; //阳线
28800
+ this.Canvas.stroke();
28801
+ }
28802
+ else
28803
+ {
28804
+ var yPrePrice=this.GetYFromData(prePrice,false);
28805
+ this.Canvas.lineTo(xFixed, yPrePrice);
28806
+ this.Canvas.strokeStyle=this.DownColor; //阳线
28807
+ this.Canvas.stroke();
28808
+
28809
+ this.Canvas.beginPath();
28810
+ this.Canvas.moveTo(xFixed, yPrePrice);
28811
+ this.Canvas.lineTo(xFixed, yLow);
28812
+ this.Canvas.strokeStyle=this.UpColor;
28813
+ this.Canvas.stroke();
28814
+ }
28815
+ }
28816
+
28817
+ }
28818
+ else
28819
+ {
28820
+ this.Canvas.beginPath();
28821
+ if (data.Direction==1)
28822
+ {
28823
+ this.Canvas.moveTo(xFixed, yLow);
28824
+ this.Canvas.lineTo(xFixed, yHigh);
28825
+ }
28826
+ else if (data.Direction==2)
28827
+ {
28828
+ this.Canvas.moveTo(xFixed, yHigh);
28829
+ this.Canvas.lineTo(xFixed, yLow);
28830
+ }
28831
+ this.Canvas.stroke();
28832
+ }
28833
+
28834
+ /*
28835
+ if (data.YClose<data.Close)
28836
+ {
28837
+ this.Canvas.strokeStyle=this.UpColor; //阳线
28838
+ this.Canvas.fillStyle=this.UpColor;
28839
+ }
28840
+ else if (data.YClose>data.Close)
28841
+ {
28842
+ this.Canvas.strokeStyle=this.DownColor; //阴线
28843
+ this.Canvas.fillStyle=this.DownColor;
28844
+ }
28845
+
28846
+ this.Canvas.beginPath();
28847
+ if (isHScreen)
28848
+ {
28849
+ this.Canvas.moveTo(yHigh,ToFixedPoint(x));
28850
+ this.Canvas.lineTo(yLow,ToFixedPoint(x));
28851
+ }
28852
+ else
28853
+ {
28854
+ this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yHigh);
28855
+ this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yLow);
28856
+ }
28857
+ this.Canvas.stroke();
28858
+ */
28859
+
28860
+ preItem.Item=data;
28861
+ preItem.X=x;
28862
+
28863
+ if (data.Direction==1) preItem.Y=yHigh; //上
28864
+ else if (data.Direction==2) preItem.Y=yLow //下
28865
+ }
28866
+
28867
+ this.PtMax=ptMax;
28868
+ this.PtMin=ptMin;
28869
+ }
28870
+
28652
28871
  this.DrawTrade=function() //交易系统
28653
28872
  {
28654
28873
  if (!this.TradeData) return;
@@ -29156,6 +29375,10 @@ function ChartKLine()
29156
29375
  {
29157
29376
  this.DrawHLCArea();
29158
29377
  }
29378
+ else if (this.DrawType==16)
29379
+ {
29380
+ this.DrawKagi();
29381
+ }
29159
29382
  else if (this.DrawType==17)
29160
29383
  {
29161
29384
  this.DrawOrderFlow_Style4();
@@ -52255,6 +52478,7 @@ function ChartCorssCursor()
52255
52478
 
52256
52479
  this.StringFormatY.Value=yValue;
52257
52480
  this.StringFormatY.FrameID=yValueExtend.FrameID;
52481
+ this.StringFormatY.RValue=yValueExtend.RightYValue; //右侧子坐标
52258
52482
  this.StringFormatY.Point={X:x, Y:y};
52259
52483
  this.StringFormatY.ClientPos=this.ClientPos;
52260
52484
 
@@ -53059,6 +53283,7 @@ function HQPriceStringFormat()
53059
53283
  {
53060
53284
  if (this.DataFormatType==1) this.Text=IFrameSplitOperator.FormatValueThousandsString(this.Value,defaultfloatPrecision);
53061
53285
  else this.Text=IFrameSplitOperator.FormatValueString(this.Value,defaultfloatPrecision,this.LanguageID);
53286
+ if (IFrameSplitOperator.IsNumber(this.RValue)) this.RText=IFrameSplitOperator.FormatValueString(this.RValue,defaultfloatPrecision,this.LanguageID);
53062
53287
  }
53063
53288
 
53064
53289
  if (this.GetEventCallback)
@@ -69696,20 +69921,24 @@ function RenkoCalculate()
69696
69921
  //
69697
69922
  function KagiCalculate()
69698
69923
  {
69699
- this.Symbol;
69700
- this.SourceData;
69701
- this.FloatPrecision=2; //品种小数位数
69702
- this.ATR={ Count:14 }; //使用ATR计算砖块大小
69924
+ this.newMethod=RenkoCalculate; //派生
69925
+ this.newMethod();
69926
+ delete this.newMethod;
69927
+
69928
+ this.ClassName="KagiCalculate";
69929
+ this.BrickSizeType=0;
69930
+ this.BrickSize=0.5; //固定大小
69703
69931
 
69704
69932
  this.RecvHistoryData=function(sourceData, option) //历史日线数据
69705
69933
  {
69706
69934
  this.Symbol=option.Symbol;
69707
69935
  this.SourceData=sourceData;
69708
69936
  this.FloatPrecision=GetfloatPrecision(this.Symbol);
69709
- return this.Calculate(sourceData);
69937
+ if (this.BrickSizeType==1) this.CalculateATR();
69938
+ return this.CalculateByClose(sourceData);
69710
69939
  }
69711
69940
 
69712
- this.Calculate=function(sourceData)
69941
+ this.CalculateByClose=function(sourceData)
69713
69942
  {
69714
69943
  var bindData=new ChartData();
69715
69944
  bindData.Data=[]
@@ -69720,13 +69949,139 @@ function KagiCalculate()
69720
69949
 
69721
69950
  if (!IFrameSplitOperator.IsNonEmptyArray(sourceData.Data)) return bindData;
69722
69951
 
69723
- var periodCount=this.ATR.Count;
69952
+ var brickSize=this.BrickSize;
69953
+ if (this.BrickSizeType==1) brickSize=this.ATR.BrickSize;
69724
69954
 
69725
69955
  var kItem=sourceData.Data[0];
69726
- this.LastData=HistoryData.Copy(kItem);
69727
- for(var i=1; i<sourceData.Data.length; )
69956
+ var kagiItem=HistoryData.Copy(kItem);
69957
+
69958
+ kagiItem.High=kagiItem.Low=kItem.Close;
69959
+ kagiItem.StartItem=kItem;
69960
+ kagiItem.Direction=0; //1 上 2=下
69961
+
69962
+ var T_MergeKData=function(dest, src)
69728
69963
  {
69964
+ dest.Vol+=src.Vol;
69965
+ dest.Amount+=src.Amount;
69729
69966
  }
69967
+
69968
+ var index=1;
69969
+ for( ;index<sourceData.Data.length;++index) //确定好方向
69970
+ {
69971
+ var kItem=sourceData.Data[index];
69972
+ if (kItem.Close>kagiItem.Close)
69973
+ {
69974
+ kagiItem.Direction=1;
69975
+ kagiItem.Close=kItem.Close;
69976
+ kagiItem.EndItem=kItem;
69977
+ kagiItem.High=kItem.Close;
69978
+ break;
69979
+ }
69980
+ else if (kItem.Close<kagiItem.Close)
69981
+ {
69982
+ kagiItem.Direction=2;
69983
+ kagiItem.Close=kItem.Close;
69984
+ kagiItem.EndItem=kItem;
69985
+ kagiItem.Low=kItem.Close;
69986
+ break;
69987
+ }
69988
+ }
69989
+
69990
+ var changeItem=null;
69991
+ for(++index; index<sourceData.Data.length;++index )
69992
+ {
69993
+ var kItem=sourceData.Data[index];
69994
+ if (kagiItem.Direction==1) //上
69995
+ {
69996
+ if (kItem.Close>=kagiItem.High)
69997
+ {
69998
+ kagiItem.Close=kItem.Close;
69999
+ kagiItem.High=kItem.Close;
70000
+ kagiItem.EndItem=kItem;
70001
+ changeItem=null;
70002
+ }
70003
+ else
70004
+ {
70005
+ if (!changeItem)
70006
+ {
70007
+ changeItem=HistoryData.Copy(kItem);
70008
+ changeItem.High=changeItem.Low=kItem.Close;
70009
+ }
70010
+ else
70011
+ {
70012
+ changeItem.Close=kItem.Close;
70013
+ if (changeItem.Low>kItem.Close) changeItem.Low=kItem.Close;
70014
+ }
70015
+
70016
+ if (Math.abs(changeItem.Low-kagiItem.High)>brickSize) //达到变盘点
70017
+ {
70018
+ bindData.Data.push(kagiItem);
70019
+
70020
+ var newItem=HistoryData.Copy(kItem);
70021
+ newItem.High=kagiItem.High;
70022
+ newItem.Low=kItem.Close;
70023
+ newItem.Direction=2; //1 上 2=下
70024
+ newItem.StartItem=kItem;
70025
+
70026
+ kagiItem=newItem;
70027
+ changeItem=null;
70028
+ }
70029
+ }
70030
+ }
70031
+ else if (kagiItem.Direction==2) //下
70032
+ {
70033
+ if (kItem.Close<=kagiItem.Low)
70034
+ {
70035
+ kagiItem.Close=kItem.Close;
70036
+ kagiItem.Low=kItem.Close;
70037
+ kagiItem.EndItem=kItem;
70038
+ }
70039
+ else
70040
+ {
70041
+ if (!changeItem)
70042
+ {
70043
+ changeItem=HistoryData.Copy(kItem);
70044
+ changeItem.High=changeItem.Low=kItem.Close;
70045
+ }
70046
+ else
70047
+ {
70048
+ changeItem.Close=kItem.Close;
70049
+ if (changeItem.High<kItem.Close) changeItem.High=kItem.Close;
70050
+ }
70051
+
70052
+ if (Math.abs(changeItem.High-kagiItem.Low)>brickSize) //达到变盘点
70053
+ {
70054
+ bindData.Data.push(kagiItem);
70055
+
70056
+ var newItem=HistoryData.Copy(kItem);
70057
+ newItem.High=kItem.Close;
70058
+ newItem.Low=kagiItem.Low;
70059
+ newItem.Direction=1; //1 上 2=下
70060
+ newItem.StartItem=kItem;
70061
+
70062
+ kagiItem=newItem;
70063
+ changeItem=null;
70064
+ }
70065
+ }
70066
+ }
70067
+ }
70068
+
70069
+ return bindData;
70070
+ }
70071
+
70072
+ //获取配置信息
70073
+ this.GetTitle=function()
70074
+ {
70075
+ if (this.BrickSizeType==1)
70076
+ {
70077
+ var text=`Kagi [ATR(${this.ATR.Count}), ${this.ATR.BrickSize}]`;
70078
+ }
70079
+ else
70080
+ {
70081
+ var text=`Kagi [Traditional]`;
70082
+ }
70083
+
70084
+ return text;
69730
70085
  }
69731
70086
  }
69732
70087
 
@@ -73334,12 +73689,17 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
73334
73689
  //删除某一个窗口的指标, bCallDestory=是否调用图形销毁函数
73335
73690
  this.DeleteIndexPaint=function(windowIndex, bCallDestroy)
73336
73691
  {
73337
- let paint=new Array(); //踢出当前窗口的指标画法
73338
- for(let i in this.ChartPaint)
73692
+ if (!this.Frame.SubFrame[windowIndex]) return;
73693
+ var subFrame=this.Frame.SubFrame[windowIndex].Frame;
73694
+ if (!subFrame) return;
73695
+
73696
+ var paint=[]; //踢出当前窗口的指标画法
73697
+ for(var i=0;i<this.ChartPaint.length; ++i)
73339
73698
  {
73340
- let item=this.ChartPaint[i];
73699
+ var item=this.ChartPaint[i];
73700
+ var bFind=(item.ChartFrame.Guid==subFrame.Guid || item.ChartFrame==subFrame);
73341
73701
 
73342
- if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)
73702
+ if (i==0 || !bFind)
73343
73703
  {
73344
73704
  paint.push(item);
73345
73705
  }
@@ -73352,7 +73712,7 @@ function KLineChartContainer(uielement,OffscreenElement, cacheElement)
73352
73712
  }
73353
73713
  }
73354
73714
 
73355
- var subFrame=this.Frame.SubFrame[windowIndex].Frame;
73715
+
73356
73716
  subFrame.YSpecificMaxMin=null; //清空指定最大最小值
73357
73717
  subFrame.IsLocked=false; //解除上锁
73358
73718
  subFrame.YSplitScale = null; //清空固定刻度
@@ -79086,6 +79446,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79086
79446
  }
79087
79447
 
79088
79448
  var subFrame=new SubFrameItem();
79449
+ frame.FrameData.SubFrameItem=subFrame;
79089
79450
  subFrame.Frame=frame;
79090
79451
  if (i==0)
79091
79452
  subFrame.Height=20;
@@ -79172,6 +79533,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79172
79533
  }
79173
79534
 
79174
79535
  var subFrame=new SubFrameItem();
79536
+ frame.FrameData.SubFrameItem=subFrame;
79175
79537
  subFrame.Frame=frame;
79176
79538
  subFrame.Height=10;
79177
79539
 
@@ -79243,12 +79605,16 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79243
79605
  //删除某一个窗口的指标
79244
79606
  this.DeleteIndexPaint=function(windowIndex,bCallDestroy)
79245
79607
  {
79246
- let paint=new Array(); //踢出当前窗口的指标画法
79247
- for(let i in this.ChartPaint)
79608
+ var subFrame=this.Frame.SubFrame[windowIndex].Frame;
79609
+ if (!subFrame) return;
79610
+
79611
+ var paint=[]; //踢出当前窗口的指标画法
79612
+ for(var i=0;i<this.ChartPaint.length;++i)
79248
79613
  {
79249
- let item=this.ChartPaint[i];
79614
+ var item=this.ChartPaint[i];
79615
+ var bFind=(item.ChartFrame.Guid==subFrame.Guid || item.ChartFrame==subFrame);
79250
79616
 
79251
- if (i==0 || item.ChartFrame!=this.Frame.SubFrame[windowIndex].Frame)
79617
+ if (i==0 || !bFind)
79252
79618
  {
79253
79619
  paint.push(item);
79254
79620
  }
@@ -79262,7 +79628,7 @@ function MinuteChartContainer(uielement,offscreenElement,cacheElement)
79262
79628
  }
79263
79629
 
79264
79630
  //清空指定最大最小值
79265
- var subFrame=this.Frame.SubFrame[windowIndex].Frame;
79631
+
79266
79632
  subFrame.YSpecificMaxMin=null;
79267
79633
  subFrame.IsLocked=false; //解除上锁
79268
79634
  subFrame.YSplitOperator.SplitType=subFrame.YSplitOperator.DefaultSplitType; //还原Y坐标分割模式
@@ -84585,6 +84951,7 @@ function KLineChartHScreenContainer(uielement)
84585
84951
  }
84586
84952
 
84587
84953
  var subFrame=new SubFrameItem();
84954
+ frame.FrameData.SubFrameItem=subFrame;
84588
84955
  subFrame.Frame=frame;
84589
84956
  if (i==0)
84590
84957
  subFrame.Height=20;
@@ -84729,6 +85096,7 @@ function MinuteChartHScreenContainer(uielement)
84729
85096
  }
84730
85097
 
84731
85098
  var subFrame=new SubFrameItem();
85099
+ frame.FrameData.SubFrameItem=subFrame;
84732
85100
  subFrame.Frame=frame;
84733
85101
  if (i==0)
84734
85102
  subFrame.Height=20;
@@ -134347,7 +134715,7 @@ function HQChartScriptWorker()
134347
134715
 
134348
134716
 
134349
134717
 
134350
- var HQCHART_VERSION="1.1.13143";
134718
+ var HQCHART_VERSION="1.1.13151";
134351
134719
 
134352
134720
  function PrintHQChartVersion()
134353
134721
  {