hqchart 1.1.11279 → 1.1.11289

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.
@@ -1565,7 +1565,8 @@ CHANGE_INDEX:4,//换指标
1565
1565
  CLOSE_INDEX_WINDOW:5,//关闭指标窗口
1566
1566
  OVERLAY_INDEX:6,//叠加指标
1567
1567
  MODIFY_OVERLAY_INDEX_PARAM:7,//改叠加指标参数
1568
- CHIP_DEFULT:8,CHIP_LONG:9,CHIP_RECENT:10};var JSCHART_DATA_FIELD_ID={KLINE_ORDERFLOW:99,MINUTE_MULTI_DAY_EXTENDDATA:21//多日分时图扩展数据序号
1568
+ CHIP_DEFULT:8,CHIP_LONG:9,CHIP_RECENT:10};var JSCHART_DATA_FIELD_ID={KLINE_ORDERFLOW:99,MINUTE_MULTI_DAY_EXTENDDATA:21,//多日分时图扩展数据序号
1569
+ KLINE_COLOR_DATA:66//K线自定义颜色数据
1569
1570
  };function PhoneDBClick(){this.Start=[];this.Clear=function(){this.Start=[];};this.AddTouchStart=function(x,y,time){if(this.Start.length>0){var item=this.Start[this.Start.length-1];var spanTime=time-item.Time;if(spanTime>0&&spanTime<300){this.Start.push({X:x,Y:y,Time:time});}else{this.Start=[];}}else{this.Start.push({X:x,Y:y,Time:time});}};this.IsVaildDBClick=function(){if(this.Start.length==2)return true;return false;};this.AddTouchEnd=function(time){if(this.Start.length<=0)return;var item=this.Start[this.Start.length-1];var spanTime=time-item.Time;if(spanTime>=0&&spanTime<150){}else{this.Start=[];}};}/*
1570
1571
  图形控件
1571
1572
  */function JSChartContainer(uielement,OffscreenElement){var _this3=this;this.ClassName='JSChartContainer';var _self=this;this.Frame;//框架画法
@@ -1754,7 +1755,8 @@ if(option&&option.ParentFunction=='OnMouseMove'&&option.Point){ptPosition=this.F
1754
1755
  var barrageData=null;for(var i=0;i<this.ExtendChartPaint.length;++i){var item=this.ExtendChartPaint[i];if(item.ClassName==='BarragePaint'){bCreated=true;barrageData=item.BarrageList;break;}}if(!bCreated){var chart=new BarragePaint();chart.Canvas=this.Canvas;chart.ChartBorder=this.Frame.ChartBorder;chart.ChartFrame=this.Frame;chart.HQChart=this;chart.SetOption(option);this.ExtendChartPaint.push(chart);barrageData=chart.BarrageList;}this.EnableAnimation=true;var self=this;window.requestAnimationFrame(function(){self.DrawAnimation();});return barrageData;};this.StopAnimation=function(){this.EnableAnimation=false;this.DrawDynamicInfo();};this.GetChartTooltipData=function(x,y,option){var toolTip=new TooltipData();if(this.ChartInfoPaint){if(this.ChartInfoPaint.GetTooltipData(x,y,toolTip))return toolTip;}if(this.PtInChartPaintTooltip(x,y,toolTip))return toolTip;if(IFrameSplitOperator.IsNonEmptyArray(this.Frame.SubFrame)){for(var i=0;i<this.Frame.SubFrame.length;++i){var subFrame=this.Frame.SubFrame[i];for(var j=0;j<subFrame.OverlayIndex.length;++j){var overlayItem=subFrame.OverlayIndex[j];for(var k=0;k<overlayItem.ChartPaint.length;++k){var item=overlayItem.ChartPaint[k];if(item.GetTooltipData(x,y,toolTip))return toolTip;}}}}if(this.PtInOverlayChartPaintTooltip(x,y,toolTip))return toolTip;return null;};this.PtInExtendChartButtons=function(x,y){for(var i=0;i<this.ExtendChartPaint.length;++i){var item=this.ExtendChartPaint[i];if(item.PtInButtons){var button=item.PtInButtons(x,y);if(button){button.Chart=item;return button;}}}return null;};this.OnMouseMove=function(x,y,e,isPhone){this.LastPoint.X=x;this.LastPoint.Y=y;var mouseStatus=null;//鼠标状态
1755
1756
  var frameID=this.Frame.PtInFrame(x,y);if(IFrameSplitOperator.IsNumber(frameID)&&frameID>=0)//在K线内部移动,调整K线索引
1756
1757
  this.CursorIndex=this.Frame.GetXData(x);var paint=this.GetRectSelectPaint();if(paint&&paint.GetPointCount()>0){var item=paint.PtInPaint(x,y);if(item){mouseStatus={Cursor:"ew-resize",Name:"DragRectSelect"};JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] drag rect select ",item);}}if(this.EnableBorderDrag&&this.Frame&&!this.CurrentChartDrawPicture){var dragBorder=this.Frame.PtInFrameBorder(x,y);if(dragBorder&&dragBorder.Index>=0){mouseStatus={Cursor:"n-resize",Name:"DragBorder"};JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] drag border ",dragBorder);}}if(this.EnableYDrag&&this.Frame&&!this.CurrentChartDrawPicture){var dragY=this.TryYDrag(x,y);if(dragY){mouseStatus={Cursor:dragY.Position==0?"n-resize":"row-resize",Name:"DragY"};JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] drag y ",dragY);}}if(!this.CurrentChartDrawPicture){var button=this.Frame.PtInButtons(x,y);if(button){mouseStatus={Cursor:"pointer",Name:"FrameButton"};JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] frame button ",button);}else{button=this.PtInExtendChartButtons(x,y);if(button){mouseStatus={Cursor:"pointer",Name:"ExtendChartButton"};JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] extend chart button ",button);}}}if(this.ChartCorssCursor){var crossButton=this.ChartCorssCursor.PtInButton(x,y);if(crossButton){mouseStatus={Cursor:"pointer",Name:"CorssCursorButton"};JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] cross cursor button ",crossButton);}}if(this.ClassName=="KLineChartContainer"&&this.Frame.PtInFrameBottom(x,y)){mouseStatus={Cursor:"ew-resize",Name:"FrameButtom"};JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] frame bottom ");}if(this.SelectedChart.EnableMoveOn&&this.PtInChart&&!this.CurrentChartDrawPicture){var chartInfo=this.PtInChart(x,y);if(chartInfo&&chartInfo.Identify){mouseStatus={Cursor:"pointer",Name:"PtInChart"};this.SelectedChart.MoveOn.Identify=chartInfo.Identify;this.SelectedChart.MoveOn.Identify=null;JSConsole.Chart.Log("[JSChartContainer::OnMouseMove] Point in chart ",chartInfo);}else{this.SelectedChart.MoveOn.Identify=null;}}else{this.SelectedChart.MoveOn.Identify=null;}var bDrawPicture=false;//是否正在画图
1757
- if(this.CurrentChartDrawPicture){if(this.CurrentChartDrawPicture.Status!=20)mouseStatus={Cursor:"crosshair",Name:"CurrentChartDrawPicture"};if(this.CurrentChartDrawPicture.SetLastPoint)this.CurrentChartDrawPicture.SetLastPoint({X:x,Y:y});bDrawPicture=true;}else{var drawPictrueData={};drawPictrueData.X=x;drawPictrueData.Y=y;if(this.GetChartDrawPictureByPoint(drawPictrueData)&&drawPictrueData.ChartDrawPicture&&drawPictrueData.ChartDrawPicture.EnableMove==true){if(drawPictrueData.PointIndex===100)this.UIElement.style.cursor="move";else this.UIElement.style.cursor="pointer";bDrawPicture=true;this.MoveOnChartDrawPicture=drawPictrueData.ChartDrawPicture;}else{if(!this.MouseDrag)this.UIElement.style.cursor="default";}}var clientPos=this.PtInClient(x,y);var option={ParentFunction:'OnMouseMove',Point:{X:x,Y:y},IsPhone:isPhone===true,ClientPos:clientPos};if(e&&(e.type=="mouseout"||e.type=="mouseleave")||button)option.Corss=false;//鼠标移开,在按钮上,不显示十字光标
1758
+ if(this.CurrentChartDrawPicture){var index=this.Frame.PtInChartFrame(x,y);if(this.CurrentChartDrawPicture.Status!=20){if(index>=0)mouseStatus={Cursor:"crosshair",Name:"CurrentChartDrawPicture"};else mouseStatus={Cursor:"not-allowed",Name:"CurrentChartDrawPicture"};//不在画图区域
1759
+ }if(this.CurrentChartDrawPicture.SetLastPoint)this.CurrentChartDrawPicture.SetLastPoint({X:x,Y:y});bDrawPicture=true;}else{var drawPictrueData={};drawPictrueData.X=x;drawPictrueData.Y=y;if(this.GetChartDrawPictureByPoint(drawPictrueData)&&drawPictrueData.ChartDrawPicture&&drawPictrueData.ChartDrawPicture.EnableMove==true){if(drawPictrueData.PointIndex===100)this.UIElement.style.cursor="move";else this.UIElement.style.cursor="pointer";bDrawPicture=true;this.MoveOnChartDrawPicture=drawPictrueData.ChartDrawPicture;}else{if(!this.MouseDrag)this.UIElement.style.cursor="default";}}var clientPos=this.PtInClient(x,y);var option={ParentFunction:'OnMouseMove',Point:{X:x,Y:y},IsPhone:isPhone===true,ClientPos:clientPos};if(e&&(e.type=="mouseout"||e.type=="mouseleave")||button)option.Corss=false;//鼠标移开,在按钮上,不显示十字光标
1758
1760
  if(this.SetCorssCursorIndex)this.SetCorssCursorIndex(option);this.DrawDynamicInfo(option);if(mouseStatus)this.UIElement.style.cursor=mouseStatus.Cursor;if(this.IsShowTooltip&&bDrawPicture==false){var toolTip=this.GetChartTooltipData(x,y);if(toolTip&&toolTip.Data){if(isPhone===true){var touche=e.touches[0];var xTooltip=touche.clientX-this.UIElement.getBoundingClientRect().left;var yTooltip=touche.clientY-this.UIElement.getBoundingClientRect().top;}else{var xTooltip=e.clientX-this.UIElement.getBoundingClientRect().left;var yTooltip=e.clientY-this.UIElement.getBoundingClientRect().top;}this.ShowTooltip(xTooltip,yTooltip,toolTip);}else{this.HideTooltip();}}};this.OnKeyDown=function(e){if(this.ChartSplashPaint&&this.ChartSplashPaint.IsEnableSplash==true)return;var keyID=e.keyCode?e.keyCode:e.which;switch(keyID){case 37://left
1759
1761
  if(e.ctrlKey&&this.OnCustomKeyDown){if(this.OnCustomKeyDown(keyID,e))break;}if(this.CursorIndex<=0.99999){if(!this.DataMoveLeft()){//左移数据到头了 触发下载新数据
1760
1762
  if(this.DragDownloadData)this.DragDownloadData();break;}this.UpdataDataoffset();this.UpdatePointByCursorIndex();this.UpdateFrameMaxMin();this.Draw();this.ShowTooltipByKeyDown();this.OnKLinePageChange("keydown");}else{--this.CursorIndex;this.UpdatePointByCursorIndex();this.DrawDynamicInfo();this.ShowTooltipByKeyDown();}break;case 39://right
@@ -2566,7 +2568,9 @@ var yValue=frame.GetYData(y);if(frame.YSplitOperator.CoordinateType==1)//百分
2566
2568
  {var firstOpenPrice=frame.YSplitOperator.GetFirstOpenPrice();outObject.RightYValue=((yValue-firstOpenPrice)/firstOpenPrice*100).toFixed(2)+'%';}return yValue;}};this.PtInFrame=function(x,y)//鼠标哪个指标窗口
