我有一个模拟交易所的程序,似乎运作良好,特别是当我设置一个止损或获利时。但是,当有多次出现时,它只执行一次。我似乎无法弄明白。这也适用于我称之为短期兴趣的抽象。当我保存时,Mongo似乎创建了两个实例,这有点问题。我知道代码现在已经过了,但我打算让它工作然后开始优化。以下是执行上述抽象的代码:
tradeIdIndex = results.history[results.history.length - 1]._id;
if(req.body.typeofTrade == 'short'){
results.shortInterest.push({
time : Date(),
price : req.body.price,
tradeId : tradeIdIndex,
typeofTrade : req.body.typeofTrade,
quantity : req.body.quantity,
userId : req.body.userId
})
results.save();
}
如果满足某些条件,这将保存我希望稍后删除的shortInterest。如果满足删除shortInterest,takeProfit和stopLosses的条件,则调用下面的代码,这实际上只是函数的一个片段。它按照我的预期执行。
if(tradeId){
console.log("I am checking the sell and cover to remove the respective open trades");
for(var i = userData.openTrades.length -1; i >= 0; i--){
if(userData.openTrades[i].celebrity == self.req.celebrityName && userData.openTrades[i].typeofTrade == typeofTrade && userData.openTrades[i].tradeId == tradeId){
console.log(userData.openTrades[i]);
userData.openTrades.splice(i, 1);
userData.save();
}
};
}
它将控制权返回给下面的代码,该代码实际上将其称为继续执行。
case "short" :
checkSellandCover(userData, 'short', self, req.tradeId);
removeStops(self.celebrity, userId, 'cover', req.tradeId);
removeTakeProfits(self.celebrity, userId, 'cover', req.tradeId);
removeShortInterest(self.celebrity, userId, 'short', req.tradeId);
userData.save();
if(self.celebrity.ask > req.shortPrice){
value = parseFloat(self.celebrity.ask) * parseFloat(req.quantity) - parseFloat(req.shortPrice) * parseFloat(req.quantity);
userData.accountValue = parseFloat(userData.accountValue) - value + parseFloat(req.shortPrice) * parseFloat(req.quantity);
userData.save();
} else {
value = 2 * parseFloat(req.shortPrice) * parseFloat(req.quantity) - parseFloat(self.celebrity.ask) * parseFloat(req.quantity);
userData.accountValue = userData.accountValue + value;
userData.save();
}
break;
如上所述,我的问题和疑问是:
1)为什么mongo会保存我的数据两次。 2)如果我有多个止损或获利,则上述代码不能正确执行。与短期兴趣相同,因为它被保存两次。既然我已经提出了这个问题,我开始认为这是因为我正在执行数据库操作,并且在执行results.save()指令时,数据库搜索可能仍在执行。