什么网站上可以做简历,上海专业做网站的公司,泰州网站建设策划,濮阳网直播HQChart实战教程67-worker批量计算股票指标 什么是Worker批量指标计算示例地址步骤1. 创建一个后台工作线程类2. 发送指标计算任务3. 接收计算结果数据对接 完整源码demo_workerthread_sina.htmlhqchart_worker_sina.js HQChart插件源码地址 什么是Worker
Worker 接口是 Web W… HQChart实战教程67-worker批量计算股票指标 什么是Worker批量指标计算示例地址步骤1. 创建一个后台工作线程类2. 发送指标计算任务3. 接收计算结果数据对接 完整源码demo_workerthread_sina.htmlhqchart_worker_sina.js HQChart插件源码地址 什么是Worker
Worker 接口是 Web Workers API 的一部分指的是一种可由脚本创建的后台任务任务执行中可以向其创建者收发信息。
批量指标计算
通过把指标计算迁移到后台线程中可以提高效率可以开N个后台线程平行计算也不会卡主线程。HQChart通达信指标计算引擎是一个独立的计算模块通过在后台线程中独立调用计算模块就可以达到批量计算指标
示例地址 https://jones2000.github.io/HQChart/webhqchart.demo/samples/demo_workerthread_sina.html 注意K线数据是网上找的不支持跨域调试的时候需要给浏览器安装一个跨域插件就可以用 可以参看教程解决Chrome本地调试跨域.
步骤
1. 创建一个后台工作线程类
hqchart内置一个后台指标计算的工作线程类HQChartScriptWorker 可以直接派生这个类 然后把数据对接上就可以了。 其他的基类都封装好了。 HQChartScriptWorker源码地址:https://github.com/jones2000/HQChart/blob/master/webhqchart/umychart.worker.js
2. 发送指标计算任务
通过系统api接口postMessage可以发送数据给工作线程
function RunIndexScript(symbol, index, jobID)
{var message{ID:JSCHART_WORKER_MESSAGE_ID.EXECUTE_SCRIPT, //任务类型固定值AryIndex: //需要执行的指标名称或指标脚本[{Index:index},//{Index:MACD},//{Index:TEST, Name:测试脚本, Script:T:MA((LH)/2,10)}],Symbol:symbol, //股票代码Name:symbol, //股票名称Period:5, //5分钟K线Right:0, //复权HQDataType:HQ_DATA_TYPE.KLINE_ID, //K线指标固定值)Guid:jobID,IsApiPeriodtrue, //后台计算周期};g_HQWorker.postMessage(message);}3. 接收计算结果
绑定onmessage的回调就可以
var g_HQWorkernew Worker(hqchart_worker_sina.js);
g_HQWorker.onmessage(e){ OnRecvWorkerMessage(e); }function OnRecvWorkerMessage(e)
{if (e.data.IDJSCHART_WORKER_MESSAGE_ID.FINISH_EXECUTE_SCRIPT) //指标计算完成{console.log([OnRecvWorkerMessage] data, e.data);}
}数据结构
{Data指标数据 { Date:日期 Time时间, Out:指标输出变量, Stock:股票信息, Index:指标名称 }IndexInfo: 指标信息JobInfo: 发送指标命令的内容
}注意 返回的指标结果数据是一个数组
数据对接
和前端图形一样通过NetworkFilter对接数据
function JSSampleScriptWorker()
{this.newMethodHQChartScriptWorker; //派生this.newMethod();delete this.newMethod;this.NetworkFilterfunction(data, callback, indexInfo, message){//数据对接console.log([JSSampleScriptWorker::NetworkFilter] [${data.Name}][${data.Explain}] data, data);if (data.NameJSSymbolData::GetSymbolData){}
............}
完整源码
demo_workerthread_sina.html
!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
html xmlnshttp://www.w3.org/1999/xhtml
head
meta nameviewport contentwidthdevice-width, initial-scale1.0, minimum-scale1.0, maximum-scale1.0, user-scalableno /
meta http-equivContent-Type contenttext/html; charsetutf-8 / title工作线程计算/title /head
bodydiv idrange_title5分钟周期指标计算/divbr/divdiv classtable_rowspan classitem_symbol600000.sh/spanspan classitem_indexnameMA/spandiv iditem_result_1计算结果/div/divdiv classtable_rowspan classitem_symbol605166.sh/spanspan classitem_indexnameRSI/spandiv iditem_result_2计算结果/div/divdiv classtable_rowspan classitem_symbol601169.sh/spanspan classitem_indexnameMACD/spandiv iditem_result_3计算结果/div/div/divbr/divspan idbutton_1 classbtn-style开始计算/span/divscript src../jscommon/umychart.resource/js/jquery.min.js/scriptscript src../jscommon/umychart.console.js/script !-- 日志输出 --script src../jscommon/umychart.network.js/script !-- 网络请求分装 --script src../jscommon/umychart.js/script !-- K线图形 --script src../jscommon/umychart.complier.js/script !-- 麦语言解析执行器 --script src../jscommon/umychart.index.data.js/script !-- 基础指标库 --script src../jscommon/umychart.style.js/script !-- 白色风格和黑色风格配置信息 --scriptvar g_HQWorkernew Worker(hqchart_worker_sina.js);g_HQWorker.onmessage(e){ OnRecvWorkerMessage(e); }var jobCount1;var job_list[{ Symbol:sh600000.sh, Index:MA, OutDomID:item_result_1 },{ Symbol:sh605166.sh, Index:RSI, OutDomID:item_result_2 },{ Symbol:sh601169.sh, Index:MACD, OutDomID:item_result_3 },];function OnRecvWorkerMessage(e){if (e.data.IDJSCHART_WORKER_MESSAGE_ID.FINISH_EXECUTE_SCRIPT){console.log([OnRecvWorkerMessage] data, e.data);var jobIDe.data.JobInfo.Guid;var aryDatee.data.Data.Date;var aryTimee.data.Data.Time;var indexaryTime.length-10; //输出最后条记录var aryResult[];var outText;for(var iindex;iaryTime.length;i){var datearyDate[i];var timearyTime[i];var textDate${date}, Time:${time} ;for(var j0;je.data.Data.Out.length;j){var namee.data.Data.Out[j].Name;var valuee.data.Data.Out[j].Data[i];text${name}${value.toFixed(4)}, ;}aryResult.push(text);outTexttext;outTextbr;}var domIDnull;for(var i0;ijob_list.length;i){var itemjob_list[i];if (item.JobIDjobID){domIDitem.OutDomID;break;}}if (!domID) return;$(#domID)[0].innerHTMLoutText;}}function RunIndexScript(symbol, index, jobID){var message{ID:JSCHART_WORKER_MESSAGE_ID.EXECUTE_SCRIPT,AryIndex:[{Index:index},//{Index:MACD},//{Index:TEST, Name:测试脚本, Script:T:MA((LH)/2,10)}],Symbol:symbol,Name:symbol,Period:5, //5分钟K线Right:0,HQDataType:HQ_DATA_TYPE.KLINE_ID,Guid:jobID,IsApiPeriod:true,};g_HQWorker.postMessage(message);}function RunAll(){for(var i0;ijob_list.length;i){var itemjob_list[i];item.JobIDjobCount;RunIndexScript(item.Symbol, item.Index, item.JobID);}}$(function () {$(#button_1).click(function() { RunAll(); } );})/script
/body
/htmlstyle.btn-style
{padding: 3px 8px;border: 1px solid #ececec;border-radius: 5px;background-color: #f5f5f5;cursor: pointer;
}.item_symbol
{display:block;line-height: 50px;width:100px;align-items: center;
}.item_indexname
{display:block;line-height: 50px;width:100px;align-items: center;
}.table_row
{display: flex; height: 200px;border-style:solid;border-width:1px;border-color:#BEBEBE;
}/stylehqchart_worker_sina.js
/
// 工作线程
//
//
importScripts(../jscommon/umychart.complier.js,../jscommon/umychart.js, ../jscommon/umychart.index.data.js,../jscommon/umychart.worker.js);JSConsole.Complier.Log(){ }function JSSampleScriptWorker()
{this.newMethodHQChartScriptWorker; //派生this.newMethod();delete this.newMethod;this.NetworkFilterfunction(data, callback, indexInfo, message){//数据对接console.log([JSSampleScriptWorker::NetworkFilter] [${data.Name}][${data.Explain}] data, data);if (data.NameJSSymbolData::GetSymbolData){var requestDatadata.Request.Data;if (requestData.period5) //5分钟K线{var symbolrequestData.symbol;symbolsymbol.replace(.sh,);//http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbolsz000001scale5ma5datalen1023var urlhttps://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol${symbol}scale5ma5datalen1023;console.log([JSSampleScriptWorker::NetworkFilter] url${url});var responsethis.HttpRequest(url);if (response.response){var recvJSON.parse(response.response);this.RecvHistoryMinuteData(recv, callback, data);}}}}this.RecvHistoryMinuteDatafunction(recv, callback, data){var hqChartData{code:0, data:[] };hqChartData.symbolhqChartData.namedata.Request.Data.symbol;var yClosenull;for(var i0;irecv.length;i){var itemrecv[i];var dateTimenew Date(item.day);var datedateTime.getFullYear()*10000(dateTime.getMonth()1)*100dateTime.getDate();var timedateTime.getHours()*100dateTime.getMinutes();var closeparseFloat(item.close);var highparseFloat(item.high);var lowparseFloat(item.low);var openparseFloat(item.open);var volparseFloat(item.volume);var amountnull;if (closenull) continue;var newItem[ date, yClose, open, high, low, close, vol, amount, time];hqChartData.data.push(newItem);yCloseclose;}console.log([JSSampleScriptWorker::RecvHistoryMinuteData] hqchartData , hqChartData)callback(hqChartData);}this.HttpRequestfunction(url){var req new XMLHttpRequest();req.open(GET, url, false);req.onerror(e){ console.log(e);}req.send();return req;}
}var g_ScriptWorkernew JSSampleScriptWorker();g_ScriptWorker.Create();HQChart插件源码地址
https://github.com/jones2000/HQChart