forked from askmike/gekko
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzaif.jp.js
127 lines (103 loc) · 3.21 KB
/
zaif.jp.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
var Zaif = require("zaif.jp");
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 = 'Zaif';
this.balance;
this.price;
this.zaif = Zaif.createPrivateApi(this.key, this.secret, 'user agent is node-zaif');
this.api = Zaif.PublicApi;
}
// 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(data) {
var portfolio = [];
_.each(data.funds, 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.zaif.getInfo().then(_.bind(set, this));
}
Trader.prototype.getTicker = function(callback) {
this.api.ticker('btc_jpy').then(callback);
}
Trader.prototype.getFee = function(callback) {
var makerFee = 0.0;
callback(false, makerFee / 100);
}
Trader.prototype.buy = function(amount, price, callback) {
var set = function(result) {
if(!result)
return log.error('unable to buy:', result);
callback(null, result.order_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.zaif.trade('bid', price, amount).then(_.bind(set, this));
}
Trader.prototype.sell = function(amount, price, callback) {
var set = function(result) {
if(!result)
return log.error('unable to sell:', result);
callback(null, result.order_id);
};
this.zaif.trade('ask', price, amount).then(_.bind(set, this));
}
Trader.prototype.checkOrder = function(order, callback) {
var check = function(result) {
var stillThere = (order in result);
callback(null, !stillThere);
};
this.zaif.activeorders().then(_.bind(check, this));
}
Trader.prototype.cancelOrder = function(order, callback) {
var cancel = function(result) {
if(!result)
log.error('unable to cancel order', order, '(', result, ')');
};
this.zaif.cancelorder(order).then(_.bind(cancel, this));
}
Trader.prototype.getTrades = function(since, callback, descending) {
var args = _.toArray(arguments);
var process = function(result) {
if(!result)
return this.retry(this.getTrades, args);
callback(null, result.reverse());
};
this.api.trades('btc_jpy').then(_.bind(process, this));
}
module.exports = Trader;