当前位置: 首页 > news >正文

HQChart实战教程67-worker批量计算股票指标

HQChart实战教程67-worker批量计算股票指标

  • 什么是Worker
  • 批量指标计算
  • 示例地址
  • 步骤
    • 1. 创建一个后台工作线程类
    • 2. 发送指标计算任务
    • 3. 接收计算结果
    • 数据对接
  • 完整源码
    • demo_workerthread_sina.html
    • hqchart_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((L+H)/2,10)'}],Symbol:symbol,	//股票代码Name:symbol,		//股票名称Period:5,   //5分钟K线Right:0,   //复权HQDataType:HQ_DATA_TYPE.KLINE_ID, //K线指标(固定值)Guid:jobID,IsApiPeriod:true, //后台计算周期};g_HQWorker.postMessage(message);}

3. 接收计算结果

绑定onmessage的回调,就可以

var g_HQWorker=new Worker("hqchart_worker_sina.js");
g_HQWorker.onmessage=(e)=>{ OnRecvWorkerMessage(e); }function OnRecvWorkerMessage(e)
{if (e.data.ID==JSCHART_WORKER_MESSAGE_ID.FINISH_EXECUTE_SCRIPT)  //指标计算完成{console.log("[OnRecvWorkerMessage] data=", e.data);}
}

数据结构
在这里插入图片描述

{Data:指标数据 { Date:日期, Time:时间,  Out:指标输出变量, Stock:股票信息,  Index:指标名称 }IndexInfo: 指标信息JobInfo: 发送指标命令的内容
}

注意: 返回的指标结果数据是一个数组

数据对接

和前端图形一样,通过NetworkFilter对接数据

function JSSampleScriptWorker()
{this.newMethod=HQChartScriptWorker;   //派生this.newMethod();delete this.newMethod;this.NetworkFilter=function(data, callback, indexInfo, message){//数据对接console.log(`[JSSampleScriptWorker::NetworkFilter] [${data.Name}][${data.Explain}] data=`, data);if (data.Name=="JSSymbolData::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 xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <title>工作线程计算</title>  </head>  
<body><div id="range_title">5分钟周期指标计算</div><br/><div><div class="table_row"><span class="item_symbol">600000.sh</span><span class="item_indexname">MA</span><div id="item_result_1">计算结果</div></div><div class="table_row"><span class="item_symbol">605166.sh</span><span class="item_indexname">RSI</span><div id="item_result_2">计算结果</div></div><div class="table_row"><span class="item_symbol">601169.sh</span><span class="item_indexname">MACD</span><div id="item_result_3">计算结果</div></div></div><br/><div><span id="button_1" class="btn-style">开始计算</span></div><script src="../jscommon/umychart.resource/js/jquery.min.js"></script><script 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>       <!-- 白色风格和黑色风格配置信息 --><script>var g_HQWorker=new Worker("hqchart_worker_sina.js");g_HQWorker.onmessage=(e)=>{ OnRecvWorkerMessage(e); }var jobCount=1;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.ID==JSCHART_WORKER_MESSAGE_ID.FINISH_EXECUTE_SCRIPT){console.log("[OnRecvWorkerMessage] data=", e.data);var jobID=e.data.JobInfo.Guid;var aryDate=e.data.Data.Date;var aryTime=e.data.Data.Time;var index=aryTime.length-10; //输出最后条记录var aryResult=[];var outText="";for(var i=index;i<aryTime.length;++i){var date=aryDate[i];var time=aryTime[i];var text=`Date=${date}, Time:${time} `;for(var j=0;j<e.data.Data.Out.length;++j){var name=e.data.Data.Out[j].Name;var value=e.data.Data.Out[j].Data[i];text+=`${name}=${value.toFixed(4)}, `;}aryResult.push(text);outText+=text;outText+='<br>';}var domID=null;for(var i=0;i<job_list.length;++i){var item=job_list[i];if (item.JobID==jobID){domID=item.OutDomID;break;}}if (!domID) return;$("#"+domID)[0].innerHTML=outText;}}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((L+H)/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 i=0;i<job_list.length;++i){var item=job_list[i];item.JobID=++jobCount;RunIndexScript(item.Symbol, item.Index, item.JobID);}}$(function () {$("#button_1").click(function() { RunAll(); } );})</script>  
</body>  
</html><style>.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;
}</style>

