Skip to content

Commit f0c9b92

Browse files
committed
perf: replace dbly-linked-list with denque
1 parent 562f85c commit f0c9b92

File tree

11 files changed

+49
-194
lines changed

11 files changed

+49
-194
lines changed

package-lock.json

Lines changed: 14 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "hft-limit-order-book",
33
"version": "0.0.2",
4-
"description": "Ultra-fast Limit Order Book for high-frequency trading (HFT) for NodeJS.",
4+
"description": "Node.js Lmit Order Book for high-frequency trading (HFT).",
55
"main": "dist/cjs/index.js",
66
"module": "dist/esm/index.js",
77
"umd:main": "dist/umd/index.js",
@@ -56,7 +56,7 @@
5656
"url": "https://github.com/fasenderos/hft-limit-order-book/issues"
5757
},
5858
"dependencies": {
59-
"dbly-linked-list": "0.3.5",
59+
"denque": "2.1.0",
6060
"functional-red-black-tree": "1.0.1"
6161
},
6262
"devDependencies": {

src/orderbook.ts

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -205,28 +205,23 @@ export class OrderBook {
205205
}
206206
if (response.quantityLeft) {
207207
while (orderQueue.len() > 0 && response.quantityLeft > 0) {
208-
const headOrderEl = orderQueue.head()
209-
if (headOrderEl) {
210-
const headOrder = headOrderEl.getData<Order>()
211-
if (headOrder) {
212-
if (response.quantityLeft < headOrder.size) {
213-
response.partial = new Order(
214-
headOrder.id,
215-
headOrder.side,
216-
headOrder.size - response.quantityLeft,
217-
headOrder.price,
218-
headOrder.time
219-
)
208+
const headOrder = orderQueue.head()
209+
if (headOrder) {
210+
if (response.quantityLeft < headOrder.size) {
211+
response.partial = new Order(
212+
headOrder.id,
213+
headOrder.side,
214+
headOrder.size - response.quantityLeft,
215+
headOrder.price,
216+
headOrder.time
217+
)
220218

221-
response.partialQuantityProcessed = response.quantityLeft
222-
orderQueue.update(headOrderEl, headOrder, response.partial)
223-
response.quantityLeft = 0
224-
} else {
225-
response.quantityLeft = response.quantityLeft - headOrder.size
226-
response.done = response.done.concat(
227-
this.cancelOrder(headOrder.id)
228-
)
229-
}
219+
response.partialQuantityProcessed = response.quantityLeft
220+
orderQueue.update(headOrder, response.partial)
221+
response.quantityLeft = 0
222+
} else {
223+
response.quantityLeft = response.quantityLeft - headOrder.size
224+
response.done = response.done.concat(this.cancelOrder(headOrder.id))
230225
}
231226
}
232227
}

src/orderqueue.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
1-
import LinkedList, { Node, NodeData } from 'dbly-linked-list'
1+
import Denque from 'denque'
22
import { Order } from './order'
33

44
export class OrderQueue {
55
private _price: number
66
private _volume: number
7-
private orders: LinkedList
7+
private orders: Denque<Order>
88
private ordersMap: { [key: string]: number } = {}
99

1010
constructor(price: number) {
1111
this._price = price
1212
this._volume = 0
13-
this.orders = new LinkedList()
13+
this.orders = new Denque<Order>()
1414
}
1515

1616
// returns the number of orders in queue
1717
len = (): number => {
18-
return this.orders.getSize()
18+
return this.orders.length
1919
}
2020

21-
toArray = (): NodeData[] => {
21+
toArray = (): Order[] => {
2222
return this.orders.toArray()
2323
}
2424

@@ -33,34 +33,34 @@ export class OrderQueue {
3333
}
3434

3535
// returns top order in queue
36-
head = () => {
37-
return this.orders.getHeadNode()
36+
head = (): Order | undefined => {
37+
return this.orders.peekFront()
3838
}
3939

4040
// returns bottom order in queue
41-
tail = () => {
42-
return this.orders.getTailNode()
41+
tail = (): Order | undefined => {
42+
return this.orders.peekBack()
4343
}
4444

4545
// adds order to tail of the queue
4646
append = (order: Order): Order => {
4747
this._volume += order.size
48-
this.orders.insert(order)
49-
this.ordersMap[order.id] = this.orders.getSize() - 1
48+
this.orders.push(order)
49+
this.ordersMap[order.id] = this.orders.length - 1
5050
return order
5151
}
5252

5353
// sets up new order to list value
54-
update = (node: Node, nodeData: Order, order: Order) => {
55-
this._volume -= nodeData.size
56-
this._volume += order.size
57-
node.data = order
54+
update = (oldOrder: Order, newOrder: Order) => {
55+
this._volume -= oldOrder.size
56+
this._volume += newOrder.size
57+
oldOrder = newOrder
5858
}
5959

6060
// removes order from the queue
6161
remove = (order: Order) => {
6262
this._volume -= order.size
63-
this.orders.removeAt(this.ordersMap[order.id])
63+
this.orders.removeOne(this.ordersMap[order.id])
6464
delete this.ordersMap[order.id]
6565
}
6666
}

src/orderside.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import createRBTree from 'functional-red-black-tree'
2-
import { NodeData } from 'dbly-linked-list'
32
import { Order } from './order'
43
import { OrderQueue } from './orderqueue'
54

@@ -95,7 +94,7 @@ export class OrderSide {
9594

9695
// returns all orders
9796
orders = () => {
98-
let orders: NodeData[] = []
97+
let orders: Order[] = []
9998
for (const price in this.prices) {
10099
if (Object.prototype.hasOwnProperty.call(this.prices, price)) {
101100
const allOrders = this.prices[price].toArray()

types/errors.d.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

types/order.d.ts

Lines changed: 0 additions & 29 deletions
This file was deleted.

types/orderbook.d.ts

Lines changed: 0 additions & 39 deletions
This file was deleted.

types/orderqueue.d.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

types/orderside.d.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)