Skip to content

Commit 325293a

Browse files
author
Ruben Callewaert
committed
v0.9.6 Stability Improvements
- Fixed another bug in the exchangeapi service - Performance improvements in storage.js (Bulk inserts) - Removed unnecessary logger.debug commands to increase readibility - You can now reset your initial balance by executing "node app.js -rb"
1 parent 9258491 commit 325293a

27 files changed

+486
-589
lines changed

.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,11 @@ Thumbs.db
66
ehthumbs.db
77
Desktop.ini
88
$RECYCLE.BIN/
9+
10+
# All
11+
.idea
12+
13+
# Project
14+
node_modules
15+
logs
16+
config.js

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ If you would like to simulate trading on your collected data, execute:
120120

121121
node app.js -b
122122

123+
If you would like to reset the initial balance (profit reports are based against this value), execute:
124+
125+
node app.js -rb
126+
123127
Remember the backtester simulates your trading strategy on the data you collected. So the longer you keep the bot (app.js) running, the more significant the results of the backtester.
124128

125129
## Profitability

app.js

+76-26
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,124 @@
11
var _ = require('underscore');
2+
var cluster = require('cluster');
23

34
var loggingservice = require('./services/loggingservice.js');
45

56
//------------------------------Config
67
var config = require('./config.js');
78
//------------------------------Config
89

9-
//------------------------------IntializeModules
10-
var logger = new loggingservice('app', config.debug);
11-
//------------------------------IntializeModules
12-
13-
//------------------------------AnnounceStart
14-
logger.log('----------------------------------------------------');
15-
logger.log('Starting BitBot v0.9.5');
16-
logger.log('Real Trading Enabled = ' + config.tradingEnabled);
17-
logger.log('Working Dir = ' + process.cwd());
18-
logger.log('----------------------------------------------------');
19-
//------------------------------AnnounceStart
20-
2110
var app = function() {
2211

23-
_.bindAll(this, 'appListener', 'launchTrader', 'launchBacktester', 'start');
12+
_.bindAll(this, 'appListener', 'launchTrader', 'launchBacktester', 'launchGa', 'initializeModules', 'start');
2413

2514
};
2615

2716
app.prototype.appListener = function() {
2817

2918
this.app.on('done', function() {
30-
logger.log('App closed.');
19+
this.logger.log('App closed.');
3120
}.bind(this));
3221

3322
};
3423

3524
app.prototype.launchTrader = function() {
3625

37-
logger.log('----------------------------------------------------');
38-
logger.log('Launching trader module.');
39-
logger.log('----------------------------------------------------');
26+
this.logger.log('----------------------------------------------------');
27+
this.logger.log('Launching trader module.');
28+
this.logger.log('----------------------------------------------------');
4029
this.app = require('./apps/trader.js');
4130
this.appListener();
4231
this.app.start();
4332

44-
}
33+
};
4534

4635
app.prototype.launchBacktester = function() {
4736

48-
logger.log('----------------------------------------------------');
49-
logger.log('Launching backtester module.');
50-
logger.log('----------------------------------------------------');
37+
this.logger.log('----------------------------------------------------');
38+
this.logger.log('Launching backtester module.');
39+
this.logger.log('----------------------------------------------------');
5140
this.app = require('./apps/backtester.js');
5241
this.appListener();
5342
this.app.start();
5443

55-
}
44+
};
45+
46+
app.prototype.launchGa = function() {
47+
48+
this.logger.log('----------------------------------------------------');
49+
this.logger.log('Launching ga module.');
50+
this.logger.log('----------------------------------------------------');
51+
this.app = require('./apps/ga.js');
52+
this.appListener();
53+
this.app.start();
54+
55+
};
56+
57+
app.prototype.launchReset = function(collection) {
58+
59+
this.logger.log('----------------------------------------------------');
60+
this.logger.log('Launching ga module.');
61+
this.logger.log('----------------------------------------------------');
62+
this.app = require('./apps/reset.js');
63+
this.appListener();
64+
this.app.start(collection);
65+
66+
};
67+
68+
app.prototype.initializeModules = function(appName) {
69+
70+
this.logger = new loggingservice(appName, config.debug);
71+
72+
};
5673