2567
2569
  {for(var i=0;i<this.SubFrame.length;++i){var item=this.SubFrame[i];var left=item.Frame.ChartBorder.GetLeft();var top=item.Frame.ChartBorder.GetTop();var width=item.Frame.ChartBorder.GetWidth();var height=item.Frame.ChartBorder.GetHeight();item.Frame.Canvas.beginPath();item.Frame.Canvas.rect(left,top,width,height);if(item.Frame.Canvas.isPointInPath(x,y)){return i;//转成整形
2568
2570
  }}var bottom=this.ChartBorder.GetBottom();var chartHeight=this.ChartBorder.GetChartHeight();var left=this.ChartBorder.GetLeft();var right=this.ChartBorder.GetRight();//底部
2569
- if(x>=left&&x<=right&&y>bottom&&y<chartHeight)return-3;return-1;};this.PtInButtons=function(x,y){for(var i=0;i<this.SubFrame.length;++i){var item=this.SubFrame[i];var button=item.Frame.PtInButtons(x,y);if(button){button.Frame=item.Frame;return button;}for(var j=0;j<item.OverlayIndex.length;++j){var overlayItem=item.OverlayIndex[j];var overlayFrame=overlayItem.Frame;if(!overlayFrame||!overlayFrame.PtInButtons)continue;var button=overlayFrame.PtInButtons(x,y);if(button){button.IndexID=overlayItem.Identify;button.FrameID=i;button.OverlayFrame=overlayFrame;button.Frame=item.Frame;return button;}}}return null;};//是否在X轴坐标上
2571
+ if(x>=left&&x<=right&&y>bottom&&y<chartHeight)return-3;return-1;};this.PtInChartFrame=function(x,y)//鼠标在图形区域, 取出上下空白
2572
+ {for(var i=0;i<this.SubFrame.length;++i){var item=this.SubFrame[i];var left=item.Frame.ChartBorder.GetLeft();var top=item.Frame.ChartBorder.GetTopEx();var width=item.Frame.ChartBorder.GetWidth();var height=item.Frame.ChartBorder.GetHeightEx();item.Frame.Canvas.beginPath();item.Frame.Canvas.rect(left,top,width,height);if(item.Frame.Canvas.isPointInPath(x,y)){return i;//转成整形
2573
+ }}return-1;};this.PtInButtons=function(x,y){for(var i=0;i<this.SubFrame.length;++i){var item=this.SubFrame[i];var button=item.Frame.PtInButtons(x,y);if(button){button.Frame=item.Frame;return button;}for(var j=0;j<item.OverlayIndex.length;++j){var overlayItem=item.OverlayIndex[j];var overlayFrame=overlayItem.Frame;if(!overlayFrame||!overlayFrame.PtInButtons)continue;var button=overlayFrame.PtInButtons(x,y);if(button){button.IndexID=overlayItem.Identify;button.FrameID=i;button.OverlayFrame=overlayFrame;button.Frame=item.Frame;return button;}}}return null;};//是否在X轴坐标上
2570
2574
  this.PtInFrameBottom=function(x,y){var left=this.ChartBorder.GetLeft();var top=this.ChartBorder.GetBottom();var width=this.ChartBorder.GetWidth();var height=this.ChartBorder.Bottom;this.Canvas.beginPath();this.Canvas.rect(left,top,width,height);if(this.Canvas.isPointInPath(x,y))return true;return false;};this.GetXFromIndex=function(index){return this.SubFrame[0].Frame.GetXFromIndex(index);};this.GetYFromData=function(value){return this.SubFrame[0].Frame.GetYFromData(value);};this.ZoomUp=function(cursorIndex){var result=this.SubFrame[0].Frame.ZoomUp(cursorIndex);this.UpdateAllFrame();return result;};this.ZoomDown=function(cursorIndex){var result=this.SubFrame[0].Frame.ZoomDown(cursorIndex);this.UpdateAllFrame();return result;};this.XCoordinateZoom=function(step,isMoveLeft){var result=this.SubFrame[0].Frame.XCoordinateZoom(step,isMoveLeft);this.UpdateAllFrame();return result;};//设置重新计算刻度坐标
2571
2575
  this.ResetXYSplit=function(){for(var _i in this.SubFrame){this.SubFrame[_i].Frame.XYSplit=true;}};this.SetLanguage=function(languageID){for(var _i2 in this.SubFrame){var item=this.SubFrame[_i2];if(item&&item.Frame){if(item.Frame.YSplitOperator)item.Frame.YSplitOperator.LanguageID=languageID;if(item.Frame.XSplitOperator)item.Frame.XSplitOperator.LanguageID=languageID;}}};this.GetCurrentPageSize=function()//获取当前页显示的数据个数
2572
2576
  {if(this.SubFrame.length<=0)return null;var item=this.SubFrame[0];if(!item||!item.Frame)return null;return item.Frame.XPointCount;};this.OnSize=function(){var obj={};this.SubFrame[0].Frame.OnSize(obj);this.UpdateAllFrame();return obj;};this.SetDataWidth=function(dataWidth){var obj=this.SubFrame[0].Frame.SetDataWidth(dataWidth);this.UpdateAllFrame();return obj;};this.UpdateAllFrame=function(){var mainFrame=this.SubFrame[0].Frame;for(var i=0;i<this.SubFrame.length;++i){var item=this.SubFrame[i];if(i>0)//第1个窗口主坐标已经算好了
@@ -2635,8 +2639,8 @@ this.AFactor;//后复权
2635
2639
  }//数据复制
2636
2640
  HistoryData.Copy=function(data){var newData=new HistoryData();newData.Date=data.Date;if(IFrameSplitOperator.IsNumber(data.Time))newData.Time=data.Time;newData.YClose=data.YClose;newData.Open=data.Open;newData.Close=data.Close;newData.High=data.High;newData.Low=data.Low;newData.Vol=data.Vol;newData.Amount=data.Amount;if(IFrameSplitOperator.IsNumber(data.FlowCapital))newData.FlowCapital=data.FlowCapital;if(IFrameSplitOperator.IsNumber(data.Position))newData.Position=data.Position;if(IFrameSplitOperator.IsNumber(data.YFClose))newData.YFClose=data.YFClose;if(IFrameSplitOperator.IsNumber(data.FClose))newData.FClose=data.FClose;//指数涨停家数
2637
2641
  if(IFrameSplitOperator.IsNumber(data.Stop))newData.Stop=data.Stop;if(IFrameSplitOperator.IsNumber(data.Up))newData.Up=data.Up;if(IFrameSplitOperator.IsNumber(data.Down))newData.Down=data.Down;if(IFrameSplitOperator.IsNumber(data.Unchanged))newData.Unchanged=data.Unchanged;//复权因子
2638
- if(IFrameSplitOperator.IsNumber(data.BFactor))newData.BFactor=data.BFactor;if(IFrameSplitOperator.IsNumber(data.AFactor))newData.AFactor=data.AFactor;if(data.OrderFlow)newData.OrderFlow=data.OrderFlow;return newData;};//把数据 src 复制到 dest中
2639
- HistoryData.CopyTo=function(dest,src){dest.Date=src.Date;if(IFrameSplitOperator.IsNumber(src.Time))dest.Time=src.Time;dest.YClose=src.YClose;dest.Open=src.Open;dest.Close=src.Close;dest.High=src.High;dest.Low=src.Low;dest.Vol=src.Vol;dest.Amount=src.Amount;if(IFrameSplitOperator.IsNumber(src.FlowCapital))dest.FlowCapital=src.FlowCapital;if(IFrameSplitOperator.IsNumber(src.Position))dest.Position=src.Position;if(IFrameSplitOperator.IsNumber(src.YFClose))dest.YFClose=src.YFClose;if(IFrameSplitOperator.IsNumber(src.FClose))dest.FClose=src.FClose;if(IFrameSplitOperator.IsNumber(src.Stop))dest.Stop=src.Stop;if(IFrameSplitOperator.IsNumber(src.Up))dest.Up=src.Up;if(IFrameSplitOperator.IsNumber(src.Down))dest.Down=src.Down;if(IFrameSplitOperator.IsNumber(src.Unchanged))dest.Unchanged=src.Unchanged;if(IFrameSplitOperator.IsNumber(src.BFactor))dest.BFactor=src.BFactor;if(IFrameSplitOperator.IsNumber(src.AFactor))dest.AFactor=src.AFactor;};//数据复权拷贝
2642
+ if(IFrameSplitOperator.IsNumber(data.BFactor))newData.BFactor=data.BFactor;if(IFrameSplitOperator.IsNumber(data.AFactor))newData.AFactor=data.AFactor;if(data.OrderFlow)newData.OrderFlow=data.OrderFlow;if(data.ColorData)newData.ColorData=data.ColorData;return newData;};//把数据 src 复制到 dest中
2643
+ HistoryData.CopyTo=function(dest,src){dest.Date=src.Date;if(IFrameSplitOperator.IsNumber(src.Time))dest.Time=src.Time;dest.YClose=src.YClose;dest.Open=src.Open;dest.Close=src.Close;dest.High=src.High;dest.Low=src.Low;dest.Vol=src.Vol;dest.Amount=src.Amount;if(IFrameSplitOperator.IsNumber(src.FlowCapital))dest.FlowCapital=src.FlowCapital;if(IFrameSplitOperator.IsNumber(src.Position))dest.Position=src.Position;if(IFrameSplitOperator.IsNumber(src.YFClose))dest.YFClose=src.YFClose;if(IFrameSplitOperator.IsNumber(src.FClose))dest.FClose=src.FClose;if(IFrameSplitOperator.IsNumber(src.Stop))dest.Stop=src.Stop;if(IFrameSplitOperator.IsNumber(src.Up))dest.Up=src.Up;if(IFrameSplitOperator.IsNumber(src.Down))dest.Down=src.Down;if(IFrameSplitOperator.IsNumber(src.Unchanged))dest.Unchanged=src.Unchanged;if(IFrameSplitOperator.IsNumber(src.BFactor))dest.BFactor=src.BFactor;if(IFrameSplitOperator.IsNumber(src.AFactor))dest.AFactor=src.AFactor;if(src.OrderFlow)dest.OrderFlow=src.OrderFlow;if(src.ColorData)dest.ColorData=src.ColorData;};//数据复权拷贝
2640
2644
  HistoryData.CopyRight=function(data,seed){var newData=new HistoryData();newData.Date=data.Date;newData.YClose=data.YClose*seed;newData.Open=data.Open*seed;newData.Close=data.Close*seed;newData.High=data.High*seed;newData.Low=data.Low*seed;newData.Vol=data.Vol;newData.Amount=data.Amount;newData.FlowCapital=data.FlowCapital;newData.Position=data.Position;newData.YFClose=data.YFClose;newData.FClose=data.FClose;return newData;};function MinuteData(){this.Close;this.Open;this.High;this.Low;this.Vol;//量
2641
2645
  this.Amount;//金额
2642
2646
  this.DateTime;this.Increase;//涨幅
@@ -2868,7 +2872,7 @@ var ZOOM_SEED=
2868
2872
  function ChartKLine(){this.newMethod=IChartPainting;//派生
2869
2873
  this.newMethod();delete this.newMethod;this.ClassName='ChartKLine';//类名
2870
2874
  this.Symbol;//股票代码
2871
- this.DrawType=0;// 0=实心K线柱子 1=收盘价线 2=美国线 3=空心K线柱子 4=收盘价面积图 5=订单流 6=空心K线柱子2(全部空心) 7=订单流样式2 8=订单流样式3
2875
+ this.DrawType=0;// 0=实心K线柱子 1=收盘价线 2=美国线 3=空心K线柱子 4=收盘价面积图 5=订单流 6=空心K线柱子2(全部空心) 7=订单流样式2 8=订单流样式3 9=自定义颜色K线
2872
2876
  this.CloseLineColor=g_JSChartResource.CloseLineColor;this.CloseLineAreaColor=g_JSChartResource.CloseLineAreaColor;this.CloseLineWidth=g_JSChartResource.CloseLineWidth;this.UpColor=g_JSChartResource.UpBarColor;this.DownColor=g_JSChartResource.DownBarColor;this.UnchagneColor=g_JSChartResource.UnchagneBarColor;//平盘
2873
2877
  this.ColorData;//五彩K线颜色 >0:g_JSChartResource.UpBarColor 其他:g_JSChartResource.DownBarColor
2874
2878
  this.TradeData;//交易系统 包含买卖数据{Buy:, Sell:, Name:指标名称 }
@@ -2919,7 +2923,7 @@ if(bFirstPoint)return;this.Canvas.stroke();if(isHScreen){this.Canvas.lineTo(bord
2919
2923
  {var isHScreen=this.ChartFrame.IsHScreen===true;var dataWidth=this.ChartFrame.DataWidth;var distanceWidth=this.ChartFrame.DistanceWidth;var border=this.ChartBorder.GetBorder();var xOffset=border.LeftEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;var chartright=border.RightEx;var xPointCount=this.ChartFrame.XPointCount;if(isHScreen){var border=this.ChartBorder.GetHScreenBorder();xOffset=border.TopEx+distanceWidth/2.0+g_JSChartResource.FrameLeftMargin;chartright=border.BottomEx;}var ptMax={X:null,Y:null,Value:null,Align:'left'};var ptMin={X:null,Y:null,Value:null,Align:'left'};var upColor=this.UpColor;var downColor=this.DownColor;var unchagneColor=this.UnchagneColor;this.ShowRange.Start=this.Data.DataOffset;this.ShowRange.End=this.ShowRange.Start;this.ShowRange.DataCount=0;this.ShowRange.ShowCount=xPointCount;var ptLast=null;this.DrawKRange.Start=this.Data.DataOffset;for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j,xOffset+=dataWidth+distanceWidth,++this.ShowRange.DataCount){var data=this.Data.Data[i];this.ShowRange.End=i;if(data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;var left=xOffset;var right=xOffset+dataWidth;if(right>chartright)break;var x=left+(right-left)/2;var yLow=this.GetYFromData(data.Low,false);var yHigh=this.GetYFromData(data.High,false);var yOpen=this.GetYFromData(data.Open,false);var yClose=this.GetYFromData(data.Close,false);var y=yHigh;this.DrawKRange.End=i;if(ptMax.Value==null||ptMax.Value<data.High)//求最大值
2920
2924
  {ptMax.X=x;ptMax.Y=yHigh;ptMax.Value=data.High;ptMax.Align=j<xPointCount/2?'left':'right';}if(ptMin.Value==null||ptMin.Value>data.Low)//求最小值
2921
2925
  {ptMin.X=x;ptMin.Y=yLow;ptMin.Value=data.Low;ptMin.Align=j<xPointCount/2?'left':'right';}if(this.ColorData)///五彩K线颜色设置
2922
- {if(i<this.ColorData.length)upColor=downColor=unchagneColor=this.ColorData[i]>0?this.UpColor:this.DownColor;else upColor=downColor=unchagneColor=this.DownColor;}var kLineOption=this.GetCustomKLine(data);if(kLineOption){var barColor=kLineOption.Color;if(!barColor){if(data.Open<data.Close)barColor=upColor;else if(data.Open>data.Close)barColor=downColor;else barColor=unchagneColor;}var drawType=this.DrawType;if(IFrameSplitOperator.IsNumber(kLineOption.DrawType))drawType=kLineOption.DrawType;this.DrawKBar_Custom(data,dataWidth,barColor,drawType,kLineOption,x,y,left,right,yLow,yHigh,yOpen,yClose,border,isHScreen);}else if(data.Open<data.Close)//阳线
2926
+ {if(i<this.ColorData.length)upColor=downColor=unchagneColor=this.ColorData[i]>0?this.UpColor:this.DownColor;else upColor=downColor=unchagneColor=this.DownColor;}var kLineOption=this.GetCustomKLine(data);if(kLineOption){var barColor=kLineOption.Color;if(!barColor){if(data.Open<data.Close)barColor=upColor;else if(data.Open>data.Close)barColor=downColor;else barColor=unchagneColor;}var drawType=this.DrawType;if(IFrameSplitOperator.IsNumber(kLineOption.DrawType))drawType=kLineOption.DrawType;this.DrawKBar_Custom(data,dataWidth,barColor,drawType,kLineOption,x,y,left,right,yLow,yHigh,yOpen,yClose,border,isHScreen);}else if(this.DrawType==9&&data.ColorData){this.DrawKBarV2(data,data.ColorData,dataWidth,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen);}else if(data.Open<data.Close)//阳线
2923
2927
  {this.DrawKBar_Up(data,dataWidth,upColor,this.DrawType,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen);}else if(data.Open>data.Close)//阴线
2924
2928
  {this.DrawKBar_Down(data,dataWidth,downColor,this.DrawType,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen);}else// 平线
2925
2929
  {this.DrawKBar_Unchagne(data,dataWidth,unchagneColor,this.DrawType,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen);}if(this.IsShowKTooltip&&!isHScreen)//添加tooltip区域
@@ -2951,7 +2955,31 @@ else this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yClose-y)
2951
2955
  {this.Canvas.beginPath();this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));this.Canvas.stroke();}else{this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));}}}else{if(Math.abs(yOpen-y)<1){this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);//高度小于1,统一使用高度1
2952
2956
  }else{if(drawType==3)//空心柱
2953
2957
  {this.Canvas.beginPath();this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));this.Canvas.stroke();}else{this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yOpen)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yOpen-y)));}}}if(data.Open>data.Low)//下影线
