hqchart
Version:
HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接
1,516 lines (1,238 loc) • 92.1 kB
JavaScript
/*
Copyright (c) 2018 jones
http://www.apache.org/licenses/LICENSE-2.0
开源项目 https://github.com/jones2000/HQChart
jones_2000@163.com
内置K线提示信息
*/
function JSDialogTooltip()
{
this.DivDialog=null;
this.DragTitle=null;
this.TitleBox=null; //{ DivTitle, DivName, DivName }
this.Style=0; //0=一行一个, 1=2行一个
this.HQChart=null;
this.UpColor=g_JSChartResource.UpTextColor;
this.DownColor=g_JSChartResource.DownTextColor;
this.UnchangeColor=g_JSChartResource.UnchagneTextColor;
this.TitleColor=g_JSChartResource.DialogTooltip.TitleColor;
this.TitleBGColor=g_JSChartResource.DialogTooltip.TitleBGColor;
this.BGColor=g_JSChartResource.DialogTooltip.BGColor;
this.BorderColor=g_JSChartResource.DialogTooltip.BorderColor;
this.TextColor=g_JSChartResource.DialogTooltip.TextColor;
this.ValueColor=g_JSChartResource.DialogTooltip.ValueColor;
this.VolColor=g_JSChartResource.DialogTooltip.VolColor;
this.AmountColor=g_JSChartResource.DialogTooltip.AmountColor;
this.TurnoverRateColor=g_JSChartResource.DialogTooltip.TurnoverRateColor;
this.PositionColor=g_JSChartResource.DialogTooltip.PositionColor;
this.DateTimeColor=g_JSChartResource.DialogTooltip.DateTimeColor;
this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;
this.MaxRowCount=35;
this.ValueAlign=
{
Right:"UMyChart_Tooltip_Text_Span",
};
this.TitleAlign=
{
Right:"UMyChart_Tooltip_Title_Span",
Left:"UMyChart_Tooltip_Title_Left_Span",
Center:"UMyChart_Tooltip_Title_Center_Span",
};
this.AryData=[];
this.AryText=[];
this.KItemCache=null;
this.KItemCache2=null; //{ DataIndex:k线索引 }
this.KItemCacheID=null;
this.IndexTitle={ Enable:false, MaxCount:3 }; //是否显示指标标题
this.LastValueCache=null; //最后的鼠标位置对应的数值
this.LastValueCacheID=null; //鼠标信息
this.DataID=null; //当前显示的数据时间{ Symbol:, Date:, Time: }
this.RestoreFocusDelay=800;
this.Inital=function(hqchart, option)
{
this.HQChart=hqchart;
if (option)
{
if (IFrameSplitOperator.IsNumber(option.Style)) this.Style=option.Style;
if (IFrameSplitOperator.IsPlusNumber(option.MaxRowCount)) this.MaxRowCount=option.MaxRowCount;
if (option.IndexTitle)
{
var item=option.IndexTitle;
if (IFrameSplitOperator.IsBool(item.Enable)) this.IndexTitle.Enable=item.Enable;
if (IFrameSplitOperator.IsPlusNumber(item.MaxCount)) this.IndexTitle.MaxCount=item.MaxCount;
}
}
}
this.Destroy=function()
{
this.AryData=[];
this.AryText=[];
this.KItemCache=null;
this.KItemCache2=null;
this.KItemCacheID=null;
if (this.DivDialog)
{
if (document && document.body && document.body.removeChild) document.body.removeChild(this.DivDialog);
this.DivDialog=null;
}
}
this.OnClickColseButton=function(e)
{
this.Close(e);
if (this.HQChart && this.HQChart.ChartCorssCursor)
{
var chart=this.HQChart.ChartCorssCursor;
if (!chart.IsShowCorss) return;
chart.IsShowCorss=false;
this.HQChart.Draw();
this.HQChart.SetFocus();
}
}
//data={ Symbol, Date, Time}
this.IsEqualDataID=function(data)
{
if (!this.DataID) return false;
if (!data) return false;
if (this.DataID.Symbol!=data.Symbol) return false;
if (this.DataID.Date!=data.Date) return false;
if (IFrameSplitOperator.IsNumber(this.DataID.Time))
{
if (this.DataID.Time!=data.Time) return false;
}
return true;
}
this.Create=function()
{
var divDom=document.createElement("div");
divDom.className='UMyChart_Tooltip_Dialog_Div';
var divTitle=document.createElement("div");
divTitle.className='UMyChart_Tooltip_Title_Div';
divTitle.onmousedown=(e)=>{ this.OnMouseDownTitle(e);}
var divName=document.createElement("div");
divName.className='UMyChart_Tooltip_Name_Div';
divName.innerText="----";
divTitle.appendChild(divName);
var divClose=document.createElement("div");
divClose.className='UMyChart_Tooltip_Close_Div';
divClose.innerText="x";
divClose.onmousedown=(e)=>{ this.OnClickColseButton(e); }
divTitle.appendChild(divClose);
divDom.appendChild(divTitle);
var table=document.createElement("table");
table.className="UMyChart_Tooltip_Table";
divDom.appendChild(table);
var tbody=document.createElement("tbody");
tbody.className="UMyChart_Tooltip_Tbody";
table.appendChild(tbody);
this.AryData=[];
if (this.Style==1)
{
for(var i=0;i<this.MaxRowCount;++i)
{
var rowItem={ Tr:null, TitleSpan:null, TextSpan:null, Tr2:null };
var trDom=document.createElement("tr");
trDom.className='UMyChart_Tooltip_Group_Tr';
tbody.appendChild(trDom);
rowItem.Tr=trDom;
var tdDom=document.createElement("td");
tdDom.className="UMyChart_Tooltip_Text_Sinlge_Td"; //标题
trDom.appendChild(tdDom);
var spanDom=document.createElement("span");
spanDom.className='UMyChart_Tooltip_Title_Left_Span';
spanDom.innerText='标题';
tdDom.appendChild(spanDom);
rowItem.TitleSpan=spanDom;
var trDom=document.createElement("tr");
trDom.className='UMyChart_Tooltip_Group_Tr';
tbody.appendChild(trDom);
rowItem.Tr2=trDom;
var tdDom=document.createElement("td");
tdDom.className="UMyChart_Tooltip_Text_Sinlge_Td"; //数值
trDom.appendChild(tdDom);
var spanDom=document.createElement("span");
spanDom.className='UMyChart_Tooltip_Text_Span';
spanDom.innerText='数值';
tdDom.appendChild(spanDom);
rowItem.TextSpan=spanDom;
this.AryData.push(rowItem);
}
}
else
{
for(var i=0;i<this.MaxRowCount;++i)
{
var rowItem={ Tr:null, TitleSpan:null, TextSpan:null, TitleTd:null, TextTd:null };
var trDom=document.createElement("tr");
trDom.className='UMyChart_Tooltip_Group_Tr';
tbody.appendChild(trDom);
rowItem.Tr=trDom;
var tdDom=document.createElement("td");
tdDom.className="UMyChart_Tooltip_Title_Td"; //标题
trDom.appendChild(tdDom);
rowItem.TitleTd=tdDom;
var spanDom=document.createElement("span");
spanDom.className='UMyChart_Tooltip_Title_Span';
spanDom.innerText='标题';
tdDom.appendChild(spanDom);
rowItem.TitleSpan=spanDom;
var tdDom=document.createElement("td");
tdDom.className="UMyChart_Tooltip_Text_Td"; //数值
trDom.appendChild(tdDom);
rowItem.TextTd=tdDom;
var spanDom=document.createElement("span");
spanDom.className='UMyChart_Tooltip_Text_Span';
spanDom.innerText='数值';
tdDom.appendChild(spanDom);
rowItem.TextSpan=spanDom;
this.AryData.push(rowItem);
}
}
document.body.appendChild(divDom);
this.DivName=divName;
this.DivDialog=divDom;
this.TitleBox={ DivTitle:divTitle, DivName:divName, DivColor:divClose };
this.UpdateStyle();
}
//更新实时数据
this.UpdateKLineData=function(data)
{
if (!data.KItem|| !data.IsShowCorss) return;
this.LanguageID=this.HQChart.LanguageID;
if (this.HQChart.ClassName=='KLineChartContainer')
{
var strKItem=JSON.stringify(data.KItem);
var bUpdata=false;
if (this.KItemCacheID!=strKItem) //数据变动的才更新
{
this.KItemCache= JSON.parse(strKItem);
this.KItemCache2={ DataIndex:data.DataIndex };
this.KItemCacheID=strKItem;
bUpdata=true;
}
if (bUpdata)
{
this.UpdateTableDOM();
}
else
{
//JSConsole.Chart.Log(`[JSDialogTooltip::Update] save as KItemCache and KItem`);
}
}
}
//更新实时分时数据
this.UpdateMinuteData=function(data)
{
if (!data.MinItem || !data.IsShowCorss) return;
var strKItem=JSON.stringify(data.MinItem);
var bUpdata=false;
if (this.KItemCacheID!=strKItem) //数据变动的才更新
{
this.KItemCache= JSON.parse(strKItem);
this.KItemCacheID=strKItem;
bUpdata=true;
}
if (bUpdata)
{
this.UpdateTableDOM();
}
}
this.Update=function(data)
{
if (!this.DivDialog || !this.TitleBox) return;
//实时数据更新
if (data.DataType==1)
{
this.UpdateKLineData(data);
return;
}
else if (data.DataType==2)
{
this.UpdateMinuteData(data);
return;
}
if ((!data.KItem && !data.MinItem) || !data.IsShowCorss || data.ClientPos<0) return;
this.LanguageID=this.HQChart.LanguageID;
if (this.HQChart.ClassName=='KLineChartContainer')
{
var strKItem=JSON.stringify(data.KItem);
var strLastValue=JSON.stringify(data.LastValue);
var bUpdata=false;
if (this.KItemCacheID!=strKItem) //数据变动的才更新
{
this.KItemCache= JSON.parse(strKItem);
this.KItemCache2={ DataIndex:data.DataIndex };
this.KItemCacheID=strKItem;
bUpdata=true;
}
if (data.LastValue && data.LastValue.Y && IFrameSplitOperator.IsNumber(data.LastValue.Y.Value) && this.LastValueCacheID!=strLastValue)
{
this.LastValueCache=JSON.parse(strLastValue);
this.LastValueCacheID=strLastValue;
bUpdata=true;
}
if (bUpdata)
{
this.UpdateDataID(data);
this.UpdateTableDOM();
}
else
{
//JSConsole.Chart.Log(`[JSDialogTooltip::Update] save as KItemCache and KItem`);
}
}
else if (this.HQChart.ClassName=='MinuteChartContainer')
{
var strKItem=JSON.stringify(data.MinItem);
var strLastValue=JSON.stringify(data.LastValue);
var bUpdata=false;
if (this.KItemCacheID!=strKItem) //数据变动的才更新
{
this.KItemCache= JSON.parse(strKItem);
this.KItemCacheID=strKItem;
bUpdata=true;
}
if (data.LastValue && data.LastValue.Y && IFrameSplitOperator.IsNumber(data.LastValue.Y.Value) && this.LastValueCacheID!=strLastValue)
{
this.LastValueCache=JSON.parse(strLastValue);
this.LastValueCacheID=strLastValue;
bUpdata=true;
}
if (bUpdata)
{
this.UpdateDataID(data);
this.UpdateTableDOM();
}
}
else
{
return;
}
this.TitleBox.DivName.innerText=data.Name;
if (!this.IsShow()) this.Show();
}
this.UpdateTableDOM=function()
{
if (!this.KItemCache) return;
if (this.HQChart.ClassName=='KLineChartContainer')
{
this.AryText=this.GetFormatKLineTooltipText(this.KItemCache);
if (this.IndexTitle.Enable)
{
var aryIndexTitle=this.GetIndexTitleTooltipText(this.KItemCache,this.KItemCache2);
if (IFrameSplitOperator.IsNonEmptyArray(aryIndexTitle)) this.AryText.push(...aryIndexTitle);
}
}
else if (this.HQChart.ClassName=='MinuteChartContainer')
{
this.AryText=this.GetFormatMinuteTooltipText(this.KItemCache);
}
else
return;
var index=0;
for(index=0;index<this.AryText.length && index<this.MaxRowCount;++index)
{
var outItem=this.AryText[index];
var item=this.AryData[index];
item.TitleSpan.innerText=outItem.Title;
if (outItem.TitleColor) item.TitleSpan.style.color=outItem.TitleColor;
else item.TitleSpan.style.color=this.TextColor;
item.TextSpan.innerText=outItem.Text;
item.TextSpan.style.color=outItem.Color;
//修改右侧数值样式
if (outItem.ClassName)
{
item.TextSpan.className=outItem.ClassName;
}
else
{
if (item.TextSpan.className!=this.ValueAlign.Right) item.TextSpan.className=this.ValueAlign.Right;
}
//修改左侧标题样式
if (outItem.TitleClassName)
{
item.TitleSpan.className=outItem.TitleClassName;
}
else
{
if (this.Style==0)
{
if (item.TitleSpan.className!=this.TitleAlign.Right) item.TitleSpan.className=this.TitleAlign.Right;
}
else if (this.Style==1)
{
if (item.TitleSpan.className!=this.TitleAlign.Left) item.TitleSpan.className=this.TitleAlign.Left;
}
}
if (item.TitleTd)
{
if (outItem.IsMergeCell) //合并单元格
{
item.TitleTd.colSpan=2;
item.TextTd.style.display="none";
}
else
{
if (item.TitleTd.colSpan!=1) item.TitleTd.colSpan=1;
item.TextTd.style.display="";
}
}
item.Tr.style.display="";
if (item.Tr2) item.Tr2.style.display="";
}
for( ; index<this.MaxRowCount; ++index)
{
var item=this.AryData[index];
item.Tr.style.display="none";
if (item.Tr2) item.Tr2.style.display="none";
}
}
this.UpdateDataID=function(data)
{
if (this.HQChart.ClassName=='KLineChartContainer')
{
var kItem=data.KItem;
this.DataID={ Symbol:data.Symbol, Date:kItem.Date, Time:null };
if (IFrameSplitOperator.IsNumber(kItem.Time)) this.DataID.Time=kItem.Time;
}
else if (this.HQChart.ClassName=='MinuteChartContainer')
{
var minItem=data.MinItem;
if (minItem.Type==0) //连续交易
{
var item=minItem.Data;
if (item) this.DataID={ Symbol:data.Symbol, Date:item.Date, Time:item.Time };
}
else if (minItem.Type==1) //集合竞价
{
var item=minItem.Data.Data;
if (item) this.DataID={ Symbol:data.Symbol, Date:item.Date, Time:item.Time };
}
}
}
this.Close=function(e)
{
if (!this.DivDialog) return;
this.DivDialog.style.visibility='hidden';
if (this.HQChart) this.HQChart.RestoreFocus(this.RestoreFocusDelay);
}
this.OnMouseDownTitle=function(e)
{
if (!this.DivDialog) return;
var dragData={ X:e.clientX, Y:e.clientY };
dragData.YOffset=e.clientX - this.DivDialog.offsetLeft;
dragData.XOffset=e.clientY - this.DivDialog.offsetTop;
this.DragTitle=dragData;
document.onmousemove=(e)=>{ this.DocOnMouseMoveTitle(e); }
document.onmouseup=(e)=>{ this.DocOnMouseUpTitle(e); }
}
this.DocOnMouseMoveTitle=function(e)
{
if (!this.DragTitle) return;
var left = e.clientX - this.DragTitle.YOffset;
var top = e.clientY - this.DragTitle.XOffset;
var right=left+this.DivDialog.offsetWidth;
var bottom=top+ this.DivDialog.offsetHeight;
if ((right+5)>=window.innerWidth) left=window.innerWidth-this.DivDialog.offsetWidth-5;
if ((bottom+5)>=window.innerHeight) top=window.innerHeight-this.DivDialog.offsetHeight-5;
this.DivDialog.style.left = left + 'px';
this.DivDialog.style.top = top + 'px';
if(e.preventDefault) e.preventDefault();
}
this.DocOnMouseUpTitle=function(e)
{
this.DragTitle=null;
document.onmousemove = null;
document.onmouseup = null;
}
this.Show=function(x, y)
{
if (this.IsShow()) return;
if (!this.DivDialog) return;
if (!this.HQChart) return;
var top=this.HQChart.Frame.ChartBorder.GetTop();
var left=this.HQChart.Frame.ChartBorder.GetLeft();
var rtClient=this.HQChart.UIElement.getBoundingClientRect();
var x=left+rtClient.left+5;
var y=top+rtClient.top+10;
this.DivDialog.style.top = y + "px";
this.DivDialog.style.left = x + "px";
this.DivDialog.style.visibility='visible';
}
this.IsShow=function()
{
if (!this.DivDialog) return false;
return this.DivDialog.style.visibility==='visible';
}
this.GetFormatKLineTooltipText=function(data)
{
var defaultfloatPrecision=GetfloatPrecision(this.HQChart.Symbol);//价格小数位数
var upperSymbol=this.HQChart.Symbol.toUpperCase();
var unit=MARKET_SUFFIX_NAME.GetVolUnit(upperSymbol);
var priceFormat=0;
if (this.Style==1) priceFormat=1;
//日期
var dateItem=this.ForamtDate(data.Date,"YYYY/MM/DD/W",'DialogTooltip-Date' );
//时间
var timeItem=null;
if (IFrameSplitOperator.IsNumber(data.Time)) timeItem=this.FormatTime(data.Time, this.HQChart.Period, null, 'DialogTooltip-Time');
var yClose=data.YClose; //昨收价|昨结算价
var aryText=
[
this.ForamtPrice(data.Open,yClose, defaultfloatPrecision,'DialogTooltip-Open',priceFormat),
this.ForamtPrice(data.High,yClose, defaultfloatPrecision,'DialogTooltip-High',priceFormat),
this.ForamtPrice(data.Low,yClose, defaultfloatPrecision,'DialogTooltip-Low',priceFormat),
this.ForamtPrice(data.Close,yClose, defaultfloatPrecision,'DialogTooltip-Close',priceFormat),
this.FormatVol(data.Vol/unit,'DialogTooltip-Vol' ),
this.FormatAmount(data.Amount,'DialogTooltip-Amount' ),
this.FormatIncrease(data.Close,yClose,defaultfloatPrecision,'DialogTooltip-Increase',priceFormat),
this.FormatAmplitude(data.High,data.Low,yClose,defaultfloatPrecision,'DialogTooltip-Amplitude',priceFormat),
];
if (this.LastValueCache && this.LastValueCache.Y)
{
var item=this.LastValueCache.Y;
var rowItem=null;
if (item.Extend.FrameID==0)
{
rowItem=this.ForamtPrice(item.Value,null, defaultfloatPrecision,'DialogTooltip-Value',2);
}
else
{
rowItem=this.ForamtValue(item.Value, 2,'DialogTooltip-Value');
}
if (rowItem) aryText.unshift(rowItem);
}
if (this.Style==1)
{
if (timeItem) aryText.unshift(timeItem);
var dateItem=this.ForamtDate(data.Date,"YYYY/MM/DD",'DialogTooltip-Date' );
aryText.unshift(dateItem);
}
else
{
if (timeItem) aryText.unshift(timeItem);
aryText.unshift(dateItem);
}
//换手率
if (IFrameSplitOperator.IsNumber(data.FlowCapital))
{
aryText.push(this.FormatExchange(data.Vol,data.FlowCapital,'DialogTooltip-Exchange' ));
}
//持仓量 结算价
if (MARKET_SUFFIX_NAME.IsFutures(upperSymbol))
{
aryText.push(this.FormatPosition(data.Position,'DialogTooltip-Position'));
aryText.push(this.ForamtFClose(data.FClose, defaultfloatPrecision, 'DialogTooltip-FClose'));
}
var event=this.HQChart.GetEventCallback(JSCHART_EVENT_ID.ON_FORMAT_DIALOG_TOOLTIP);
if (event && event.Callback)
{
var sendData={ AryText:aryText, Data:data, Symbol:this.HQChart.Symbol, HQChart:this.HQChart, IsKLine:true };
event.Callback(event, sendData, this);
}
return aryText;
}
this.GetIndexTitleTooltipText=function(kItem, data)
{
if (!(this.Style===0)) return null;
if (!this.HQChart) return null;
if (!IFrameSplitOperator.IsNonEmptyArray(this.HQChart.TitlePaint)) return null;
if (!IFrameSplitOperator.IsNumber(data.DataIndex) || data.DataIndex<0) return null;
var aryText=[];
var dataIndex=data.DataIndex;
for(var i=0,j=0,k=0; i<this.HQChart.TitlePaint.length && k<this.IndexTitle.MaxCount; ++i)
{
var titleChart=this.HQChart.TitlePaint[i];
if (titleChart.ClassName!="DynamicChartTitlePainting") continue;
if (!IFrameSplitOperator.IsNonEmptyArray(titleChart.Data)) continue;
var indexName=titleChart.Title;
//if (titleChart.ArgumentsText) indexName+=titleChart.ArgumentsText;
aryText.push({ Title:indexName, IsMergeCell:true, TitleClassName:this.TitleAlign.Center });
for(j=0;j<titleChart.Data.length;++j)
{
var item=titleChart.Data[j];
if (!item || !item.Data || !IFrameSplitOperator.IsNonEmptyArray(item.Data.Data)) continue;
if (item.IsShow===false) continue;
if (item.IsVisible===false) continue;
if (item.DataType) continue; //定制类型暂时不支持
value=item.Data.Data[dataIndex];
var text="--";
if (value) text=titleChart.FormatValue(value, item);
var title=item.Name;
var dyTitle=titleChart.GetDynamicOutName(item.Name); //动态标题
if (dyTitle) title=dyTitle;
var tooltipItem=
{
Title:title,
Text:text,
Color:item.Color
};
aryText.push(tooltipItem);
}
++k;
}
return aryText;
}
this.GetFormatMinuteTooltipText=function(data)
{
var defaultfloatPrecision=GetfloatPrecision(this.HQChart.Symbol);//价格小数位数
var upperSymbol=this.HQChart.Symbol.toUpperCase();
var unit=MARKET_SUFFIX_NAME.GetVolUnit(upperSymbol);
var aryText=[];
if (data.Type==0) //连续交易
{
var item=data.Data;
if (!item) item={ };
aryText=
[
this.ForamtDate(item.Date,this.Style==1?"MM/DD/W":"YYYY/MM/DD/W",'DialogTooltip-Date' ),
this.FormatTime(item.Time, null, "HH:MM", 'DialogTooltip-Time'),
this.ForamtPrice(item.Close,item.YClose, defaultfloatPrecision,'DialogTooltip-Price', 1),
this.ForamtPrice(item.AvPrice,item.YClose, defaultfloatPrecision,'DialogTooltip-AvPrice', 1),
this.FormatRisefall(item.Close,item.YClose, defaultfloatPrecision,'DialogTooltip-Risefall'),
this.FormatIncrease(item.Close,item.YClose,defaultfloatPrecision,'DialogTooltip-Increase', 1),
this.FormatVol(item.Vol/unit,'DialogTooltip-Vol' ),
this.FormatAmount(item.Amount,'DialogTooltip-Amount' ),
];
if (this.LastValueCache && this.LastValueCache.Y)
{
var item=this.LastValueCache.Y;
var rowItem=null;
if (item.Extend.FrameID==0)
{
rowItem=this.ForamtPrice(item.Value,null, defaultfloatPrecision,'DialogTooltip-Value',2);
}
else
{
rowItem=this.ForamtValue(item.Value, 2,'DialogTooltip-Value');
}
if (rowItem) aryText.splice(2,0,rowItem);
}
}
else if (data.Type==1) //集合竞价
{
var item=data.Data.Data;
if (!item) item={ Vol:[] };
if (data.Data.Ver===1)
{
var timeForamt="HH:MM"
aryText=
[
this.ForamtDate(item.Date,this.Style==1?"MM/DD/W":"YYYY/MM/DD/W",'DialogTooltip-Date' ),
this.FormatTime(item.Time, null, timeForamt, 'DialogTooltip-Time'),
this.ForamtPrice(item.Price,item.YClose, defaultfloatPrecision,'DialogTooltip-AC-Price',1),
this.FormatIncrease(item.Price,item.YClose,defaultfloatPrecision,'DialogTooltip-AC-Increase',1),
this.FormatVol(item.Vol[0]/unit,'DialogTooltip-AC-Vol'),
];
}
else if (data.Data.Ver===3)
{
var timeForamt="HH:MM:SS";
aryText=
[
this.ForamtDate(item.Date,this.Style==1?"MM/DD/W":"YYYY/MM/DD/W",'DialogTooltip-Date' ),
this.FormatTime(item.Time, null, timeForamt, 'DialogTooltip-Time'),
this.ForamtPrice(item.Price,item.YClose, defaultfloatPrecision,'DialogTooltip-AC-Price',1),
this.FormatIncrease(item.Price,item.YClose,defaultfloatPrecision,'DialogTooltip-AC-Increase',1),
this.FormatVol(item.Vol[0]/unit,'DialogTooltip-AC-Vol', 2),
];
}
else
{
var timeForamt="HH:MM:SS";
aryText=
[
this.ForamtDate(item.Date,this.Style==1?"MM/DD/W":"YYYY/MM/DD/W",'DialogTooltip-Date' ),
this.FormatTime(item.Time, null, timeForamt, 'DialogTooltip-Time'),
this.ForamtPrice(item.Price,item.YClose, defaultfloatPrecision,'DialogTooltip-AC-Price',1),
this.FormatIncrease(item.Price,item.YClose,defaultfloatPrecision,'DialogTooltip-AC-Increase',1),
this.FormatVol(item.Vol[0]/unit,'DialogTooltip-AC-Vol', 2),
this.FormatVol(item.Vol[1]/unit,'DialogTooltip-AC-NotMatchVol', 2),
];
}
}
else
{
}
var event=this.HQChart.GetEventCallback(JSCHART_EVENT_ID.ON_FORMAT_DIALOG_TOOLTIP);
if (event && event.Callback)
{
var sendData={ AryText:aryText, Data:data, Symbol:this.HQChart.Symbol, HQChart:this.HQChart, IsMinute:true };
event.Callback(event, sendData, this);
}
return aryText
}
this.GetColor=function(price,yClose)
{
if(price>yClose) return this.UpColor;
else if (price<yClose) return this.DownColor;
else return this.UnchangeColor;
}
this.GetPriceColor=function(price, yClose)
{
var color=this.GetColor(price, yClose);
return color;
}
//配色修改
this.ReloadResource=function(option)
{
this.UpColor=g_JSChartResource.UpTextColor;
this.DownColor=g_JSChartResource.DownTextColor;
this.UnchangeColor=g_JSChartResource.UnchagneTextColor;
this.TitleColor=g_JSChartResource.DialogTooltip.TitleColor;
this.TitleBGColor=g_JSChartResource.DialogTooltip.TitleBGColor;
this.BGColor=g_JSChartResource.DialogTooltip.BGColor;
this.BorderColor=g_JSChartResource.DialogTooltip.BorderColor;
this.VolColor=g_JSChartResource.DialogTooltip.VolColor;
this.AmountColor=g_JSChartResource.DialogTooltip.AmountColor;
this.TurnoverRateColor=g_JSChartResource.DialogTooltip.TurnoverRateColor;
this.PositionColor=g_JSChartResource.DialogTooltip.PositionColor;
this.DateTimeColor=g_JSChartResource.DialogTooltip.DateTimeColor;
this.TextColor=g_JSChartResource.DialogTooltip.TextColor;
this.ValueColor=g_JSChartResource.DialogTooltip.ValueColor;
if (!this.DivDialog) return;
this.UpdateStyle();
}
this.UpdateStyle=function()
{
if (!this.DivDialog) return;
if (this.BGColor) this.DivDialog.style['background-color']=this.BGColor;
if (this.BorderColor) this.DivDialog.style['border-color']=this.BorderColor;
if (this.TitleBGColor) this.TitleBox.DivTitle.style['background-color']=this.TitleBGColor;
if (this.TitleColor) this.TitleBox.DivName.style['color']=this.TitleColor;
this.UpdateTableDOM();
}
/////////////////////////////////////////////////////////////////////////////////////////////
//数据格式化 format=0 点差+涨幅 1=涨幅
this.ForamtPrice=function(price, yClose, defaultfloatPrecision, TitleID, format)
{
var item=
{
Title:g_JSChartLocalization.GetText(TitleID, this.LanguageID),
Text:"--.--",
Color:this.ValueColor
};
if (!IFrameSplitOperator.IsNumber(price)) return item;
if (format==2)
{
item.Text=price.toFixed(defaultfloatPrecision);
item.Color=this.ValueColor;
return item;
}
if (IFrameSplitOperator.IsNumber(yClose) && format!=1)
{
var value=(price-yClose)/yClose*100;
item.Text=`${price.toFixed(defaultfloatPrecision)}(${value.toFixed(2)}%)`;
}
else
{
item.Text=price.toFixed(defaultfloatPrecision);
}
item.Color=this.GetColor(price, yClose);
return item;
}
this.ForamtValue=function(value, defaultfloatPrecision, TitleID)
{
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:'--',
Color:this.ValueColor
};
if (!IFrameSplitOperator.IsNumber(value)) return item;
item.Text=IFrameSplitOperator.FormatValueStringV2(value,defaultfloatPrecision,2,this.LanguageID);
return item;
}
this.FormatVol=function(vol, TitleID, floatPrecision)
{
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:'--',
Color:this.VolColor
};
if (!IFrameSplitOperator.IsNumber(vol)) return item;
var decimal=0; //小数位数
if (IFrameSplitOperator.IsNumber(floatPrecision)) decimal=floatPrecision;
item.Text=IFrameSplitOperator.FormatValueStringV2(vol,decimal,2,this.LanguageID);
return item;
}
this.FormatAmount=function(amount, TitleID)
{
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:'--',
Color:this.AmountColor
};
if (!IFrameSplitOperator.IsNumber(amount)) return item;
item.Text=IFrameSplitOperator.FormatValueString(amount,2,this.LanguageID);
return item;
}
this.FormatIncrease=function(price, yClose, defaultfloatPrecision, TitleID, fromat)
{
//涨幅
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:"--.--",
Color:this.ValueColor
};
if (!IFrameSplitOperator.IsNumber(price) || !IFrameSplitOperator.IsNumber(yClose)) return item;
var diffValue=price-yClose;
var value=(price-yClose)/yClose;
if (fromat==1)
{
item.Text=`${(value*100).toFixed(2)}%`;
}
else
{
item.Text=`${diffValue.toFixed(defaultfloatPrecision)}(${(value*100).toFixed(2)}%)`;
}
item.Color=this.GetColor(value,0);
return item;
}
this.FormatRisefall=function(price, yClose, defaultfloatPrecision, TitleID)
{
//涨跌
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:"--.--",
Color:this.ValueColor
};
if (!IFrameSplitOperator.IsNumber(price) || !IFrameSplitOperator.IsNumber(yClose)) return item;
var value=price-yClose;
item.Text=`${value.toFixed(defaultfloatPrecision)}`;
item.Color=this.GetColor(value,0);
return item;
}
this.FormatAmplitude=function(high, low, yClose, defaultfloatPrecision, TitleID, fromat)
{
//振幅
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:"--.--",
Color:this.ValueColor
};
if (!IFrameSplitOperator.IsNumber(high) || !IFrameSplitOperator.IsNumber(low) || !IFrameSplitOperator.IsNumber(yClose)) return item;
var diffValue=high-low;
var value=(high-low)/yClose;
if (fromat==1) item.Text=`${(value*100).toFixed(2)}%`;
else item.Text=`${diffValue.toFixed(defaultfloatPrecision)}(${(value*100).toFixed(2)}%)`;
item.Color=this.GetColor(value,0);
return item;
}
this.ForamtDate=function(date, format, TitleID)
{
//日期
var item=
{
Title:g_JSChartLocalization.GetText('DialogTooltip-Date',this.LanguageID),
Text:"----/--/--",
Color:this.DateTimeColor
}
if (!IFrameSplitOperator.IsNumber(date)) return item;
item.Text=IFrameSplitOperator.FormatDateString(date,format);
return item;
}
this.FormatTime=function(time, period, format, TitleID)
{
//时间
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:'--:--',
Color:this.DateTimeColor
};
if (!IFrameSplitOperator.IsNumber(time)) return item;
if (!format)
{
format="HH:MM";
if (ChartData.IsMinutePeriod(period,true)) format='HH:MM'; // 分钟周期
else if (ChartData.IsSecondPeriod(period)) format='HH:MM:SS';
else if (ChartData.IsMilliSecondPeriod(period)) format='HH:MM:SS.fff';
}
item.Text=IFrameSplitOperator.FormatTimeString(time,format);
return item;
}
//换手率 成交量/流通股本
this.FormatExchange=function(vol, flowCapital, TitleID)
{
//换手率
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:'--.--',
Color:this.DateTimeColor
};
if (!IFrameSplitOperator.IsNumber(vol) || !IFrameSplitOperator.IsNumber(flowCapital) || flowCapital==0) return item;
var value=vol/flowCapital*100;
item.Text=value.toFixed(2)+'%';
return item;
}
//持仓
this.FormatPosition=function(position, TitleID)
{
//持仓
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:'--.--',
Color:this.PositionColor
};
if (!IFrameSplitOperator.IsNumber(position)) return item;
item.Text=position.toFixed(0);
return item;
}
//结算价
this.ForamtFClose=function(value, defaultfloatPrecision, TitleID)
{
var item=
{
Title:g_JSChartLocalization.GetText(TitleID,this.LanguageID),
Text:'--.--',
Color:this.DateTimeColor
};
if (!IFrameSplitOperator.IsNumber(value)) return item;
item.Text=value.toFixed(defaultfloatPrecision);
return item;
}
}
//浮动K线提示信息
function JSFloatTooltip()
{
this.DivDialog=null;
this.Style=0; //0=一行一个, 1=2行一个
this.HQChart=null;
this.MaxRowCount=25;
this.UpColor=g_JSChartResource.UpTextColor;
this.DownColor=g_JSChartResource.DownTextColor;
this.UnchangeColor=g_JSChartResource.UnchagneTextColor;
this.BGColor=g_JSChartResource.FloatTooltip.BGColor;
this.BorderColor=g_JSChartResource.FloatTooltip.BorderColor;
this.TextColor=g_JSChartResource.FloatTooltip.TextColor;
this.ValueColor=g_JSChartResource.FloatTooltip.ValueColor;
this.VolColor=g_JSChartResource.FloatTooltip.VolColor;
this.AmountColor=g_JSChartResource.FloatTooltip.AmountColor;
this.TurnoverRateColor=g_JSChartResource.FloatTooltip.TurnoverRateColor;
this.PositionColor=g_JSChartResource.FloatTooltip.PositionColor;
this.DateTimeColor=g_JSChartResource.FloatTooltip.DateTimeColor;
this.LanguageID=JSCHART_LANGUAGE_ID.LANGUAGE_CHINESE_ID;
this.ValueAlign=
{
Left:"UMyChart_Tooltip_Float_Text2_Span", //左对齐
MarginLeft:'UMyChart_Tooltip_Float_Text3_Span',
Right:"UMyChart_Tooltip_Float_Text_Span",
}
this.TitleAlign=
{
Default:"UMyChart_Tooltip_Float_Title_Span", //标题默认
}
this.AryData=[]; //输出文字信息
this.AryText=[]; //表格tr
this.KItemCache=null; //{ Symbol:, Item:, Name }
this.KItemCacheID=null;
this.Inital=function(hqchart, option)
{
this.HQChart=hqchart;
if (option)
{
if (IFrameSplitOperator.IsNumber(option.Style)) this.Style=option.Style;
if (IFrameSplitOperator.IsNumber(option.MaxRowCount)) this.MaxRowCount=option.MaxRowCount;
}
}
this.Destroy=function()
{
this.AryData=[];
this.AryText=[];
this.KItemCache=null;
this.KItemCacheID=null;
if (this.DivDialog)
{
document.body.removeChild(this.DivDialog);
this.DivDialog=null;
}
}
this.Show=function(x, y, option)
{
if (!this.DivDialog) return;
if (!this.HQChart) return;
var rtClient=this.HQChart.UIElement.getBoundingClientRect();
var yMove=0;
if (option && IFrameSplitOperator.IsNumber(option.YMove)) yMove=option.YMove;
var left=x+rtClient.left,top=y+rtClient.top+yMove;
var right=left+this.DivDialog.offsetWidth;
var bottom=top+this.DivDialog.offsetHeight;
if ((right+5)>=window.innerWidth) left=left-this.DivDialog.offsetWidth;
if ((bottom+5)>=window.innerHeight)
{
top=(y+rtClient.top)-this.DivDialog.offsetHeight;
}
this.DivDialog.style.top = top + "px";
this.DivDialog.style.left = left + "px";
if (this.DivDialog.style.visibility!='visible')
this.DivDialog.style.visibility='visible';
}
this.Hide=function()
{
if (!this.DivDialog) return;
this.KItemCache=null;
this.KItemCacheID=null;
if (this.DivDialog.style.visibility!='hidden') this.DivDialog.style.visibility='hidden';
}
this.Create=function()
{
var divDom=document.createElement("div");
divDom.className='UMyChart_Tooltip_Float_Div';
var table=document.createElement("table");
table.className="UMyChart_Tooltip_Float_Table";
divDom.appendChild(table);
var tbody=document.createElement("tbody");
tbody.className="UMyChart_Tooltip_Float_Tbody";
table.appendChild(tbody);
this.AryData=[];
for(var i=0;i<this.MaxRowCount;++i)
{
var rowItem={ Tr:null, TitleSpan:null, TextSpan:null, TitleTd:null, TextTd:null };
var trDom=document.createElement("tr");
trDom.className='UMyChart_Tooltip_Float_Group_Tr';
tbody.appendChild(trDom);
rowItem.Tr=trDom;
var tdDom=document.createElement("td");
tdDom.className="UMyChart_Tooltip_Float_Title_Td"; //标题
trDom.appendChild(tdDom);
rowItem.TitleTd=tdDom;
var spanDom=document.createElement("span");
spanDom.className=this.TitleAlign.Default;
spanDom.innerText='标题';
tdDom.appendChild(spanDom);
rowItem.TitleSpan=spanDom;
var tdDom=document.createElement("td");
tdDom.className="UMyChart_Tooltip_Float_Text_Td"; //数值
trDom.appendChild(tdDom);
rowItem.TextTd=tdDom;
var spanDom=document.createElement("span");
spanDom.className='UMyChart_Tooltip_Float_Text_Span';
spanDom.innerText='数值';
tdDom.appendChild(spanDom);
rowItem.TextSpan=spanDom;
this.AryData.push(rowItem);
}
document.body.appendChild(divDom);
this.DivDialog=divDom;
this.UpdateStyle();
}
this.IsShow=function()
{
if (!this.DivDialog) return false;
return this.DivDialog.style.visibility==='visible';
}
//data={ Symbol, Date, Time} 是否是同一条K线
this.IsEqualHQID=function(data)
{
if (!this.KItemCache) return false;
if (!data) return false;
if (!this.KItemCache.Item) return false;
var kItem=this.KItemCache.Item;
if (this.KItemCache.Symbol!=data.Symbol) return false;
if (kItem.Date!=data.Date) return false;
if (IFrameSplitOperator.IsNumber(kItem.Time))
{
if (kItem.Time!=data.Time) return false;
}
return true;
}
this.UpdateStyle=function()
{
if (!this.DivDialog) return;
if (this.BGColor) this.DivDialog.style['background-color']=this.BGColor;
if (this.BorderColor) this.DivDialog.style['border-color']=this.BorderColor;
//this.UpdateTableDOM();
}
//更新数据
this.Update=function(data)
{
if (!this.DivDialog) return;
this.LanguageID=this.HQChart.LanguageID;
if (data.DataType==1)
{
var tooltipData=data.Tooltip;
if (!tooltipData) return;
if (tooltipData.Type==0) //K线信息
{
this.UpdateKLineToolitp(data);
}
else if (tooltipData.Type==1) //信息地雷
{
this.UpdateKLineInfoTooltip(data);
}
else if (tooltipData.Type==2) //交易指标
{
this.UpdateTradeIndexTooltip(data);
}
else if (tooltipData.Type==3) //分时图异动信息
{
this.UpdateMinuteInfoTooltip(data);
}
else if (tooltipData.Type==4) //ChartMultiSVGIconV2 图标信息
{
this.UpdatMultiSVGIconV2Tooltip(data);
}
else if (tooltipData.Type==5) //ChartOX 信息
{
this.UpdatChartOXTooltip(data);
}
else if (tooltipData.Type==6) //散点图
{
this.UpdatChartScatterPlotTooltip(data);
}
else if (tooltipData.Type==7) //ChartDrawSVG 老版本 单行
{
this.UpdateChartDrawSVGTooltip(data);
}
else if (tooltipData.Type==8) //ChartDrawSVG 新版本
{
this.UpdateChartDrawSVGV2Tooltip(data);
}
else if (tooltipData.Type==9) //ChartKLineTable
{
this.UpdateChartKLineTableTooltip(data);
}
}
else if (data.DataType==2) //更新实时行情数据
{
this.UpdateRealtimeHQTooltip(data);
}
else if (data.DataType==3) //报价列表
{
var tooltipData=data.Tooltip;
if (!tooltipData) return;
if (tooltipData.Type==2) //报价列表表头图标提示信息
{
this.ReportHeaderIconTooltip(data);
}
else if (tooltipData.Type==1) //单元格截断内容
{
this.ReportCellTruncateTooltip(data);
}
else if (tooltipData.Type==4) //单元格提示信息
{
this.ReportCellTooltip(data);
}
}
else if (data.DataType==4) //T型报价
{
var tooltipData=data.Tooltip;
if (!tooltipData) return;
if (tooltipData.Type==2 || tooltipData.Type==3)
{
this.TReportIconTooltip(data);
}
}
else if (data.DataType==5) //成交笔数
{
var tooltipData=data.Tooltip;
if (!tooltipData) return;
if (tooltipData.Type==2) //提示信息
{
this.DealItemTooltip(data);
}
}
}
this.UpdateRealtimeHQTooltip=function(data)
{
if (!this.KItemCache) return;
var kItem={ Symbol:data.Symbol, Name:this.KItemCache.Name, Item:data.Data, IsOverlay:this.KItemCache.IsOverlay };
var strKItem=JSON.stringify(kItem);
var bUpdata=false;
if (this.KItemCacheID!=strKItem) //数据变动的才更新
{
this.KItemCache= kItem;
this.KItemCacheID=strKItem;
this.AryText=this.GetFormatKLineTooltipText(this.KItemCache);
bUpdata=true;
}
if (bUpdata)
{
this.UpdateTableDOM();
}
}
this.ShowTooltip=function(data)
{
if (!data.Point) return;
var x=data.Point.X;
var y=data.Point.Y;
this.Show(x, y, { YMove:data.Point.YMove });
}
//K线提示信息
this.UpdateKLineToolitp=function(data)
{
var tooltipData=data.Tooltip;
var symbol=data.Symbol;
var name=data.Name;
var bOverlay=false; //是否是叠加指标
var bIndexKLine=false;
if (tooltipData.ChartPaint.Name=="Overlay-KLine")
{
symbol=tooltipData.ChartPaint.Symbol;
name=tooltipData.ChartPaint.Title;
bOverlay=true;
}
else if (tooltipData.ChartPaint.Name=="DRAWKLINE")
{
symbol=tooltipData.ChartPaint.Symbol;
name=tooltipData.ChartPaint.Title;
bIndexKLine=true;
}
var kItem={ Symbol:symbol, Name:name, Item:CloneData(tooltipData.Data), IsOverlay:bOverlay, IsIndexKLine:bIndexKLine };
var strKItem=JSON.stringify(kItem);
var bUpdata=false;
if (this.KItemCacheID!=strKItem) //数据变动的才更新
{
this.KItemCache= kItem;
this.KItemCacheID=strKItem;
this.AryText=this.GetFormatKLineTooltipText(this.KItemCache);
bUpdata=true;
}
if (bUpdata)
{
this.UpdateTableDOM();
}
this.ShowTooltip(data);
}
//ChartDrawSVG 老版本 单行
this.UpdateChartDrawSVGTooltip=function(data)
{
var tooltipData=data.Tooltip;
if (!tooltipData.Data || !tooltipData.Data.Item || !tooltipData.Data.Item.Tooltip) return;
var item=tooltipData.Data.Item.Tooltip;
var aryText=[]
var rowItem={ Text:"", HTMLTitle:item.Text, Color:this.ValueColor, IsMergeCell:true };
aryText.push(rowItem);
this.AryText=aryText;
this.UpdateTableDOM();
this.ShowTooltip(data);
}
//ChartDrawSVG 新版本
this.UpdateChartDrawSVGV2Tooltip=function(data)
{
var tooltipData=data.Tooltip;
if (!tooltipData.Data || !tooltipData.Data.Item || !tooltipData.Data.Item.Tooltip) return;
var aryData=tooltipData.Data.Item.Tooltip.AryText;
if (!IFrameSplitOperator.IsNonEmptyArray(aryData)) return;
var aryText=[];
for(var i=0;i<aryData.length;++i)
{
var item=aryData[i];
var rowItem={ Title:"", Text:"", Color:this.ValueColor, ClassName:this.ValueAlign.MarginLeft };
if (item.TextColor) rowItem.Color=item.TextColor;
if (item.Title) rowItem.Title=item.Title;
if (item.Text) rowItem.Text=item.Text;
aryText.push(rowItem);
}
this.AryText=aryText;
this.UpdateTableDOM();
this.ShowTooltip(data);
}
this.UpdateChartKLineTabl