Files
Superalgos/OrderBook.js
T
2018-02-14 13:00:19 +01:00

135 lines
3.2 KiB
JavaScript

function newOrderBook() {
/*
The order book object mantains the information of an order book of a certain market.
It is initially empty until it receives a request for orders from any of its clients. It tries to serve the request with already existing orders,
in case that request was done before, and if it wasnt, then it makes the request to a Server object and store the orders received.
*/
var orders = new Map(); // Here we store all the orders that we received from the server.
var marketId;
var server;
var datetimeRange;
var lastRangeLoaded;
var orderBook = {
setDatetimeRange: setDatetimeRange,
getOrdersOf: getOrdersOf,
initialize: initialize
};
return orderBook;
function initialize(market) {
marketId = market;
/* First we initialize the server that will allow us to retrieve data. */
server = newFileServer();
server.initialize();
}
function setDatetimeRange(newDatetimeRange) {
datetimeRange = newDatetimeRange;
lastRangeLoaded = false;
orders = new Map();
}
function getOrdersOf(datetime, callBackFunction) {
/*
Someone is requesting the order book to get updated with information of the datime provided. We request here the new
information the server knows about this datetime, but only if this information we dont have it already.
*/
if (lastRangeLoaded !== true) {
server.getOrderBook(datetimeRange.begin, datetimeRange.end, marketId, onServerResponded);
} else {
respondToCaller();
}
function onServerResponded(resultSet) {
lastRangeLoaded = true;
/*
Fresh data about the order book has just arrived from the server. We need to take it an put it in the right way.
*/
addOrders(resultSet);
respondToCaller();
}
function addOrders(resultSet) {
var totalRows = Object.keys(resultSet).length;
for (var i = 1; i <= totalRows; i++) {
var row = resultSet["row " + i];
/* We move the information from the result set to an order object, and use that from now on. */
var order = newOrder(row.Id, row.Type, row.Rate, row.AmountA, row.AmountB, new Date(row.DatetimeIn), new Date(row.DatetimeOut));
orders.set(order.id, order);
}
}
function respondToCaller() {
var ordersForDatetime = [];
/* We are ready to create an array of the orders for the date requested. For this we need to scan the whole Order Book. */
for (var order of orders.values()) {
var valueOfDatetimeIn = order.datetimeIn.valueOf();
var valueOfDatetimeOut = order.datetimeOut.valueOf();
var valueOfDatetime = datetime.valueOf();
if (valueOfDatetimeIn <= valueOfDatetime && valueOfDatetimeOut > valueOfDatetime) {
ordersForDatetime.push(order);
}
}
callBackFunction(ordersForDatetime);
}
}
}