123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693 |
- /*
- 第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
- }
|