hqchart_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.newMethod=HQChartScriptWorker;   //派生this.newMethod();delete this.newMethod;this.NetworkFilter=function(data, callback, indexInfo, message){//数据对接console.log(`[JSSampleScriptWorker::NetworkFilter] [${data.Name}][${data.Explain}] data=`, data);if (data.Name=="JSSymbolData::GetSymbolData"){var requestData=data.Request.Data;if (requestData.period==5)    //5分钟K线{var symbol=requestData.symbol;symbol=symbol.replace(".sh","");//http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=sz000001&scale=5&ma=5&datalen=1023var url=`https://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=${symbol}&scale=5&ma=5&datalen=1023`;console.log(`[JSSampleScriptWorker::NetworkFilter] url=${url}`);var response=this.HttpRequest(url);if (response.response){var recv=JSON.parse(response.response);this.RecvHistoryMinuteData(recv, callback, data);}}}}this.RecvHistoryMinuteData=function(recv, callback, data){var hqChartData={code:0, data:[] };hqChartData.symbol=hqChartData.name=data.Request.Data.symbol;var yClose=null;for(var i=0;i<recv.length;++i){var item=recv[i];var dateTime=new Date(item.day);var date=dateTime.getFullYear()*10000+(dateTime.getMonth()+1)*100+dateTime.getDate();var time=dateTime.getHours()*100+dateTime.getMinutes();var close=parseFloat(item.close);var high=parseFloat(item.high);var low=parseFloat(item.low);var open=parseFloat(item.open);var vol=parseFloat(item.volume);var amount=null;if (close==null) continue;var newItem=[ date, yClose, open, high, low, close, vol, amount, time];hqChartData.data.push(newItem);yClose=close;}console.log("[JSSampleScriptWorker::RecvHistoryMinuteData] hqchartData ", hqChartData)callback(hqChartData);}this.HttpRequest=function(url){var req = new XMLHttpRequest();req.open('GET', url, false);req.onerror=(e)=>{ console.log(e);}req.send();return req;}
}var g_ScriptWorker=new JSSampleScriptWorker();g_ScriptWorker.Create();

HQChart插件源码地址

https://github.com/jones2000/HQChart

相关文章:

HQChart实战教程67-worker批量计算股票指标

HQChart实战教程67-worker批量计算股票指标 什么是Worker批量指标计算示例地址步骤1. 创建一个后台工作线程类2. 发送指标计算任务3. 接收计算结果数据对接 完整源码demo_workerthread_sina.htmlhqchart_worker_sina.js HQChart插件源码地址 什么是Worker Worker 接口是 Web W…...

博客系统自动化测试项目实践

文章目录 一.测试需求分析1.功能分析2.非功能分析 二.制定测试方案&#xff08;计划 策略&#xff09;三.编写测试用例四.执行自动化测试用例五.编写测试报告六.项目总结 一.测试需求分析 1.功能分析 通过功能测试需求分析 2.非功能分析 非功能分析主要从:界面,性能,安全性,…...

软考高级之系统架构师系列之操作系统基础

概念 接口 操作系统为用户提供两类接口&#xff1a;操作一级的接口和程序控制一级的接口。操作一级的接口包括操作控制命令、菜单命令等&#xff1b;程序控制一级的接口包括系统调用。 UMA和NUMA UMA&#xff0c;统一内存访问&#xff0c;Uniform Memory Access&#xff0c…...

制作一个可以arm架构下运行的docker镜像(for Python)

看完本篇文章&#xff0c;你将得到一个可以arm架构下运行的python 基础镜像。 题外话 这里直接说docker镜像有点儿草率&#xff0c;因为目前很多容器都是Podman了。 podman的介绍 arm和aarch傻傻分不清楚 现在这两个是一样的意思了。 arm64和aarch64之间的区别 开始制作镜…...

Goland连接服务器/虚拟机远程编译开发

创建SSH连接 SSH用于与远程服务器建立连接 Settings -> Tools -> SSH Configurations 添加新的ssh连接&#xff0c;Host为ip地址&#xff0c;Username为用户名&#xff0c;认证方式这里选择密码验证 全部填完后可以点击Test Connection测试连接是否成功 创建Deployment…...

大数据Doris(十四):Doris表中的数据基本概念

文章目录 Doris表中的数据基本概念 一、​​​​​​​Row & Column...

【Linux】Linux环境配置以及部署项目后端

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Linux的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Linux环境配置 1.JDK ①上传安装包到…...

RabbitMQ消费者的可靠性

目录 一、消费者确认 二、失败重试机制 2.1、失败处理策略 三、业务幂等性 3.1、唯一消息ID 3.2、业务判断 3.3、兜底方案 一、消费者确认 RabbitMQ提供了消费者确认机制&#xff08;Consumer Acknowledgement&#xff09;。即&#xff1a;当消费者处理消息结束后&#x…...

