This repository has been archived on 2025-10-29. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
gekko/core/budfox/tradeBatcher.js
2021-06-06 20:25:14 +02:00

125 lines
2.7 KiB
JavaScript

//
// Small wrapper that only propagates new trades.
//
// Expects trade batches to be written like:
// [
// {
// tid: x, // tid is preferred, but if none available date will also work
// price: x,
// date: (timestamp),
// amount: x
// },
// {
// tid: x + 1,
// price: x,
// date: (timestamp),
// amount: x
// }
// ]
//
// Emits 'new trades' event with:
// {
// amount: x,
// start: (moment),
// end: (moment),
// first: (trade),
// last: (trade)
// data: [
// // batch of new trades with
// // moments instead of timestamps
// ]
// }
var _ = require('lodash');
var moment = require('moment');
var util = require('../util');
var log = require('../log');
var TradeBatcher = function(tid) {
if(!_.isString(tid))
throw new Error('tid is not a string');
_.bindAll(this);
this.tid = tid;
this.last = -1;
}
util.makeEventEmitter(TradeBatcher);
TradeBatcher.prototype.write = function(batch) {
if(!_.isArray(batch))
throw new Error('batch is not an array');
if(_.isEmpty(batch))
return log.debug('Trade fetch came back empty.');
var filterBatch = this.filter(batch);
var amount = _.size(filterBatch);
if(!amount)
return log.debug('No new trades.');
var momentBatch = this.convertDates(filterBatch);
var last = _.last(momentBatch);
var first = _.first(momentBatch);
log.debug(
'Processing', amount, 'new trades.',
'From',
first.date.format('YYYY-MM-DD HH:mm:ss'),
'UTC to',
last.date.format('YYYY-MM-DD HH:mm:ss'),
'UTC.',
'(' + first.date.from(last.date, true) + ')'
);
this.emit('new batch', {
amount: amount,
start: first.date,
end: last.date,
last: last,
first: first,
data: momentBatch
});
this.last = last[this.tid];
// we overwrote those, get unix ts back
if(this.tid === 'date')
this.last = this.last.unix();
}
TradeBatcher.prototype.filter = function(batch) {
// make sure we're not trying to count
// beyond infinity
var lastTid = _.last(batch)[this.tid];
if(lastTid === lastTid + 1)
util.die('trade tid is max int, Gekko can\'t process..');
// remove trades that have zero amount
// see @link
// https://github.com/askmike/gekko/issues/486
batch = _.filter(batch, function(trade) {
return trade.amount > 0;
});
// weed out known trades
// TODO: optimize by stopping as soon as the
// first trade is too old (reverse first)
return _.filter(batch, function(trade) {
return this.last < trade[this.tid];
}, this);
}
TradeBatcher.prototype.convertDates = function(batch) {
return _.map(_.cloneDeep(batch), function(trade) {
trade.date = moment.unix(trade.date).utc();
return trade;
});
}
module.exports = TradeBatcher;