real trader works

This commit is contained in:
Josh Harvey 2016-04-10 02:39:56 +02:00
parent 1a10c3aba8
commit 92bed14927
3 changed files with 47 additions and 27 deletions

View file

@ -9,7 +9,7 @@ BigNumber.config({DECIMAL_PLACES: 40})
var logger = require('./logger')
var argv = require('minimist')(process.argv.slice(2))
var tradeInterval = null
var tradeIntervals = {}
var POLLING_RATE = 60 * 1000 // poll each minute
var REAP_RATE = 2 * 1000
@ -183,11 +183,11 @@ exports.configure = function configure (config) {
}
)
tradesQueues[cryptoCode] = []
tradesQueues[cryptoCode] = tradesQueues[cryptoCode] || []
loadOrConfigPlugin(
traderPlugins[cryptoCode],
'trade',
'trader',
cryptoCode,
null,
function onTraderChange (newTrader) {
@ -334,13 +334,13 @@ exports.trade = function trade (session, rawTrade, cb) {
// add bill to trader queue (if trader is enabled)
var cryptoCode = rawTrade.cryptoCode || 'BTC'
var traderPlugin = traderPlugins[cryptoCode]
var tradesQueue = tradesQueues[cryptoCode]
if (traderPlugin) {
tradesQueue.push({
logger.debug('[%s] Pushing trade: %d', cryptoCode, rawTrade.cryptoAtoms)
tradesQueues[cryptoCode].push({
currency: rawTrade.currency,
cryptoAtoms: rawTrade.cryptoAtoms,
cryptoCode: rawTrade.cryptoCode
cryptoCode: cryptoCode
})
}
@ -417,11 +417,10 @@ exports.startPolling = function startPolling () {
cryptoCodes.forEach(function (cryptoCode) {
setInterval(async.apply(pollBalance, cryptoCode), POLLING_RATE)
setInterval(async.apply(pollRate, cryptoCode), POLLING_RATE)
startTrader(cryptoCode)
})
setInterval(reapTxs, REAP_RATE)
startTrader()
}
function startTrader (cryptoCode) {
@ -430,21 +429,23 @@ function startTrader (cryptoCode) {
// `Trader#executeTrades` returns early if we don't have a trade exchange
// configured at the moment.
var traderPlugin = traderPlugins[cryptoCode]
if (!traderPlugin || tradeIntervals[cryptoCode]) return
if (traderPlugin && !tradeInterval) {
tradeInterval = setInterval(
function () { executeTrades(cryptoCode) },
cachedConfig.exchanges.settings.tradeInterval
)
}
logger.debug('[%s] startTrader', cryptoCode)
tradeIntervals[cryptoCode] = setInterval(
function () { executeTrades(cryptoCode) },
cachedConfig.exchanges.settings.tradeInterval
)
}
function stopTrader (cryptoCode) {
if (tradeInterval) {
clearInterval(tradeInterval)
tradeInterval = null
tradesQueues[cryptoCode] = []
}
if (!tradeIntervals[cryptoCode]) return
logger.debug('[%s] stopTrader', cryptoCode)
clearInterval(tradeIntervals[cryptoCode])
tradeIntervals[cryptoCode] = null
tradesQueues[cryptoCode] = []
}
function pollBalance (cryptoCode, cb) {
@ -536,8 +537,11 @@ function purchase (trade, cb) {
function consolidateTrades (cryptoCode) {
// NOTE: value in cryptoAtoms stays the same no matter the currency
logger.debug('tradesQueues size: %d', tradesQueues[cryptoCode].length)
logger.debug('tradesQueues head: %j', tradesQueues[cryptoCode][0])
var cryptoAtoms = tradesQueues[cryptoCode].reduce(function (prev, current) {
return current.cryptoAtoms.plus(prev)
return prev.plus(current.cryptoAtoms)
}, new BigNumber(0))
var consolidatedTrade = {
@ -548,7 +552,7 @@ function consolidateTrades (cryptoCode) {
tradesQueues[cryptoCode] = []
logger.debug('consolidated: ', JSON.stringify(consolidatedTrade))
logger.debug('[%s] consolidated: %j', cryptoCode, consolidatedTrade)
return consolidatedTrade
}
@ -556,21 +560,23 @@ function executeTrades (cryptoCode) {
var traderPlugin = traderPlugins[cryptoCode]
if (!traderPlugin) return
logger.debug('checking for trades')
logger.debug('[%s] checking for trades', cryptoCode)
var trade = consolidateTrades(cryptoCode)
if (trade.cryptoAtoms.eq(0)) {
logger.debug('rejecting 0 trade')
logger.debug('[%s] rejecting 0 trade', cryptoCode)
return
}
logger.debug('making a trade: %d', trade.cryptoAtoms.toString())
purchase(trade, function (err) {
if (err) {
logger.debug(err)
tradesQueues[cryptoCode].push(trade)
if (err.name !== 'orderTooSmall') logger.error(err)
}
logger.debug('Successful trade.')
})
}