2954
- {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(drawType==3?Math.min(yClose,yOpen):y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.max(yClose,yOpen):y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));}this.Canvas.stroke();}}else{this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh,ToFixedPoint(x));this.Canvas.lineTo(yLow,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),yHigh);this.Canvas.lineTo(ToFixedPoint(x),yLow);}this.Canvas.strokeStyle=barColor;this.Canvas.stroke();}};this.DrawTrade=function()//交易系统
2958
+ {this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(drawType==3?Math.min(yClose,yOpen):y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(drawType==3?Math.max(yClose,yOpen):y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));}this.Canvas.stroke();}}else{this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh,ToFixedPoint(x));this.Canvas.lineTo(yLow,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),yHigh);this.Canvas.lineTo(ToFixedPoint(x),yLow);}this.Canvas.strokeStyle=barColor;this.Canvas.stroke();}};this.DrawKBarV2=function(data,colorData,dataWidth,x,y,left,right,yLow,yHigh,yOpen,yClose,isHScreen){var isDrawBorder=false;var isEmptyBar=false;if(colorData.border)isDrawBorder=true;if(colorData.Type===0)isEmptyBar=true;if(dataWidth>=4){if(isDrawBorder){if(dataWidth%2!=0)dataWidth-=1;}if(data.High>data.Close)//上影线
2959
+ {if(colorData.Line){this.Canvas.strokeStyle=colorData.Line.Color;this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(isEmptyBar?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));}else{if(isDrawBorder){var xFixed=left+dataWidth/2;this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(Math.min(yClose,yOpen)));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(Math.min(yClose,yOpen)));}}this.Canvas.stroke();}y=yClose;}else{y=yClose;}if(isHScreen){/*
2960
+ if (Math.abs(yOpen-y)<1)
2961
+ {
2962
+ this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth)); //高度小于1,统一使用高度1
2963
+ }
2964
+ else
2965
+ {
2966
+ if (drawType==3) //空心柱
2967
+ {
2968
+ this.Canvas.beginPath();
2969
+ this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));
2970
+ this.Canvas.stroke();
2971
+ }
2972
+ else
2973
+ {
2974
+ this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));
2975
+ }
2976
+ }
2977
+ */}else{//实心
2978
+ if(!isEmptyBar&&colorData.BarColor){this.Canvas.fillStyle=colorData.BarColor;if(Math.abs(yOpen-y)<1){this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);//高度小于1,统一使用高度1
2979
+ }else{this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yOpen)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yOpen-y)));}}if(colorData.Border)//空心
2980
+ {if(Math.abs(yOpen-y)<1){this.Canvas.fillStyle=colorData.Border.Color;this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1);//高度小于1,统一使用高度1
2981
+ }else{this.Canvas.strokeStyle=colorData.Border.Color;this.Canvas.beginPath();this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));this.Canvas.stroke();}}}if(data.Open>data.Low)//下影线
2982
+ {if(colorData.Line){this.Canvas.strokeStyle=colorData.Line.Color;this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(ToFixedPoint(isEmptyBar?Math.min(yClose,yOpen):y),ToFixedPoint(x));this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));}else{if(isDrawBorder){var xFixed=left+dataWidth/2;this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(Math.max(yClose,yOpen)));this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(yLow));}else{this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(Math.max(yClose,yOpen)));this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));}}this.Canvas.stroke();}}}else{var lineColor;if(isEmptyBar&&colorData.Border){lineColor=colorData.Border.Color;}else if(!isEmptyBar&&colorData.BarColor){lineColor=colorData.BarColor;}if(lineColor){this.Canvas.strokeStyle=lineColor;this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh,ToFixedPoint(x));this.Canvas.lineTo(yLow,ToFixedPoint(x));}else{this.Canvas.moveTo(ToFixedPoint(x),yHigh);this.Canvas.lineTo(ToFixedPoint(x),yLow);}this.Canvas.stroke();}}};this.DrawTrade=function()//交易系统
2955
2983
  {if(!this.TradeData)return;var isHScreen=this.ChartFrame.IsHScreen===true;var dataWidth=this.ChartFrame.DataWidth;var distanceWidth=this.ChartFrame.DistanceWidth;var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;var chartright=this.ChartBorder.GetRight();var xPointCount=this.ChartFrame.XPointCount;if(isHScreen){xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;chartright=this.ChartBorder.GetBottom();}var sellData=this.TradeData.Sell;var buyData=this.TradeData.Buy;var arrowWidth=dataWidth;if(arrowWidth>10)arrowWidth=10;for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j,xOffset+=dataWidth+distanceWidth){var data=this.Data.Data[i];if(data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;var buy=false,sell=false;if(sellData&&i<sellData.length)sell=sellData[i]>0;if(buyData&&i<buyData.length)buy=buyData[i]>0;if(!sell&&!buy)continue;var left=xOffset;var right=xOffset+dataWidth;if(right>chartright)break;var x=left+(right-left)/2;var yLow=this.GetYFromData(data.Low,false);var yHigh=this.GetYFromData(data.High,false);var yOpen=this.GetYFromData(data.Open,false);var yClose=this.GetYFromData(data.Close,false);var y=yHigh;if(buy){this.Canvas.fillStyle=this.UpColor;this.Canvas.strokeStyle=this.UnchagneColor;this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yLow-1,x);this.Canvas.lineTo(yLow-arrowWidth-1,x-arrowWidth/2);this.Canvas.lineTo(yLow-arrowWidth-1,x+arrowWidth/2);}else{this.Canvas.moveTo(x,yLow+1);this.Canvas.lineTo(x-arrowWidth/2,yLow+arrowWidth+1);this.Canvas.lineTo(x+arrowWidth/2,yLow+arrowWidth+1);}this.Canvas.closePath();this.Canvas.fill();this.Canvas.stroke();}if(sell){this.Canvas.fillStyle=this.DownColor;this.Canvas.strokeStyle=this.UnchagneColor;this.Canvas.beginPath();if(isHScreen){this.Canvas.moveTo(yHigh+1,x);this.Canvas.lineTo(yHigh+arrowWidth+1,x-arrowWidth/2);this.Canvas.lineTo(yHigh+arrowWidth+1,x+arrowWidth/2);}else{this.Canvas.moveTo(x,yHigh-1);this.Canvas.lineTo(x-arrowWidth/2,yHigh-arrowWidth-1);this.Canvas.lineTo(x+arrowWidth/2,yHigh-arrowWidth-1);}this.Canvas.closePath();this.Canvas.fill();this.Canvas.stroke();}}};this.DrawTick=function()//分笔图
2956
2984
  {var isHScreen=this.ChartFrame.IsHScreen===true;var dataWidth=this.ChartFrame.DataWidth;var distanceWidth=this.ChartFrame.DistanceWidth;var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;if(isHScreen)xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;var chartright=this.ChartBorder.GetRight();if(isHScreen)chartright=this.ChartBorder.GetBottom();var xPointCount=this.ChartFrame.XPointCount;var fontSize=parseInt(dataWidth);if(fontSize<=1)fontSize=2;else if(fontSize>=18)fontSize=18;var bFirstPoint=true;var pixelRatio=GetDevicePixelRatio();var textSize=fontSize*pixelRatio;this.Canvas.beginPath();this.Canvas.font=fontSize*pixelRatio+'px '+this.TickFontName;this.ShowRange.Start=this.Data.DataOffset;this.ShowRange.End=this.ShowRange.Start;this.ShowRange.DataCount=0;this.ShowRange.ShowCount=xPointCount;this.DrawKRange.Start=this.Data.DataOffset;for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j,xOffset+=dataWidth+distanceWidth){var data=this.Data.Data[i];this.ShowRange.End=i;if(data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;var left=xOffset;var right=xOffset+dataWidth;if(right>chartright)break;var x=left+(right-left)/2;var yClose=this.ChartFrame.GetYFromData(data.Close,false);this.DrawKRange.End=i;if(data.Flag===0)this.Canvas.fillStyle=this.UpColor;else if(data.Flag==1)this.Canvas.fillStyle=this.DownColor;else this.Canvas.fillStyle=this.UnchagneColor;this.Canvas.textAlign='center';this.Canvas.textBaseline='middle';if(isHScreen)this.Canvas.fillText(this.TickSymbol,yClose,x);else this.Canvas.fillText(this.TickSymbol,x,yClose);if(this.IsShowKTooltip&&!isHScreen)//添加tooltip区域
2957
2985
  {var rect=new Rect(x-textSize/2,yClose-textSize/2,textSize,textSize);//this.Canvas.fillStyle="rgb(0,0,100)";
@@ -2963,7 +2991,7 @@ this.Canvas.clip();};this.Draw=function(){this.IsShowOrderText=false;this.Toolti
2963
2991
  this.PtMin={X:null,Y:null,Value:null,Align:'left'};//清空最小
2964
2992
  this.DrawKRange={Start:null,End:null};this.ChartFrame.ChartKLine={Max:null,Min:null};//保存K线上 显示最大最小值坐标
2965
2993
  if(!this.IsShow)return;if(ChartData.IsTickPeriod(this.Period))//分笔图
2966
- {this.Canvas.save();if(this.DrawType==1){this.ClipClient(this.ChartFrame.IsHScreen);this.DrawCloseLine();}else if(this.DrawType==4){this.ClipClient(this.ChartFrame.IsHScreen);this.DrawCloseArea();}else{this.ClipTickClient(this.ChartFrame.IsHScreen);this.DrawTick();}this.Canvas.restore();return;}this.Canvas.save();this.ClipClient(this.ChartFrame.IsHScreen);if(this.DrawType==1){this.DrawCloseLine();this.Canvas.restore();return;}else if(this.DrawType==2){this.DrawAKLine();}else if(this.DrawType==4){this.DrawCloseArea();}else if(this.DrawType==5){this.DrawOrderFlow();}else if(this.DrawType==7){this.DrawOrderFlow_Style2();}else if(this.DrawType==8){this.DrawOrderFlow_Style3();}else{this.DrawKBar();}if(this.TradeIcon)this.DrawTradeIcon();else this.DrawTrade();this.Canvas.restore();if(this.IsShowMaxMinPrice)//标注最大值最小值
2994
+ {this.Canvas.save();if(this.DrawType==1){this.ClipClient(this.ChartFrame.IsHScreen);this.DrawCloseLine();}else if(this.DrawType==4){this.ClipClient(this.ChartFrame.IsHScreen);this.DrawCloseArea();}else{this.ClipTickClient(this.ChartFrame.IsHScreen);this.DrawTick();}this.Canvas.restore();return;}this.Canvas.save();this.ClipClient(this.ChartFrame.IsHScreen);if(this.DrawType==1){this.DrawCloseLine();this.Canvas.restore();return;}else if(this.DrawType==2){this.DrawAKLine();}else if(this.DrawType==4){this.DrawCloseArea();}else if(this.DrawType==5){this.DrawOrderFlow();}else if(this.DrawType==7){this.DrawOrderFlow_Style2();}else if(this.DrawType==8){this.DrawOrderFlow_Style3();}else if(this.DrawType==9){this.DrawKBar();}else{this.DrawKBar();}if(this.TradeIcon)this.DrawTradeIcon();else this.DrawTrade();this.Canvas.restore();if(this.IsShowMaxMinPrice)//标注最大值最小值
2967
2995
  {if(this.ChartFrame.IsHScreen===true)this.HScreenDrawMaxMinPrice(this.PtMax,this.PtMin);else this.DrawMaxMinPrice(this.PtMax,this.PtMin);}};this.DrawMaxMinPrice=function(ptMax,ptMin){if(ptMax.X==null||ptMax.Y==null||ptMax.Value==null)return;if(ptMin.X==null||ptMin.Y==null||ptMin.Value==null)return;var leftArrow=g_JSChartResource.KLine.MaxMin.LeftArrow;var rightArrow=g_JSChartResource.KLine.MaxMin.RightArrow;var highYOffset=g_JSChartResource.KLine.MaxMin.HighYOffset;var lowYOffset=g_JSChartResource.KLine.MaxMin.LowYOffset;var defaultfloatPrecision=GetfloatPrecision(this.Symbol);this.Canvas.font=this.TextFont;this.Canvas.fillStyle=this.TextColor;var top=this.ChartBorder.GetTopEx();var bottom=this.ChartBorder.GetBottomEx();var ptTop=ptMax;if(this.ChartFrame.CoordinateType==1)//反转坐标
2968
2996
  {if(ptMax.Y<ptMin.Y)ptTop=ptMin;this.Canvas.textBaseline='top';}else{if(ptMax.Y>ptMin.Y)ptTop=ptMin;this.Canvas.textBaseline='bottom';}this.Canvas.textAlign=ptTop.Align;var left=ptTop.Align=='left'?ptTop.X:ptTop.X;if(IFrameSplitOperator.IsNumber(highYOffset))ptTop.Y+=highYOffset;var text=ptTop.Value.toFixed(defaultfloatPrecision);if(ptTop.Align=='left')text=leftArrow+text;else text=text+rightArrow;if(ptTop.Y>top-2){this.Canvas.fillText(text,left,ptTop.Y);this.ChartFrame.ChartKLine.Max={X:left,Y:ptTop.Y,Text:{BaseLine:'bottom'}};}var ptBottom=ptMin;if(this.ChartFrame.CoordinateType==1){if(ptMin.Y>ptMax.Y)ptBottom=ptMax;this.Canvas.textBaseline='bottom';}else{if(ptMax.Y>ptMin.Y)ptTop=ptMin;this.Canvas.textBaseline='top';}this.Canvas.textAlign=ptBottom.Align;var left=ptBottom.Align=='left'?ptBottom.X:ptBottom.X;if(IFrameSplitOperator.IsNumber(lowYOffset))ptBottom.Y+=lowYOffset;var text=ptMin.Value.toFixed(defaultfloatPrecision);if(ptBottom.Align=='left')text=leftArrow+text;else text=text+rightArrow;if(ptBottom.Y<bottom+1){this.Canvas.fillText(text,left,ptBottom.Y);this.ChartFrame.ChartKLine.Min={X:left,Y:ptBottom.Y,Text:{BaseLine:'top'}};}};this.HScreenDrawMaxMinPrice=function(ptMax,ptMin)//横屏模式下显示最大最小值
2969
2997
  {if(ptMax.X==null||ptMax.Y==null||ptMax.Value==null)return;if(ptMin.X==null||ptMin.Y==null||ptMin.Value==null)return;var leftArrow=g_JSChartResource.KLine.MaxMin.LeftArrow;var rightArrow=g_JSChartResource.KLine.MaxMin.RightArrow;var highYOffset=g_JSChartResource.KLine.MaxMin.HighYOffset;var lowYOffset=g_JSChartResource.KLine.MaxMin.LowYOffset;var defaultfloatPrecision=GetfloatPrecision(this.Symbol);var xText=ptMax.Y;var yText=ptMax.X;if(IFrameSplitOperator.IsNumber(highYOffset))xText+=highYOffset;this.Canvas.save();this.Canvas.translate(xText,yText);this.Canvas.rotate(90*Math.PI/180);this.Canvas.font=this.TextFont;this.Canvas.fillStyle=this.TextColor;this.Canvas.textAlign=ptMax.Align;this.Canvas.textBaseline='bottom';var text=ptMax.Value.toFixed(defaultfloatPrecision);if(ptMax.Align=='left')text=leftArrow+text;else text=text+rightArrow;this.Canvas.fillText(text,0,0);this.Canvas.restore();var xText=ptMin.Y;var yText=ptMin.X;if(IFrameSplitOperator.IsNumber(lowYOffset))xText+=lowYOffset;this.Canvas.save();this.Canvas.translate(xText,yText);this.Canvas.rotate(90*Math.PI/180);this.Canvas.font=this.TextFont;this.Canvas.fillStyle=this.TextColor;this.Canvas.textAlign=ptMin.Align;this.Canvas.textBaseline='top';var text=ptMin.Value.toFixed(defaultfloatPrecision);if(ptMin.Align=='left')text=leftArrow+text;else text=text+rightArrow;this.Canvas.fillText(text,0,0);this.Canvas.restore();};//画某一天的信息地雷
@@ -3112,7 +3140,9 @@ if(isHScreen){this.Canvas.moveTo(ToFixedPoint(yOpen),left);this.Canvas.lineTo(To
3112
3140
  if(isHScreen){this.Canvas.moveTo(ToFixedPoint(yClose),right);this.Canvas.lineTo(ToFixedPoint(yClose),x);}else{this.Canvas.moveTo(right,ToFixedPoint(yClose));this.Canvas.lineTo(x,ToFixedPoint(yClose));}this.Canvas.stroke();}}};this.DrawCloseLine=function(firstOpen)//收盘价线
3113
3141
  {var isHScreen=this.ChartFrame.IsHScreen===true;var dataWidth=this.ChartFrame.DataWidth;var distanceWidth=this.ChartFrame.DistanceWidth;var xOffset=this.ChartBorder.GetLeft()+distanceWidth/2.0+2.0;if(isHScreen)xOffset=this.ChartBorder.GetTop()+distanceWidth/2.0+2.0;var chartright=this.ChartBorder.GetRight();if(isHScreen)chartright=this.ChartBorder.GetBottom();var xPointCount=this.ChartFrame.XPointCount;var firstOverlayOpen=null;var bFirstPoint=true;this.Canvas.strokeStyle=this.Color;if(IFrameSplitOperator.IsNumber(this.CloseLineWidth))this.Canvas.lineWidth=this.CloseLineWidth;this.ShowRange.Start=this.Data.DataOffset;this.ShowRange.End=this.ShowRange.Start;this.ShowRange.DataCount=0;this.ShowRange.ShowCount=xPointCount;this.ShowRange.FirstOpen=firstOpen;this.DrawKRange.Start=this.Data.DataOffset;this.Canvas.beginPath();for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j,xOffset+=dataWidth+distanceWidth,++this.ShowRange.DataCount){var data=this.Data.Data[i];if(data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;if(firstOverlayOpen==null){firstOverlayOpen=data.Open;this.ShowRange.FirstOverlayOpen=data.Open;}var left=xOffset;var right=xOffset+dataWidth;if(right>chartright)break;var x=left+(right-left)/2;var yClose=this.GetYFromData(data.Close/firstOverlayOpen*firstOpen,false);this.DrawKRange.End=i;if(bFirstPoint){if(isHScreen)this.Canvas.moveTo(yClose,x);else this.Canvas.moveTo(x,yClose);bFirstPoint=false;}else{if(isHScreen)this.Canvas.lineTo(yClose,x);else this.Canvas.lineTo(x,yClose);}}if(bFirstPoint==false)this.Canvas.stroke();};this.GetFirstOpen=function(){if(!this.MainData||!this.Data)return null;var xPointCount=this.ChartFrame.XPointCount;for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length&&j<xPointCount;++i,++j){var data=this.MainData.Data[i];if(data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;return data.Open;}return null;};this.Draw=function(){this.TooltipRect=[];this.InfoTooltipRect=[];this.DrawKRange={Start:null,End:null};if(!this.MainData||!this.Data)return;var xPointCount=this.ChartFrame.XPointCount;var firstOpen=this.GetFirstOpen();//主线数据第1个开盘价
3114
3142
  if(firstOpen==null)return;var drawType=this.DrawType;if(this.CustomDrawType!=null)drawType=this.CustomDrawType;this.Canvas.save();this.ClipClient(this.ChartFrame.IsHScreen);if(drawType==1)this.DrawCloseLine(firstOpen);else if(drawType==2)this.DrawAKLine(firstOpen);else this.DrawKBar(firstOpen);this.Canvas.restore();};this.GetMaxMin=function(){var xPointCount=this.ChartFrame.XPointCount;var range={};range.Max=null;range.Min=null;if(!this.MainData||!this.Data)return range;var firstOpen=null;//主线数据第1个收盘价
3115
- for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length&&j<xPointCount;++i,++j){var data=this.MainData.Data[i];if(data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;firstOpen=data.Close;break;}if(firstOpen==null)return range;var firstOverlayOpen=null;var high,low;for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j){var data=this.Data.Data[i];if(!data||data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;if(firstOverlayOpen==null)firstOverlayOpen=data.Open;high=data.High/firstOverlayOpen*firstOpen;low=data.Low/firstOverlayOpen*firstOpen;if(range.Max==null)range.Max=high;if(range.Min==null)range.Min=low;if(range.Max<high)range.Max=high;if(range.Min>low)range.Min=low;}return range;};this.GetTooltipData=function(x,y,tooltip){for(var i in this.TooltipRect){var rect=this.TooltipRect[i][1];this.Canvas.beginPath();this.Canvas.rect(rect.X,rect.Y,rect.Width,rect.Height);if(this.Canvas.isPointInPath(x,y)){var index=this.TooltipRect[i][0];tooltip.Data=this.Data.Data[index];tooltip.ChartPaint=this;return true;}}return false;};this.PtInChart=function(x,y){if(this.DrawType==1||this.DrawType==4){return null;return this.PtInLine(x,y,{KLineClose:true});}return this.PtInKBar(x,y,{OverlayKLine:true});};this.DrawSelectedStatus=function(){this.DrawLinePoint({OverlayKLine:true});};}//K线表格
3143
+ for(var i=this.Data.DataOffset,j=0;i<this.MainData.Data.length&&j<xPointCount;++i,++j){var data=this.MainData.Data[i];if(data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;firstOpen=data.Close;break;}if(firstOpen==null)return range;var firstOverlayOpen=null;var high,low;for(var i=this.Data.DataOffset,j=0;i<this.Data.Data.length&&j<xPointCount;++i,++j){var data=this.Data.Data[i];if(!data||data.Open==null||data.High==null||data.Low==null||data.Close==null)continue;if(firstOverlayOpen==null)firstOverlayOpen=data.Open;high=data.High/firstOverlayOpen*firstOpen;low=data.Low/firstOverlayOpen*firstOpen;if(range.Max==null)range.Max=high;if(range.Min==null)range.Min=low;if(range.Max<high)range.Max=high;if(range.Min>low)range.Min=low;}return range;};this.GetTooltipData=function(x,y,tooltip){for(var i in this.TooltipRect){var rect=this.TooltipRect[i][1];this.Canvas.beginPath();this.Canvas.rect(rect.X,rect.Y,rect.Width,rect.Height);if(this.Canvas.isPointInPath(x,y)){var index=this.TooltipRect[i][0];tooltip.Data=this.Data.Data[index];tooltip.ChartPaint=this;return true;}}return false;};this.PtInChart=function(x,y){var drawType=this.DrawType;if(IFrameSplitOperator.IsNumber(this.CustomDrawType))drawType=this.CustomDrawType;if(drawType==1||drawType==4)//线段,面积不支持选中
3144
+ {return null;//return this.PtInLine(x,y, {KLineClose:true});
3145
+ }return this.PtInKBar(x,y,{OverlayKLine:true});};this.DrawSelectedStatus=function(){this.DrawLinePoint({OverlayKLine:true});};}//K线表格
3116
3146
  function ChartKLineTable(){this.newMethod=IChartPainting;//派生
3117
3147
  this.newMethod();delete this.newMethod;this.ClassName='ChartKlineTable';//类名
3118
3148
  this.Data;this.RowName;this.IsShowRowName=false;this.BGColor;//背景色
@@ -4337,7 +4367,7 @@ var right=this.Frame.ChartBorder.GetRight();if(this.Frame.IsHScreen===true){bott
4337
4367
  drawLeft=left;left+=textWidth;if(left>right)break;this.Canvas.fillText(text,drawLeft,bottom,textWidth);}if(left>right)break;}}catch(err){_didIteratorError9=true;_iteratorError9=err;}finally{try{if(!_iteratorNormalCompletion9&&_iterator9.return){_iterator9.return();}}finally{if(_didIteratorError9){throw _iteratorError9;}}}};this.HScreenDraw=function(){var border=this.Frame.ChartBorder.GetHScreenBorder();var xText=this.Frame.ChartBorder.GetRightTitle();var yText=border.TopEx;this.Canvas.translate(xText,yText);this.Canvas.rotate(90*Math.PI/180);var left=1;var bottom=-this.Frame.ChartBorder.TitleHeight/2;//上下居中显示
4338
4368
  var right=this.Frame.ChartBorder.GetHeight();this.Canvas.textAlign="left";this.Canvas.textBaseline="middle";this.Canvas.font=this.Font;if(this.Title&&this.IsShowIndexName){var textWidth=this.Canvas.measureText(this.Title).width+2;if(this.IsDrawTitleBG){var spaceSize=GetDevicePixelRatio()*2;this.Canvas.fillStyle=this.BGColor;this.TitleRect={Left:this.Frame.ChartBorder.GetRightTitle(),Top:border.TopEx,Width:this.Frame.ChartBorder.TitleHeight,Height:textWidth};//保存下标题的坐标
4339
4369
  var drawRect={Left:left,Top:-this.Frame.ChartBorder.TitleHeight+spaceSize,Width:textWidth,Height:this.Frame.ChartBorder.TitleHeight-spaceSize*2};this.Canvas.fillRect(drawRect.Left,drawRect.Top,drawRect.Width,drawRect.Height);}this.Canvas.fillStyle=this.TitleColor;this.Canvas.fillText(this.Title,left,bottom,textWidth);left+=textWidth;left+=this.TitleSpace;}var isShowLastData=this.IsShowLastData();var lockRect=this.Frame.GetLockRect();if(lockRect)//指标上锁区域不显示动态标题
4340
- {var index=Math.abs(this.CursorIndex-0.5);if(this.IsKLineFrame)index=this.CursorIndex;var x=this.Frame.GetXFromIndex(index.toFixed(0));if(x>=lockRect.Top)return;if(isShowLastData)return;}for(var i in this.Data){var item=this.Data[i];var outText=this.GetTitleItem(item,isShowLastData);if(!outText)continue;var valueText=outText.Text;var aryText=outText.ArrayText;if(aryText){var text;for(var k=0;k<aryText.length;++k){var titleItem=aryText[k];if(titleItem.Name)text=titleItem.Name+":"+titleItem.Text;else text=titleItem.Text;var space=this.ParamSpace*GetDevicePixelRatio();var textWidth=this.Canvas.measureText(text).width+space;if(left+textWidth>right)break;this.Canvas.fillStyle=titleItem.Color;this.Canvas.fillText(text,left,bottom,textWidth);left+=textWidth;}}else{this.Canvas.fillStyle=item.Color;var text=item.Name+":"+valueText;var space=this.ParamSpace*GetDevicePixelRatio();var textWidth=this.Canvas.measureText(text).width+space;//后空2个像素
4370
+ {var index=Math.abs(this.CursorIndex-0.5);if(this.IsKLineFrame)index=this.CursorIndex;var x=this.Frame.GetXFromIndex(index.toFixed(0));if(x>=lockRect.Top)return;if(isShowLastData)return;}for(var i in this.Data){var item=this.Data[i];var outText=this.GetTitleItem(item,isShowLastData);if(!outText)continue;var valueText=outText.Text;var aryText=outText.ArrayText;if(aryText){var text;for(var k=0;k<aryText.length;++k){var titleItem=aryText[k];if(titleItem.Name)text=titleItem.Name+":"+titleItem.Text;else text=titleItem.Text;var space=this.ParamSpace*GetDevicePixelRatio();var textWidth=this.Canvas.measureText(text).width+space;if(left+textWidth>right)break;this.Canvas.fillStyle=titleItem.Color;this.Canvas.fillText(text,left,bottom,textWidth);left+=textWidth;}}else{this.Canvas.fillStyle=item.Color;var text=valueText;if(item.Name){var dyTitle=this.GetDynamicOutName(item.Name);if(dyTitle)text=dyTitle+":"+valueText;else text=item.Name+":"+valueText;}var space=this.ParamSpace*GetDevicePixelRatio();var textWidth=this.Canvas.measureText(text).width+space;//后空2个像素
4341
4371
  if(left+textWidth>right)break;this.Canvas.fillText(text,left,bottom,textWidth);left+=textWidth;}}if(this.Explain)//说明信息
4342
4372
  {this.Canvas.fillStyle=this.TitleColor;var text="说明:"+this.Explain;var textWidth=this.Canvas.measureText(text).width+2;if(left+textWidth<right){this.Canvas.fillText(text,left,bottom,textWidth);left+=textWidth;}}if(this.OverlayIndexType.Position==1)this.DrawOverlayIndexSingleLine();else this.DrawOverlayIndex(left+5*GetDevicePixelRatio());//间距都空点 和主指标区分开
4343
4373
  };this.OnDrawEventCallback=function(drawData){if(!this.OnDrawEvent||!this.OnDrawEvent.Callback)return;var data={Draw:drawData,Name:'DynamicChartTitlePainting'};this.OnDrawEvent.Callback(this.OnDrawEvent,data,this);};this.GetFontHeight=function(font){return GetFontHeight(this.Canvas,font,"擎");};}//画图工具
@@ -5678,7 +5708,7 @@ this.UpdateOverlayIndex=function(identify){var overlayIndex=this.GetOverlayIndex
5678
5708
  this.ChangeWindowIndexParam=function(index){this.WindowIndex[index].Index[0].Param+=1;this.WindowIndex[index].Index[1].Param+=1;this.UpdateWindowIndex(index);};this.OnDoubleClick=function(x,y,e){if(this.EnableYDrag&&(this.EnableYDrag.Left||this.EnableYDrag.Right)&&this.Frame&&this.Frame.PtInFrameY){var pixelTatio=GetDevicePixelRatio();var x=(e.clientX-this.UIElement.getBoundingClientRect().left)*pixelTatio;var y=(e.clientY-this.UIElement.getBoundingClientRect().top)*pixelTatio;var dragY=this.Frame.PtInFrameY(x,y);if(dragY&&dragY.Index>=0&&dragY.IsOverlay==false){this.CancelZoomUpDownFrameY(dragY);}}var selectedChart;//图形选中
5679
5709
  if(this.SelectedChart.EnableSelected){selectedChart=this.PtInChart(x,y);}var dbClickInfo={SelectedChart:selectedChart};this.DBClickEvent(dbClickInfo,e);if(!selectedChart&&this.EnableZoomIndexWindow)//双击放大缩小
5680
5710
  {var frameId=this.Frame.PtInFrame(x,y);JSConsole.Chart.Log("[KLineChartContainer::OnDoubleClick] frameId",frameId);if(frameId>=this.Frame.ZoomStartWindowIndex){if(this.ZoomIndexWindow(frameId,{X:x,Y:y})){this.Frame.SetSizeChage(true);this.Draw();return true;}}}var event=null;if(this.mapEvent.has(JSCHART_EVENT_ID.DBCLICK_KLINE))event=this.mapEvent.get(JSCHART_EVENT_ID.DBCLICK_KLINE);if(!this.MinuteDialog&&!event)return;var tooltip=new TooltipData();if(!this.PtInChartPaintTooltip(x,y,tooltip))return;if(!tooltip.Data)return;if(event){if(this.ClickChartTimer!=null)//清空单击定时器
5681
- {clearTimeout(this.ClickChartTimer);this.ClickChartTimer=null;}var data={Tooltip:tooltip,Stock:{Symbol:this.Symbol,Name:this.Name}};event.Callback(event,data,this);}if(this.MinuteDialog){e.data={Chart:this,Tooltip:tooltip};this.MinuteDialog.DoModal(e);}};this.CancelAutoUpdate=function()//关闭停止更新
5711
+ {clearTimeout(this.ClickChartTimer);this.ClickChartTimer=null;}var data={Tooltip:tooltip,Stock:{Symbol:this.Symbol,Name:this.Name},X:e.clientX,Y:e.clientY};event.Callback(event,data,this);}if(this.MinuteDialog){e.data={Chart:this,Tooltip:tooltip};this.MinuteDialog.DoModal(e);}};this.CancelAutoUpdate=function()//关闭停止更新
5682
5712
  {if(typeof this.AutoUpdateTimer=='number'){clearTimeout(this.AutoUpdateTimer);this.AutoUpdateTimer=undefined;}};//数据自动更新
