繁体   English   中英

在node.js和mongodb中的两个日期变量之间查找并平均所有数据

[英]Find and average all data between two date variables in node.js and mongodb

我有一个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天范围内的所有项目。 这就是我卡住的地方。 我已经用console.log记录了我创建的开始日期和结束日期变量,它们相距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万次以上的记录

显然,该信息存储为ISOString。 现在,使用.toISOString()函数可以得到结果。 但是,一旦提取了整整10天的数据,循环就会显着放缓,大约经过20k次循环后几乎会爬行。 也许这种方法对回测不可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM