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/markets/importer.js
T
2021-06-06 20:25:14 +02:00

118 lines
2.5 KiB
JavaScript

var _ = require('lodash');
var util = require('../util');
var config = util.getConfig();
var dirs = util.dirs();
var log = require(dirs.core + 'log');
var moment = require('moment');
var gekkoEnv = util.gekkoEnv();
var adapter = config[config.adapter];
var daterange = config.importer.daterange;
var from = moment.utc(daterange.from);
if(daterange.to) {
var to = moment.utc(daterange.to);
} else {
var to = moment().utc();
log.debug(
'No end date specified for importing, setting to',
to.format()
);
}
log.debug(to.format());
if(!from.isValid())
util.die('invalid `from`');
if(!to.isValid())
util.die('invalid `to`');
var TradeBatcher = require(dirs.budfox + 'tradeBatcher');
var CandleManager = require(dirs.budfox + 'candleManager');
var exchangeChecker = require(dirs.gekko + 'exchange/exchangeChecker');
var error = exchangeChecker.cantFetchFullHistory(config.watch);
if(error)
util.die(error, true);
var fetcher = require(dirs.importers + config.watch.exchange);
if(to <= from)
util.die('This daterange does not make sense.')
var Market = function() {
_.bindAll(this);
this.exchangeSettings = exchangeChecker.settings(config.watch);
this.tradeBatcher = new TradeBatcher(this.exchangeSettings.tid);
this.candleManager = new CandleManager;
this.fetcher = fetcher({
to: to,
from: from
});
this.done = false;
this.fetcher.bus.on(
'trades',
this.processTrades
);
this.fetcher.bus.on(
'done',
function() {
this.done = true;
}.bind(this)
)
this.tradeBatcher.on(
'new batch',
this.candleManager.processTrades
);
this.candleManager.on(
'candles',
this.pushCandles
);
Readable.call(this, {objectMode: true});
this.get();
}
var Readable = require('stream').Readable;
Market.prototype = Object.create(Readable.prototype, {
constructor: { value: Market }
});
Market.prototype._read = _.noop;
Market.prototype.pushCandles = function(candles) {
_.each(candles, this.push);
}
Market.prototype.get = function() {
this.fetcher.fetch();
}
Market.prototype.processTrades = function(trades) {
this.tradeBatcher.write(trades);
if(this.done) {
log.info('Done importing!');
this.emit('end');
return;
}
if(_.size(trades) && gekkoEnv === 'child-process') {
let lastAtTS = _.last(trades).date;
let lastAt = moment.unix(lastAtTS).utc().format();
process.send({event: 'marketUpdate', payload: lastAt});
}
setTimeout(this.get, 1000);
}
module.exports = Market;