5774
app.prototype.start = function() {
5875

5976
var argument = process.argv[2];
6077

6178
if(!argument) {
62-
this.launchTrader();
79+
this.appName = 'trader';
80+
this.run = this.launchTrader;
6381
} else {
6482
if(argument === '-b') {
65-
this.launchBacktester();
83+
this.appName = 'backtester';
84+
this.run = this.launchBacktester;
85+
} else if(argument === '-g') {
86+
this.appName = 'ga';
87+
this.run = this.launchGa;
88+
} else if(argument === '-rb') {
89+
this.appName = 'reset';
90+
this.run = function() {
91+
this.launchReset('balance');
92+
}.bind(this);
93+
} else if(argument === '-ro') {
94+
this.appName = 'reset';
95+
this.run = function() {
96+
this.launchReset('bestOrganism');
97+
}.bind(this);
6698
} else {
67-
logger.log('Invalid argument, supported options:');
68-
logger.log('-b: Launch Backtester');
99+
this.appName = 'app';
100+
run = null;
69101
}
70102
}
71103

104+
this.initializeModules(this.appName);
105+
106+
//------------------------------AnnounceStart
107+
this.logger.log('----------------------------------------------------');
108+
this.logger.log('Starting BitBot v0.9.6');
109+
this.logger.log('Real Trading Enabled = ' + config.tradingEnabled);
110+
this.logger.log('Working Dir = ' + process.cwd());
111+
this.logger.log('----------------------------------------------------');
112+
//------------------------------AnnounceStart
113+
114+
if(this.run) {
115+
this.run();
116+
} else {
117+
this.logger.log('Invalid argument, supported options:');
118+
this.logger.log('-b: Launch Backtester');
119+
this.logger.log('-rb: Reset balance');
120+
}
121+
72122
};
73123

74124
var application = new app();

apps/backtester.js

+28-15
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@ var simulatorservice = require('../services/simulator.js');
1212
var config = require('../config.js');
1313
//------------------------------Config
1414

15-
//------------------------------IntializeModules
15+
//------------------------------InitializeModules
1616
var logger = new loggingservice('backtester', config.debug);
1717
var storage = new storageservice(config.exchangeSettings, config.mongoConnectionString, logger);
1818
var exchangeapi = new exchangeapiservice(config.exchangeSettings, config.apiSettings, logger);
19-
var advisor = new tradingadvisor(config.indicatorSettings, true, storage, logger);
19+
var advisor = new tradingadvisor(config.indicatorSettings, storage, logger);
2020
var simulator = new simulatorservice(config.exchangeSettings, config.backTesterSettings, config.indicatorSettings, advisor, logger);
21-
//------------------------------IntializeModules
21+
//------------------------------InitializeModules
2222

2323
var backtester = function() {
2424

25-
_.bindAll(this, 'start');
25+
this.indicatorSettings = config.indicatorSettings;
26+
27+
_.bindAll(this, 'run', 'start');
2628

2729
};
2830

@@ -32,19 +34,30 @@ var EventEmitter = require('events').EventEmitter;
3234
Util.inherits(backtester, EventEmitter);
3335
//---EventEmitter Setup
3436

