forked from askmike/gekko
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbitstamp.js
131 lines (106 loc) · 3.3 KB
/
bitstamp.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
var Bitstamp = require("bitstamp");
var util = require('../core/util.js');
var _ = require('lodash');
var moment = require('moment');
var log = require('../core/log');
var Trader = function(config) {
_.bindAll(this);
if(_.isObject(config)) {
this.key = config.key;
this.secret = config.secret;
this.clientID = config.username;
}
this.name = 'Bitstamp';
this.balance;
this.price;
this.bitstamp = new Bitstamp(this.key, this.secret, this.clientID);
}
// if the exchange errors we try the same call again after
// waiting 10 seconds
Trader.prototype.retry = function(method, args) {
var wait = +moment.duration(10, 'seconds');
log.debug(this.name, 'returned an error, retrying..');
var self = this;
// make sure the callback (and any other fn)
// is bound to Trader
_.each(args, function(arg, i) {
if(_.isFunction(arg))
args[i] = _.bind(arg, self);
});
// run the failed method again with the same
// arguments after wait
setTimeout(
function() { method.apply(self, args) },
wait
);
}
Trader.prototype.getPortfolio = function(callback) {
var set = function(err, data) {
var portfolio = [];
_.each(data, function(amount, asset) {
if(asset.indexOf('available') !== -1) {
asset = asset.substr(0, 3).toUpperCase();
portfolio.push({name: asset, amount: parseFloat(amount)});
}
});
callback(err, portfolio);
}
this.bitstamp.balance(_.bind(set, this));
}
Trader.prototype.getTicker = function(callback) {
this.bitstamp.ticker(callback);
}
Trader.prototype.getFee = function(callback) {
var set = function(err, data) {
if(err)
callback(err);
callback(false, data.fee / 100);
}
this.bitstamp.balance(_.bind(set, this));
}
Trader.prototype.buy = function(amount, price, callback) {
var set = function(err, result) {
if(err || result.error)
return log.error('unable to buy:', err, result);
callback(null, result.id);
};
// TODO: fees are hardcoded here?
amount *= 0.995; // remove fees
// prevent: Ensure that there are no more than 8 digits in total.
amount *= 100000000;
amount = Math.floor(amount);
amount /= 100000000;
this.bitstamp.buy(amount, price, _.bind(set, this));
}
Trader.prototype.sell = function(amount, price, callback) {
var set = function(err, result) {
if(err || result.error)
return log.error('unable to sell:', err, result);
callback(null, result.id);
};
this.bitstamp.sell(amount, price, _.bind(set, this));
}
Trader.prototype.checkOrder = function(order, callback) {
var check = function(err, result) {
var stillThere = _.find(result, function(o) { return o.id === order });
callback(err, !stillThere);
};
this.bitstamp.open_orders(_.bind(check, this));
}
Trader.prototype.cancelOrder = function(order, callback) {
var cancel = function(err, result) {
if(err || !result)
log.error('unable to cancel order', order, '(', err, result, ')');
};
this.bitstamp.cancel_order(order, _.bind(cancel, this));
}
Trader.prototype.getTrades = function(since, callback, descending) {
var args = _.toArray(arguments);
var process = function(err, result) {
if(err)
return this.retry(this.getTrades, args);
callback(null, result.reverse());
};
this.bitstamp.transactions(_.bind(process, this));
}
module.exports = Trader;