sfccxt
Version:
A JavaScript / Python / PHP cryptocurrency trading library with support for 130+ exchanges
393 lines (334 loc) • 16.1 kB
JavaScript
'use strict';
const { OrderBook, IndexedOrderBook, CountedOrderBook } = require ('../../base/OrderBook');
const assert = require ('assert');
function equals (a, b) {
if (a.length !== b.length) {
return false;
}
for (const prop in a) {
if (Array.isArray (a[prop])) {
if (!equals (a[prop], b[prop])) {
return false;
}
}
else if (a[prop] !== b[prop]) {
return false;
}
}
return true;
}
// --------------------------------------------------------------------------------------------------------------------
const orderBookInput = {
'bids': [ [ 10.0, 10 ], [ 9.1, 11 ], [ 8.2, 12 ], [ 7.3, 13 ], [ 6.4, 14 ], [ 4.5, 13 ], [ 4.5, 0 ] ],
'asks': [ [ 16.6, 10 ], [ 15.5, 11 ], [ 14.4, 12 ], [ 13.3, 13 ], [ 12.2, 14 ], [ 11.1, 13 ] ],
'timestamp': 1574827239000,
'nonce': 69,
'symbol': undefined,
};
const orderBookTarget = {
'bids': [ [ 10.0, 10 ], [ 9.1, 11 ], [ 8.2, 12 ], [ 7.3, 13 ], [ 6.4, 14 ] ],
'asks': [ [ 11.1, 13 ], [ 12.2, 14 ], [ 13.3, 13 ], [ 14.4, 12 ], [ 15.5, 11 ], [ 16.6, 10 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const storeBid = {
'bids': [ [ 10.0, 10 ], [ 9.1, 11 ], [ 8.2, 12 ], [ 7.3, 13 ], [ 6.4, 14 ], [ 3, 4 ] ],
'asks': [ [ 11.1, 13 ], [ 12.2, 14 ], [ 13.3, 13 ], [ 14.4, 12 ], [ 15.5, 11 ], [ 16.6, 10 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const limitedOrderBookTarget = {
'bids': [ [ 10.0, 10 ], [ 9.1, 11 ], [ 8.2, 12 ], [ 7.3, 13 ], [ 6.4, 14 ] ],
'asks': [ [ 11.1, 13 ], [ 12.2, 14 ], [ 13.3, 13 ], [ 14.4, 12 ], [ 15.5, 11 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const limitedDeletedOrderBookTarget = {
'bids': [ [ 10.0, 10 ], [ 9.1, 11 ], [ 8.2, 12 ], [ 7.3, 13 ], [ 6.4, 14 ] ],
'asks': [ [ 11.1, 13 ], [ 12.2, 14 ], [ 13.3, 13 ], [ 14.4, 12 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const indexedOrderBookInput = {
'bids': [ [ 10.0, 10, '1234' ], [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ], [ 4.5, 13, '1239' ] ],
'asks': [ [ 16.6, 10, '1240' ], [ 15.5, 11, '1241' ], [ 14.4, 12, '1242' ], [ 13.3, 13, '1243' ], [ 12.2, 14, '1244' ], [ 11.1, 13, '1244' ] ],
'timestamp': 1574827239000,
'nonce': 69,
'symbol': undefined,
};
const indexedOrderBookTarget = {
'bids': [ [ 10.0, 10, '1234' ], [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ], [ 4.5, 13, '1239' ] ],
'asks': [ [ 11.1, 13, '1244' ], [ 13.3, 13, '1243' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const limitedIndexedOrderBookTarget = {
'bids': [ [ 10.0, 10, '1234' ], [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ] ],
'asks': [ [ 11.1, 13, '1244' ], [ 13.3, 13, '1243' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const incrementalIndexedOrderBookTarget = {
'bids': [ [ 10.0, 10, '1234' ], [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ], [ 4.5, 13, '1239' ] ],
'asks': [ [ 11.1, 27, '1244' ], [ 13.3, 13, '1243' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const incrementalIndexedOrderBookDeletedTarget = {
'bids': [ [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ], [ 4.5, 13, '1239' ] ],
'asks': [ [ 11.1, 27, '1244' ], [ 13.3, 13, '1243' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const limitedIncrementalIndexedOrderBookTarget = {
'bids': [ [ 10.0, 10, '1234' ], [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ] ],
'asks': [ [ 11.1, 27, '1244' ], [ 13.3, 13, '1243' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const storedIncrementalIndexedOrderBookTarget = {
'bids': [ [ 10.0, 13, '1234' ], [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ], [ 4.5, 13, '1239' ] ],
'asks': [ [ 11.1, 27, '1244' ], [ 13.3, 13, '1243' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const anotherStoredIncrementalIndexedOrderBookTarget = {
'bids': [ [ 10.2, 13, '1234' ], [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ], [ 4.5, 13, '1239' ] ],
'asks': [ [ 11.1, 27, '1244' ], [ 13.3, 13, '1243' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const overwrite1234 = {
'bids': [ [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ], [ 4.5, 13, '1239' ] ],
'asks': [ [ 11.1, 13, '1244' ], [ 13.3, 13, '1243' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const overwrite1244 = {
'bids': [ [ 10.0, 10, '1234' ], [ 9.1, 11, '1235' ], [ 8.2, 12, '1236' ], [ 7.3, 13, '1237' ], [ 6.4, 14, '1238' ], [ 4.5, 13, '1239' ] ],
'asks': [ [ 13.3, 13, '1243' ], [ 13.5, 13, '1244' ], [ 14.4, 12, '1242' ], [ 15.5, 11, '1241' ], [ 16.6, 10, '1240' ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const countedOrderBookInput = {
'bids': [ [ 10.0, 10, 1 ], [ 9.1, 11, 1 ], [ 8.2, 12, 1 ], [ 7.3, 13, 1 ], [ 7.3, 0, 1 ], [ 6.4, 14, 5 ], [ 4.5, 13, 5 ], [ 4.5, 13, 1 ], [ 4.5, 13, 0 ] ],
'asks': [ [ 16.6, 10, 1 ], [ 15.5, 11, 1 ], [ 14.4, 12, 1 ], [ 13.3, 13, 3 ], [ 12.2, 14, 3 ], [ 11.1, 13, 3 ], [ 11.1, 13, 12 ] ],
'timestamp': 1574827239000,
'nonce': 69,
'symbol': undefined,
};
const countedOrderBookTarget = {
'bids': [ [ 10.0, 10, 1 ], [ 9.1, 11, 1 ], [ 8.2, 12, 1 ], [ 6.4, 14, 5 ] ],
'asks': [ [ 11.1, 13, 12 ], [ 12.2, 14, 3 ], [ 13.3, 13, 3 ], [ 14.4, 12, 1 ], [ 15.5, 11, 1 ], [ 16.6, 10, 1 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const storedCountedOrderbookTarget = {
'bids': [ [ 10.0, 10, 1 ], [ 9.1, 11, 1 ], [ 8.2, 12, 1 ], [ 6.4, 14, 5 ], [ 1, 1, 6 ] ],
'asks': [ [ 11.1, 13, 12 ], [ 12.2, 14, 3 ], [ 13.3, 13, 3 ], [ 14.4, 12, 1 ], [ 15.5, 11, 1 ], [ 16.6, 10, 1 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const limitedCountedOrderBookTarget = {
'bids': [ [ 10.0, 10, 1 ], [ 9.1, 11, 1 ], [ 8.2, 12, 1 ], [ 6.4, 14, 5 ] ],
'asks': [ [ 11.1, 13, 12 ], [ 12.2, 14, 3 ], [ 13.3, 13, 3 ], [ 14.4, 12, 1 ], [ 15.5, 11, 1 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const incrementalOrderBookInput = {
'bids': [ [ 10.0, 1 ], [ 10.0, 2 ], [ 9.1, 0 ], [ 8.2, 1 ], [ 7.3, 1 ], [ 6.4, 1 ] ],
'asks': [ [ 11.1, 5 ], [ 11.1, -6 ], [ 11.1, 2 ], [ 12.2, 10 ], [ 12.2, -9.875 ], [ 12.2, 0 ], [ 13.3, 3 ], [ 14.4, 4 ], [ 15.5, 1 ], [ 16.6, 3 ] ],
'timestamp': 1574827239000,
'nonce': 69,
'symbol': undefined,
};
const incremetalOrderBookTarget = {
'bids': [ [ 10.0, 3 ], [ 8.2, 1 ], [ 7.3, 1 ], [ 6.4, 1 ] ],
'asks': [ [ 11.1, 2 ], [ 12.2, 0.125 ], [ 13.3, 3 ], [ 14.4, 4 ], [ 15.5, 1 ], [ 16.6, 3 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const limitedIncremetalOrderBookTarget = {
'bids': [ [ 10.0, 3 ], [ 8.2, 1 ], [ 7.3, 1 ], [ 6.4, 1 ] ],
'asks': [ [ 11.1, 2 ], [ 12.2, 0.125 ], [ 13.3, 3 ], [ 14.4, 4 ], [ 15.5, 1 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const storedIncremetalOrderBookTarget = {
'bids': [ [ 10.0, 3 ], [ 8.2, 1 ], [ 7.3, 1 ], [ 6.4, 1 ], [ 3, 3 ] ],
'asks': [ [ 11.1, 2 ], [ 12.2, 0.125 ], [ 13.3, 3 ], [ 14.4, 4 ], [ 15.5, 1 ], [ 16.6, 3 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const doubleStoredIncremetalOrderBookTarget = {
'bids': [ [ 10.0, 3 ], [ 8.2, 1 ], [ 7.3, 1 ], [ 6.4, 1 ], [ 3, 10 ] ],
'asks': [ [ 11.1, 2 ], [ 12.2, 0.125 ], [ 13.3, 3 ], [ 14.4, 4 ], [ 15.5, 1 ], [ 16.6, 3 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
const negativeStoredIncremetalOrderBookTarget = {
'bids': [ [ 10.0, 3 ], [ 8.2, 1 ], [ 7.3, 1 ], [ 6.4, 1 ] ],
'asks': [ [ 11.1, 2 ], [ 12.2, 0.125 ], [ 13.3, 3 ], [ 14.4, 4 ], [ 16.6, 3 ] ],
'timestamp': 1574827239000,
'datetime': '2019-11-27T04:00:39.000Z',
'nonce': 69,
'symbol': undefined,
};
let bids = undefined;
let asks = undefined;
// --------------------------------------------------------------------------------------------------------------------
const orderBook = new OrderBook (orderBookInput);
const limited = new OrderBook (orderBookInput, 5);
orderBook.limit ();
assert (equals (orderBook, orderBookTarget));
limited.limit ();
assert (equals (limited, limitedOrderBookTarget));
orderBook.limit ();
assert (equals (orderBook, orderBookTarget));
bids = orderBook['bids'];
bids.store (1000, 0);
orderBook.limit ();
assert (equals (orderBook, orderBookTarget));
bids.store (3, 4);
orderBook.limit ();
assert (equals (orderBook, storeBid));
bids.store (3, 0);
orderBook.limit ();
assert (equals (orderBook, orderBookTarget));
asks = limited['asks'];
asks.store (15.5, 0);
limited.limit ();
assert (equals (limited, limitedDeletedOrderBookTarget));
// --------------------------------------------------------------------------------------------------------------------
let indexedOrderBook = new IndexedOrderBook (indexedOrderBookInput);
const limitedIndexedOrderBook = new IndexedOrderBook (indexedOrderBookInput, 5);
indexedOrderBook.limit ();
assert (equals (indexedOrderBook, indexedOrderBookTarget));
limitedIndexedOrderBook.limit ();
assert (equals (limitedIndexedOrderBook, limitedIndexedOrderBookTarget));
indexedOrderBook.limit ();
assert (equals (indexedOrderBook, indexedOrderBookTarget));
bids = indexedOrderBook['bids'];
bids.store (1000, 0, '12345');
assert (equals (indexedOrderBook, indexedOrderBookTarget));
bids.store (10, 0, '1234');
indexedOrderBook.limit ();
assert (equals (indexedOrderBook, overwrite1234));
indexedOrderBook = new IndexedOrderBook (indexedOrderBookInput);
asks = indexedOrderBook['asks'];
asks.store (13.5, 13, '1244');
indexedOrderBook.limit ();
assert (equals (indexedOrderBook, overwrite1244));
// --------------------------------------------------------------------------------------------------------------------
const countedOrderBook = new CountedOrderBook (countedOrderBookInput);
const limitedCountedOrderBook = new CountedOrderBook (countedOrderBookInput, 5);
countedOrderBook.limit ();
assert (equals (countedOrderBook, countedOrderBookTarget));
limitedCountedOrderBook.limit ();
assert (equals (limitedCountedOrderBook, limitedCountedOrderBookTarget));
countedOrderBook.limit ();
assert (equals (countedOrderBook, countedOrderBookTarget));
bids = countedOrderBook['bids'];
bids.store (5, 0, 6);
countedOrderBook.limit ();
assert (equals (countedOrderBook, countedOrderBookTarget));
bids.store (1, 1, 6);
countedOrderBook.limit ();
assert (equals (countedOrderBook, storedCountedOrderbookTarget));
// --------------------------------------------------------------------------------------------------------------------
// let incrementalOrderBook = new IncrementalOrderBook (incrementalOrderBookInput);
// const limitedIncrementalOrderBook = new IncrementalOrderBook (incrementalOrderBookInput, 5);
// incrementalOrderBook.limit ();
// assert (equals (incrementalOrderBook, incremetalOrderBookTarget));
// incrementalOrderBook.limit (5);
// limitedIncrementalOrderBook.limit ();
// assert (equals (incrementalOrderBook, limitedIncremetalOrderBookTarget));
// assert (equals (limitedIncrementalOrderBook, limitedIncremetalOrderBookTarget));
// incrementalOrderBook.limit ();
// assert (equals (incrementalOrderBook, incremetalOrderBookTarget));
// bids = incrementalOrderBook['bids'];
// bids.store (3, 3);
// incrementalOrderBook.limit ();
// assert (equals (incrementalOrderBook, storedIncremetalOrderBookTarget));
// bids.store (3, 7);
// incrementalOrderBook.limit ();
// assert (equals (incrementalOrderBook, doubleStoredIncremetalOrderBookTarget));
// bids.store (17, 0);
// assert (equals (incrementalOrderBook, doubleStoredIncremetalOrderBookTarget));
// incrementalOrderBook = new IncrementalOrderBook (incrementalOrderBookInput);
// asks = incrementalOrderBook['asks'];
// asks.store (15.5, -10);
// incrementalOrderBook.limit ();
// assert (equals (incrementalOrderBook, negativeStoredIncremetalOrderBookTarget));
// --------------------------------------------------------------------------------------------------------------------
// let incrementalIndexedOrderBook = new IncrementalIndexedOrderBook (indexedOrderBookInput);
// const limitedIncrementalIndexedOrderBook = new IncrementalIndexedOrderBook (indexedOrderBookInput, 5);
// incrementalIndexedOrderBook.limit ();
// assert (equals (incrementalIndexedOrderBook, incrementalIndexedOrderBookTarget));
// incrementalIndexedOrderBook.limit (5);
// limitedIncrementalIndexedOrderBook.limit ();
// assert (equals (incrementalIndexedOrderBook, limitedIncrementalIndexedOrderBookTarget));
// assert (equals (limitedIncrementalIndexedOrderBook, limitedIncrementalIndexedOrderBookTarget));
// incrementalIndexedOrderBook.limit ();
// assert (equals (incrementalIndexedOrderBook, incrementalIndexedOrderBookTarget));
// bids = incrementalIndexedOrderBook['bids'];
// bids.store (5, 0, 'xxyy');
// incrementalIndexedOrderBook.limit ();
// assert (equals (incrementalIndexedOrderBook, incrementalIndexedOrderBookTarget));
// bids.store (10.0, 3, '1234'); // price does match merge size
// incrementalIndexedOrderBook.limit ();
// assert (equals (incrementalIndexedOrderBook, storedIncrementalIndexedOrderBookTarget));
// bids.store (0, 0, '1234');
// incrementalIndexedOrderBook.limit ();
// assert (equals (incrementalIndexedOrderBook, incrementalIndexedOrderBookDeletedTarget));
// incrementalIndexedOrderBook = new IncrementalIndexedOrderBook (indexedOrderBookInput);
// bids = incrementalIndexedOrderBook['bids'];
// bids.store (10.2, 3, '1234'); // price does not match merge size
// incrementalIndexedOrderBook.limit ();
// assert (equals (incrementalIndexedOrderBook, anotherStoredIncrementalIndexedOrderBookTarget));
// --------------------------------------------------------------------------------------------------------------------
const resetBook = new OrderBook (storeBid);
resetBook.limit ();
resetBook.reset (orderBookInput);
resetBook.limit ();
assert (equals (resetBook, orderBookTarget));