Created
December 26, 2016 02:39
-
-
Save VictorTaelin/b662b4d75561cb2acdeb21bf68421fc3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module.exports = (function(){ | |
function Book(baseCurrency, token){ | |
var book = {}; | |
book.offers = {}; | |
book.offers[baseCurrency] = []; | |
book.offers[token] = []; | |
book.pair = [baseCurrency, token]; | |
return book; | |
}; | |
function offer(offer, book, debug){ | |
var trades = []; | |
var offers = book.offers[offer.offerToken]; | |
var asks = book.offers[offer.askToken]; | |
if (debug) | |
console.log( | |
"buy "+offer.askToken+"; "+ | |
"offer "+offer.offerAmount+" "+offer.offerToken+"; "+ | |
"price "+offer.askPrice+" "+offer.offerToken+"/"+offer.askToken); | |
while (offer.offerAmount > 0 && asks.length > 0 && offer.askPrice >= 1/asks[asks.length-1].askPrice){ | |
var ask = asks.pop(); // offer B, ask A | |
var dealPrice = 1/ask.askPrice; // A / B | |
var dealAmount = Math.min(offer.offerAmount, ask.offerAmount * dealPrice); // A | |
var trade = { | |
offerUser: offer.offerUser, | |
offerToken: offer.offerToken, | |
offerAmount: dealAmount, | |
askUser: ask.offerUser, | |
askToken: offer.askToken, | |
askAmount: dealAmount / dealPrice}; | |
if (debug){ | |
console.log("deal: "+dealPrice+" "+offer.offerToken+"/"+offer.askToken+" ("+(1/dealPrice)+")"); | |
console.log("give "+trade.offerAmount+" "+trade.offerToken+" for "+trade.askAmount+" "+trade.askToken); | |
}; | |
trades.push(trade); | |
offer.offerAmount -= trade.offerAmount; | |
ask.offerAmount -= trade.askAmount; | |
if (debug){ | |
console.log("now offer "+JSON.stringify(offer)); | |
console.log("now ask "+JSON.stringify(ask)); | |
}; | |
if (ask.offerAmount > 0) | |
book.offers[offer.askToken].push(ask); | |
}; | |
if (offer.offerAmount > 0){ | |
for (var i=0, l=offers.length; i<l; ++i){ | |
if (offer && offer.askPrice < offers[i].askPrice){ | |
offers.splice(i, 0, offer); | |
offer = null; | |
}; | |
}; | |
if (offer) | |
offers.push(offer); | |
}; | |
return {book: book, trades: trades}; | |
}; | |
function sell(user, amount, price, book){ | |
return offer({ | |
offerUser: user, | |
offerToken: book.pair[1], | |
offerAmount: amount, | |
askToken: book.pair[0], | |
askPrice: 1/price}, | |
book); | |
}; | |
function buy(user, amount, price, book){ | |
return offer({ | |
offerUser: user, | |
offerToken: book.pair[0], | |
offerAmount: amount * price, | |
askToken: book.pair[1], | |
askPrice: price}, | |
book); | |
}; | |
function show(book){ | |
function pad(str, len, rev){ | |
while (str.length < len) | |
str = rev ? str+" " : " "+str; | |
return str.slice(0,len); | |
}; | |
function num(num){ | |
return pad(num === 0 ? "" : num.toFixed(8), 14, 0); | |
}; | |
var str = ""; | |
str += "[ " + book.pair[0] + " / " + book.pair[1] + " MARKET ]\n"; | |
str += "| BUY ORDERS | SELL ORDERS |\n"; | |
str += "| USER | AMOUNT | PRICE | USER | AMOUNT | PRICE |\n"; | |
var as = book.offers[book.pair[0]].slice(0); | |
var bs = book.offers[book.pair[1]].slice(0); | |
for (var a = as.pop(), b = bs.pop(); a || b; a = as.pop(), b = bs.pop()){ | |
str += "| "+pad(a ? a.offerUser : "",8,1)+" "; | |
str += "| "+num(a ? (a.offerAmount/a.askPrice) : 0)+" "; | |
str += "| "+num(a ? a.askPrice : 0)+" "; | |
str += "| "+pad(b ? b.offerUser : "",8,1)+" "; | |
str += "| "+num(b ? b.offerAmount : 0)+" "; | |
str += "| "+num(b ? (1/b.askPrice) : 0)+" |\n"; | |
}; | |
return str; | |
}; | |
return { | |
Book: Book, | |
sell: sell, | |
buy: buy, | |
show: show}; | |
})(); |
Author
VictorTaelin
commented
Mar 4, 2017
•
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment