UNPKG

bluebot

Version:

A bitcoin trading bot for auto trading at various exchanges

206 lines (188 loc) 4.95 kB
var moment = require('moment'); var _ = require('lodash'); var path = require('path'); var fs = require('fs'); var semver = require('semver'); var program = require('commander'); var retry = require('retry'); var startTime = moment(); var _config = false; var _package = false; var _nodeVersion = false; var _bluebotMode = false; var _bluebotEnv = false; var _args = false; // helper functions var util = { getConfig: function() { // cache if(_config) return _config; if(!program.config) util.die('Please specify a config file.', true); if(!fs.existsSync(util.dirs().bluebot + program.config)) util.die('Cannot find the specified config file.', true); _config = require(util.dirs().bluebot + program.config); return _config; }, // overwrite the whole config setConfig: function(config) { _config = config; }, setConfigProperty: function(parent, key, value) { if(parent) _config[parent][key] = value; else _config[key] = value; }, getVersion: function() { return util.getPackage().version; }, getPackage: function() { if(_package) return _package; _package = JSON.parse( fs.readFileSync(__dirname + '/../package.json', 'utf8') ); return _package; }, getRequiredNodeVersion: function() { return util.getPackage().engines.node; }, recentNode: function() { var required = util.getRequiredNodeVersion(); return semver.satisfies(process.version, required); }, // check if two moments are corresponding // to the same time equals: function(a, b) { return !(a < b || a > b) }, minToMs: function(min) { return min * 60 * 1000; }, defer: function(fn) { return function(args) { var args = _.toArray(arguments); return _.defer(function() { fn.apply(this, args) }); } }, logVersion: function() { return `BlueBot version: v${util.getVersion()}` + `\nNodejs version: ${process.version}`; }, die: function(m, soft) { if(_bluebotEnv === 'standalone' || !_bluebotEnv) var log = console.log.bind(console); else if(_bluebotEnv === 'child-process') var log = m => process.send({type: 'error', error: m}); if(m) { if(soft) { log('\n ERROR: ' + m + '\n\n'); } else { log('\n\nBlueBot encountered an error and can\'t continue'); log('\nError:\n'); log(m, '\n\n'); log('\nMeta debug info:\n'); log(util.logVersion()); log(''); } } process.exit(1); }, dirs: function() { var ROOT = __dirname + '/../'; return { bluebot: ROOT, core: ROOT + 'core/', markets: ROOT + 'core/markets/', exchanges: ROOT + 'exchanges/', plugins: ROOT + 'plugins/', methods: ROOT + 'strategies/', indicators: ROOT + 'strategies/indicators/', sonic: ROOT + 'core/sonic/', importers: ROOT + 'importers/exchanges/', tools: ROOT + 'core/tools/', workers: ROOT + 'core/workers/', web: ROOT + 'web/', config: ROOT + 'config/' } }, inherit: function(dest, source) { require('util').inherits( dest, source ); }, makeEventEmitter: function(dest) { util.inherit(dest, require('events').EventEmitter); }, setBlueBotMode: function(mode) { _bluebotMode = mode; }, bluebotMode: function() { if(_bluebotMode) return _bluebotMode; if(program['import']) return 'importer'; else if(program.backtest) return 'backtest'; else return 'realtime'; }, gekkoModes: function() { return [ 'importer', 'backtest', 'realtime' ] }, setBlueBotEnv: function(env) { _bluebotEnv = env; }, bluebotEnv: function() { return _bluebotEnv || 'standalone'; }, launchUI: function() { if(program['ui']) return true; else return false; }, getStartTime: function() { return startTime; }, retry: function(fn, callback) { var operation = retry.operation({ retries: 5, factor: 1.2, minTimeout: 1 * 1000, maxTimeout: 3 * 1000 }); operation.attempt(function(currentAttempt) { fn(function(err, result) { if (operation.retry(err)) { return; } callback(err ? operation.mainError() : null, result); }); }); } } // NOTE: those options are only used // in stand alone mode program .version(util.logVersion()) .option('-c, --config <file>', 'Config file') .option('-b, --backtest', 'backtesting mode') .option('-i, --import', 'importer mode') .option('--ui', 'launch a web UI') .parse(process.argv); // make sure the current node version is recent enough if(!util.recentNode()) util.die([ 'Your local version of Node.js is too old. ', 'You have ', process.version, ' and you need atleast ', util.getRequiredNodeVersion() ].join(''), true); module.exports = util;