2017-12-11 12 views
0

mongodbのコレクションがあります。GDAXからEthereumのすべての過去の取引をダウンロードしました。私は現在、取引アルゴリズムをバックテストしようとしており、簡単な10日間の平均で始めたいと考えています。コレクション内のデータは、ISO形式で保存され、このnode.jsとmongodbの2つの日付変数間のすべてのデータを見つけて平均化する

[{ 
    "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の日付が、の追加で開始時刻と終了時刻の変数の結果を変換しようとするのです全くわからない場合保存されたデータにはない東部標準時。以下のコードは以下のことを行います。まず、コレクション内で最も高いtrade_idを探します。次に、trade_id 1から、コレクションの各アイテムをループし、日付の10日前の範囲内のすべてのアイテムを取得します。ここで私は立ち往生している。私はconsole.logで、作成した開始日と終了日の変数は10日離れていますが、これらの変数を使用してコレクションにクエリを実行すると結果は得られません。選択した2つのランダムな日付を使用すると、一重引用符で動作するので、2つの変数を使用した場合の違いはわかりません。また、可能であれば、同じクエリ内のすべての価格結果の平均を計算したいと考えています。何か提案や助けに感謝します。ありがとう。

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万レコードプラスする必要があります。

答えて

0

明らかに情報はISOStringとして保存されています。 .toISOString()関数を使用すると結果が得られるようになりました。しかし、ループは大幅に遅くなり、10キロバイトのデータを一度取得すると、約20キロのループの後にはほとんどクロールします。おそらく、この方法はバックテストのために実行可能ではないでしょう。

関連する問題