5683
5713
  this.AutoUpdate=function(waitTime)//waitTime 更新时间
5684
5714
  {this.CancelAutoUpdate();if(!this.IsAutoUpdate)return;if(!this.Symbol)return;var self=this;var marketStatus=MARKET_SUFFIX_NAME.GetMarketStatus(this.Symbol);if(marketStatus==0||marketStatus==3)return;//闭市,盘后
@@ -5755,17 +5785,18 @@ Explain:'成交量分布图下载',Request:{Period:this.Period,Right:this.Right,
5755
5785
  KLineChartContainer.JsonDataToHistoryData=function(data){var aryDayData=[];if(!data.data)return aryDayData;var upperSymbol=null;if(data.symbol)upperSymbol=data.symbol.toUpperCase();var isFutures=false;//是否是期货
5756
5786
  if(upperSymbol)isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);var list=data.data;var date=0,yclose=1,open=2,high=3,low=4,close=5,vol=6,amount=7,position=8;var fclose=9,yfclose=10;//结算价, 前结算价
5757
5787
  var bfactor=11,afactor=12;//前, 后复权因子
5758
- var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;for(var i=0;i<list.length;++i){var item=new HistoryData();var jsData=list[i];item.Date=jsData[date];item.Open=jsData[open];item.YClose=jsData[yclose];item.Close=jsData[close];item.High=jsData[high];item.Low=jsData[low];item.Vol=jsData[vol];//原始单位股
5788
+ var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;var colorData=JSCHART_DATA_FIELD_ID.KLINE_COLOR_DATA;for(var i=0;i<list.length;++i){var item=new HistoryData();var jsData=list[i];item.Date=jsData[date];item.Open=jsData[open];item.YClose=jsData[yclose];item.Close=jsData[close];item.High=jsData[high];item.Low=jsData[low];item.Vol=jsData[vol];//原始单位股
5759
5789
  item.Amount=jsData[amount];if(IFrameSplitOperator.IsNumber(jsData[position]))item.Position=jsData[position];//期货持仓
5760
5790
  if(IFrameSplitOperator.IsNumber(jsData[fclose]))item.FClose=jsData[fclose];//期货结算价
5761
5791
  if(IFrameSplitOperator.IsNumber(jsData[yfclose]))item.YFClose=jsData[yfclose];//期货前结算价
5762
5792
  if(IFrameSplitOperator.IsNumber(jsData[bfactor]))item.BFactor=jsData[bfactor];//前复权因子
5763
5793
  if(IFrameSplitOperator.IsNumber(jsData[afactor]))item.AFactor=jsData[afactor];//后复权因子
5764
- if(!IFrameSplitOperator.IsNumber(item.Open))continue;if(jsData[orderFlow])item.OrderFlow=jsData[orderFlow];aryDayData.push(item);}return aryDayData;};KLineChartContainer.JsonDataToRealtimeData=function(data,symbol){if(!data.stock)return null;var stock;for(var i in data.stock)//查找对应的股票数据
5794
+ if(!IFrameSplitOperator.IsNumber(item.Open))continue;if(jsData[orderFlow])item.OrderFlow=jsData[orderFlow];if(jsData[colorData])item.ColorData=jsData[colorData];aryDayData.push(item);}return aryDayData;};KLineChartContainer.JsonDataToRealtimeData=function(data,symbol){if(!data.stock)return null;var stock;for(var i in data.stock)//查找对应的股票数据
5765
5795
  {var stockItem=data.stock[i];if(stockItem&&stockItem.symbol==symbol){stock=stockItem;break;}}if(!stock)return null;var upperSymbol=symbol.toUpperCase();var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);var item=new HistoryData();item.Date=stock.date;item.Open=stock.open;item.YClose=stock.yclose;item.High=stock.high;item.Low=stock.low;item.Vol=stock.vol;//股
5766
5796
  item.Amount=stock.amount;item.Close=stock.price;if(IFrameSplitOperator.IsNumber(stock.position))item.Position=stock.position;//持仓量
5767
5797
  if(IFrameSplitOperator.IsNumber(stock.bfactor))item.BFactor=stock.bfactor;//前复权因子
5768
5798
  if(IFrameSplitOperator.IsNumber(stock.afactor))item.AFactor=stock.afactor;//后复权因子
5799
+ if(stock.colordata)item.ColorData=stock.colordata;//自定义颜色
5769
5800
  return item;};KLineChartContainer.JsonDataToMinuteRealtimeData=function(data,symbol){if(!data.stock)return null;var stock;for(var i in data.stock)//查找对应的股票数据
5770
5801
  {var stockItem=data.stock[i];if(stockItem&&stockItem.symbol==symbol){stock=stockItem;break;}}if(!stock)return null;var upperSymbol=symbol.toUpperCase();var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);var aryMinuteData=new Array();var preClose=stock.yclose;//前一个数据价格
5771
5802
  var date=stock.date;if(isFutures&&stock.yclearing)preClose=stock.yclearing;//期货使用昨结算价
