-
Notifications
You must be signed in to change notification settings - Fork 2
/
server.js
130 lines (101 loc) · 3.43 KB
/
server.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
const gdax = require('./exchangeAPIs/gdax.js');
const polo = require('./exchangeAPIs/polo.js');
const YAML = require('yamljs');
const creds = YAML.load('../credentials.yaml');
let poloBTCAddress = creds.polo.address.btc;
let gdaxETHAddress = creds.gdax.address.eth;
// Minimum amounts of coin to be exchanged
const MIN_AMOUNT_BTC = 0.01;
const MIN_AMOUNT_ETH = 1;
let widestSpread = -10;
let widestSpreadInInterval = -10;
let widestNegSpread = 10;
let widestNegSpreadInInterval = 10;
let lastSpread = -10;
let totalMinutesRun = 0;
const reportIntervalSeconds = 2 * 60;
const reportIntervalMinutes = reportIntervalSeconds / 60;
setInterval(
function () {
totalMinutesRun += reportIntervalMinutes;
console.log('--------( ' + totalMinutesRun + ' mins )-------');
console.log('Last spread:', lastSpread);
console.log(
'Widest + in interval (' + reportIntervalMinutes + ' mins):',
widestSpreadInInterval
);
console.log(
'Widest - in interval (' + reportIntervalMinutes + ' mins):',
widestNegSpreadInInterval
);
console.log('Widest + so far:', widestSpread);
console.log('Widest - so far:', widestNegSpread);
widestSpreadInInterval = -10;
},
reportIntervalSeconds * 1000
);
// IF ((GDAX * 104%) < POLO number)
// SELL ETH
// cancel_after (0.5 secs, which needs to be in mins)
// type: market
// funds : total ETH
// Always SEND BTC
function _handle_GDAX(btc_eth_gdax, btc_eth_polo) {
if (!btc_eth_polo) {
return;
}
gdax.getBalances(function (balances) {
const ethAmountStr = balances.ETH;
const btcAmountStr = balances.BTC;
const gdaxRate = parseFloat(btc_eth_gdax);
const poloRate = parseFloat(btc_eth_polo);
const spread = (poloRate - gdaxRate) / gdaxRate;
if (spread >= 0.0388 && parseFloat(ethAmountStr) > MIN_AMOUNT_ETH) {
gdax.sellAllETH(btc_eth_gdax);
console.log('Selling all ETH... on GDAX');
console.log('GDAX:', gdaxRate, 'POLO:', poloRate);
}
if (parseFloat(btcAmountStr) > MIN_AMOUNT_BTC) {
gdax.sendAllBTCTo(poloBTCAddress);
console.log('Sending all BTC to POLO...');
}
lastSpread = spread;
widestSpreadInInterval = Math.max(widestSpreadInInterval, spread);
widestNegSpreadInInterval = Math.min(widestNegSpreadInInterval, spread);
widestSpread = Math.max(widestSpread, spread);
widestNegSpread = Math.min(widestNegSpread, spread);
});
}
// Always BUY ETH
// Always SEND ETH
function _handle_POLO(btc_eth_gdax, btc_eth_polo) {
if (!btc_eth_gdax) {
return;
}
polo.getBalances(function (balances) {
const ethAmountStr = balances.ETH;
const btcAmountStr = balances.BTC;
if (parseFloat(btcAmountStr) > MIN_AMOUNT_BTC) {
polo.buyAllETH(btc_eth_polo);
console.log('Buying all ETH on POLO...');
}
if (parseFloat(ethAmountStr) > MIN_AMOUNT_ETH) {
polo.sendAllETHTo(gdaxETHAddress);
console.log('Sending all ETH to GDAX...');
}
});
}
// Called every price update from polo
polo.initWithHandler(function (btc_eth_polo) {
// Only execute logic on incoming gdax data
// since it is less frequent
// const btc_eth_gdax = gdax.getLast();
// _handle_GDAX(btc_eth_gdax, btc_eth_polo);
// _handle_POLO(btc_eth_gdax, btc_eth_polo);
});
// Called every price update from gdax
gdax.setupTicker(function (btc_eth_gdax) {
const btc_eth_polo = polo.getLast();
_handle_POLO(btc_eth_gdax, btc_eth_polo);
_handle_GDAX(btc_eth_gdax, btc_eth_polo);
}, 401);