云计算助力史上首届“云上亚运”圆满成功!

201金&#xff0c;魔幻的BGM&#xff0c;以及崛起的中国科技&#xff0c;让杭州亚运会成功出圈。 很多网友表示太震撼了&#xff01;开幕式很漂亮&#xff0c;杭州为了奥运造新城真豪横&#xff0c;看完一整个文化自信住&#xff01; 赛场内外除了无数个令人感动的瞬间&#…...

博彦科技:以金融为起点,凭借创新技术平台真打实干

【科技明说 &#xff5c; 重磅专题】 成立于1995年的博彦科技&#xff0c;已有28年左右的发展历程。 我没有想到&#xff0c;博彦科技也对AIGC领域情有独钟。博彦科技自研的数字人产品SaaS平台&#xff0c;可以接入包括百度文心一言、阿里通义千问等AI大模型产品。可见&#…...

NLP实践——中文指代消解方案

NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务&#xff0c;有很多开源的项目和工具可以借鉴&#xff0c;比如spacy的基础模…...

【Redis】认识Redis-特点特性应用场景对比MySQL重要文件及作用

文章目录 认识redisredis的主要特点redis的特性&#xff08;优点&#xff09;redis是单线程模型&#xff0c;为什么效率这么高&#xff0c;访问速度这么快redis应用场景redis不可以做什么MySQL和Redis对比启动RedisRedis客户端Redis重要文件及作用 认识redis redis里面相关的小…...

goland setup go env

go env -w设置的变量&#xff0c;在goland中不生效&#xff0c;需要额外配置。 点击goland->preference&#xff0c;在go module里&#xff0c;设置go环境变量即可。...

如何打造一支敏捷测试团队

文章目录 摘要01 从测试角度理解敏捷理念什么是敏捷&#xff1f;测试人员应该怎样理解敏捷理念&#xff1f;敏捷宣言对于测试活动的启发与思考总结如下。敏捷原则12条敏捷实践框架为什么要做敏捷 02 什么是敏捷测试03 敏捷测试为什么会失败04 诊断脑暴会的成果示例敏捷测试原则…...

STM32F40EZT6 PWM可控制电压原理

PWM可控制电压原理 主要通过PWM 输入模式根据控制单位时间内输出的平均电压&#xff0c;以调节电压大小。而PWM输出模式通过调节占空比&#xff0c;控制平均电压大小&#xff1b; 设置TIM为PWM输出模式 第一步&#xff1a;时钟使能&#xff1a; GPIO&#xff0c;TIM; 第二步&a…...

信号灯集,消息队列

信号灯集 1、概念 信号灯(semaphore)&#xff0c;也叫信号量。它是不同进程间或一个给定进程内部不同线程间同步的机制&#xff1b;System V的信号灯是一个或者多个信号灯的一个集合。其中的每一个都是单独的计数信号灯。而Posix信号灯指的是单个计数信号灯。 通过信号灯集实现…...

我在Vscode学OpenCV 初步接触

OpenCV是一个开源的计算机视觉库&#xff0c;可以处理图像和视频数据。它包含了超过2500个优化过的算法&#xff0c;用于对图像和视频进行处理&#xff0c;包括目标识别、面部识别、运动跟踪、立体视觉等。OpenCV支持多种编程语言&#xff0c;包括C、Python、Java等&#xff0c…...

[threejs]让导入的gltf模型显示边框

边框1效果图如下&#xff1a; 代码如下&#xff1a; const gltfLoader1 new GLTFLoader();gltfLoader1.load( "/assets/box/1/scene.gltf" ,function(gltf){let model gltf.scene;model.scale.set(3,3,3)// scene1.add(model);// renderer1.render(scene1, camera…...