@@ -5777,13 +5808,13 @@ if(!IFrameSplitOperator.IsNumber(item.Open))item.Open=null;if(!IFrameSplitOperat
5777
5808
  if(IFrameSplitOperator.IsNumber(jsData.price))preClose=jsData.price;aryMinuteData[i]=item;}return aryMinuteData;};//分钟K线叠加数据增量更新v2版本
5778
5809
  KLineChartContainer.JsonDataToMinuteRealtimeDataV2=function(data,symbol){if(!data||!data.overlay||!symbol)return null;var overlayData=null;for(var i=0;i<data.overlay.length;++i)//overlay={ symbol:, name:, data:[] }
5779
5810
  {var item=data.overlay[i];if(item.symbol==symbol){overlayData=item;break;}}if(!overlayData)return null;var upperSymbol=symbol.toUpperCase();var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);//是否是期货
5780
- var date=0,yclose=1,open=2,high=3,low=4,close=5,vol=6,amount=7,time=8,position=9,orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;;var yClose=null;for(var i=0;i<overlayData.data.length;++i){var item=new HistoryData();var jsData=overlayData.data[i];item.Date=jsData[date];item.Open=jsData[open];item.YClose=jsData[yclose];item.Close=jsData[close];item.High=jsData[high];item.Low=jsData[low];item.Vol=jsData[vol];//股
5811
+ var date=0,yclose=1,open=2,high=3,low=4,close=5,vol=6,amount=7,time=8,position=9;var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;var yClose=null;for(var i=0;i<overlayData.data.length;++i){var item=new HistoryData();var jsData=overlayData.data[i];item.Date=jsData[date];item.Open=jsData[open];item.YClose=jsData[yclose];item.Close=jsData[close];item.High=jsData[high];item.Low=jsData[low];item.Vol=jsData[vol];//股
5781
5812
  item.Amount=jsData[amount];item.Time=jsData[time];if(IFrameSplitOperator.IsNumber(jsData[position]))item.Position=jsData[position];//期货持仓
5782
5813
  if(!IFrameSplitOperator.IsNumber(item.YClose)){if(IFrameSplitOperator.IsNumber(yClose))item.YClose=yClose;}if(IFrameSplitOperator.IsNumber(item.Close))yClose=item.Close;if(jsData[orderFlow])item.OrderFlow=jsData[orderFlow];aryMinuteData.push(item);}return aryMinuteData;};//API 返回数据 转化为array[]
5783
5814
  KLineChartContainer.JsonDataToMinuteHistoryData=function(data){var upperSymbol=null;if(data.symbol)upperSymbol=data.symbol.toUpperCase();var isSHSZ=false;if(upperSymbol)isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);var isFutures=false;//是否是期货
5784
- if(upperSymbol)isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);var list=data.data;var aryDayData=new Array();var date=0,yclose=1,open=2,high=3,low=4,close=5,vol=6,amount=7,time=8,position=9,orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;;var yClose=null;for(var i=0;i<list.length;++i){var item=new HistoryData();var jsData=list[i];item.Date=jsData[date];item.Open=jsData[open];item.YClose=jsData[yclose];item.Close=jsData[close];item.High=jsData[high];item.Low=jsData[low];item.Vol=jsData[vol];//股
5815
+ if(upperSymbol)isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);var list=data.data;var aryDayData=new Array();var date=0,yclose=1,open=2,high=3,low=4,close=5,vol=6,amount=7,time=8,position=9;var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;var colorData=JSCHART_DATA_FIELD_ID.KLINE_COLOR_DATA;var yClose=null;for(var i=0;i<list.length;++i){var item=new HistoryData();var jsData=list[i];item.Date=jsData[date];item.Open=jsData[open];item.YClose=jsData[yclose];item.Close=jsData[close];item.High=jsData[high];item.Low=jsData[low];item.Vol=jsData[vol];//股
5785
5816
  item.Amount=jsData[amount];item.Time=jsData[time];if(IFrameSplitOperator.IsNumber(jsData[position]))item.Position=jsData[position];//期货持仓
5786
- if(!IFrameSplitOperator.IsNumber(item.YClose)){if(IFrameSplitOperator.IsNumber(yClose))item.YClose=yClose;}if(IFrameSplitOperator.IsNumber(item.Close))yClose=item.Close;if(jsData[orderFlow])item.OrderFlow=jsData[orderFlow];aryDayData.push(item);}/* 内部不处理无效数据, 确保外部传过来的数据是对的.
5817
+ if(!IFrameSplitOperator.IsNumber(item.YClose)){if(IFrameSplitOperator.IsNumber(yClose))item.YClose=yClose;}if(IFrameSplitOperator.IsNumber(item.Close))yClose=item.Close;if(jsData[orderFlow])item.OrderFlow=jsData[orderFlow];if(jsData[colorData])item.ColorData=jsData[colorData];aryDayData.push(item);}/* 内部不处理无效数据, 确保外部传过来的数据是对的.
5787
5818
  // 无效数据处理
5788
5819
  for(var i = 0; i < aryDayData.length; ++i)
5789
5820
  {
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "hqchart",
3
3
  "description": "stock chart",
4
4
  "author": "jones2000",
5
- "version": "1.1.11279",
5
+ "version": "1.1.11289",
6
6
  "main": "lib/main.js",
7
7
  "private": false,
8
8
  "license": "Apache License 2.0",
@@ -6262,6 +6262,7 @@ var JSCHART_DATA_FIELD_ID=
6262
6262
  {
6263
6263
  KLINE_ORDERFLOW:99,
6264
6264
  MINUTE_MULTI_DAY_EXTENDDATA:21, //多日分时图扩展数据序号
6265
+ KLINE_COLOR_DATA:66, //K线自定义颜色数据
6265
6266
  }
6266
6267
 
6267
6268
 
@@ -8840,7 +8841,15 @@ function JSChartContainer(uielement, OffscreenElement)
8840
8841
  var bDrawPicture=false; //是否正在画图
8841
8842
  if (this.CurrentChartDrawPicture)
8842
8843
  {
8843
- if (this.CurrentChartDrawPicture.Status!=20) mouseStatus={ Cursor:"crosshair", Name:"CurrentChartDrawPicture"};
8844
+ var index=this.Frame.PtInChartFrame(x,y);
8845
+ if (this.CurrentChartDrawPicture.Status!=20)
8846
+ {
8847
+ if (index>=0)
8848
+ mouseStatus={ Cursor:"crosshair", Name:"CurrentChartDrawPicture"};
8849
+ else
8850
+ mouseStatus={ Cursor:"not-allowed", Name:"CurrentChartDrawPicture"}; //不在画图区域
8851
+ }
8852
+
8844
8853
  if (this.CurrentChartDrawPicture.SetLastPoint) this.CurrentChartDrawPicture.SetLastPoint({X:x,Y:y});
8845
8854
  bDrawPicture=true;
8846
8855
  }
@@ -18054,6 +18063,27 @@ function HQTradeFrame()
18054
18063
  return -1;
18055
18064
  }
18056
18065
 
18066
+ this.PtInChartFrame=function(x,y) //鼠标在图形区域, 取出上下空白
18067
+ {
18068
+ for(var i=0; i<this.SubFrame.length; ++i)
18069
+ {
18070
+ var item=this.SubFrame[i];
18071
+ var left=item.Frame.ChartBorder.GetLeft();
18072
+ var top=item.Frame.ChartBorder.GetTopEx();
18073
+ var width=item.Frame.ChartBorder.GetWidth();
18074
+ var height=item.Frame.ChartBorder.GetHeightEx();
18075
+
18076
+ item.Frame.Canvas.beginPath();
18077
+ item.Frame.Canvas.rect(left,top,width,height);
18078
+ if (item.Frame.Canvas.isPointInPath(x,y))
18079
+ {
18080
+ return i; //转成整形
18081
+ }
18082
+ }
18083
+
18084
+ return -1;
18085
+ }
18086
+
18057
18087
  this.PtInButtons=function(x,y)
18058
18088
  {
18059
18089
  for(var i=0; i<this.SubFrame.length; ++i)
@@ -18794,6 +18824,7 @@ HistoryData.Copy=function(data)
18794
18824
  if (IFrameSplitOperator.IsNumber(data.AFactor)) newData.AFactor=data.AFactor;
18795
18825
 
18796
18826
  if (data.OrderFlow) newData.OrderFlow=data.OrderFlow;
18827
+ if (data.ColorData) newData.ColorData=data.ColorData;
18797
18828
 
18798
18829
  return newData;
18799
18830
  }
@@ -18824,6 +18855,9 @@ HistoryData.CopyTo=function(dest,src)
18824
18855
 
18825
18856
  if (IFrameSplitOperator.IsNumber(src.BFactor)) dest.BFactor=src.BFactor;
18826
18857
  if (IFrameSplitOperator.IsNumber(src.AFactor)) dest.AFactor=src.AFactor;
18858
+
18859
+ if (src.OrderFlow) dest.OrderFlow=src.OrderFlow;
18860
+ if (src.ColorData) dest.ColorData=src.ColorData;
18827
18861
  }
18828
18862
 
18829
18863
  //数据复权拷贝
@@ -22105,7 +22139,7 @@ function ChartKLine()
22105
22139
 
22106
22140
  this.ClassName='ChartKLine'; //类名
22107
22141
  this.Symbol; //股票代码
22108
- this.DrawType=0; // 0=实心K线柱子 1=收盘价线 2=美国线 3=空心K线柱子 4=收盘价面积图 5=订单流 6=空心K线柱子2(全部空心) 7=订单流样式2 8=订单流样式3
22142
+ this.DrawType=0; // 0=实心K线柱子 1=收盘价线 2=美国线 3=空心K线柱子 4=收盘价面积图 5=订单流 6=空心K线柱子2(全部空心) 7=订单流样式2 8=订单流样式3 9=自定义颜色K线
22109
22143
  this.CloseLineColor=g_JSChartResource.CloseLineColor;
22110
22144
  this.CloseLineAreaColor=g_JSChartResource.CloseLineAreaColor;
22111
22145
  this.CloseLineWidth=g_JSChartResource.CloseLineWidth;
@@ -22646,6 +22680,10 @@ function ChartKLine()
22646
22680
 
22647
22681
  this.DrawKBar_Custom(data, dataWidth, barColor, drawType, kLineOption, x, y, left, right, yLow, yHigh, yOpen, yClose, border, isHScreen);
22648
22682
  }
22683
+ else if (this.DrawType==9 && data.ColorData)
22684
+ {
22685
+ this.DrawKBarV2(data, data.ColorData, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
22686
+ }
22649
22687
  else if (data.Open<data.Close) //阳线
22650
22688
  {
22651
22689
  this.DrawKBar_Up(data, dataWidth, upColor, this.DrawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
@@ -23131,6 +23169,171 @@ function ChartKLine()
23131
23169
  }
23132
23170
  }
23133
23171
 
23172
+ this.DrawKBarV2=function(data, colorData, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen)
23173
+ {
23174
+ var isDrawBorder=false;
23175
+ var isEmptyBar=false;
23176
+ if (colorData.border) isDrawBorder=true;
23177
+ if (colorData.Type===0) isEmptyBar=true;
23178
+
23179
+ if (dataWidth>=4)
23180
+ {
23181
+ if (isDrawBorder)
23182
+ {
23183
+ if ((dataWidth%2)!=0) dataWidth-=1;
23184
+ }
23185
+
23186
+ if (data.High>data.Close) //上影线
23187
+ {
23188
+ if (colorData.Line)
23189
+ {
23190
+ this.Canvas.strokeStyle=colorData.Line.Color;
23191
+ this.Canvas.beginPath();
23192
+ if (isHScreen)
23193
+ {
23194
+ this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));
23195
+ this.Canvas.lineTo(ToFixedPoint(isEmptyBar?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));
23196
+ }
23197
+ else
23198
+ {
23199
+ if (isDrawBorder)
23200
+ {
23201
+ var xFixed=left+dataWidth/2;
23202
+ this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(y));
23203
+ this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(Math.min(yClose,yOpen)));
23204
+ }
23205
+ else
23206
+ {
23207
+ this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
23208
+ this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(Math.min(yClose,yOpen)));
23209
+ }
23210
+ }
23211
+ this.Canvas.stroke();
23212
+ }
23213
+
23214
+ y=yClose;
23215
+ }
23216
+ else
23217
+ {
23218
+ y=yClose;
23219
+ }
23220
+
23221
+ if (isHScreen)
23222
+ {
23223
+ /*
23224
+ if (Math.abs(yOpen-y)<1)
23225
+ {
23226
+ this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth)); //高度小于1,统一使用高度1
23227
+ }
23228
+ else
23229
+ {
23230
+ if (drawType==3) //空心柱
23231
+ {
23232
+ this.Canvas.beginPath();
23233
+ this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));
23234
+ this.Canvas.stroke();
23235
+ }
23236
+ else
23237
+ {
23238
+ this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));
23239
+ }
23240
+ }
23241
+ */
23242
+ }
23243
+ else
23244
+ {
23245
+
23246
+ //实心
23247
+ if (!isEmptyBar && colorData.BarColor)
23248
+ {
23249
+ this.Canvas.fillStyle=colorData.BarColor;
23250
+ if (Math.abs(yOpen-y)<1)
23251
+ {
23252
+ this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1); //高度小于1,统一使用高度1
23253
+ }
23254
+ else
23255
+ {
23256
+ this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yOpen)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yOpen-y)));
23257
+ }
23258
+ }
23259
+
23260
+ if (colorData.Border) //空心
23261
+ {
23262
+ if (Math.abs(yOpen-y)<1)
23263
+ {
23264
+ this.Canvas.fillStyle=colorData.Border.Color;
23265
+ this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1); //高度小于1,统一使用高度1
23266
+ }
23267
+ else
23268
+ {
23269
+ this.Canvas.strokeStyle=colorData.Border.Color;
23270
+ this.Canvas.beginPath();
23271
+ this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));
23272
+ this.Canvas.stroke();
23273
+ }
23274
+ }
23275
+ }
23276
+
23277
+ if (data.Open>data.Low) //下影线
23278
+ {
23279
+ if (colorData.Line)
23280
+ {
23281
+ this.Canvas.strokeStyle=colorData.Line.Color;
23282
+ this.Canvas.beginPath();
23283
+ if (isHScreen)
23284
+ {
23285
+ this.Canvas.moveTo(ToFixedPoint(isEmptyBar?Math.min(yClose,yOpen):y),ToFixedPoint(x));
23286
+ this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));
23287
+ }
23288
+ else
23289
+ {
23290
+ if (isDrawBorder)
23291
+ {
23292
+ var xFixed=left+dataWidth/2;
23293
+ this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(Math.max(yClose,yOpen)));
23294
+ this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(yLow));
23295
+ }
23296
+ else
23297
+ {
23298
+ this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(Math.max(yClose,yOpen)));
23299
+ this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));
23300
+ }
23301
+ }
23302
+ this.Canvas.stroke();
23303
+ }
23304
+ }
23305
+ }
23306
+ else
23307
+ {
23308
+ var lineColor;
23309
+ if (isEmptyBar && colorData.Border)
23310
+ {
23311
+ lineColor=colorData.Border.Color;
23312
+ }
23313
+ else if (!isEmptyBar && colorData.BarColor)
23314
+ {
23315
+ lineColor=colorData.BarColor;
23316
+ }
23317
+
23318
+ if (lineColor)
23319
+ {
23320
+ this.Canvas.strokeStyle=lineColor;
23321
+ this.Canvas.beginPath();
23322
+ if (isHScreen)
23323
+ {
23324
+ this.Canvas.moveTo(yHigh,ToFixedPoint(x));
23325
+ this.Canvas.lineTo(yLow,ToFixedPoint(x));
23326
+ }
23327
+ else
23328
+ {
23329
+ this.Canvas.moveTo(ToFixedPoint(x),yHigh);
23330
+ this.Canvas.lineTo(ToFixedPoint(x),yLow);
23331
+ }
23332
+ this.Canvas.stroke();
23333
+ }
23334
+ }
23335
+ }
23336
+
23134
23337
  this.DrawTrade=function() //交易系统
