我有一个 mongodb 集合,我从 GDAX 下载了以太坊的所有历史交易。我目前正在尝试回测交易算法,我想从一个简单的十天平均值开始。集合中的数据看起来像这样
[{
"time": "2014-11-07T22:19:28.578544Z",
"trade_id": 74,
"price": "10.00000000",
"size": "0.01000000",
"side": "buy"
}, {
"time": "2014-11-07T01:08:43.642366Z",
"trade_id": 73,
"price": "100.00000000",
"size": "0.01000000",
"side": "sell"
}]
数据以 ISO 格式保存,不完全确定它是字符串还是 ISO 日期,但尝试转换开始和结束时间变量会导致在末尾添加东部标准时间,而保存的数据没有。下面的代码将执行以下操作。首先,它在集合中查找最高的 trade_id。然后,从 trade_id 1 开始,它遍历集合中的每个项目,获取日期前 10 天范围内的所有项目。这是我卡住的地方。我已经控制台记录了我创建的开始和结束日期变量,它们相隔 10 天,但是当我使用这些变量查询集合时,我没有得到任何结果。使用在单引号中选择的两个随机日期确实有效,所以我看不出使用两个变量的区别。还,如果可能,我还想计算同一查询中所有价格结果的平均值。将不胜感激任何建议或帮助。谢谢。
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/EthHistory";
function getNextTradeID(maxID, i){
mongo.collection("EthTestData").find({
trade_id: i }).toArray(function(err, newid) {
if (err) {
console.log(err);
return;
}
i = i + 1;
var startTimeAvg = new Date(Date.parse(newid[0].time));
var endTimeAvg = new Date(startTimeAvg- (60*60*24*10*1000))
getTenDayAverage(maxID, i, startTimeAvg, endTimeAvg);
});
}
function getTenDayAverage(maxID, i, startTimeAvg, endTimeAvg) {
console.log(startTimeAvg, endTimeAvg)
mongo.collection("EthTestData").find({
time:{
$gte: (endTimeAvg),
$lte: (startTimeAvg) }}).toArray(function(err, result) {
if (err) {
console.log(err);
return;
}
console.log(result)
tradeIDLoop(maxID, i);
});
}
function tradeIDLoop(maxID, i) {
if (maxID < i) {
mongo.close
}
else {
getNextTradeID(maxID, i);
}
};
function getMaxTradeID() {
mongo.collection("EthTestData").find().sort({trade_id:-1}).limit(1).toArray(function(err, result) {
if (err) {
console.log(err);
return;
}
var i = 1
var maxID = Number(result[0].trade_id);
tradeIDLoop(maxID, i);
});
};
MongoClient.connect(url, function(err, db) {
if (err) {
console.log(err);
return;
}
mongo = db
getMaxTradeID();
});
最后,我想用结果更新集合中启动循环的项目,然后继续下一条记录。如果这可以包含在 10 天的数据选择和平均值中,也许有人可以建议如何,否则我将使用另一个查询。试图使这尽可能高效,因为我必须为超过 1900 万条记录执行此操作