hqchart 1.1.14305 → 1.1.14307
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 +280 -24
- package/src/jscommon/umychart.uniapp.h5/umychart.uniapp.h5.js +293 -32
- package/src/jscommon/umychart.version.js +1 -1
- package/src/jscommon/umychart.vue/umychart.vue.js +293 -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,221 @@ 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
|
+
}
|
|
41791
|
+
|
|
41792
|
+
var x,y,price;
|
|
41793
|
+
for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length && j<xPointCount;++i,++j,xOffset+=(dataWidth+distanceWidth))
|
|
41794
|
+
{
|
|
41795
|
+
var kItem=this.Data.Data[i];
|
|
41796
|
+
var key=this.BuildKey(kItem);
|
|
41797
|
+
if (!this.MapCache.has(key)) continue;
|
|
41798
|
+
var mapItem=this.MapCache.get(key);
|
|
41799
|
+
|
|
41800
|
+
if (isMinute)
|
|
41801
|
+
{
|
|
41802
|
+
x=this.ChartFrame.GetXFromIndex(j);
|
|
41803
|
+
}
|
|
41804
|
+
else
|
|
41805
|
+
{
|
|
41806
|
+
var left=xOffset;
|
|
41807
|
+
var right=xOffset+dataWidth;
|
|
41808
|
+
if (right>chartright) break;
|
|
41809
|
+
x=left+(right-left)/2;
|
|
41810
|
+
}
|
|
41811
|
+
|
|
41812
|
+
for(var j=0;j<mapItem.Data.length;++j)
|
|
41813
|
+
{
|
|
41814
|
+
var item=mapItem.Data[j];
|
|
41815
|
+
|
|
41816
|
+
if (item.Value=="Top") y=top;
|
|
41817
|
+
else if (item.Value=="Bottom") y=bottom;
|
|
41818
|
+
else
|
|
41819
|
+
{
|
|
41820
|
+
if (IFrameSplitOperator.IsString(item.Value)) price=this.GetKValue(kItem,item.Value);
|
|
41821
|
+
else price=item.Value;
|
|
41822
|
+
|
|
41823
|
+
y=this.ChartFrame.GetYFromData(price, false);
|
|
41824
|
+
}
|
|
41825
|
+
if (IFrameSplitOperator.IsNumber(item.YOffset)) y+=item.YOffset; //Y轴偏移
|
|
41826
|
+
|
|
41827
|
+
var svgItem=item.SVG;
|
|
41828
|
+
if (IFrameSplitOperator.IsNumber(svgItem.YOffset)) y+=svgItem.YOffset;
|
|
41829
|
+
|
|
41830
|
+
if (this.AutoPosition)
|
|
41831
|
+
{
|
|
41832
|
+
var pt={ X:x, Y:y };
|
|
41833
|
+
this.CalculateShowPosition(item, pt); //重新计算位置
|
|
41834
|
+
x=pt.X;
|
|
41835
|
+
y=pt.Y;
|
|
41836
|
+
}
|
|
41837
|
+
|
|
41838
|
+
var fontSVG=`${svgItem.Size}px ${this.Family}`;
|
|
41839
|
+
this.Canvas.font=fontSVG;
|
|
41840
|
+
var halfSize=svgItem.Size/2;
|
|
41841
|
+
var textBaseline='bottom';
|
|
41842
|
+
var rtSVG={ Left:x-halfSize, Right:x+halfSize, Top:y-svgItem.Size, Bottom:y, Height:svgItem.Size, Width:svgItem.Size };
|
|
41843
|
+
if (svgItem.VAlign===0)
|
|
41844
|
+
{
|
|
41845
|
+
textBaseline="top";
|
|
41846
|
+
rtSVG.Top=y;
|
|
41847
|
+
rtSVG.Bottom=rtSVG.Top+svgItem.Size;
|
|
41848
|
+
}
|
|
41849
|
+
else if (svgItem.VAlign===1)
|
|
41850
|
+
{
|
|
41851
|
+
textBaseline='middle';
|
|
41852
|
+
rtSVG.Top=y-svgItem.Size/2;
|
|
41853
|
+
rtSVG.Bottom=rtSVG.Top+svgItem.Size;
|
|
41854
|
+
}
|
|
41855
|
+
|
|
41856
|
+
if (rtSVG.Top<0)
|
|
41857
|
+
{
|
|
41858
|
+
rtSVG.Top=0;
|
|
41859
|
+
rtSVG.Bottom=svgItem.Size;
|
|
41860
|
+
y=rtSVG.Bottom;
|
|
41861
|
+
}
|
|
41862
|
+
|
|
41863
|
+
this.Canvas.textBaseline=textBaseline;
|
|
41864
|
+
this.Canvas.textAlign='center';
|
|
41865
|
+
this.Canvas.fillStyle = svgItem.Color;
|
|
41866
|
+
this.Canvas.fillText(svgItem.Symbol, x, y);
|
|
41867
|
+
|
|
41868
|
+
this.AryDrawRect.push( {Left:rtSVG.Left, Top:rtSVG.Top, Right:rtSVG.Right, Bottom:rtSVG.Bottom, Type:"SVG", Data:item } );
|
|
41869
|
+
|
|
41870
|
+
if (this.EnableTooltip) this.TooltipRect.push({ Rect:rtSVG, Index:i, Item:item });
|
|
41871
|
+
|
|
41872
|
+
//文字
|
|
41873
|
+
if (item.Text && item.Text.Content && this.TextFont)
|
|
41874
|
+
{
|
|
41875
|
+
var textItem=item.Text;
|
|
41876
|
+
this.Canvas.font=this.TextFont;
|
|
41877
|
+
this.Canvas.fillStyle=textItem.Color;
|
|
41878
|
+
var yText=y;
|
|
41879
|
+
if (IFrameSplitOperator.IsNumber(textItem.YOffset)) yText+=textItem.YOffset;
|
|
41880
|
+
this.Canvas.fillText(textItem.Content, x, yText);
|
|
41881
|
+
}
|
|
41882
|
+
|
|
41883
|
+
if (item.Detail)
|
|
41884
|
+
{
|
|
41885
|
+
this.DrawDetail(rtSVG,item.Detail, item);
|
|
41886
|
+
}
|
|
41887
|
+
|
|
41888
|
+
//连线
|
|
41889
|
+
if (item.Line)
|
|
41890
|
+
{
|
|
41891
|
+
var lineItem=item.Line;
|
|
41892
|
+
var price=null, yPrice=null;
|
|
41893
|
+
if (lineItem.Value=="Bottom")
|
|
41894
|
+
{
|
|
41895
|
+
yPrice=bottom;
|
|
41896
|
+
}
|
|
41897
|
+
else if (lineItem.Value=="Top")
|
|
41898
|
+
{
|
|
41899
|
+
yPrice=top;
|
|
41900
|
+
}
|
|
41901
|
+
else
|
|
41902
|
+
{
|
|
41903
|
+
if (IFrameSplitOperator.IsString(lineItem.Value))
|
|
41904
|
+
price=this.GetKValue(kItem,lineItem.Value);
|
|
41905
|
+
|
|
41906
|
+
if (!IFrameSplitOperator.IsNumber(price)) continue;
|
|
41907
|
+
yPrice=this.ChartFrame.GetYFromData(price);
|
|
41908
|
+
}
|
|
41909
|
+
|
|
41910
|
+
if (yPrice>=rtSVG.Top && yPrice<=rtSVG.Bottom) continue;
|
|
41911
|
+
|
|
41912
|
+
var yText;
|
|
41913
|
+
if (yPrice<rtSVG.Top)
|
|
41914
|
+
{
|
|
41915
|
+
yText=rtSVG.Top;
|
|
41916
|
+
if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
|
|
41917
|
+
{
|
|
41918
|
+
//yPrice+=lineItem.Blank;
|
|
41919
|
+
yText-=lineItem.SVGBlank;
|
|
41920
|
+
}
|
|
41921
|
+
}
|
|
41922
|
+
else
|
|
41923
|
+
{
|
|
41924
|
+
yText=rtSVG.Bottom;
|
|
41925
|
+
if (IFrameSplitOperator.IsNumber(lineItem.SVGBlank))
|
|
41926
|
+
{
|
|
41927
|
+
//yPrice-=lineItem.Blank;
|
|
41928
|
+
yText+=lineItem.SVGBlank;
|
|
41929
|
+
}
|
|
41930
|
+
}
|
|
41931
|
+
|
|
41932
|
+
if (lineItem.Dash) this.Canvas.setLineDash(lineItem.Dash); //虚线
|
|
41933
|
+
var lineWidth=1*pixelRatio;
|
|
41934
|
+
if (lineItem.Width>0) lineWidth=lineItem.Width*pixelRatio;
|
|
41935
|
+
this.Canvas.lineWidth=lineWidth; //线宽
|
|
41936
|
+
this.Canvas.strokeStyle = lineItem.Color;
|
|
41937
|
+
this.Canvas.beginPath();
|
|
41938
|
+
|
|
41939
|
+
if (this.IsHScreen)
|
|
41940
|
+
{
|
|
41941
|
+
this.Canvas.moveTo(yText, ToFixedPoint(x));
|
|
41942
|
+
this.Canvas.lineTo(yPrice,ToFixedPoint(x));
|
|
41943
|
+
}
|
|
41944
|
+
else
|
|
41945
|
+
{
|
|
41946
|
+
this.Canvas.moveTo(ToFixedPoint2(lineWidth,x),yText);
|
|
41947
|
+
this.Canvas.lineTo(ToFixedPoint2(lineWidth,x),yPrice);
|
|
41948
|
+
}
|
|
41949
|
+
|
|
41950
|
+
this.Canvas.stroke();
|
|
41951
|
+
this.Canvas.setLineDash([]);
|
|
41952
|
+
}
|
|
41953
|
+
}
|
|
41954
|
+
}
|
|
41955
|
+
}
|
|
41956
|
+
|
|
41957
|
+
/*
|
|
41711
41958
|
this.DrawSVG=function()
|
|
41712
41959
|
{
|
|
41713
41960
|
if (!this.IsShow || this.ChartFrame.IsMinSize) return;
|
|
@@ -41882,26 +42129,35 @@ function ChartDrawSVG()
|
|
|
41882
42129
|
}
|
|
41883
42130
|
}
|
|
41884
42131
|
}
|
|
42132
|
+
*/
|
|
41885
42133
|
|
|
41886
42134
|
this.GetMaxMin=function()
|
|
41887
42135
|
{
|
|
42136
|
+
this.IsHScreen=(this.ChartFrame.IsHScreen===true);
|
|
41888
42137
|
var range={ Min:null, Max:null };
|
|
42138
|
+
if(!this.Data || !IFrameSplitOperator.IsNonEmptyArray(this.Data.Data)) return range;
|
|
42139
|
+
if (!this.MapCache || this.MapCache.size<=0) return;
|
|
41889
42140
|
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
42141
|
|
|
41894
|
-
for(var i=0;
|
|
42142
|
+
for(var i=this.Data.DataOffset,j=0, k=0;i<this.Data.Data.length && j<xPointCount;++i,++j)
|
|
41895
42143
|
{
|
|
41896
|
-
var
|
|
41897
|
-
|
|
41898
|
-
if (
|
|
42144
|
+
var kItem=this.Data.Data[i];
|
|
42145
|
+
var key=this.BuildKey(kItem);
|
|
42146
|
+
if (!this.MapCache.has(key)) continue;
|
|
42147
|
+
var mapItem=this.MapCache.get(key);
|
|
42148
|
+
if (!IFrameSplitOperator.IsNonEmptyArray(mapItem.Data)) continue;
|
|
42149
|
+
|
|
42150
|
+
for(k=0;k<mapItem.Data.length;++k)
|
|
41899
42151
|
{
|
|
41900
|
-
|
|
41901
|
-
|
|
41902
|
-
|
|
41903
|
-
if (
|
|
41904
|
-
|
|
42152
|
+
var item=mapItem.Data[k];
|
|
42153
|
+
var value=item.Value;
|
|
42154
|
+
if (IFrameSplitOperator.IsString(item.Value)) value=this.GetKValue(kItem,item.Value);
|
|
42155
|
+
if (!IFrameSplitOperator.IsNumber(value)) continue;
|
|
42156
|
+
|
|
42157
|
+
if (range.Max==null) range.Max=value;
|
|
42158
|
+
else if (range.Max<value) range.Max=value;
|
|
42159
|
+
if (range.Min==null) range.Min=value;
|
|
42160
|
+
else if (range.Min>value) range.Min=value;
|
|
41905
42161
|
}
|
|
41906
42162
|
}
|
|
41907
42163
|
|
|
@@ -41917,11 +42173,10 @@ function ChartDrawSVG()
|
|
|
41917
42173
|
var item=this.TooltipRect[i];
|
|
41918
42174
|
if (!item.Rect) continue;
|
|
41919
42175
|
var rect=item.Rect;
|
|
41920
|
-
|
|
41921
|
-
|
|
41922
|
-
if (this.Canvas.isPointInPath(x,y))
|
|
42176
|
+
|
|
42177
|
+
if (x>=rect.Left && x<=rect.Right && y>=rect.Top && y<=rect.Bottom)
|
|
41923
42178
|
{
|
|
41924
|
-
var data=
|
|
42179
|
+
var data=item.Item;
|
|
41925
42180
|
JSConsole.Chart.Log('[ChartDrawSVG::GetTooltipData] svg icon.', item);
|
|
41926
42181
|
tooltip.Data={ Rect:item.Rect, Item:data, Index:item.Index };
|
|
41927
42182
|
tooltip.ChartPaint=this;
|
|
@@ -87802,7 +88057,7 @@ MinuteChartContainer.JsonDataToMinuteData=function(data,isBeforeData)
|
|
|
87802
88057
|
return aryMinuteData;
|
|
87803
88058
|
}
|
|
87804
88059
|
|
|
87805
|
-
//分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 ]
|
|
88060
|
+
//分钟增量数据 stock: [ { date:, yclose:, yclearing: , minute:[ [],]} 0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌 11=领先指标 12=持仓 ]
|
|
87806
88061
|
MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
|
|
87807
88062
|
{
|
|
87808
88063
|
if (!data || !data.stock) return null;
|
|
@@ -87840,16 +88095,17 @@ MinuteChartContainer.JsonDataToUpdateMinuteData=function(data)
|
|
|
87840
88095
|
if (IFrameSplitOperator.IsNumber(jsData[9])) item.Increase=jsData[9];
|
|
87841
88096
|
if (IFrameSplitOperator.IsNumber(jsData[10])) item.Risefall=jsData[10];
|
|
87842
88097
|
if (IFrameSplitOperator.IsNumber(jsData[11])) item.Lead=jsData[11];
|
|
87843
|
-
|
|
88098
|
+
if (IFrameSplitOperator.IsNumber(jsData[12])) item.Position=jsData[12];
|
|
87844
88099
|
|
|
87845
88100
|
if (jsData[extendDataIndex]) item.ExtendData=jsData[extendDataIndex];
|
|
87846
|
-
|
|
88101
|
+
|
|
88102
|
+
item.DateTime=`${item.Date} ${item.Time}`;
|
|
87847
88103
|
|
|
87848
88104
|
if (IFrameSplitOperator.IsNumber(minuteData.YClose) && item.Close)
|
|
87849
|
-
item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100;
|
|
88105
|
+
item.Increase=(item.Close-minuteData.YClose)/minuteData.YClose*100; //涨幅 (最新价格-昨收)/昨收*100;
|
|
87850
88106
|
|
|
87851
88107
|
if (isFutures && minuteData.YClearing && item.Close)
|
|
87852
|
-
|
|
88108
|
+
item.Increase=(item.Close-minuteData.YClearing)/minuteData.YClearing*100; //涨幅 (最新价格-昨结算价)/昨结算价*100;
|
|
87853
88109
|
|
|
87854
88110
|
|
|
87855
88111
|
minuteData.Data.push(item);
|