UNPKG

3.97 kBJavaScriptView Raw
1/*
2
3 Gekko is a Bitcoin trading bot for Mt. Gox written
4 in node, it features multiple trading methods using
5 technical analysis.
6
7 Disclaimer:
8
9 USE AT YOUR OWN RISK!
10
11 The authors of this project is NOT responsible for any damage or loss caused
12 by this software. There can be bugs and the bot may not perform as expected
13 or specified. Please consider testing it first without automatic buying /
14 selling in the provided advice. Also look at the code to see what how
15 it's working.
16
17*/
18
19// helpers
20var moment = require('moment');
21var _ = require('underscore');
22var util = require('./util.js');
23var log = require('./log.js');
24var async = require('async');
25var Manager = require('./portfolioManager');
26
27var config = util.getConfig();
28var Consultant = require('./methods/' + config.tradingMethod.toLowerCase().split(' ').join('-'));
29
30log.info('I\'m gonna make you rich, Bud Fox.');
31log.info('Let me show you some ' + config.tradingMethod + '.\n\n');
32
33if(config.backtest.enabled) {
34 log.info('Preparing backtester to test strategy against historical data.');
35
36 // implement a trading method to create a consultant.
37 var consultant = new Consultant();
38
39 // overwrite the watcher in case of normal setup
40 if(config.normal.enabled)
41 config.watch = config.normal;
42
43 var Logger = require('./logger');
44 var logger = new Logger(_.extend(config.profitCalculator, config.watch));
45 consultant.on('advice', logger.inform);
46 if(config.profitCalculator.enabled)
47 consultant.on('advice', logger.trackProfits);
48
49 consultant.on('finish', logger.finish);
50
51 consultant.emit('prepare');
52 return;
53}
54
55
56//
57// Normalize the configuration between normal & advanced
58//
59if(config.normal && config.normal.enabled) {
60 // if the normal settings are enabled we overwrite the
61 // watcher and traders set in the advanced zone
62 log.info('Using normal settings to monitor the live market');
63 config.watch = config.normal;
64 config.traders = [];
65
66 var checker = new Manager(config.normal, true);
67 var valid = checker.validCredentials();
68 if(config.normal.tradingEnabled && valid)
69 config.traders.push( config.normal );
70 else
71 log.info('NOT trading with real money');
72} else {
73 log.info('Using advanced settings');
74}
75
76//
77// create a public exchange object which can retrieve live trade information
78//
79var provider = config.watch.exchange.toLowerCase();
80if(provider === 'btce') {
81 // we can't fetch historical data from btce directly so we use bitcoincharts
82 // @link http://bitcoincharts.com/about/markets-api/
83 config.watch.market = provider;
84 provider = 'bitcoincharts';
85}
86var DataProvider = require('./exchanges/' + provider);
87var watcher = new DataProvider(config.watch);
88
89// implement a trading method to create a consultant, we pass it a config and a
90// public mtgox object which the method can use to get data on past trades
91var consultant = new Consultant(watcher);
92
93// log advice
94var Logger = require('./logger');
95var logger = new Logger(_.extend(config.profitCalculator, config.watch));
96consultant.on('advice', logger.inform);
97if(config.profitCalculator.enabled)
98 consultant.on('advice', logger.trackProfits);
99
100//
101// Configure automatic traders based on advice
102//
103var managers = _.filter(config.traders, function(t) { return t.enabled });
104var configureManagers = function(_next) {
105 var next = _.after(managers.length, _next);
106 _.each(managers, function(conf) {
107 conf.exchange = conf.exchange.toLowerCase();
108
109 var manager = new Manager(conf);
110 consultant.on('advice', manager.trade);
111 manager.on('ready', next);
112 });
113}
114
115
116//
117// Configure automatic email on advice
118//
119var configureMail = function(next) {
120 if(config.mail.enabled && config.mail.email) {
121 var mailer = require('./mailer');
122 mailer.init(function() {
123 consultant.on('advice', mailer.send);
124 next();
125 });
126 } else
127 next();
128}
129
130var start = function() {
131 consultant.emit('prepare');
132}
133
134async.series([configureMail, configureManagers], start);
\No newline at end of file