hqchart 1.1.14305 → 1.1.14309
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/lib/umychart.vue.js +191 -15
- package/package.json +1 -1
- package/src/jscommon/umychart.complier.js +12 -7
- package/src/jscommon/umychart.js +282 -24
- package/src/jscommon/umychart.uniapp.h5/umychart.uniapp.h5.js +295 -32
- package/src/jscommon/umychart.version.js +1 -1
- package/src/jscommon/umychart.vue/umychart.vue.js +295 -32
package/src/jscommon/umychart.js
CHANGED
|
@@ -41457,6 +41457,7 @@ function ChartDrawSVG()
|
|
|
41457
41457
|
this.Family;
|
|
41458
41458
|
this.TextFont;
|
|
41459
41459
|
this.Texts=[]; //[ { Index:, Value:, Symbol:, Text:, Size: } ] SVG:图标 Text:文字 Size:图标大小
|
|
41460
|
+
//this.Data; 存K线数据
|
|
41460
41461
|
this.IsHScreen=false; //是否横屏
|
|
41461
41462
|
this.IsDestroy=false; //是否已销毁
|
|
41462
41463
|
this.EnableTooltip=true;
|
|
@@ -41466,8 +41467,38 @@ function ChartDrawSVG()
|
|
|
41466
41467
|
|
|
41467
41468
|
this.AryDrawRect=[]; //已经绘制的区域
|
|
41468
41469
|
this.AutoYOffset=0;
|
|
41469
|
-
|
|
41470
|
-
|
|
41470
|
+
|
|
41471
|
+
this.BuildKeyCallback=null;
|
|
41472
|
+
this.MapCache=null; //key=date/date-time value={ Data:[] }
|
|
41473
|
+
|
|
41474
|
+
this.BuildKey=function(item)
|
|
41475
|
+
{
|
|
41476
|
+
if (this.BuildKeyCallback) return this.BuildKeyCallback(item);
|
|
41477
|
+
|
|
41478
|
+
if (IFrameSplitOperator.IsNumber(item.Time)) return `${item.Date}-${item.Time}`;
|
|
41479
|
+
else return `${item.Date}`;
|
|
41480
|
+
}
|
|
41481
|
+
|
|
41482
|
+
this.BuildCacheData=function()
|
|
41483
|
+
{
|
|
41484
|
+
var mapData=new Map();
|
|
41485
|
+
this.MapCache=mapData;
|
|
41486
|
+
for(var i=0; i<this.Texts.length;++i)
|
|
41487
|
+
{
|
|
41488
|
+
var item=this.Texts[i];
|
|
41489
|
+
var key=this.BuildKey(item);
|
|
41490
|
+
|
|
41491
|
+
if (mapData.has(key))
|
|
41492
|
+
{
|
|
41493
|
+
var mapItem=mapData.get(key);
|
|
41494
|
+
mapItem.Data.push(item);
|
|
41495
|
+
}
|
|
41496
|
+
else
|
|
41497
|
+
{
|
|
41498
|
+
mapData.set(key,{ Date:item.Date, Time:item.Time, Data:[item] });
|
|
41499
|
+
}
|
|
41500
|
+
}
|
|
41501
|
+
}
|
|
41471
41502
|
|
|
41472
41503
|
this.Draw=function()
|
|
41473
41504
|
{
|
|
@@ -41478,8 +41509,9 @@ function ChartDrawSVG()
|
|
|
41478
41509
|
if (!this.IsShow || this.ChartFrame.IsMinSize || !this.IsVisible) return;
|
|
41479
41510
|
if (this.IsShowIndexTitleOnly()) return;
|
|
41480
41511
|
if (this.IsHideScriptIndex()) return;
|
|
41512
|
+
if (!this.MapCache || this.MapCache.size<=0) return;
|
|
41481
41513
|
|
|
41482
|
-
this.
|
|
41514
|
+
this.DrawSVGV2();
|
|
41483
41515
|
}
|
|
41484
41516
|
|
|
41485
41517
|
this.DrawDetail=function(rtSVG, data, svgItem)
|
|
@@ -41708,6 +41740,223 @@ function ChartDrawSVG()
|
|
|
41708
41740
|
return false;
|
|
41709
41741
|
}
|
|
41710
41742
|
|
|
41743
|
+
this.GetKValue=function(kItem, valueName)
|
|
41744
|
+
{
|
|
41745
|
+
switch(valueName)
|
|
41746
|
+
{
|
|
41747
|
+
case "HIGH":
|
|
41748
|
+
case "H":
|
|
41749
|
+
return kItem.High;
|
|
41750
|
+
case "L":
|
|
41751
|
+
case "LOW":
|
|
41752
|
+
return kItem.Low;
|
|
41753
|
+
case "C":
|
|
41754
|
+
case "CLOSE":
|
|
41755
|
+
return kItem.Close;
|
|
41756
|
+
case "O":
|
|
41757
|
+
case "OPEN":
|
|
41758
|
+
return KItem.Open;
|
|
41759
|
+
default:
|
|
41760
|
+
return null;
|
|
41761
|
+
}
|
|
41762
|
+
}
|
|
41763
|
+
|
|
41764
|
+
this.DrawSVGV2=function()
|
|
41765
|
+
{
|
|
41766
|
+
if (!this.IsShow || this.ChartFrame.IsMinSize) return;
|
|
41767
|
+
if (!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return;
|
|
41768
|
+
if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return;
|
|
41769
|
+
if (!this.Family) return;
|
|
41770
|
+
|
|
41771
|
+
this.IsHScreen=(this.ChartFrame.IsHScreen===true);
|
|
41772
|
+
if (this.IsHScreen) return;
|
|
41773
|
+
|
|
41774
|
+
var xPointCount=this.ChartFrame.XPointCount;
|
|
41775
|
+
var dataWidth=this.ChartFrame.DataWidth;
|
|
41776
|
+
var distanceWidth=this.ChartFrame.DistanceWidth;
|
|
41777
|
+
var isMinute=this.IsMinuteFrame();
|
|
41778
|
+
var border=this.GetBorder();
|
|
41779
|
+
var pixelRatio = GetDevicePixelRatio();
|
|
41780
|
+
|
|
41781
|
+
if (this.IsHScreen)
|
|
41782
|
+
{
|
|
41783
|
+
|
|
41784
|
+
}
|
|
41785
|
+
else
|
|
41786
|
+
{
|
|
41787
|
+
var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;
|
|
41788
|
+
var chartright=border.RightEx;
|
|
41789
|
+
var chartLeft=border.LeftEx;
|
|
41790
|
+
var top=border.TopEx;
|
|
41791
|
+
var bottom=border.BottomEx;
|
|
41792
|
+
}
|
|
41793
|
+
|
|
41794
|
+
var x,y,price;
|
|
41795
|
+
for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
|
|
41796
|
+
{
|
|
41797
|
+
var kItem=this.Data.Data[i];
|
|
41798
|
+
var key=this.BuildKey(kItem);
|
|
41799
|
+
if (!this.MapCache.has(key)) continue;
|
|
41800
|
+
var mapItem=this.MapCache.get(key);
|
|
41801
|
+
|
|
41802
|
+
if (isMinute)
|
|
41803
|
+
{
|
|
41804
|
+
x=this.ChartFrame.GetXFromIndex(j);
|
|
41805
|
+
}
|
|
41806
|
+
else
|
|
41807
|
+
{
|
|
41808
|
+
var left=xOffset;
|
|
41809
|
+
var right=xOffset+dataWidth;
|
|
41810
|
+
if (right>chartright) break;
|
|
41811
|
+
x=left+(right-left)/2;
|
|
41812
|
+
}
|
|
41813
|
+
|
|
41814
|
+
for(var k=0;k<mapItem.Data.length;++k)
|
|
41815
|
+
{
|
|
41816
|
+
var item=mapItem.Data[k];
|
|
41817
|
+
|
|
41818
|
+
if (item.Value=="Top") y=top;
|
|
41819
|
+
else if (item.Value=="Bottom") y=bottom;
|
|
41820
|
+
else
|
|
41821
|
+
{
|
|
41822
|
+
if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
|
|
41823
|
+
else price=item.Value;
|
|
41824
|
+
|
|
41825
|
+
y=this.ChartFrame.GetYFromData(price, false);
|
|
41826
|
+
}
|
|
41827
|
+
if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
|
|
41828
|
+
|
|
41829
|
+
var svgItem=item.SVG;
|
|
41830
|
+
if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
|
|
41831
|
+
|
|
41832
|
+
if (this.AutoPosition)
|
|
41833
|
+
{
|
|
41834
|
+
var pt={ X:x, Y:y };
|
|
41835
|
+
this.CalculateShowPosition(item, pt); //重新计算位置
|
|
41836
|
+
x=pt.X;
|
|
41837
|
+
y=pt.Y;
|
|
41838
|
+
}
|
|
41839
|
+
|
|
41840
|
+
var fontSVG=`${svgItem.Size}px ${this.Family}`;
|
|
41841
|
+
this.Canvas.font=fontSVG;
|
|
41842
|
+
var halfSize=svgItem.Size/2;
|
|
41843
|
+
var textBaseline='bottom';
|
|
41844
|
+
var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
|
|
41845
|
+
if (svgItem.VAlign===0)
|
|
41846
|
+
{
|
|
41847
|
+
textBaseline="top";
|
|
41848
|
+
rtSVG.Top=y;
|
|
41849
|
+
rtSVG.Bottom=rtSVG.Top+svgItem.Size;
|
|
41850
|
+
}
|
|
41851
|
+
else if (svgItem.VAlign===1)
|
|
41852
|
+
{
|
|
41853
|
+
textBaseline='middle';
|
|
41854
|
+
rtSVG.Top=y-svgItem.Size/2;
|
|
41855
|
+
rtSVG.Bottom=rtSVG.Top+svgItem.Size;
|
|
41856
|
+
}
|
|
41857
|
+
|
|
41858
|
+
if (rtSVG.Top<0)
|
|
41859
|
+
{
|
|
41860
|
+
rtSVG.Top=0;
|
|
41861
|
+
rtSVG.Bottom=svgItem.Size;
|
|
41862
|
+
y=rtSVG.Bottom;
|
|
41863
|
+
}
|
|
41864
|
+
|
|
41865
|
+
this.Canvas.textBaseline=textBaseline;
|
|
41866
|
+
this.Canvas.textAlign='center';
|
|
41867
|
+
this.Canvas.fillStyle = svgItem.Color;
|
|
41868
|
+
this.Canvas.fillText(svgItem.Symbol, x, y);
|
|
41869
|
+
|
|
41870
|
+
this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
|
|
41871
|
+
|
|
41872
|
+
if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
|
|
41873
|
+
|
|
41874
|
+
//文字
|
|
41875
|
+
if (item.Text && item.Text.Content && this.TextFont)
|
|
41876
|
+
{
|
|
41877
|
+
var textItem=item.Text;
|
|
41878
|
+
this.Canvas.font=this.TextFont;
|
|
41879
|
+
this.Canvas.fillStyle=textItem.Color;
|
|
41880
|
+
var yText=y;
|
|
41881
|
+
if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
|
|
41882
|
+
this.Canvas.fillText(textItem.Content, x, yText);
|
|
41883
|
+
}
|
|
41884
|
+
|
|
41885
|
+
if (item.Detail)
|
|
41886
|
+
{
|
|
41887
|
+
this.DrawDetail(rtSVG,item.Detail, item);
|
|
41888
|
+
}
|
|
41889
|
+
|
|
41890
|
+
//连线
|
|
41891
|
+
if (item.Line)
|
|
41892
|
+
{
|
|
41893
|
+
var lineItem=item.Line;
|
|
41894
|
+
var price=null, yPrice=null;
|
|
41895
|
+
if (lineItem.Value=="Bottom")
|
|
41896
|
+
{
|
|
41897
|
+
yPrice=bottom;
|
|
41898
|
+
}
|
|
41899
|
+
else if (lineItem.Value=="Top")
|
|
41900
|
+
{
|
|
41901
|
+
yPrice=top;
|
|
41902
|
+
}
|
|
41903
|
+
else
|
|
41904
|
+
{
|
|
41905
|
+
if (IFrameSplitOperator.IsString(lineItem.Value))
|
|
41906
|
+
price=this.GetKValue(kItem,lineItem.Value);
|
|
41907
|
+
|
|
41908
|
+
if (!IFrameSplitOperator.IsNumber(price)) continue;
|
|
41909
|
+
yPrice=this.ChartFrame.GetYFromData(price);
|
|
41910
|
+
}
|
|
41911
|
+
|
|
41912
|
+
if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
|
|
41913
|
+
|
|
41914
|
+
var yText;
|
|
41915
|
+
if (yPrice<rtSVG.Top)
|
|
41916
|
+
{
|
|
41917
|
+
yText=rtSVG.Top;
|
|
41918
|
+
if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
|
|
41919
|
+
{
|
|
41920
|
+
//yPrice+=lineItem.Blank;
|
|
41921
|
+
yText-=lineItem.SVGBlank;
|
|
41922
|
+
}
|
|
41923
|
+
}
|
|
41924
|
+
else
|
|
41925
|
+
{
|
|
41926
|
+
yText=rtSVG.Bottom;
|
|
41927
|
+
if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
|
|
41928
|
+
{
|
|
41929
|
+
//yPrice-=lineItem.Blank;
|
|
41930
|
+
yText+=lineItem.SVGBlank;
|
|
41931
|
+
}
|
|
41932
|
+
}
|
|
41933
|
+
|
|
41934
|
+
if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
|
|
41935
|
+
var lineWidth=1*pixelRatio;
|
|
41936
|
+
if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
|
|
41937
|
+
this.Canvas.lineWidth=lineWidth; //线宽
|
|
41938
|
+
this.Canvas.strokeStyle = lineItem.Color;
|
|
41939
|
+
this.Canvas.beginPath();
|
|
41940
|
+
|
|
41941
|
+
if (this.IsHScreen)
|
|
41942
|
+
{
|
|
41943
|
+
this.Canvas.moveTo(yText, ToFixedPoint(x));
|
|
41944
|
+
this.Canvas.lineTo(yPrice,ToFixedPoint(x));
|
|
41945
|
+
}
|
|
41946
|
+
else
|
|
41947
|
+
{
|
|
41948
|
+
this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
|
|
41949
|
+
this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
|
|
41950
|
+
}
|
|
41951
|
+
|
|
41952
|
+
this.Canvas.stroke();
|
|
41953
|
+
this.Canvas.setLineDash([]);
|
|
41954
|
+
}
|
|
41955
|
+
}
|
|
41956
|
+
}
|
|
41957
|
+
}
|
|
41958
|
+
|
|
41959
|
+
/*
|
|
41711
41960
|
this.DrawSVG=function()
|
|
41712
41961
|
{
|
|
41713
41962
|
if (!this.IsShow || this.ChartFrame.IsMinSize) return;
|
|
@@ -41882,26 +42131,35 @@ function ChartDrawSVG()
|
|
|
41882
42131
|
}
|
|
41883
42132
|
}
|
|
41884
42133
|
}
|
|
42134
|
+
*/
|
|
41885
42135
|
|
|
41886
42136
|
this.GetMaxMin=function()
|
|
41887
42137
|
{
|
|
42138
|
+
this.IsHScreen=(this.ChartFrame.IsHScreen===true);
|
|
41888
42139
|
var range={ Min:null, Max:null };
|
|
42140
|
+
if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
|
|
42141
|
+
if (!this.MapCache || this.MapCache.size<=0) return;
|
|
41889
42142
|
var xPointCount=this.ChartFrame.XPointCount;
|
|
41890
|
-
var start=this.Data.DataOffset;
|
|
41891
|
-
var end=start+xPointCount;
|
|
41892
|
-
if (!IFrameSplitOperator.IsNonEmptyArray(this.Texts)) return range;
|
|
41893
42143
|
|
|
41894
|
-
for(var i=0;
|
|
42144
|
+
for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
|
|
41895
42145
|
{
|
|
41896
|
-
var
|
|
41897
|
-
|
|
41898
|
-
if (
|
|
42146
|
+
var kItem=this.Data.Data[i];
|
|
42147
|
+
var key=this.BuildKey(kItem);
|
|
42148
|
+
if (!this.MapCache.has(key)) continue;
|
|
42149
|
+
var mapItem=this.MapCache.get(key);
|
|
42150
|
+
if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
|
|
42151
|
+
|
|
42152
|
+
for(k=0;k<mapItem.Data.length;++k)
|
|
41899
42153
|
{
|
|
41900
|
-
|
|
41901
|
-
|
|
41902
|
-
|
|
41903
|
-
if (
|
|
41904
|
-
|
|
42154
|
+
var item=mapItem.Data[k];
|
|
42155
|
+
var value=item.Value;
|
|
42156
|
+
if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
|
|
42157
|
+
if (!IFrameSplitOperator.IsNumber(value)) continue;
|
|
42158
|
+
|
|
42159
|
+
if (range.Max==null) range.Max=value;
|
|
42160
|
+
else if (range.Max<value) range.Max=value;
|
|
42161
|
+
if (range.Min==null) range.Min=value;
|
|
42162
|
+
else if (range.Min>value) range.Min=value;
|
|
41905
42163
|
}
|
|
41906
42164
|
}
|
|
41907
42165
|
|
|
@@ -41917,11 +42175,10 @@ function ChartDrawSVG()
|
|
|
41917
42175
|
var item=this.TooltipRect[i];
|
|
41918
42176
|
if (!item.Rect) continue;
|
|
41919
42177
|
var rect=item.Rect;
|
|
41920
|
-
|
|
41921
|
-
|
|
41922
|
-
if (this.Canvas.isPointInPath(x,y))
|
|
42178
|
+
|
|
42179
|
+
if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
|
|
41923
42180
|
{
|
|
41924
|
-
var data=
|
|
42181
|
+
var data=item.Item;
|
|
41925
42182
|
JSConsole.Chart.Log('[ChartDrawSVG::GetTooltipData] svg icon.', item);
|
|
41926
42183
|
tooltip.Data={ Rect:item.Rect, Item:data, Index:item.Index };
|
|
41927
42184
|
tooltip.ChartPaint=this;
|
|
@@ -87802,7 +88059,7 @@ MinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)
|
|
|
87802
88059
|
return aryMinuteData;
|
|
87803
88060
|
}
|
|
87804
88061
|
|
|
87805
|
-
//分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 ]
|
|
88062
|
+
//分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 12=持仓 ]
|
|
87806
88063
|
MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
|
|
87807
88064
|
{
|
|
87808
88065
|
if (!data || !data.stock) return null;
|
|
@@ -87840,16 +88097,17 @@ MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
|
|
|
87840
88097
|
if (IFrameSplitOperator.IsNumber(jsData[9])) item.Increase=jsData[9];
|
|
87841
88098
|
if (IFrameSplitOperator.IsNumber(jsData[10])) item.Risefall=jsData[10];
|
|
87842
88099
|
if (IFrameSplitOperator.IsNumber(jsData[11])) item.Lead=jsData[11];
|
|
87843
|
-
|
|
88100
|
+
if (IFrameSplitOperator.IsNumber(jsData[12])) item.Position=jsData[12];
|
|
87844
88101
|
|
|
87845
88102
|
if (jsData[extendDataIndex]) item.ExtendData=jsData[extendDataIndex];
|
|
87846
|
-
|
|
88103
|
+
|
|
88104
|
+
item.DateTime=`${item.Date} ${item.Time}`;
|
|
87847
88105
|
|
|
87848
88106
|
if (IFrameSplitOperator.IsNumber(minuteData.YClose) && item.Close)
|
|
87849
|
-
item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100;
|
|
88107
|
+
item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
|
|
87850
88108
|
|
|
87851
88109
|
if (isFutures && minuteData.YClearing && item.Close)
|
|
87852
|
-
|
|
88110
|
+
item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
|
|
87853
88111
|
|
|
87854
88112
|
|
|
87855
88113
|
minuteData.Data.push(item);
|