有人说,控制仓位的水平,决定了你是一个炒股新手还是民间股神。这句话还真有几分道理。因为仓位管理是交易风险管理的基础,所以资产规模越大的交易员就越重视仓位的管理。
下面,我们花上15分钟,亲手使用Node.js和MongoDB来搭建一个Web服务,用来管理我们的投资仓位。这个服务需要为我们提供一个接口,用来查询和更新投资仓位记录。在数据库层面,我们选择MongoDB来存储所有的仓位记录。
基本架构
我们使用Node.js下的Express框架来搭建仓位管理服务。总体来看,整个服务包含了四个层面的组件:
- 数据库层面: MongoDB用来存储仓位记录
- 模型层面:实现JavaScript对象和数据之间的映射
- 控制器层面:提供仓位记录的增删改查操作逻辑
- 路由层面: 根据不同的客户请求来调用相应的逻辑
接下来,我们来看一看如何实现这四个层面的代码
连接到MongoDB数据库
我们使用Node.js下的mongoose来连接MongoDB数据库。
在简单的演示场景中,我们可以使用下面这样的URL来连接到单独运行的mongod进程:
mongodb://<user>:<pwd>@<host>:<port>/<database>
而在严肃的业务场景中,则可以使用这样的URL来连接到MongoDB复制集:
mongodb://<user>:<pwd>@<host1>:<port1>,<host2>:<port2>,<host3>:<port3>/<database>?replicaSet=<replset>
以下的代码就可以帮助我们连接到一个在本地docker容器上运行的mongod进程:
var mongoose = require('mongoose');
var mongoDB = 'mongodb://localhost:27017/demo';
mongoose.connect(mongoDB, {useNewUrlParser: true});
var db = mongoose.connection;
db.on('error', console.error.bind(console, 'MongoDB连接异常:'));
定义仓位记录对象与数据之间的映射
mongoose是一个对象数据模型库(ODM)。和关系型数据库所使用的对象关系映射库(ORM)类似,mongoose可以帮助我们简化开发代码,实现模型验证,并且降低应用代码和数据库方案之间的耦合度。
我们先来定义一下仓位记录对象所包含的信息:
- 交易账号
- 股票代码
- 交易数量
- 交易价格
实现这个仓位记录映射的代码非常直观:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var PositionSchema = new Schema({
account: {type: String, required: true},
stock: {type: String, required: true},
quantity: {type: Number, required: true},
price: {type: Number, required: true}
});
module.exports = mongoose.model('Position', PositionSchema);
在控制器层面实现仓位记录操作逻辑
接下来,我们终于可以使用mongoose库来实现数据操作了。
让我们来实现存储一条新增仓位记录的逻辑。
首先,我们可以使用客户请求中的POST数据来创建一个仓位记录对象,然后使用mongoose来将这个对象映射存储进数据库中:
var Position = require('../models/position');
// Create
exports.createPosition = function(req, res) {
var position = new Position(
{
account: req.body.account,
stock: req.body.stock,
quantity: req.body.quantity,
price: req.body.price
}
);
position.save(function (err) {
if (err) {
return next(err)
}
res.send('仓位记录添加成功')
})
};
不仅要存储新的仓位记录,我们还需要从数据库中查询之前保存过的仓位记录。
比如说,我们需要一个可以通过交易账户来查找该账户下所有的仓位记录的服务。我们使用mongoose库中的find()
函数来进行数据库查询:
// Read
exports.queryPosition = function(req, res) {
Position.find({account: req.params.account}, function(err, position) {
if (err) return next(err);
res.send(position);
})
};
这个find()
函数的查询语句参数看起来很眼熟吧?是不是和mongo shell中的find()
函数很相似呢?
使用路由来分配客户请求
现在,我们已经可以开始设计我们的Web服务的端点了。
很简单,如果客户发送一个POST请求到/create
端点,存储仓位记录的逻辑应该被调用;而如果客户发送一个包含:account
参数的GET请求时,查询仓位记录的逻辑则应该被调用:
var express = require('express');
var router = express.Router();
var positionController = require('../controllers/position');
router.post('/create', positionController.createPosition);
router.get('/:account', positionController.queryPosition);
组装服务
所有层面的实现都已经准备就绪了。让我们把所有逻辑组装在一起吧:
var express = require('express');
var app = express();
var position = require('./routes/position');
app.use('/position', position);
var port = 8888;
app.listen(port, () => {
console.log('仓位记录管理服务运行中...')
});
怎么样?搭建这样一个支持MongoDB基本操作的Web服务是不是很简单呢?
阅读愉快~
– The End –
热门评论
转发这篇锦鲤文,明天还是一片大涨
抢个前排不容易,才登上QAQ,为大佬打call!
不管是什么,我都要当沙发