hqchart
Version:
HQChart - H5, 微信小程序 沪深/港股/数字货币/期货/美股 K线图(kline),走势图,缩放,拖拽,十字光标,画图工具,截图,筹码图. 分析家语法,通达信语法,(麦语法),第3方数据对接
1,350 lines (1,141 loc) • 147 kB
JavaScript
/////////////////////////////////////////////////////////////////////
// 模拟测试数据
//
//
/////////////////////////////////////////////////////////////////////
function HQData() { }
HQData.Explain="本地测试数据";
HQData.NetworkFilter=function(data, callback)
{
console.log(`[HQData::NetworkFilter] ${HQData.Explain}`, data);
switch(data.Name)
{
//HQChart使用教程29-走势图如何对接第3方数据1
case 'MinuteChartContainer::RequestMinuteData': //分时图数据对接
//HQChart使用教程29-走势图如何对接第3方数据2-最新分时数据
HQData.Minute_RequestMinuteData(data, callback);
break;
case "MinuteChartContainer::RequestHistoryMinuteData": //多日分时图
//HQChart使用教程29-走势图如何对接第3方数据3-多日分时数据
HQData.Minute_RequestHistoryMinuteData(data, callback);
break;
case "MinuteChartContainer::RequestOverlayMinuteData": //单日叠加
HQData.Minute_RequestOverlayMinuteData(data, callback);
break;
case "MinuteChartContainer::RequestOverlayHistoryMinuteData": //叠加多日
HQData.Minute_RequestOverlayHistoryMinuteData(data, callback);
break;
case "MinuteChartContainer::RequestPopMinuteData": //弹出分时图数据
//HQChart使用教程29-走势图如何对接第3方数据2-最新分时数据 格式跟这个一样
HQData.Minute_RequestPopMinuteData(data, callback);
break;
//HQChart使用教程30-K线图如何对接第3方数据1
case 'KLineChartContainer::RequestHistoryData': //日线全量数据下载
//HQChart使用教程30-K线图如何对接第3方数据2-日K数据
HQData.RequestHistoryData(data,callback);
break;
case 'KLineChartContainer::RequestRealtimeData': //日线实时数据更新
//HQChart使用教程30-K线图如何对接第3方数据14-轮询增量更新日K数据
HQData.RequestRealtimeData(data,callback);
break;
case 'KLineChartContainer::RequestFlowCapitalData': //流通股本
//HQChart使用教程30-K线图如何对接第3方数据4-流通股本数据
HQData.RequestFlowCapitalData(data,callback);
break;
case 'KLineChartContainer::ReqeustHistoryMinuteData': //分钟全量数据下载
//HQChart使用教程30-K线图如何对接第3方数据3-1分钟K数据
HQData.RequestHistoryMinuteData(data, callback);
break;
case 'KLineChartContainer::RequestMinuteRealtimeData': //分钟增量数据更新
//HQChart使用教程30-K线图如何对接第3方数据15-轮询增量更新1分钟K线数据
HQData.RequestMinuteRealtimeData(data,callback);
break;
case "JSSymbolData::GetVariantData": //额外的变量数据
//HQChart使用教程30-K线图如何对接第3方数据29-板块字符串函数数据[GNBLOCK,GNBLOCKNUM......]
HQData.RequestIndexVariantData(data,callback);
break;
case "JSSymbolData::GetCustomFunctionData": //自定义函数数据下载
HQData.CustomFunction_RequestData(data,callback);
break;
case "JSSymbolData::GetCustomVariantData": //自定义函数数据下载
HQData.CustomVarData_RequestData(data,callback);
break;
case "JSSymbolData::GetOtherSymbolData":
//HQChart使用教程30-K线图如何对接第3方数据31-获取指定品种的K线数据
HQData.RequestOtherSymbolData(data, callback);
break;
case "AnnouncementInfo::RequestData":
//HQChart使用教程30-K线图如何对接第3方数据20-信息地雷公告数据
HQData.AnnouncementInfo_RequestData(data,callback);
break;
case "JSSymbolData::GetLatestData":
//HQChart使用教程30-K线图如何对接第3方数据30-即时行情数据DYNAINFO
HQData.RequestLatestData(data,callback);
break;
case "KLineChartContainer::RequestOverlayHistoryData": //叠加股票
//HQChart使用教程30-K线图如何对接第3方数据16-日K叠加股票
HQData.RequestOverlayHistoryData(data, callback);
break;
case "KLineChartContainer::RequestOverlayHistoryMinuteData":
//HQChart使用教程30-K线图如何对接第3方数据17- 分钟K叠加股票
HQData.RequestOverlayHistoryMinuteData(data, callback);
break;
case "PforecastInfo::RequestData":
HQData.PforecastInfo_RequestData(data,callback);
break;
case "InvestorInfo::RequestData":
HQData.InvestorInfo_RequestData(data,callback);
break;
case "ResearchInfo::RequestData":
HQData.ResearchInfo_RequestData(data,callback);
break;
case "BlockTrading::RequestData":
HQData.BlockTrading_RequestData(data,callback);
break;
case "TradeDetail::RequestData":
HQData.TradeDetail_RequestData(data,callback);
break;
case "JSSymbolData::GetFinance": //财务数据
HQData.Finance_RequestData(data,callback);
break;
case "JSSymbolData::GetGPJYValue":
HQData.GPJYValue_RequestData(data,callback);
break;
case "JSSymbolData::GetSCJYValue":
HQData.SCJYValue_RequestData(data,callback);
break;
case "JSSymbolData::GetBKJYValue":
HQData.BKJYValue_RequestData(data,callback);
break;
case "JSSymbolData::GetGPJYOne":
HQData.GPJYOne_RequestData(data,callback);
break;
case "JSSymbolData::GetSCJYOne":
HQData.SCJYOne_RequestData(data,callback);
break;
case "JSSymbolData::GetBKJYOne":
HQData.BKJYOne_RequestData(data,callback);
break;
case "JSSymbolData::GetFinValue":
HQData.FinValue_RequestData(data,callback);
break;
case "JSSymbolData::GetFinOne":
HQData.FinOne_RequestData(data,callback);
break;
case "JSSymbolData::GetIndexData":
HQData.INDEX_RequestData(data,callback);
break;
//////////////////////////////////////////////////////
//报价列表数据
case "JSReportChartContainer::RequestStockListData":
//HQChart使用教程95-报价列表对接第3方数据1-码表数据
HQData.Report_RequestStockListData(data, callback); //码表
break;
case "JSReportChartContainer::RequestMemberListData": //板块成分
//HQChart使用教程95-报价列表对接第3方数据2-板块成分数据
HQData.Report_RequestMemberListDat(data, callback);
break;
case "JSDealChartContainer::RequestStockData": //股票数据更新
//HQChart使用教程95-报价列表对接第3方数据3-股票数据
HQData.Report_RequestStockData(data, callback);
break;
case "JSDealChartContainer::RequestStockSortData": //股票排序数据
//HQChart使用教程95-报价列表对接第3方数据4-股票排序数据
HQData.Report_RequestStockSortData(data, callback);
break;
case "JSDealChartContainer::RequestVirtualStockData":
HQData.Report_RequestVirtualStockData(data, callback); //股票数据 虚拟表格
break;
case "APIScriptIndex::ExecuteScript": //测试指标
HQData.Report_APIIndex(data, callback);
break;
/////////////////////////////////////////////////////////////////
//
case "KLineChartContainer::RequestVolumeProfileData": //成交量分布图
HQData.RequestVolumeProfileData(data, callback);
break;
}
}
HQData.Minute_RequestMinuteData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol[0]; //请求的股票代码
var callcation=data.Request.Data.callcation; //集合竞价
var bBuySellBar=data.Request.Data.IsShowBuySellBar;
console.log(`[HQData::RequestMinuteData] Symbol=${symbol}, Update=${data.Self.DataStatus.LatestDay}`);
if (data.Self.DataStatus.LatestDay) //增量更新模式
{
HQData.Minute_RequestMinuteUpdateData(data, callback);
return;
}
setTimeout(()=>{
var fullData=HQData.GetDayMinuteDataBySymbol(symbol);
var srcStock=fullData[0];
var stockItem={ date:srcStock.date, minute:srcStock.minute.slice(), yclose:srcStock.yclose, symbol:symbol, name:symbol };
//盘前
if (callcation.Before)
{
/*
var before=
[
//[交易时间, 价格,成交量, 成交金额, 日期(可选,YYYYMMDD)],
[915, srcStock.yclose,0,0],
[916, srcStock.yclose+0.01,0,0],
[917, srcStock.yclose+0.03,0,0],
[918, srcStock.yclose+0.02,0,0],
[919, srcStock.yclose+0.02,0,0],
[920, srcStock.yclose+0.01,0,0],
[921, srcStock.yclose,0,0],
[922, srcStock.yclose-0.02,0,0],
[923, srcStock.yclose-0.03,0,0],
[924, srcStock.yclose,0,0],
[925, srcStock.yclose,0,0],
];
var beforeinfo={ totalcount:11, ver:1.0 };
stockItem.before=before;
stockItem.beforeinfo=beforeinfo;
*/
/*
var before=[];
var beforeinfo={ totalcount:60*10, ver:2.0 }; //9:15-9:25 集合竞价15分钟 1s一个数据
var price=srcStock.yclose+0.01;
var date=new Date(2021,5,2, 9,15, 0);
var mapTest=new Map(
[
[91505, [91505,price+0.01, 400, 300, 1, 800]],
[91550, [91550,price+0.02, 550, 600, 0, 1500]],
[91603, [91603,price+0.03, 300, 600, 1, 3600]],
[91613, [91613,price+0.03, 150, 320, 1, 3600]],
[91623, [91623,price+0.04, 200, 400, 1, 3600]],
[91635, [91635,price+0.05, 100, 100, 1, 3600]],
[91640, [91640,price+0.03, 350, 210, 2, 1600]],
[91711, [91711,price+0.02, 3210, 350, 2, 3700]],
[91731, [91731,price+0.04, 110, 450, 1, 3700]],
[91825, [91825,price-0.01, 210, 650, 2, 3700]],
[91855, [91855,price-0.02, 330, 440, 1, 1000]],
[91915, [91915,price-0.03, 630, 640, 1, 1200]],
[92022, [92022,price+0.01, 260, 550, 2, 1000]],
[92304, [92304,price-0.02, 300, 100, 2, 1000]],
[92314, [92314,price-0.03, 550, 150, 2, 1000]],
[92344, [92344,price-0.04, 550, 150, 1, 1000]],
[92357, [92357,price-0.05, 250, 750, 1, 1500]],
[92405, [92405,price-0.07, 450, 50, 2, 1000]],
[92435, [92435,price-0.08, 650, 250, 1, 1000]],
[92458, [92458,price-0.12, 350, 350, 2, 1000]],
])
for(var i=0;i<beforeinfo.totalcount; ++i) //1s一个数据
{
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
var item=[ time, null, null, null, null, null ];
if (mapTest.has(time))
{
item=mapTest.get(time);
}
date.setSeconds(date.getSeconds()+1);
before.push(item);
}
*/
if (symbol=="000001.sh") //指数
{
var before=[];
var beforeinfo={ totalcount:60*10, ver:3.0, TimeConfig:{ AryTime:[{ Start:91500, End:92459, Date:srcStock.date }]} }; //9:15-9:25 集合竞价15分钟 1s一个数据
var price=srcStock.yclose+0.01;
var vol=0;
var date=new Date(2021,5,2, 9,15, 0);
var testData={ Up:1, Max:srcStock.yclose*1.02, Min:srcStock.yclose*0.98 };
for(var i=0;i<beforeinfo.totalcount; ++i) //3s一个数据
{
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
vol=HQData.GetRandomTestData(100,500)*1000;
var item=[ time, price, price+0.04, vol, 3, vol*1.3 ];
before.push(item);
if (price>testData.Max && testData.Up===1)
testData.Up=0;
else if (price<testData.Min && testData.Up===0)
testData.Up=1;
var value=HQData.GetRandomTestData(1,10)/100;
if (testData.Up==1) price+=value;
else price-=value;
date.setSeconds(date.getSeconds()+3);
time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
if (time>92500) break;
}
}
else //股票
{
var before=[];
var beforeinfo={ totalcount:60*10, ver:2.0, TimeConfig:{ AryTime:[{ Start:91500, End:92459, Date:srcStock.date }]} }; //9:15-9:25 集合竞价15分钟 1s一个数据
var price=srcStock.yclose+0.01;
var date=new Date(2021,5,2, 9,15, 0);
before=
[
[91505,price+0.01, 400, 300, 1, 800],
[91550,price+0.02, 550, 600, 0, 1500],
[91603,price+0.03, 300, 600, 1, 3600],
[91613,price+0.03, 150, 320, 1, 3600],
[91623,price+0.04, 200, 400, 1, 3600],
[91635,price+0.05, 100, 100, 1, 3600],
[91640,price+0.03, 350, 210, 2, 1600],
[91711,price+0.02, 3210, 350, 2, 3700],
[91731,price+0.04, 110, 450, 1, 3700],
[91825,price-0.01, 210, 650, 2, 3700],
[91855,price-0.02, 330, 440, 1, 1000],
[91915,price-0.03, 630, 640, 1, 1200],
[92022,price+0.01, 260, 550, 2, 1000],
[92304,price-0.02, 300, 100, 2, 1000],
[92314,price-0.03, 550, 150, 2, 1000],
[92344,price-0.04, 550, 150, 1, 1000],
[92357,price-0.05, 250, 750, 1, 1500],
[92405,price-0.07, 450, 50, 2, 1000],
[92435,price-0.08, 650, 250, 1, 1000],
[92458,price-0.12, 350, 350, 2, 1000],
];
}
stockItem.before=before;
stockItem.beforeinfo=beforeinfo;
}
//盘中
//stockItem.minute.length=50;
//测试用 这里可以修改数据
//var lastItem=srcStock.minute[srcStock.minute.length-1];
//lastItem.price+=Math.ceil(Math.random()*10)/1000*lastItem.price;
/*
for(var i=0;i<srcStock.minute.length;++i)
{
var item=srcStock.minute[i];
if (item.amount<1000000) item.amount*=100000;
}
*/
if (bBuySellBar) //盘口分析
{
var lastPrice=srcStock.yclose;
if (stockItem.minute.length>0) lastPrice=stockItem.minute[stockItem.minute.length-1].price;
var aryBuy=[];
var value=lastPrice+0.01;
for(var i=0;i<10;++i)
{
aryBuy.push({Price:value, Type:1, Vol:HQData.GetRandomTestData(1000,10000) });
value+=0.02;
}
var arySell=[];
for(var i=0;i<10;++i)
{
arySell.push({Price:value, Type:2, Vol:HQData.GetRandomTestData(1000,10000) });
value+=0.02;
}
stockItem.BuySellData={ AryBuy:aryBuy, ArySell:arySell };
}
//盘后
if (callcation.After)
{
var price=stockItem.minute[stockItem.minute.length-1].price;
/*
var afterData=[]
var afterInfo={ ver:2.0, totalcount:60*3 } //14:57-15:00
var date=new Date(2021,5,2, 14,57, 0);
var mapTest=new Map(
[
[145708, [145708,price+0.01, 400, 300, 1, 800]],
[145718, [145718,price+0.02, 550, 600, 0, 1500]],
[145738, [145738,price+0.02, 150, 800, 0, 1500]],
[145748, [145748,price+0.02, 150, 800, 0, 1500]],
[145803, [145803,price+0.03, 300, 600, 1, 3600]],
[145815, [145815,price+0.03, 350, 210, 2, 1600]],
[145826, [145826,price+0.02, 1210, 350, 2, 2700]],
[145833, [145833,price+0.01, 260, 550, 2, 1000]],
[145845, [145845,price+0.02, 160, 750, 2, 1000]],
[145858, [145858,price-0.01, 460, 650, 2, 1500]],
[145905, [145905,price-0.02, 160, 450, 1, 1500]],
[145928, [145928,price-0.02, 260, 250, 1, 1500]],
[145948, [145948,price-0.02, 860, 150, 1, 1500]],
])
for(var i=0;i<afterInfo.totalcount; ++i) //1s一个数据
{
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
var item=[ time, null, null, null, null, null ];
if (mapTest.has(time))
{
item=mapTest.get(time);
}
date.setSeconds(date.getSeconds()+1);
afterData.push(item);
}
*/
if (symbol=="000001.sh") //指数
{
var afterData=[]
var afterInfo={ ver:3.0, totalcount:60*3, TimeConfig:{ AryTime:[{ Start:145700, End:145959, Date:srcStock.date }]} } //14:57-15:00
var date=new Date(2021,5,2, 14,57, 0);
var vol=0;
for(var i=0;i<afterInfo.totalcount; ++i) //1s一个数据
{
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
vol=HQData.GetRandomTestData(100,500)*1000;
var item=[ time, price, price+0.04, vol, 3, vol*1.3 ];
afterData.push(item);
date.setSeconds(date.getSeconds()+3);
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
if (time>145959) break;
}
}
else
{
var afterData=[]
var afterInfo={ ver:2.0, totalcount:60*3, TimeConfig:{ AryTime:[{ Start:145700, End:145959, Date:srcStock.date }]} } //14:57-15:00
if (stockItem.minute.length>=240)
{
afterData=
[
[145708,price+0.01, 400, 300, 1, 800],
[145718,price+0.02, 550, 600, 0, 1500],
[145738,price+0.02, 150, 800, 0, 1500],
[145748,price+0.02, 150, 800, 0, 1500],
[145803,price+0.03, 300, 600, 1, 3600],
[145815,price+0.03, 350, 210, 2, 1600],
[145826,price+0.02, 1210, 350, 2, 2700],
[145833,price+0.01, 260, 550, 2, 1000],
[145845,price+0.02, 160, 750, 2, 1000],
[145858,price-0.01, 460, 650, 2, 1500],
[145905,price-0.02, 160, 450, 1, 1500],
[145928,price-0.02, 260, 250, 1, 1500],
[145948,price-0.02, 860, 150, 1, 1500],
];
}
}
stockItem.after=afterData;
stockItem.afterinfo=afterInfo;
}
var hqchartData={code:0, stock:[stockItem] };
var time=new Date();
if (time.getSeconds()%3==1)
hqchartData.LatestPointFlash={ FlashCount:2 };
callback(hqchartData);
}, 50);
}
//增量更新
HQData.Minute_RequestMinuteUpdateData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol[0]; //请求的股票代码
var callcation=data.Request.Data.callcation; //集合竞价
var bBuySellBar=data.Request.Data.IsShowBuySellBar;
console.log(`[HQData::Minute_RequestMinuteUpdateData] Symbol=${symbol}`);
var endTime=0;
if (data.DateRange)
{
endTime=data.DateRange.End.Time;
}
setTimeout(()=>
{
var fullData=HQData.GetDayMinuteDataBySymbol(symbol);
var srcStock=fullData[0];
var stockItem={ date:srcStock.date, minute:[], yclose:srcStock.yclose, symbol:symbol, name:symbol };
var lastItem=null;
for(var i=0;i<srcStock.minute.length;++i)
{
var item=srcStock.minute[i];
if (item.time>=endTime)
{
//0=日期 1=时间 2=开 3=高 4=低 5=收 6=均价 7=量 8=金额 9=涨幅 10=涨跌
var minItem=[srcStock.date, item.time, item.open, item.high, item.low, item.price, item.avprice , item.vol, item.amount ];
stockItem.minute.push(minItem);
lastItem=minItem;
if (stockItem.minute.length>3) break;
}
}
if (callcation.Before)
{
if (symbol=="000001.sh") //指数
{
var before=[];
var beforeinfo={ totalcount:60*10, ver:3.0, TimeConfig:{ AryTime:[{ Start:91500, End:92459, Date:srcStock.date }]} }; //9:15-9:25 集合竞价15分钟 1s一个数据
var price=srcStock.yclose+0.01;
var vol=0;
var date=new Date(2021,5,2, 9,15, 0);
var testData={ Value:0.01, Up:1, Max:srcStock.yclose*1.02, Min:srcStock.yclose*0.98 };
for(var i=0;i<beforeinfo.totalcount; ++i) //3s一个数据
{
vol=HQData.GetRandomTestData(100,500)*1000;
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
var item=[ time, price, price+0.04, vol, 3, vol*1.3 ];
before.push(item);
if (price>testData.Max && testData.Up===1)
testData.Up=0;
else if (price<testData.Min && testData.Up===0)
testData.Up=1;
var value=HQData.GetRandomTestData(1,10)/100;
if (testData.Up==1) price+=value;
else price-=value;
date.setSeconds(date.getSeconds()+3);
time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
if (time>92500) break;
}
}
else
{
var beforeinfo={ totalcount:60*10, ver:2.0, TimeConfig:{ AryTime:[{ Start:91500, End:92459, Date:srcStock.date }]} }; //9:15-9:25 集合竞价15分钟 1s一个数据
var price=srcStock.yclose-0.01;
var before=
[
[92344,price-0.03, 150, 150, 2, 1000],
[92357,price-0.04, 250, 250, 2, 1500],
[92405,price-0.05, 350, 350, 1, 1000],
[92435,price-0.06, 450, 450, 1, 1000],
[92458,price-0.07, 550, 550, 2, 1000],
];
}
stockItem.before=before;
stockItem.beforeinfo=beforeinfo;
}
if (callcation.After)
{
if (symbol=="000001.sh") //指数
{
var afterData=[]
var afterInfo={ ver:3.0, totalcount:60*3, TimeConfig:{ AryTime:[{ Start:145700, End:145959, Date:srcStock.date }]} } //14:57-15:00
if (IFrameSplitOperator.IsNonEmptyArray(lastItem) && lastItem[1]>=1457)
{
var price=lastItem[5];
var date=new Date(2021,5,2, 14,57, 0);
var vol=0;
for(var i=0;i<afterInfo.totalcount; ++i) //1s一个数据
{
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
vol=HQData.GetRandomTestData(100,500)*1000;
var item=[ time, price, price+0.04, vol, 3, vol*1.3 ];
afterData.push(item);
date.setSeconds(date.getSeconds()+3);
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
if (time>145959) break;
}
}
}
else
{
var afterInfo={ totalcount:60*10, ver:2.0, TimeConfig:{ AryTime:[{ Start:145700, End:145959, Date:srcStock.date }]} }; //9:15-9:25 集合竞价15分钟 1s一个数据
var afterData=[];
if (IFrameSplitOperator.IsNonEmptyArray(lastItem) && lastItem[1]>=1457)
{
var price=lastItem[5];
afterData=
[
[145708,price+0.01, 400, 300, 1, 800],
[145718,price+0.02, 550, 600, 0, 1500],
[145738,price+0.02, 150, 800, 0, 1500],
[145748,price+0.02, 150, 800, 0, 1500],
[145803,price+0.03, 300, 600, 1, 3600],
[145815,price+0.03, 350, 210, 2, 1600],
[145826,price+0.02, 1210, 350, 2, 2700],
[145833,price+0.01, 260, 550, 2, 1000],
[145845,price+0.02, 160, 750, 2, 1000],
[145858,price-0.01, 460, 650, 2, 1500],
[145905,price-0.02, 160, 450, 1, 1500],
[145928,price-0.02, 260, 250, 1, 1500],
[145948,price-0.02, 860, 150, 1, 1500],
];
}
}
stockItem.after=afterData;
stockItem.afterinfo=afterInfo;
}
if (bBuySellBar && lastItem) //盘口分析
{
var lastPrice=lastItem[4];
var aryBuy=[];
var value=lastPrice+0.01;
for(var i=0;i<10;++i)
{
aryBuy.push({Price:value, Type:1, Vol:HQData.GetRandomTestData(1000,10000) });
value+=0.02;
}
var arySell=[];
for(var i=0;i<10;++i)
{
arySell.push({Price:value, Type:2, Vol:HQData.GetRandomTestData(1000,10000) });
value+=0.02;
}
stockItem.BuySellData={ AryBuy:aryBuy, ArySell:arySell };
}
var hqchartData={code:0, stock:[stockItem], dataType:1 };
hqchartData.LatestPointFlash={ FlashCount:2 };
callback(hqchartData);
}, 50);
}
HQData.Minute_RequestMinuteDataV2=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol[0]; //请求的股票代码
var callcation=data.Request.Data.callcation; //集合竞价
console.log(`[HQData::Minute_RequestMinuteDataV2] Symbol=${symbol}`);
setTimeout(()=>
{
var fullData=HQData.GetDayMinuteDataBySymbol(symbol);
var srcStock=fullData[0];
var stockItem={ date:srcStock.date, minute:srcStock.minute, yclose:srcStock.yclose, symbol:symbol, name:symbol };
if (callcation.Before)
{
var TEST_BEFORE_DATA=
[
[8.52, 50000, 30000, 1, 200000],
[8.53, 55000, 40000, 0, 80000],
[8.52, 40000, 60000, 1, 80000],
[8.55, 30000, 21000, 2, 44000],
[8.51, 21000, 25000, 2, 40000],
[8.50, 36000, 55000, 2, 60000],
[8.49, 10000, 20000, 2, 33000],
];
var date=new Date(parseInt(stockItem.date/10000),(stockItem.date/100%100-1),stockItem.date%100, 9, 15, 0);
var count=10*60; //9:15-9:25
var before=[];
for(var i=0, j=0;i<count;++i)
{
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
var testIndex=j%TEST_BEFORE_DATA.length;
var testData=TEST_BEFORE_DATA[testIndex];
var item=[ time, null, null, null, null, null ];
if (i%20==0 || i==count-1)
{
item=[ time, testData[0], testData[1], testData[2], testData[3], (testData[1]+testData[2])*1.5 ];
++j;
}
before.push(item);
date.setSeconds(date.getSeconds()+1);
}
//before.length=200;
var beforeinfo={ totalcount:count, ver:2.0 };
stockItem.before=before;
stockItem.beforeinfo=beforeinfo;
var TEST_AFTER_DATA=
[
[8.51, 40000, 30000, 1, 80000],
[8.51, 55000, 60000, 0, 150000],
[8.51, 30000, 60000, 1, 160000],
[8.51, 35000, 21000, 2, 50000],
[8.51, 21000, 35000, 2, 70000],
[8.51, 26000, 55000, 2, 100000],
[8.51, 30000, 10000, 2, 50000],
];
var date=new Date(parseInt(stockItem.date/10000),(stockItem.date/100%100-1),stockItem.date%100, 14, 57, 0);
var count=3*60; //14:57-15:00
var after=[];
for(var i=0,j=0;i<count;++i)
{
var time=date.getHours()*10000+date.getMinutes()*100+date.getSeconds();
var testIndex=j%TEST_AFTER_DATA.length;
var testData=TEST_AFTER_DATA[testIndex];
var item=[ time, null, null, null, null, null ];
if (i%10==0 || i==count-1)
{
item=[ time, testData[0], testData[1], testData[2], testData[3], (testData[1]+testData[2])*1.5 ];
++j;
}
after.push(item);
date.setSeconds(date.getSeconds()+1);
}
var afterinfo={ totalcount:count, ver:2.0 };
stockItem.after=after;
stockItem.afterinfo=afterinfo;
}
//stockItem.minute.length=0;
var hqchartData={code:0, stock:[stockItem] };
callback(hqchartData);
}, 50);
}
HQData.Minute_RequestPopMinuteData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol[0]; //请求的股票代码
var date=data.Request.Data.date;
var callcation=data.Request.Data.callcation; //集合竞价
console.log(`[HQData::RequestPopMinuteData] Symbol=${symbol} Date=${date}`);
setTimeout(()=>{
var fullData=HQData.GetDayMinuteDataBySymbol(symbol);
var srcStock=fullData[0];
var stockItem={ date:date, minute:[], yclose:srcStock.yclose, symbol:srcStock.symbol, name:srcStock.symbol, IsHistoryMinute:true };
if (callcation.Before)
{
var before=
[
//[交易时间, 价格,成交量, 成交金额, 日期(可选,YYYYMMDD)],
[915, srcStock.yclose,0,0],
[916, srcStock.yclose+0.01,0,0],
[917, srcStock.yclose+0.03,0,0],
[918, srcStock.yclose+0.02,0,0],
[919, srcStock.yclose+0.02,0,0],
[920, srcStock.yclose+0.01,0,0],
[921, srcStock.yclose,0,0],
[922, srcStock.yclose-0.02,0,0],
[923, srcStock.yclose-0.03,0,0],
[924, srcStock.yclose,0,0],
[925, srcStock.yclose,0,0],
];
var beforeinfo={ totalcount:11, ver:1.0 };
stockItem.before=before;
stockItem.beforeinfo=beforeinfo;
}
for(var i=0;i<srcStock.minute.length;++i)
{
var item=srcStock.minute[i];
var newItem=CloneData(item);
newItem.date=date;
stockItem.minute.push(newItem);
}
var hqchartData={code:0, stock:[stockItem] };
callback(hqchartData);
}, 50);
}
HQData.KLine_RequestMulitDayMinuteData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol; //请求的股票代码
console.log(`[HQData::KLine_RequestMulitDayMinuteData] Symbol=${symbol}`);
var fullData=HQData.GetMulitDayMinuteDataBySymbol(symbol);
var aryKLine=[];
var aryBreakPoint=[];
for(var i=fullData.length-1;i>=0;--i)
{
var dayItem=fullData[i];
var yClose=dayItem.yclose
for(var j=0;j<dayItem.minute.length;++j)
{
var minItem=dayItem.minute[j];
var kItem=[dayItem.date, yClose, minItem[1], minItem[2], minItem[3], minItem[4],minItem[5],minItem[6], minItem[0] ];
aryKLine.push(kItem);
}
aryBreakPoint.push({ Date:dayItem.date, Time:1500 })
}
var hqchartData={ name:symbol, symbol:symbol, data:aryKLine, ver:2.0, AryBreakPoint:aryBreakPoint };
callback(hqchartData);
}
HQData.Minute_RequestHistoryMinuteData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol; //请求的股票代码
var dayCount=data.Request.Data.daycount;
var callcation=data.Request.Data.callcation; //集合竞价
var bBuySellBar=data.Request.Data.IsShowBuySellBar;
console.log(`[HQData::Minute_RequestHistoryMinuteData] Symbol=${symbol}`);
var fullData=HQData.GetMulitDayMinuteDataBySymbol(symbol);
var aryDay=[];
if (dayCount>fullData.length) dayCount=fullData.length;
aryDay=fullData.slice(0,dayCount);
for(var i=0; i<aryDay.length; ++i)
{
var stockItem=aryDay[i];
if (callcation.Before)
{
var before=[];
var beforeinfo={ totalcount:60*10, ver:2.0, TimeConfig:{ AryTime:[{ Start:91500, End:92459, Date:stockItem.date }]} }; //9:15-9:25 集合竞价15分钟 1s一个数据
var price=stockItem.yclose+0.01;
before=
[
[91505,price+0.01, 400, 300, 1, 800],
[91550,price+0.02, 550, 600, 0, 1500],
[91603,price+0.03, 300, 600, 1, 3600],
[91613,price+0.03, 150, 320, 1, 3600],
[91623,price+0.04, 200, 400, 1, 3600],
[91635,price+0.05, 100, 100, 1, 3600],
[91640,price+0.03, 350, 210, 2, 1600],
[91711,price+0.02, 3210, 350, 2, 3700],
[91731,price+0.04, 110, 450, 1, 3700],
[91825,price-0.01, 210, 650, 2, 3700],
[91855,price-0.02, 330, 440, 1, 1000],
[91915,price-0.03, 630, 640, 1, 1200],
[92022,price+0.01, 260, 550, 2, 1000],
[92304,price-0.02, 300, 100, 2, 1000],
[92314,price-0.03, 550, 150, 2, 1000],
[92344,price-0.04, 550, 150, 1, 1000],
[92357,price-0.05, 250, 750, 1, 1500],
[92405,price-0.07, 450, 50, 2, 1000],
[92435,price-0.08, 650, 250, 1, 1000],
[92458,price-0.12, 350, 350, 2, 1000],
];
stockItem.before=before;
stockItem.beforeinfo=beforeinfo;
}
if (callcation.After)
{
var afterInfo={ totalcount:60*10, ver:2.0, TimeConfig:{ AryTime:[{ Start:145700, End:145959, Date:stockItem.date }]} }; //9:15-9:25 集合竞价15分钟 1s一个数据
var price=stockItem.minute[stockItem.minute.length-1][4];
var afterData=
[
[145708,price+0.01, 400, 300, 1, 800],
[145718,price+0.02, 550, 600, 0, 1500],
[145738,price+0.02, 150, 800, 0, 1500],
[145748,price+0.02, 150, 800, 0, 1500],
[145803,price+0.03, 300, 600, 1, 3600],
[145815,price+0.03, 350, 210, 2, 1600],
[145826,price+0.02, 1210, 350, 2, 2700],
[145833,price+0.01, 260, 550, 2, 1000],
[145845,price+0.02, 160, 750, 2, 1000],
[145858,price-0.01, 460, 650, 2, 1500],
[145905,price-0.02, 160, 450, 1, 1500],
[145928,price-0.02, 260, 250, 1, 1500],
[145948,price-0.02, 860, 150, 1, 1500],
];
stockItem.after=afterData;
stockItem.afterinfo=afterInfo;
}
/*
if (callcation.Before)
{
var before=
[
//[交易时间, 价格,成交量, 成交金额, 日期(可选,YYYYMMDD)],
[915, item.yclose,0,0],
[916, item.yclose+0.01,0,0],
[917, item.yclose+0.03,0,0],
[918, item.yclose+0.02,0,0],
[919, item.yclose+0.02,0,0],
[920, item.yclose+0.01,0,0],
[921, item.yclose,0,0],
[922, item.yclose-0.02,0,0],
[923, item.yclose-0.03,0,0],
[924, item.yclose,0,0],
[925, item.yclose,0,0],
];
var beforeinfo={ totalcount:11, ver:1.0 };
item.before=before;
item.beforeinfo=beforeinfo;
}
*/
}
if (bBuySellBar) //盘口分析
{
var dayItem=aryDay[0];
var lastPrice=dayItem.minute[dayItem.minute.length-1][4];
var aryBuy=[];
var value=lastPrice+0.01;
for(var i=0;i<10;++i)
{
aryBuy.push({Price:value, Type:1, Vol:HQData.GetRandomTestData(1000,10000) });
value+=0.02;
}
var arySell=[];
for(var i=0;i<10;++i)
{
arySell.push({Price:value, Type:2, Vol:HQData.GetRandomTestData(1000,10000) });
value+=0.02;
}
dayItem.BuySellData={ AryBuy:aryBuy, ArySell:arySell };
}
var hqchartData={code:0, data:aryDay, name:symbol, symbol: symbol};
//hqchartData.data[0].minute.length=45;
callback(hqchartData);
}
HQData.Minute_RequestOverlayMinuteData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol;
var date=data.Request.Data.days[0];
var fullData=HQData.GetMulitDayMinuteDataBySymbol(symbol);
var aryDay=HQData.GetMulitDayMinuteDataByDate(fullData, [date]);
var hqchartData={ code:0, data:aryDay, name:symbol, symbol:symbol };
callback(hqchartData);
}
HQData.Minute_RequestOverlayHistoryMinuteData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol;
var aryDate=data.Request.Data.days;
var fullData=HQData.GetMulitDayMinuteDataBySymbol(symbol);
var aryDay=HQData.GetMulitDayMinuteDataByDate(fullData, aryDate);
var hqchartData={ code:0, data:aryDay, name:symbol, symbol:symbol };
callback(hqchartData);
}
HQData.RequestHistoryData=function(data,callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol; //请求的股票代码
var count=data.Request.Data.count
console.log(`[HQData::RequestMinuteDaysData] Symbol=${symbol}`);
var fullData=HQData.GetDayKLineDataBySymbol(symbol);
var aryData=[];
if (IFrameSplitOperator.IsNonEmptyArray(fullData))
{
var dataCount=fullData.length;
var start=dataCount-count;
if (start<0) start=0;
aryData=fullData.slice(start);
/*
for(var i=aryData.length-5;i<aryData.length;++i)
{
var item=aryData[i];
item[13]=true;
}
*/
}
var hqchartData={ name:symbol, symbol:symbol, data:aryData, ver:2.0 };
callback(hqchartData);
}
HQData.RequestFlowCapitalData=function(data,callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol; //请求的股票代码
console.log(`[HQData::RequestFlowCapitalData] Symbol=${symbol}`);
var hqchartData=KLINE_CAPITAL_DATA;
callback(hqchartData);
}
HQData.RequestRealtimeData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol[0]; //请求的股票代码
var end=data.Request.Data.dateRange.End;
var endDate=end.Date;
var aryStock=[];
var hqchart=data.Self;
var kData=hqchart.GetKData();
for(var i=kData.Data.length-1;i>=0;--i)
{
var item=kData.Data[i];
if (!item.IsVirtual)
{
endDate=item.Date;
break;
}
}
var bVer3=true;
if (bVer3)
{
for(var i=0;i<data.Request.Data.symbol.length;++i)
{
var item=data.Request.Data.symbol[i];
var fullData=HQData.GetDayKLineDataBySymbol(item);
if (!IFrameSplitOperator.IsNonEmptyArray(fullData)) continue;
var aryData=HQData.GetKLineDataByDate(fullData, endDate, 20999999);
if (!IFrameSplitOperator.IsNonEmptyArray(aryData)) continue;
var stockItem={ symbol:item, name:item, data:[] };
var kItem=aryData[0];
var price=kItem[5];
var value=Math.ceil(Math.random()*10)/1000*price;
var bUp=Math.ceil(Math.random()*10)>=5;
if (bUp) price+=value;
else price-=value;
var newKItem=[ ];
newKItem[0]=kItem[0];
newKItem[1]=kItem[1];
newKItem[2]=kItem[2];
newKItem[3]=Math.max(kItem[3],price);
newKItem[4]=Math.min(kItem[4],price);
newKItem[5]=price;
newKItem[6]=kItem[6];
newKItem[7]=kItem[7];
stockItem.data.push(newKItem);
aryStock.push(stockItem);
}
var hqchartData={ code:0, stock:aryStock, Ver:3.0 };
}
else
{
for(var i=0;i<data.Request.Data.symbol.length;++i)
{
var item=data.Request.Data.symbol[i];
var fullData=HQData.GetDayKLineDataBySymbol(item);
if (!IFrameSplitOperator.IsNonEmptyArray(fullData)) continue;
var aryData=HQData.GetKLineDataByDate(fullData, endDate, 20999999);
if (!IFrameSplitOperator.IsNonEmptyArray(aryData)) continue;
var kItem=aryData[0];
var price=kItem[5];
var value=Math.ceil(Math.random()*10)/1000*price;
var bUp=Math.ceil(Math.random()*10)>=5;
if (bUp) price+=value;
else price-=value;
var stockItem={ symbol:item, name:item };
stockItem.date=kItem[0];
stockItem.yclose=kItem[1];
stockItem.open=kItem[2];
stockItem.high=Math.max(kItem[3],price);
stockItem.low=Math.min(kItem[4],price);
stockItem.price=price;
stockItem.vol=kItem[6];
stockItem.amount=kItem[7];
aryStock.push(stockItem);
}
var hqchartData={ code:0, stock:aryStock, };
}
var time=new Date();
//if (time.getSeconds()%3==1)
hqchartData.LatestPointFlash={ FlashCount:2 };
callback(hqchartData);
}
HQData.RequestHistoryMinuteData=function(data, callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol; //请求的股票代码
var count=data.Request.Data.count*200; //请求的数据长度
console.log(`[HQData::RequestHistoryMinuteData] Symbol=${symbol}`);
var fullData=HQData.GetM1KLineDataBySymbol(symbol);
var aryData=[];
if (IFrameSplitOperator.IsNonEmptyArray(fullData))
{
var dataCount=fullData.length;
var start=dataCount-count;
if (start<0) start=0;
aryData=fullData.slice(start);
}
var hqchartData={ name:symbol, symbol:symbol, data:aryData, ver:2.0 };
callback(hqchartData);
}
HQData.RequestMinuteRealtimeData=function(data,callback)
{
data.PreventDefault=true;
var symbol=data.Request.Data.symbol[0]; //请求的股票代码
var end=data.Request.Data.dateRange.End;
var endDate=end.Date;
var endTime=end.Time;
var aryOverlay=[ ]; //叠加
var aryMainData=[]; //主图
for(var i=0;i<data.Request.Data.symbol.length;++i)
{
var symbol=data.Request.Data.symbol[i];
var fullData=HQData.GetM1KLineDataBySymbol(symbol);
if (!IFrameSplitOperator.IsNonEmptyArray(fullData)) continue;
var aryData=HQData.GetKLineDataByDateTime(fullData, endDate, endTime, 20999999, 9999);
if (!IFrameSplitOperator.IsNonEmptyArray(aryData)) continue;
var kItem=JSON.parse(JSON.stringify(aryData[0]));
//生成随机测试数据
var price=kItem[5];
var value=Math.ceil(Math.random()*10)/5000*price;
var bUp=Math.ceil(Math.random()*10)>=5;
if (bUp) price+=value;
else price-=value;
kItem[5]=price;
kItem[3]=Math.max(price, kItem[3]);
kItem[4]=Math.min(price, kItem[4]);
if (i==0)
{
aryMainData.push(kItem);
}
else
{
var stock={ data:[kItem], symbol:symbol, name:symbol };
aryOverlay.push(stock);
}
}
var symbol=data.Request.Data.symbol[0]; //请求的股票代码
var hqchartData={ name:symbol, symbol:symbol, ver:2.0, data:aryMainData };
if (IFrameSplitOperator.IsNonEmptyArray(aryOverlay)) hqchartData.overlay=aryOverlay;
callback(hqchartData);
}
HQData.RequestIndexVariantData=function(data,callback)
{
data.PreventDefault=true;
var varName=data.Request.Data.VariantName; //变量名称
if (varName=="FROMOPEN")
{
var hqchartData={ };
//单数据
hqchartData.Data={ Date:20230707, Value:240 };
hqchartData.DataType=1;
callback(hqchartData);
}
else if (varName=="FGBLOCK")
{
var hqchartData={ DataType:1, Data:{Value:"融资融券 大盘股 MSCI成份 周期股 沪股通标的"} }; //返回所属风格板块.
callback(hqchartData);
}
else if (varName=="GNBLOCK")
{
var hqchartData={ DataType:1, Data:{ Value:"含可转债 跨境支付CIPS"} }; //返回所属概念板块.
callback(hqchartData);
}
else if (varName=="HYBLOCK")
{
var hqchartData={ DataType:1, Data:{Value:"全国性银行"}}; //返回品种所属行业.
callback(hqchartData);
}
else if (varName=="DYBLOCK")
{
var hqchartData={ DataType:1, Data:{Value:"上海板块"} }; //返回品种所属地域..
callback(hqchartData);
}
else if (varName=="CAPITAL")
{
var hqchartData={ DataType:1, Data:{ Value:29352177375 } }; // 当前流通股本,单位为手,债券1手为10张,其它为100
callback(hqchartData);
}
else if (varName=="LARGEINTRDVOL")
{
//测试数据
var kData=data.Self.Data;
var hqchartData={ DataType:2, Data:[] };
var testValue=0.15;
for(var i=0;i<kData.Data.length;++i)
{
var kItem=kData.Data[i];
hqchartData.Data.push({ Date:kItem.Date, Time:kItem.Time, Value:kItem.Vol*testValue });
testValue+=0.01;
if (testValue>0.23) testValue=0.15;
}
callback(hqchartData);
}
else if (varName=="LARGEOUTTRDVOL")
{
//测试数据
var kData=data.Self.Data;
var hqchartData={ DataType:2, Data:[] };
for(var i=0;i<kData.Data.length;++i)
{
var kItem=kData.Data[i];
hqchartData.Data.push({ Date:kItem.Date, Time:kItem.Time, Value:kItem.Vol*0.17 });
}
callback(hqchartData);
}
else if (varName=="EXCHANGE" || varName=="HSL")
{
var kData=data.Self.Data;
var hqchartData={ DataType:0, Data:[], Ver:2.0 };
for(var i=0;i<kData.Data.length;++i)
{
var kItem=kData.Data[i];
var value=HQData.GetRandomTestData(1,10);
hqchartData.Data.push({ Date:kItem.Date, Time:kItem.Time, Value:value });
}
callback(hqchartData);
}
else
{
var error= `变量'${varName}' 没有对接数据. [HQData.RequestIndexVariantData]`;
var hqchartData={ Error:error };
callback(hqchartData);
}
}
HQData.CustomFunction_RequestData=function(data, callback)
{
data.PreventDefault=true;
var funcName=data.Request.Data.FunctionName;
var hqchartData=null;
if (funcName=='L2_VOL')
{
var args=data.Request.Data.JobItem.Args;
var param=[ args[0].Value, args[1].Value ];
var hqchartData={ DataType:2, Data:[] };
var kData=data.Self.Data;
for(var i=0;i<kData.Data.length;++i)
{
var kItem=kData.Data[i];
hqchartData.Data.push({ Date:kItem.Date, Time:kItem.Time, Value:kItem.Vol/3 });
}
}
else
{
var error= `函数'${funcName}' 没有对接数据. [HQData.CustomFunction_RequestData]`;
var hqchartData={ Error:error };
}
callback(hqchartData);
}
HQData.CustomVarData_RequestData=function(data, callback)
{
data.PreventDefault=true;
var varName=data.Request.Data.VariantName;
if (varName=="DCLOSE")
{
var hqchartData={ DataType:2, Data:[] };
var kData=data.Self.Data;
for(var i=0;i<kData.Data.length;++i)
{
var kItem=kData.Data[i];
hqchartData.Data.push({ Date:kItem.Date, Time:kItem.Time, Value:kItem.Close });
}
callback(hqchartData);
}