基于HQChart的后台单股票指标计算服务
应用场景
最近在提供数据api的时候,有客户提出需要k线指标, 如MA ,RSI 等,我给出的方案是前端本地计算。但这样会影响整个产品的开发进度,加重前端的开发量。于是我打算把HQChart部署在nodejs后台, 直接计算指标结果返回前端
改造HQChart
HQChart基本就是canvas裸写的,没用到什么开源的库,所以迁移比较简单, 唯一用的库的就网络请求使用了ajax, 在迁移到nodejs后台的发现后台无法使用ajax,于是就需要分装一个请求接口, 前端使用$.ajax, 后台使用request库
function JSNetwork()
{
}
JSNetwork.HttpReqeust=function(obj) //对请求进行封装(前端用)
{
$.ajax(
{
url: obj.url, data: obj.data,
type:obj.type, dataType: obj.dataType,async:obj.async,
success: obj.success,
error: obj.error,
}
);
}
// 后台不能用ajax, 改用request
//
///
const clientHttp = require('request');
JSNetwork.HttpReqeust=function(obj) //对请求进行封装(后台用)
{
var options =
{
url: obj.url,
method: obj.type,
body: obj.data,
json: true, // Use,If you are sending JSON data
}
clientHttp(options, function (err, res, recvData)
{
if (err)
{
if (obj.error) obj.error(null,res,err);
}
else
{
obj.success(recvData);
}
});
}
原来网络请求写的地方
$.ajax({
url: ......
});
替换成
JSNetwork.HttpReqeust({
url: ......
});
这样移植就完成了
后台请求出来类 (JSIndexController)
把指标计算请求处理单独分装成一个类 (jsindexcontroller.js)
使用restify建立一个apiweb服务
(hqchartapi.js)
var restify = require('restify');
var JSIndexController=require('./jsindexcontroller').JSIndexController;
var server = restify.createServer({name:'HQChart.testserver'});
server.use(restify.plugins.bodyParser()); //支持json post
server.use(restify.plugins.fullResponse()); //跨域
server.use(restify.plugins.gzipResponse()); //支持压缩
server.post('/api/jsindex',JSIndexController.Post);
server.get('/api', homepage);
function homepage(req, res, next)
{
res.send({message: 'homepage'});
}
server.listen(18080, function()
{
console.log('%s listening at %s', server.name, server.url);
});
用nodejs启动这个hqchartapi.js, 一个简单的api指标计算服务就完成了。
api 接口
// symbol:[] 股票列表
// code: 脚本
// args: 脚本参数 (可选)
// maxdatacount: 日线数据计算多少天 (可选)
// maxminutedaycount: 分钟数据计算多少天 (可选)
// period: 周期 0=日线 1=周线 2=月线 3=年线 4=1分钟 5=5分钟 6=15分钟 7=30分钟 8=60分钟 (可选)
// right: 复权 0 不复权 1 前复权 2 后复权(可选)
//
/* post 数据:
{
"symbol":"600000.sh",
"indexname":"MA",
"args":[{"name":"N1","value":10},{"name":"N2","value":12}],
"maxdatacount":200,
}
返回数据
{
"code":0, 0=成功 1=失败
"ticket":131, //执行时间
"outdata":
[
date:[],
time:[],
outvar:[{name:'ma1', data:[]}, .....]
stock: { name: , symbol:}
],
*/
制作docker镜像
后台程序完成, 剩下就是部署了, 可以直接在服务器上部署,也是使用docker部署。
创建Dockerfile
FROM node:10
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./
RUN npm install
# If you are building your code for production
# RUN npm ci --only=production
# Bundle app source
COPY . .
EXPOSE 18080
CMD [ "node", "hqchartapi.js" ]
开始build image,然后就是部署到docker上。
如果还有问题可以加交流QQ群: 950092318
HQChart代码地址
地址:https://github.com/jones2000/HQChart
indexapi 在 umychart_indexapi 目录里