35-
backtester.prototype.start = function() {
37+
backtester.prototype.run = function() {
38+
39+
advisor.setIndicator(this.indicatorSettings, false);
40+
3641
async.series(
37-
{
38-
balance: function(cb) {exchangeapi.getBalance(true, cb);},
39-
aggregatedCandleSticks: function(cb) {storage.getAggregatedCandleSticks(config.indicatorSettings.candleStickSizeMinutes, cb);}
40-
}, function(err, result) {
41-
if(result.aggregatedCandleSticks.length > 0) {
42-
var result = simulator.calculate(result.aggregatedCandleSticks, result.balance.fee);
43-
simulator.report();
44-
this.emit('done');
45-
}
46-
}.bind(this)
42+
{
43+
balance: function(cb) {exchangeapi.getBalance(true, cb);},
44+
aggregatedCandleSticks: function(cb) {storage.getAggregatedCandleSticks(this.indicatorSettings.candleStickSizeMinutes, cb);}.bind(this)
45+
}, function(err, result) {
46+
if(result.aggregatedCandleSticks.length > 0) {
47+
simulator.calculate(result.aggregatedCandleSticks, result.balance.fee, this.indicatorSettings, function(result) {
48+
simulator.report();
49+
this.emit('done');
50+
}.bind(this));
51+
}
52+
}.bind(this)
4753
);
54+
55+
};
56+
57+
backtester.prototype.start = function() {
58+
59+
this.run();
60+
4861
};
4962

5063
var backtesterApp = new backtester();

apps/reset.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
var _ = require('underscore');
2+
var tools = require('../util/tools.js');
3+
var async = require('async');
4+
5+
var loggingservice = require('../services/loggingservice.js');
6+
var storageservice = require('../services/storage.js');
7+
var exchangeapiservice = require('../services/exchangeapi.js');
8+
var tradingadvisor = require('../services/tradingadvisor.js');
9+
var simulatorservice = require('../services/simulator.js');
10+
11+
//------------------------------Config
12+
var config = require('../config.js');
13+
//------------------------------Config
14+
15+
//------------------------------InitializeModules
16+
var logger = new loggingservice('reset', config.debug);
17+
var storage = new storageservice(config.exchangeSettings, config.mongoConnectionString, logger);
18+
//------------------------------InitializeModules
19+
20+
var reset = function() {
21+
22+
this.indicatorSettings = config.indicatorSettings;
23+
24+
_.bindAll(this, 'start');
25+
26+
};
27+
28+
//---EventEmitter Setup
29+
var Util = require('util');
30+
var EventEmitter = require('events').EventEmitter;
31+
Util.inherits(reset, EventEmitter);
32+
//---EventEmitter Setup
33+
34+
reset.prototype.start = function(collection) {
35+
36+
storage.dropCollection(collection, function(err) {
37+
logger.log(collection + ' dropped.');
38+
this.emit('done');
39+
}.bind(this));
40+
41+
};
42+
43+
var resetApp = new reset();
44+
45+
module.exports = resetApp;

apps/trader.js

+24-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var _ = require('underscore');
2+
var tools = require('../util/tools.js');
23

34
var loggingservice = require('../services/loggingservice.js');
45
var storageservice = require('../services/storage.js');
@@ -16,19 +17,19 @@ var profitreporter = require('../services/profitreporter.js');
1617
var config = require('../config.js');
1718
//------------------------------Config
1819

19-
//------------------------------IntializeModules
20-
var logger = new loggingservice('app', config.debug);
20+
//------------------------------InitializeModules
21+
var logger = new loggingservice('trader', config.debug);
2122
var storage = new storageservice(config.exchangeSettings, config.mongoConnectionString, logger);
2223
var exchangeapi = new exchangeapiservice(config.exchangeSettings, config.apiSettings, logger);
2324
var retriever = new dataretriever(config.downloaderRefreshSeconds, exchangeapi, logger);
2425
var processor = new dataprocessor(storage, logger);
2526
var aggregator = new candleaggregator(config.indicatorSettings.candleStickSizeMinutes, storage, logger);
26-
var advisor = new tradingadvisor(config.indicatorSettings, false, storage, logger);
27+
var advisor = new tradingadvisor(config.indicatorSettings, storage, logger);
2728
var agent = new tradingagent(config.tradingEnabled, config.exchangeSettings, storage, exchangeapi, logger);
2829
var pusher = new pushservice(config.pushOver, logger);
2930
var monitor = new ordermonitor(exchangeapi, logger);
3031
var reporter = new profitreporter(config.exchangeSettings.currencyPair, storage, exchangeapi, logger);
31-
//------------------------------IntializeModules
32+
//------------------------------InitializeModules
3233

3334
var trader = function() {
3435

@@ -40,7 +41,7 @@ var trader = function() {
4041

4142
processor.on('initialDBWrite', function(){
4243

43-
reporter.start(config.resetInitialBalances);
44+
reporter.start();
4445

4546
advisor.start();
4647

@@ -68,6 +69,22 @@ var trader = function() {
6869

6970
});
7071

72+
advisor.on('advice', function(result) {
73+
74+
this.logger.log('Advice: ' + result.advice + ' (' + result.indicatorValue + ')');
75+
76+
if(result.advice === 'buy') {
77+
78+
agent.order(result.advice);
79+
80+
} else if(result.advice === 'sell') {
81+
82+
agent.order(result.advice);
83+
84+
}
85+
86+
});
87+
7188
agent.on('realOrder',function(orderDetails){
7289

7390
if(config.pushOver.enabled) {
@@ -110,11 +127,7 @@ var trader = function() {
110127

111128
if(retry) {
112129

113-
cancelledOrderRetryTimeout = setTimeout(function(){
114-
115-
agent.order(order.orderDetails.orderType);
116-
117-
}, 1000 * 5);
130+
agent.order(order.orderDetails.orderType);
118131

119132
}
120133

@@ -130,7 +143,7 @@ var trader = function() {
130143

131144
_.bindAll(this, 'start', 'stop');
132145

133-
}
146+
};
134147

135148
//---EventEmitter Setup
136149
var Util = require('util');
@@ -148,8 +161,6 @@ trader.prototype.stop = function(cb) {
148161

149162
retriever.stop();
150163

151-
clearTimeout(cancelledOrderRetryTimeout);
152-
153164
monitor.resolvePreviousOrder(function() {
154165
logger.log('BitBot stopped succesfully!');
155166
cb();

0 commit comments

Comments
 (0)