YOLOv5优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(SC_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 目录 1. SC_C_Detect介绍 2. SC_C_Detect加入YOLOv5 2.1 新建models/head_improve.py...

作物模型--土壤数据制备过程

作物模型–土壤数据制备过程 首先打开FAO网站 下载下面这两个 Arcgis打开.bil文件 .mdb文件在access中转成.xls格式 Arcgis中对.bil文件定义投影...

基于ESP8266与RGBDigit的Wi-Fi网络时钟:硬件设计、物联网集成与DIY实践

1. 项目概述&#xff1a;一个能感知环境的网络时钟如果你和我一样&#xff0c;对复古又带点科技感的显示设备没有抵抗力&#xff0c;同时又是个喜欢动手折腾的极客&#xff0c;那么这个项目绝对能让你在工作室或家里多一个既实用又炫酷的玩意儿。我说的就是这款基于RGBDigit数码…...

Unity开发者速查手册:Sora 2模型权重量化适配指南(INT8精度损失<0.3%,已验证于RTX 4090/Apple M3 Ultra)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Sora 2与Unity整合概述 Sora 2 是 OpenAI 推出的下一代视频生成模型&#xff0c;具备高保真时序建模与物理感知能力&#xff1b;而 Unity 作为主流实时3D开发引擎&#xff0c;广泛用于游戏、仿真与数字孪生场…...

【Sora 2 HDR生成黄金公式】:曝光补偿系数×动态范围压缩阈值×时域一致性权重=可商用HDR帧率(附Python验证脚本)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Sora 2 HDR视频生成黄金公式的提出与商业意义 Sora 2 的HDR视频生成能力不再依赖传统多曝光融合或后期调色管线&#xff0c;而是通过一个端到端可微分的物理感知渲染公式实现原生高动态范围建模。该公式被业界…...

麒麟桌面CVE-2024-1086漏洞深度修复指南

1. 这个漏洞不是“修个补丁就完事”&#xff1a;麒麟桌面系统CVE-2024-1086的真实威胁图谱你可能刚在安全通告里看到“麒麟桌面系统修复CVE-2024-1086”&#xff0c;顺手点了个更新&#xff0c;心里想着“又一个内核提权漏洞&#xff0c;打上补丁不就完了&#xff1f;”——我去…...

UE5 UMG界面开发避坑指南:WidgetComponent的ZOrder和图层管理到底怎么用?

UE5 UMG界面开发避坑指南&#xff1a;WidgetComponent的ZOrder和图层管理实战解析在虚幻引擎5的UMG界面开发中&#xff0c;WidgetComponent的渲染层级管理是一个看似简单却暗藏玄机的技术点。许多开发者在处理复杂UI系统时&#xff0c;常常会遇到控件遮挡混乱、图层顺序失控的问…...

Unity VFX Graph实战:从Compute Shader依赖看GPU粒子特效的性能与平台适配(以HDRP项目为例)

Unity VFX Graph深度解析&#xff1a;GPU粒子特效的性能优化与跨平台实战指南在游戏开发领域&#xff0c;粒子特效一直是营造沉浸感的关键要素。当传统CPU驱动的粒子系统遇到性能瓶颈时&#xff0c;Unity的Visual Effect Graph&#xff08;VFX Graph&#xff09;凭借其GPU加速能…...

量子计算中的随机基准测试与Grover算法实现

1. 量子计算中的随机基准测试原理与应用随机基准测试(Randomized Benchmarking, RB)是量子计算领域评估量子门操作保真度的黄金标准方法。与传统直接测量单个量子门误差不同&#xff0c;RB通过随机量子门序列的统计特性来提取平均门保真度&#xff0c;这种方法对状态制备和测量…...

剖析爆炸事故失联成因,UWB穿戴模式隐患重重,无感定位筑牢矿山透明化空间管理根基

剖析爆炸事故失联成因&#xff0c;UWB穿戴模式隐患重重&#xff0c;无感定位筑牢矿山透明化空间管理根基一、爆炸事故深度溯源&#xff1a;井下人员大面积失联核心诱因矿山瓦斯爆炸突发灾害&#xff0c;瞬间伴随剧烈冲击、粉尘弥漫、巷道形变、线路损毁与人员紧急避险疏散&…...

崩坏星穹铁道自动化终极指南:3分钟学会解放双手的游戏助手

崩坏星穹铁道自动化终极指南&#xff1a;3分钟学会解放双手的游戏助手 【免费下载链接】StarRailAssistant 崩坏&#xff1a;星穹铁道自动化 | 崩坏&#xff1a;星穹铁道自动锄大地 | 崩坏&#xff1a;星穹铁道锄大地 | 自动锄大地 | 基于模拟按键 项目地址: https://gitcode…...

Unity场景交互动画工程化实践:触发、动画、物理与渲染四层协同

1. 这不是“加个动画”那么简单&#xff1a;为什么90%的Unity场景交互动画最终显得廉价又生硬&#xff1f; “用 Unity 打造超酷场景交互动画”——这句话在B站、知乎和独立游戏开发群里的出现频率&#xff0c;大概和“三分钟学会Python”差不多。但真正跑完一个完整流程、让玩…...