/* 第3方数据对接 h5开启以下代理跨域 腾讯分钟走势图,5日走势图 http://127.0.0.1:8715 => http://web.ifzq.gtimg.cn 新浪分钟K线数据 http://127.0.0.1:8712=> http://quotes.sina.cn 腾讯日K 支持跨域 http://proxy.finance.qq.com/ifzqgtimg/appstock/app/newfqkline/get?_var=kline_dayqfq¶m=sh600000,day,,,320,qfq&r=0.23908471470885573 */ function HQData() { } import { Interpreter } from "./eval5.min.js"; const interpreter = new Interpreter(window, { timeout: 0, }); HQData.NetworkFilter=function(data, callback) { console.log('[HQData::NetworkFilter] data', data); switch(data.Name) { case 'KLineChartContainer::ReqeustHistoryMinuteData': //分钟全量数据下载 HQData.RequestHistoryMinuteData(data, callback); break; case 'KLineChartContainer::RequestMinuteRealtimeData': //分钟增量数据更新 HQData.RequestMinuteRealtimeData(data,callback); break; case 'KLineChartContainer::RequestFlowCapitalData': //流通股本 HQData.RequestFlowCapitalData(data,callback); break; case 'KLineChartContainer::RequestHistoryData': //日线全量数据下载 HQData.RequestHistoryData(data,callback); break; case 'KLineChartContainer::RequestRealtimeData': //日线实时数据更新 HQData.RequestRealtimeData(data,callback); break; case "MinuteChartContainer::RequestMinuteData": //单日分时 HQData.RequestMinuteData(data,callback); break; case "MinuteChartContainer::RequestHistoryMinuteData": //多日分时 HQData.RequestMinuteDaysData(data,callback); break; } } //股票代码转换成新浪代码 HQData.ConverToSinaSymbol=function(symbol) { var internalSymbol; if (symbol.indexOf('.sh')>0) { internalSymbol=symbol.replace('.sh',""); internalSymbol="sh"+internalSymbol; } else if (symbol.indexOf('.sz')>0) { internalSymbol=symbol.replace('.sz',""); internalSymbol="sz"+internalSymbol; } return internalSymbol; } //股票代码转腾讯代码 HQData.ConverToQQSymbol=function(symbol) { var internalSymbol; if (symbol.indexOf('.sh')>0) { internalSymbol=symbol.replace('.sh',""); internalSymbol="sh"+internalSymbol; } else if (symbol.indexOf('.sz')>0) { internalSymbol=symbol.replace('.sz',""); internalSymbol="sz"+internalSymbol; } return internalSymbol; } //新浪分钟K线数据 HQData.GetKMinuteApiUrl=function(symbol, period, count) { var internalSymbol=HQData.ConverToSinaSymbol(symbol); var Period_List=new Map( [ [4,1], [5,5], [6,15], [7,30], [8,60] ] ); var scale=Period_List.get(period); //http://quotes.sina.cn/cn/api/jsonp_v2.php/=/CN_MarketDataService.getKLineData?symbol=sh600000&scale=1&datalen=5000 // #ifndef H5 var url=`https://quotes.sina.cn/cn/api/jsonp_v2.php/var __kminute__=/CN_MarketDataService.getKLineData?symbol=${internalSymbol}&scale=${scale}&datalen=${count}`; // #endif // #ifdef H5 var url=`http://127.0.0.1:8712/cn/api/jsonp_v2.php/var __kminute__=/CN_MarketDataService.getKLineData?symbol=${internalSymbol}&scale=${scale}&datalen=${count}`; // #endif return { Url:url, Symbol:symbol, InternalSymbol:internalSymbol, Period:period }; } //腾讯分钟走势图,5日走势图 HQData.GetMinuteApiUrl=function(symbol, dayCount) { //https://web.ifzq.gtimg.cn/appstock/app/minute/query?code=sh600519 //https://web.ifzq.gtimg.cn/appstock/app/day/query?code=sh600519 var internalSymbol=HQData.ConverToQQSymbol(symbol); if (dayCount==1) { // #ifndef H5 var url=`https://web.ifzq.gtimg.cn/appstock/app/minute/query?_var=min_data_${internalSymbol}&code=${internalSymbol}`; // #endif // #ifdef H5 var url=`http://127.0.0.1:8715/appstock/app/minute/query?_var=min_data_${internalSymbol}&code=${internalSymbol}`; // #endif } else { // #ifndef H5 var url=`https://web.ifzq.gtimg.cn/appstock/app/day/query?_var=fdays_data_${internalSymbol}&code=${internalSymbol}`; // #endif // #ifdef H5 var url=`http://127.0.0.1:8715/appstock/app/day/query?_var=fdays_data_${internalSymbol}&code=${internalSymbol}`; // #endif } return { Url:url, Symbol:symbol, InternalSymbol:internalSymbol, DayCount:dayCount }; } //腾讯日K 支持跨域 HQData.GetKDayApiUrl=function(symbol,period,right,count) { // https://proxy.finance.qq.com/ifzqgtimg/appstock/app/newfqkline/get?_var=kline_dayqfq¶m=sh600000,day,,,320,qfq&r=0.23908471470885573 // https://proxy.finance.qq.com/ifzqgtimg/appstock/app/newfqkline/get?_var=kline_weekhfq¶m=sh600000,week,,,320,hfq&r=0.9245064943280656 // https://proxy.finance.qq.com/ifzqgtimg/appstock/app/newkline/newkline?_var=kline_week¶m=sh600000,week,,,320,&r=0.5369798987226688 var internalSymbol=HQData.ConverToQQSymbol(symbol); var Period_List=new Map( [ [0,"day"], [1,"week"], [2,"month"] ] ); var periodName=Period_List.get(period); if (right==0) { var fq=""; var url=`https://proxy.finance.qq.com/ifzqgtimg/appstock/app/newkline/newkline?_var=kline_data¶m=${internalSymbol},${periodName},,,${count},`; } else { var fq="qfq"; if (right==2) fq="hfq"; var url=`https://proxy.finance.qq.com/ifzqgtimg/appstock/app/newfqkline/get?_var=kline_data¶m=${internalSymbol},${periodName},,,${count},${fq}`; } return { Url:url, Symbol:symbol, InternalSymbol:internalSymbol, Period:period, PeriodName:periodName, FuQuan:fq }; } //分钟K线 HQData.RequestHistoryMinuteData=function(data, callback) { data.PreventDefault=true; var symbol=data.Request.Data.symbol; //请求的股票代码 var period=data.Self.Period; //周期ID var count=5000; console.log(`[HQData.RequestHistoryMinuteData] Symbol=${symbol}, period=${period}`, symbol,period); var obj=HQData.GetKMinuteApiUrl(symbol,period,count); uni.request( { url: obj.Url, type: "GET", //dataType: "json", success:(recvData)=> { interpreter.evaluate(recvData.data); //console.log(__kminute__); HQData.RecvHistoryMinuteData(interpreter.globalScope.data.__kminute__, data, callback, obj); }, error:(request)=> { //self.RecvError(request,RECV_DATA_TYPE.DERIVATIVE_DATA); } }); } HQData.RecvHistoryMinuteData=function(recvData, data, callback, obj) { //{"day":"2021-03-03 14:15:00","open":"22.860","high":"22.900","low":"22.820","close":"22.830","volume":"2337300","ma_price5":22.796,"ma_volume5":1612649}, var hqChartData={code:0, data:[]}; hqChartData.symbol=obj.Symbol; hqChartData.name=obj.Symbol; var yClose=null; for(var i in recvData) { //if (i==recvData.length-1) break; //测试自动更新 var item=recvData[i]; var day = new Date(item.day); var date=day.getFullYear()*10000+(day.getMonth()+1)*100+day.getDate(); var time=day.getHours()*100+day.getMinutes(); var newItem=[ date,yClose, parseFloat(item.open), parseFloat(item.high), parseFloat(item.low), parseFloat(item.close), parseFloat(item.volume), null, time]; hqChartData.data.push(newItem); yClose=parseFloat(item.close); } if (data.Self.IsDestroy==false) { // #ifdef H5 callback(hqChartData); // #endif // #ifndef H5 callback({data:hqChartData}); // #endif } } //分钟K线更新 HQData.RequestMinuteRealtimeData=function(data,callback) { data.PreventDefault=true; var symbol=data.Request.Data.symbol[0]; //请求的股票代码 var period=data.Self.Period; //周期ID var count=5; //取最新5条 console.log(`[HQData.RequestHistoryMinuteData] Symbol=${symbol}, period=${period}`, symbol,period); var obj=HQData.GetKMinuteApiUrl(symbol,period,count); uni.request( { url: obj.Url, type: "GET", //dataType: "json", success:(recvData)=> { interpreter.evaluate(recvData.data); console.log(recvData); HQData.RecvMinuteRealtimeData(interpreter.globalScope.data.__kminute__, data, callback, obj); }, error:(request)=> { //self.RecvError(request,RECV_DATA_TYPE.DERIVATIVE_DATA); } }); } HQData.RecvMinuteRealtimeData=function(recvData, data, callback, obj) { var hqChartData={code:0, data:[], ver:2.0}; //更新数据使用2.0版本格式 hqChartData.symbol=obj.Symbol; hqChartData.name=obj.Symbol; var yClose=null; for(var i in recvData) { var item=recvData[i]; var day = new Date(item.day); var date=day.getFullYear()*10000+(day.getMonth()+1)*100+day.getDate(); var time=day.getHours()*100+day.getMinutes(); var newItem=[ date,yClose, parseFloat(item.open), parseFloat(item.high), parseFloat(item.low), parseFloat(item.close), parseFloat(item.volume), null, time]; hqChartData.data.push(newItem); yClose=parseFloat(item.close); } if (data.Self.IsDestroy==false) { // #ifdef H5 callback(hqChartData); // #endif // #ifndef H5 callback({data:hqChartData}); // #endif } } //流通股本 HQData.RequestFlowCapitalData=function(data,callback) { data.PreventDefault=true; var hqChartData={code:0, stock:[]}; //如果没有数据就填空 if (data.Self.IsDestroy==false) { // #ifdef H5 callback(hqChartData); // #endif // #ifndef H5 callback({data:hqChartData}); // #endif } } //走势图 HQData.RequestMinuteData=function(data, callback) { data.PreventDefault=true; var symbol=data.Request.Data.symbol[0]; //请求的股票代码 console.log(`[HQData::RequestMinuteData] Symbol=${symbol}`); var obj=HQData.GetMinuteApiUrl(symbol,1); uni.request( { url: obj.Url, type: "GET", //dataType: "json", success:(recvData)=> { interpreter.evaluate(recvData.data); interpreter.evaluate(`var __minute__=min_data_${obj.InternalSymbol}`); HQData.RecvMinuteData(interpreter.globalScope.data.__minute__, data, callback, obj); }, error:(request)=> { //self.RecvError(request,RECV_DATA_TYPE.DERIVATIVE_DATA); } }); } HQData.RecvMinuteData=function(recvData, data, callback, obj) { var stockData=recvData.data[obj.InternalSymbol]; var qt=stockData.qt; var mintue=stockData.data; var dayData=qt[obj.InternalSymbol]; var yClose=parseFloat(dayData[4]); //昨收盘 var date=parseInt(mintue.date); var aryMinute=[]; var perVol=0; var totalAmount=0; for(var i in mintue.data) { var item=mintue.data[i]; var aryData=item.split(" "); var price=parseFloat(aryData[1]); var vol=parseFloat(aryData[2]); var stockItem= { time:parseInt(aryData[0]), price:price, open:price, high:price, low:price, amount:null, vol:vol-perVol, //avprice:item.avg_price, } totalAmount+=(stockItem.vol*stockItem.price); stockItem.avprice=totalAmount/vol; //均价 总金额/总量 perVol=vol; aryMinute.push(stockItem); } var hqchartData={stock:[{ name:obj.Symbol, symbol:obj.Symbol,date:date,yclose:yClose, minute:aryMinute }], code:0 }; if (data.Self.IsDestroy==false) { // #ifdef H5 callback(hqchartData); // #endif // #ifndef H5 callback({data:hqchartData}); // #endif } } //5日走势图 HQData.RequestMinuteDaysData=function(data,callback) { data.PreventDefault=true; var symbol=data.Request.Data.symbol; //请求的股票代码 console.log(`[HQData.RequestMinuteDaysData] Symbol=${symbol}`); var obj=HQData.GetMinuteApiUrl(symbol,5); uni.request( { url: obj.Url, type: "GET", //dataType: "json", success:(recvData)=> { interpreter.evaluate(recvData.data); interpreter.evaluate(`var __fdays_minute__=fdays_data_${obj.InternalSymbol}`); HQData.RecvMinuteDaysData(interpreter.globalScope.data.__fdays_minute__, data, callback, obj); }, error:(request)=> { //self.RecvError(request,RECV_DATA_TYPE.DERIVATIVE_DATA); } }); } HQData.RecvMinuteDaysData=function(recvData, data, callback, obj) { var stockData=recvData.data[obj.InternalSymbol]; var qt=stockData.qt; var mintue=stockData.data; var dayData=qt[obj.InternalSymbol]; var aryDayData=[]; for(var i in stockData.data) { var dayMinute=stockData.data[i]; var date=parseInt(dayMinute.date); var itemDay={ minute:[], date:date, yclose: parseFloat(dayMinute.prec) }; var totalAmount=0, perVol=0; for(var j in dayMinute.data) { var item=dayMinute.data[j]; var aryData=item.split(" "); var price=parseFloat(aryData[1]); var vol=parseFloat(aryData[2]); var stockItem=[parseInt(aryData[0]), price,price,price,price,vol-perVol,null]; totalAmount+=(stockItem[5]*price); stockItem[7]=totalAmount/vol; //均价 总金额/总量 perVol=vol; itemDay.minute.push(stockItem); } aryDayData.push(itemDay); } var hqchartData={ symbol:obj.Symbol, name:obj.Symbol, data:aryDayData, code:0 }; if (data.Self.IsDestroy==false) { // #ifdef H5 callback(hqchartData); // #endif // #ifndef H5 callback({data:hqchartData}); // #endif } } HQData.CreateSHSZData=function(minuteStringData) { const TIME_SPLIT = [ { Start: 930, End: 1130 }, { Start: 1300, End: 1500 } ]; return minuteStringData.CreateTimeData(TIME_SPLIT); } HQData.GetSHSZData=function(upperSymbol,width) { const SHZE_MINUTE_X_COORDINATE = { Full: //完整模式 [ [0, 0, "rgb(200,200,200)", "09:30"], [31, 0, "RGB(200,200,200)", "10:00"], [61, 0, "RGB(200,200,200)", "10:30"], [91, 0, "RGB(200,200,200)", "11:00"], [120, 1, "RGB(200,200,200)", "13:00"], [150, 0, "RGB(200,200,200)", "13:30"], [180, 0, "RGB(200,200,200)", "14:00"], [210, 0, "RGB(200,200,200)", "14:30"], [240, 1, "RGB(200,200,200)", "15:00"], // 15:00 ], Simple: //简洁模式 [ [0, 0, "rgb(200,200,200)", "09:30"], [61, 0, "RGB(200,200,200)", "10:30"], [120, 1, "RGB(200,200,200)", "13:00"], [180, 0, "RGB(200,200,200)", "14:00"], [240, 1, "RGB(200,200,200)", "15:00"] ], Min: //最小模式 [ [0, 0, "rgb(200,200,200)", "09:30"], [120, 1, "RGB(200,200,200)", "13:00"], [240, 1, "RGB(200,200,200)", "15:00"] ], Count: 242, //!! 一共的分钟数据个数,不要填错了 MiddleCount: 121, // Count/2 就可以。 GetData: function (width) { if (width < 200) return this.Min; else if (width < 400) return this.Simple; return this.Full; } }; return SHZE_MINUTE_X_COORDINATE; } HQData.RequestHistoryData=function(data,callback) { data.PreventDefault=true; var symbol=data.Request.Data.symbol; //请求的股票代码 var period=data.Self.Period; //周期ID var right=data.Self.Right; var count=320; console.log(`[HQData::RequestHistoryData] Symbol=${symbol}, period=${period}, right=${right}`); var obj=HQData.GetKDayApiUrl(symbol,period,right,count); uni.request( { url: obj.Url, type: "GET", //dataType: "json", success:(recvData)=> { var code="var "+recvData.data; interpreter.evaluate(code); interpreter.evaluate("var __kday__=kline_data;") HQData.RecvHistoryData(interpreter.globalScope.data.__kday__, data, callback, obj); }, error:(request)=> { //self.RecvError(request,RECV_DATA_TYPE.DERIVATIVE_DATA); } }); } HQData.RecvHistoryData=function(recvData, data, callback, obj) { if (!recvData) return; var stockData=recvData.data[obj.InternalSymbol]; var kLineName=`${obj.FuQuan}${obj.PeriodName}`; var jsKline=stockData[kLineName]; var hqChartData={code:0, data:[]}; hqChartData.symbol=obj.Symbol; hqChartData.name=obj.Symbol; var yClose=parseFloat(stockData.prec); for(var i in jsKline) { var item=jsKline[i]; var aryDate = item[0].split('-') var date=parseInt(aryDate[0])*10000+parseInt(aryDate[1])*100+parseInt(aryDate[2]); var open=parseFloat(item[1]); var close=parseFloat(item[2]); var high=parseFloat(item[3]); var low=parseFloat(item[4]); var vol=parseFloat(item[5]); var newItem=[ date,yClose, open, high, low, close, vol, null]; hqChartData.data.push(newItem); yClose=close; } if (data.Self.IsDestroy==false) { // #ifdef H5 callback(hqChartData); // #endif // #ifndef H5 callback({data:hqChartData}); // #endif } } HQData.RequestRealtimeData=function(data,callback) { data.PreventDefault=true; var symbol=data.Request.Data.symbol[0]; //请求的股票代码 var period=data.Self.Period; //周期ID var right=data.Self.Right; var count=3; console.log(`[HQData::RequestRealtimeData] Symbol=${symbol}, period=${period}, right=${period}`); var obj=HQData.GetKDayApiUrl(symbol,period,right,count); uni.request( { url: obj.Url, type: "GET", //dataType: "json", success:(recvData)=> { interpreter.evaluate("var "+recvData.data); interpreter.evaluate("var __kday__=kline_data;") HQData.RecvRealtimeData(interpreter.globalScope.data.__kday__, data, callback, obj); }, error:(request)=> { //self.RecvError(request,RECV_DATA_TYPE.DERIVATIVE_DATA); } }); } HQData.RecvRealtimeData=function(recvData, data, callback, obj) { if (!recvData) return; var stockData=recvData.data[obj.InternalSymbol]; var kLineName=`${obj.FuQuan}${obj.PeriodName}`; var jsKline=stockData[kLineName]; var stock={name:obj.Symbol, symbol:obj.Symbol }; var yClose=parseFloat(stockData.prec); for(var i in jsKline) { var item=jsKline[i]; var aryDate = item[0].split('-') var date=parseInt(aryDate[0])*10000+parseInt(aryDate[1])*100+parseInt(aryDate[2]); var open=parseFloat(item[1]); var close=parseFloat(item[2]); var high=parseFloat(item[3]); var low=parseFloat(item[4]); var vol=parseFloat(item[5]); stock.yclose=yClose; stock.open=open; stock.high=high; stock.low=low; stock.price=close; stock.vol=vol; stock.date=date; yClose=close; } var hqChartData={code:0, stock:[stock] }; if (data.Self.IsDestroy==false) { // #ifdef H5 callback(hqChartData); // #endif // #ifndef H5 callback({data:hqChartData}); // #endif } } module.exports = { HQData:HQData }