0

我有一个 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 万条记录执行此操作

4

1 回答 1

0

显然,信息存储为 ISOString。现在使用 .toISOString() 函数会给出结果。但是,一旦提取了整整 10 天的数据,循环就会显着减慢,在大约 20k 循环后几乎爬行。也许这种方法不适用于回测。

于 2017-12-11T18:35:16.150 回答