23135
23338
  {
23136
23339
  if (!this.TradeData) return;
@@ -23392,6 +23595,10 @@ function ChartKLine()
23392
23595
  {
23393
23596
  this.DrawOrderFlow_Style3();
23394
23597
  }
23598
+ else if (this.DrawType==9)
23599
+ {
23600
+ this.DrawKBar();
23601
+ }
23395
23602
  else
23396
23603
  {
23397
23604
  this.DrawKBar();
@@ -25946,10 +26153,13 @@ function ChartOverlayKLine()
25946
26153
 
25947
26154
  this.PtInChart=function(x,y)
25948
26155
  {
25949
- if (this.DrawType==1 || this.DrawType==4)
26156
+ var drawType=this.DrawType;
26157
+ if (IFrameSplitOperator.IsNumber(this.CustomDrawType)) drawType=this.CustomDrawType;
26158
+
26159
+ if (drawType==1 || drawType==4) //线段,面积不支持选中
25950
26160
  {
25951
26161
  return null;
25952
- return this.PtInLine(x,y, {KLineClose:true});
26162
+ //return this.PtInLine(x,y, {KLineClose:true});
25953
26163
  }
25954
26164
 
25955
26165
  return this.PtInKBar(x,y, {OverlayKLine:true});
@@ -44800,7 +45010,14 @@ function DynamicChartTitlePainting()
44800
45010
  else
44801
45011
  {
44802
45012
  this.Canvas.fillStyle=item.Color;
44803
- var text=item.Name+":"+valueText;
45013
+ var text=valueText;
45014
+ if (item.Name)
45015
+ {
45016
+ var dyTitle=this.GetDynamicOutName(item.Name);
45017
+ if (dyTitle) text=dyTitle+":"+valueText;
45018
+ else text=item.Name+":"+valueText;
45019
+ }
45020
+
44804
45021
  var space=this.ParamSpace*GetDevicePixelRatio();
44805
45022
  var textWidth=this.Canvas.measureText(text).width+space; //后空2个像素
44806
45023
  if ((left+textWidth)>right) break;
@@ -58727,7 +58944,7 @@ function KLineChartContainer(uielement,OffscreenElement)
58727
58944
  this.ClickChartTimer=null;
58728
58945
  }
58729
58946
 
58730
- var data={ Tooltip:tooltip, Stock:{Symbol:this.Symbol, Name:this.Name } }
58947
+ var data={ Tooltip:tooltip, Stock:{Symbol:this.Symbol, Name:this.Name }, X:e.clientX, Y:e.clientY };
58731
58948
  event.Callback(event,data,this);
58732
58949
  }
58733
58950
 
@@ -59452,6 +59669,7 @@ KLineChartContainer.JsonDataToHistoryData=function(data)
59452
59669
  var fclose=9, yfclose=10; //结算价, 前结算价
59453
59670
  var bfactor=11, afactor=12; //前, 后复权因子
59454
59671
  var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;
59672
+ var colorData=JSCHART_DATA_FIELD_ID.KLINE_COLOR_DATA;
59455
59673
  for (var i = 0; i < list.length; ++i)
59456
59674
  {
59457
59675
  var item = new HistoryData();
@@ -59475,6 +59693,7 @@ KLineChartContainer.JsonDataToHistoryData=function(data)
59475
59693
  if (!IFrameSplitOperator.IsNumber(item.Open)) continue;
59476
59694
 
59477
59695
  if (jsData[orderFlow]) item.OrderFlow=jsData[orderFlow];
59696
+ if (jsData[colorData]) item.ColorData=jsData[colorData];
59478
59697
 
59479
59698
  aryDayData.push(item);
59480
59699
  }
@@ -59514,6 +59733,7 @@ KLineChartContainer.JsonDataToRealtimeData=function(data, symbol)
59514
59733
 
59515
59734
  if (IFrameSplitOperator.IsNumber(stock.bfactor)) item.BFactor=stock.bfactor; //前复权因子
59516
59735
  if (IFrameSplitOperator.IsNumber(stock.afactor)) item.AFactor=stock.afactor; //后复权因子
59736
+ if (stock.colordata) item.ColorData=stock.colordata; //自定义颜色
59517
59737
  return item;
59518
59738
  }
59519
59739
 
@@ -59601,7 +59821,8 @@ KLineChartContainer.JsonDataToMinuteRealtimeDataV2=function(data,symbol)
59601
59821
  var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);
59602
59822
  var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol); //是否是期货
59603
59823
 
59604
- var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9, orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;;
59824
+ var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9;
59825
+ var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;
59605
59826
  var yClose=null;
59606
59827
 
59607
59828
  for (var i = 0; i < overlayData.data.length; ++i)
@@ -59645,7 +59866,9 @@ KLineChartContainer.JsonDataToMinuteHistoryData=function(data)
59645
59866
  if (upperSymbol) isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);
59646
59867
  var list = data.data;
59647
59868
  var aryDayData=new Array();
59648
- var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9, orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;;
59869
+ var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9;
59870
+ var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;
59871
+ var colorData=JSCHART_DATA_FIELD_ID.KLINE_COLOR_DATA;
59649
59872
  var yClose=null;
59650
59873
  for (var i = 0; i < list.length; ++i)
59651
59874
  {
@@ -59670,6 +59893,7 @@ KLineChartContainer.JsonDataToMinuteHistoryData=function(data)
59670
59893
  if (IFrameSplitOperator.IsNumber(item.Close)) yClose=item.Close;
59671
59894
 
59672
59895
  if (jsData[orderFlow]) item.OrderFlow=jsData[orderFlow];
59896
+ if (jsData[colorData]) item.ColorData=jsData[colorData];
59673
59897
 
59674
59898
  aryDayData.push(item);
59675
59899
  }
@@ -6306,6 +6306,7 @@ var JSCHART_DATA_FIELD_ID=
6306
6306
  {
6307
6307
  KLINE_ORDERFLOW:99,
6308
6308
  MINUTE_MULTI_DAY_EXTENDDATA:21, //多日分时图扩展数据序号
6309
+ KLINE_COLOR_DATA:66, //K线自定义颜色数据
6309
6310
  }
6310
6311
 
6311
6312
 
@@ -8884,7 +8885,15 @@ function JSChartContainer(uielement, OffscreenElement)
8884
8885
  var bDrawPicture=false; //是否正在画图
8885
8886
  if (this.CurrentChartDrawPicture)
8886
8887
  {
8887
- if (this.CurrentChartDrawPicture.Status!=20) mouseStatus={ Cursor:"crosshair", Name:"CurrentChartDrawPicture"};
8888
+ var index=this.Frame.PtInChartFrame(x,y);
8889
+ if (this.CurrentChartDrawPicture.Status!=20)
8890
+ {
8891
+ if (index>=0)
8892
+ mouseStatus={ Cursor:"crosshair", Name:"CurrentChartDrawPicture"};
8893
+ else
8894
+ mouseStatus={ Cursor:"not-allowed", Name:"CurrentChartDrawPicture"}; //不在画图区域
8895
+ }
8896
+
8888
8897
  if (this.CurrentChartDrawPicture.SetLastPoint) this.CurrentChartDrawPicture.SetLastPoint({X:x,Y:y});
8889
8898
  bDrawPicture=true;
8890
8899
  }
@@ -18098,6 +18107,27 @@ function HQTradeFrame()
18098
18107
  return -1;
18099
18108
  }
18100
18109
 
18110
+ this.PtInChartFrame=function(x,y) //鼠标在图形区域, 取出上下空白
18111
+ {
18112
+ for(var i=0; i<this.SubFrame.length; ++i)
18113
+ {
18114
+ var item=this.SubFrame[i];
18115
+ var left=item.Frame.ChartBorder.GetLeft();
18116
+ var top=item.Frame.ChartBorder.GetTopEx();
18117
+ var width=item.Frame.ChartBorder.GetWidth();
18118
+ var height=item.Frame.ChartBorder.GetHeightEx();
18119
+
18120
+ item.Frame.Canvas.beginPath();
18121
+ item.Frame.Canvas.rect(left,top,width,height);
18122
+ if (item.Frame.Canvas.isPointInPath(x,y))
18123
+ {
18124
+ return i; //转成整形
18125
+ }
18126
+ }
18127
+
18128
+ return -1;
18129
+ }
18130
+
18101
18131
  this.PtInButtons=function(x,y)
18102
18132
  {
18103
18133
  for(var i=0; i<this.SubFrame.length; ++i)
@@ -18838,6 +18868,7 @@ HistoryData.Copy=function(data)
18838
18868
  if (IFrameSplitOperator.IsNumber(data.AFactor)) newData.AFactor=data.AFactor;
18839
18869
 
18840
18870
  if (data.OrderFlow) newData.OrderFlow=data.OrderFlow;
18871
+ if (data.ColorData) newData.ColorData=data.ColorData;
18841
18872
 
18842
18873
  return newData;
18843
18874
  }
@@ -18868,6 +18899,9 @@ HistoryData.CopyTo=function(dest,src)
18868
18899
 
18869
18900
  if (IFrameSplitOperator.IsNumber(src.BFactor)) dest.BFactor=src.BFactor;
18870
18901
  if (IFrameSplitOperator.IsNumber(src.AFactor)) dest.AFactor=src.AFactor;
18902
+
18903
+ if (src.OrderFlow) dest.OrderFlow=src.OrderFlow;
18904
+ if (src.ColorData) dest.ColorData=src.ColorData;
18871
18905
  }
18872
18906
 
18873
18907
  //数据复权拷贝
@@ -22149,7 +22183,7 @@ function ChartKLine()
22149
22183
 
22150
22184
  this.ClassName='ChartKLine'; //类名
22151
22185
  this.Symbol; //股票代码
22152
- this.DrawType=0; // 0=实心K线柱子 1=收盘价线 2=美国线 3=空心K线柱子 4=收盘价面积图 5=订单流 6=空心K线柱子2(全部空心) 7=订单流样式2 8=订单流样式3
22186
+ this.DrawType=0; // 0=实心K线柱子 1=收盘价线 2=美国线 3=空心K线柱子 4=收盘价面积图 5=订单流 6=空心K线柱子2(全部空心) 7=订单流样式2 8=订单流样式3 9=自定义颜色K线
22153
22187
  this.CloseLineColor=g_JSChartResource.CloseLineColor;
22154
22188
  this.CloseLineAreaColor=g_JSChartResource.CloseLineAreaColor;
22155
22189
  this.CloseLineWidth=g_JSChartResource.CloseLineWidth;
@@ -22690,6 +22724,10 @@ function ChartKLine()
22690
22724
 
22691
22725
  this.DrawKBar_Custom(data, dataWidth, barColor, drawType, kLineOption, x, y, left, right, yLow, yHigh, yOpen, yClose, border, isHScreen);
22692
22726
  }
22727
+ else if (this.DrawType==9 && data.ColorData)
22728
+ {
22729
+ this.DrawKBarV2(data, data.ColorData, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
22730
+ }
22693
22731
  else if (data.Open<data.Close) //阳线
22694
22732
  {
22695
22733
  this.DrawKBar_Up(data, dataWidth, upColor, this.DrawType, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen);
@@ -23175,6 +23213,171 @@ function ChartKLine()
23175
23213
  }
23176
23214
  }
23177
23215
 
23216
+ this.DrawKBarV2=function(data, colorData, dataWidth, x, y, left, right, yLow, yHigh, yOpen, yClose, isHScreen)
23217
+ {
23218
+ var isDrawBorder=false;
23219
+ var isEmptyBar=false;
23220
+ if (colorData.border) isDrawBorder=true;
23221
+ if (colorData.Type===0) isEmptyBar=true;
23222
+
23223
+ if (dataWidth>=4)
23224
+ {
23225
+ if (isDrawBorder)
23226
+ {
23227
+ if ((dataWidth%2)!=0) dataWidth-=1;
23228
+ }
23229
+
23230
+ if (data.High>data.Close) //上影线
23231
+ {
23232
+ if (colorData.Line)
23233
+ {
23234
+ this.Canvas.strokeStyle=colorData.Line.Color;
23235
+ this.Canvas.beginPath();
23236
+ if (isHScreen)
23237
+ {
23238
+ this.Canvas.moveTo(ToFixedPoint(y),ToFixedPoint(x));
23239
+ this.Canvas.lineTo(ToFixedPoint(isEmptyBar?Math.max(yClose,yOpen):yClose),ToFixedPoint(x));
23240
+ }
23241
+ else
23242
+ {
23243
+ if (isDrawBorder)
23244
+ {
23245
+ var xFixed=left+dataWidth/2;
23246
+ this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(y));
23247
+ this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(Math.min(yClose,yOpen)));
23248
+ }
23249
+ else
23250
+ {
23251
+ this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(y));
23252
+ this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(Math.min(yClose,yOpen)));
23253
+ }
23254
+ }
23255
+ this.Canvas.stroke();
23256
+ }
23257
+
23258
+ y=yClose;
23259
+ }
23260
+ else
23261
+ {
23262
+ y=yClose;
23263
+ }
23264
+
23265
+ if (isHScreen)
23266
+ {
23267
+ /*
23268
+ if (Math.abs(yOpen-y)<1)
23269
+ {
23270
+ this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),1,ToFixedRect(dataWidth)); //高度小于1,统一使用高度1
23271
+ }
23272
+ else
23273
+ {
23274
+ if (drawType==3) //空心柱
23275
+ {
23276
+ this.Canvas.beginPath();
23277
+ this.Canvas.rect(ToFixedPoint(y),ToFixedPoint(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));
23278
+ this.Canvas.stroke();
23279
+ }
23280
+ else
23281
+ {
23282
+ this.Canvas.fillRect(ToFixedRect(y),ToFixedRect(left),ToFixedRect(yOpen-y),ToFixedRect(dataWidth));
23283
+ }
23284
+ }
23285
+ */
23286
+ }
23287
+ else
23288
+ {
23289
+
23290
+ //实心
23291
+ if (!isEmptyBar && colorData.BarColor)
23292
+ {
23293
+ this.Canvas.fillStyle=colorData.BarColor;
23294
+ if (Math.abs(yOpen-y)<1)
23295
+ {
23296
+ this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1); //高度小于1,统一使用高度1
23297
+ }
23298
+ else
23299
+ {
23300
+ this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(Math.min(y,yOpen)),ToFixedRect(dataWidth),ToFixedRect(Math.abs(yOpen-y)));
23301
+ }
23302
+ }
23303
+
23304
+ if (colorData.Border) //空心
23305
+ {
23306
+ if (Math.abs(yOpen-y)<1)
23307
+ {
23308
+ this.Canvas.fillStyle=colorData.Border.Color;
23309
+ this.Canvas.fillRect(ToFixedRect(left),ToFixedRect(y),ToFixedRect(dataWidth),1); //高度小于1,统一使用高度1
23310
+ }
23311
+ else
23312
+ {
23313
+ this.Canvas.strokeStyle=colorData.Border.Color;
23314
+ this.Canvas.beginPath();
23315
+ this.Canvas.rect(ToFixedPoint(left),ToFixedPoint(y),ToFixedRect(dataWidth),ToFixedRect(yOpen-y));
23316
+ this.Canvas.stroke();
23317
+ }
23318
+ }
23319
+ }
23320
+
23321
+ if (data.Open>data.Low) //下影线
23322
+ {
23323
+ if (colorData.Line)
23324
+ {
23325
+ this.Canvas.strokeStyle=colorData.Line.Color;
23326
+ this.Canvas.beginPath();
23327
+ if (isHScreen)
23328
+ {
23329
+ this.Canvas.moveTo(ToFixedPoint(isEmptyBar?Math.min(yClose,yOpen):y),ToFixedPoint(x));
23330
+ this.Canvas.lineTo(ToFixedPoint(yLow),ToFixedPoint(x));
23331
+ }
23332
+ else
23333
+ {
23334
+ if (isDrawBorder)
23335
+ {
23336
+ var xFixed=left+dataWidth/2;
23337
+ this.Canvas.moveTo(ToFixedPoint(xFixed),ToFixedPoint(Math.max(yClose,yOpen)));
23338
+ this.Canvas.lineTo(ToFixedPoint(xFixed),ToFixedPoint(yLow));
23339
+ }
23340
+ else
23341
+ {
23342
+ this.Canvas.moveTo(ToFixedPoint(x),ToFixedPoint(Math.max(yClose,yOpen)));
23343
+ this.Canvas.lineTo(ToFixedPoint(x),ToFixedPoint(yLow));
23344
+ }
23345
+ }
23346
+ this.Canvas.stroke();
23347
+ }
23348
+ }
23349
+ }
23350
+ else
23351
+ {
23352
+ var lineColor;
23353
+ if (isEmptyBar && colorData.Border)
23354
+ {
23355
+ lineColor=colorData.Border.Color;
23356
+ }
23357
+ else if (!isEmptyBar && colorData.BarColor)
23358
+ {
23359
+ lineColor=colorData.BarColor;
23360
+ }
23361
+
23362
+ if (lineColor)
23363
+ {
23364
+ this.Canvas.strokeStyle=lineColor;
23365
+ this.Canvas.beginPath();
23366
+ if (isHScreen)
23367
+ {
23368
+ this.Canvas.moveTo(yHigh,ToFixedPoint(x));
23369
+ this.Canvas.lineTo(yLow,ToFixedPoint(x));
23370
+ }
23371
+ else
23372
+ {
23373
+ this.Canvas.moveTo(ToFixedPoint(x),yHigh);
23374
+ this.Canvas.lineTo(ToFixedPoint(x),yLow);
23375
+ }
23376
+ this.Canvas.stroke();
23377
+ }
23378
+ }
23379
+ }
23380
+
23178
23381
  this.DrawTrade=function() //交易系统
23179
23382
  {
23180
23383
  if (!this.TradeData) return;
@@ -23436,6 +23639,10 @@ function ChartKLine()
23436
23639
  {
23437
23640
  this.DrawOrderFlow_Style3();
23438
23641
  }
23642
+ else if (this.DrawType==9)
23643
+ {
23644
+ this.DrawKBar();
23645
+ }
23439
23646
  else
23440
23647
  {
23441
23648
  this.DrawKBar();
@@ -25990,10 +26197,13 @@ function ChartOverlayKLine()
25990
26197
 
25991
26198
  this.PtInChart=function(x,y)
25992
26199
  {
25993
- if (this.DrawType==1 || this.DrawType==4)
26200
+ var drawType=this.DrawType;
26201
+ if (IFrameSplitOperator.IsNumber(this.CustomDrawType)) drawType=this.CustomDrawType;
26202
+
26203
+ if (drawType==1 || drawType==4) //线段,面积不支持选中
25994
26204
  {
25995
26205
  return null;
25996
- return this.PtInLine(x,y, {KLineClose:true});
26206
+ //return this.PtInLine(x,y, {KLineClose:true});
25997
26207
  }
25998
26208
 
25999
26209
  return this.PtInKBar(x,y, {OverlayKLine:true});
@@ -44844,7 +45054,14 @@ function DynamicChartTitlePainting()
44844
45054
  else
44845
45055
  {
44846
45056
  this.Canvas.fillStyle=item.Color;
44847
- var text=item.Name+":"+valueText;
45057
+ var text=valueText;
45058
+ if (item.Name)
45059
+ {
45060
+ var dyTitle=this.GetDynamicOutName(item.Name);
45061
+ if (dyTitle) text=dyTitle+":"+valueText;
45062
+ else text=item.Name+":"+valueText;
45063
+ }
45064
+
44848
45065
  var space=this.ParamSpace*GetDevicePixelRatio();
44849
45066
  var textWidth=this.Canvas.measureText(text).width+space; //后空2个像素
44850
45067
  if ((left+textWidth)>right) break;
@@ -58771,7 +58988,7 @@ function KLineChartContainer(uielement,OffscreenElement)
58771
58988
  this.ClickChartTimer=null;
58772
58989
  }
58773
58990
 
58774
- var data={ Tooltip:tooltip, Stock:{Symbol:this.Symbol, Name:this.Name } }
58991
+ var data={ Tooltip:tooltip, Stock:{Symbol:this.Symbol, Name:this.Name }, X:e.clientX, Y:e.clientY };
58775
58992
  event.Callback(event,data,this);
58776
58993
  }
58777
58994
 
@@ -59496,6 +59713,7 @@ KLineChartContainer.JsonDataToHistoryData=function(data)
59496
59713
  var fclose=9, yfclose=10; //结算价, 前结算价
59497
59714
  var bfactor=11, afactor=12; //前, 后复权因子
59498
59715
  var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;
59716
+ var colorData=JSCHART_DATA_FIELD_ID.KLINE_COLOR_DATA;
59499
59717
  for (var i = 0; i < list.length; ++i)
59500
59718
  {
59501
59719
  var item = new HistoryData();
@@ -59519,6 +59737,7 @@ KLineChartContainer.JsonDataToHistoryData=function(data)
59519
59737
  if (!IFrameSplitOperator.IsNumber(item.Open)) continue;
59520
59738
 
59521
59739
  if (jsData[orderFlow]) item.OrderFlow=jsData[orderFlow];
59740
+ if (jsData[colorData]) item.ColorData=jsData[colorData];
59522
59741
 
59523
59742
  aryDayData.push(item);
59524
59743
  }
@@ -59558,6 +59777,7 @@ KLineChartContainer.JsonDataToRealtimeData=function(data, symbol)
59558
59777
 
59559
59778
  if (IFrameSplitOperator.IsNumber(stock.bfactor)) item.BFactor=stock.bfactor; //前复权因子
59560
59779
  if (IFrameSplitOperator.IsNumber(stock.afactor)) item.AFactor=stock.afactor; //后复权因子
59780
+ if (stock.colordata) item.ColorData=stock.colordata; //自定义颜色
59561
59781
  return item;
59562
59782
  }
59563
59783
 
@@ -59645,7 +59865,8 @@ KLineChartContainer.JsonDataToMinuteRealtimeDataV2=function(data,symbol)
59645
59865
  var isSHSZ=MARKET_SUFFIX_NAME.IsSHSZ(upperSymbol);
59646
59866
  var isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol); //是否是期货
59647
59867
 
59648
- var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9, orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;;
59868
+ var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9;
59869
+ var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;
59649
59870
  var yClose=null;
59650
59871
 
59651
59872
  for (var i = 0; i < overlayData.data.length; ++i)
@@ -59689,7 +59910,9 @@ KLineChartContainer.JsonDataToMinuteHistoryData=function(data)
59689
59910
  if (upperSymbol) isFutures=MARKET_SUFFIX_NAME.IsFutures(upperSymbol);
59690
59911
  var list = data.data;
59691
59912
  var aryDayData=new Array();
59692
- var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9, orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;;
59913
+ var date = 0, yclose = 1, open = 2, high = 3, low = 4, close = 5, vol = 6, amount = 7, time = 8, position=9;
59914
+ var orderFlow=JSCHART_DATA_FIELD_ID.KLINE_ORDERFLOW;
59915
+ var colorData=JSCHART_DATA_FIELD_ID.KLINE_COLOR_DATA;
59693
59916
  var yClose=null;
59694
59917
  for (var i = 0; i < list.length; ++i)
59695
59918
  {
@@ -59714,6 +59937,7 @@ KLineChartContainer.JsonDataToMinuteHistoryData=function(data)
59714
59937
  if (IFrameSplitOperator.IsNumber(item.Close)) yClose=item.Close;
59715
59938
 
59716
59939
  if (jsData[orderFlow]) item.OrderFlow=jsData[orderFlow];
59940
+ if (jsData[colorData]) item.ColorData=jsData[colorData];
59717
59941
 
59718
59942
  aryDayData.push(item);
59719
59943
  }