Skip to content

Commit

Permalink
Merge pull request #347 from fasenderos/remove-bignumber
Browse files Browse the repository at this point in the history
deps: removed bignumber.js for size
  • Loading branch information
fasenderos authored Jan 27, 2024
2 parents 02f885e + f0e912a commit 2c061dc
Show file tree
Hide file tree
Showing 10 changed files with 111 additions and 143 deletions.
14 changes: 0 additions & 14 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
"prepare": "husky install"
},
"dependencies": {
"bignumber.js": "^9.1.1",
"denque": "2.1.0",
"functional-red-black-tree": "1.0.1"
},
Expand Down
13 changes: 6 additions & 7 deletions src/order.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import BigNumber from 'bignumber.js'
import { Side } from './side'

interface IOrder {
Expand Down Expand Up @@ -27,14 +26,14 @@ export enum TimeInForce {
export class Order {
private readonly _id: string
private readonly _side: Side
private _size: BigNumber
private _size: number
private _price: number
private _time: number
private readonly _isMaker: boolean
constructor (
orderId: string,
side: Side,
size: BigNumber,
size: number,
price: number,
time?: number,
isMaker?: boolean
Expand Down Expand Up @@ -68,12 +67,12 @@ export class Order {
}

// Getter for order size
get size (): BigNumber {
get size (): number {
return this._size
}

// Setter for order size
set size (size: BigNumber) {
set size (size: number) {
this._size = size
}

Expand Down Expand Up @@ -106,7 +105,7 @@ export class Order {
toJSON = (): string => JSON.stringify({
id: this._id,
side: this._side,
size: this._size.toNumber(),
size: this._size,
price: this._price,
time: this._time,
isMaker: this._isMaker
Expand All @@ -116,7 +115,7 @@ export class Order {
toObject = (): IOrder => ({
id: this._id,
side: this._side,
size: this._size.toNumber(),
size: this._size,
price: this._price,
time: this._time,
isMaker: this._isMaker
Expand Down
43 changes: 18 additions & 25 deletions src/orderbook.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import BigNumber from 'bignumber.js'
import { ERROR, CustomError } from './errors'
import { Order, OrderType, OrderUpdatePrice, OrderUpdateSize, TimeInForce } from './order'
import { OrderQueue } from './orderqueue'
Expand Down Expand Up @@ -226,7 +225,7 @@ export class OrderBook {
const order = new Order(
orderID,
side,
new BigNumber(quantityToTrade),
quantityToTrade,
price,
Date.now(),
true
Expand All @@ -241,9 +240,8 @@ export class OrderBook {
let totalPrice = 0

response.done.forEach((order: Order) => {
const ordrSize: number = order.size.toNumber()
totalQuantity += ordrSize
totalPrice += order.price * ordrSize
totalQuantity += order.size
totalPrice += order.price * order.size
})
if (response.partialQuantityProcessed > 0 && response.partial !== null) {
totalQuantity += response.partialQuantityProcessed
Expand All @@ -255,7 +253,7 @@ export class OrderBook {
new Order(
orderID,
side,
new BigNumber(size),
size,
totalPrice / totalQuantity,
Date.now()
)
Expand Down Expand Up @@ -300,7 +298,7 @@ export class OrderBook {
const result = this.limit(
order.side,
order.id,
orderUpdate.size ?? order.size.toNumber(),
orderUpdate.size ?? order.size,
newPrice
)
updatedOrder = result.partial?.id === order.id ? result.partial : result.done[result.done.length - 1]
Expand All @@ -312,7 +310,7 @@ export class OrderBook {
}
} else if (
orderUpdate.size !== undefined &&
orderUpdate.size !== order.size.toNumber()
orderUpdate.size !== order.size
) {
// Quantity changed. Price is the same.
const newSize = orderUpdate.size
Expand All @@ -336,7 +334,7 @@ export class OrderBook {
const result = this.limit(
order.side,
order.id,
orderUpdate.size ?? order.size.toNumber(),
orderUpdate.size ?? order.size,
newPrice
)
updatedOrder = result.partial?.id === order.id ? result.partial : result.done[result.done.length - 1]
Expand All @@ -348,7 +346,7 @@ export class OrderBook {
}
} else if (
orderUpdate.size !== undefined &&
orderUpdate.size !== order.size.toNumber()
orderUpdate.size !== order.size
) {
// Quantity changed. Price is the same.
const newSize = orderUpdate.size
Expand Down Expand Up @@ -392,10 +390,10 @@ export class OrderBook {
const asks: Array<[number, number]> = []
const bids: Array<[number, number]> = []
this.asks.priceTree().forEach((levelPrice: number, level: OrderQueue) => {
asks.push([levelPrice, level.volume().toNumber()])
asks.push([levelPrice, level.volume()])
})
this.bids.priceTree().forEach((levelPrice: number, level: OrderQueue) => {
bids.push([levelPrice, level.volume().toNumber()])
bids.push([levelPrice, level.volume()])
})
return [asks, bids]
}
Expand Down Expand Up @@ -431,7 +429,7 @@ export class OrderBook {
}

while (size > 0 && level !== undefined) {
const levelVolume = level.volume().toNumber()
const levelVolume = level.volume()
const levelPrice = level.price()
if (this.greaterThanOrEqual(size, levelVolume)) {
price += levelPrice * levelVolume
Expand Down Expand Up @@ -473,12 +471,11 @@ export class OrderBook {
while (orderQueue.len() > 0 && response.quantityLeft > 0) {
const headOrder = orderQueue.head()
if (headOrder !== undefined) {
const headSize = headOrder.size.toNumber()
if (response.quantityLeft < headSize) {
if (response.quantityLeft < headOrder.size) {
response.partial = new Order(
headOrder.id,
headOrder.side,
new BigNumber(headSize - response.quantityLeft),
headOrder.size - response.quantityLeft,
headOrder.price,
headOrder.time,
true
Expand All @@ -488,7 +485,7 @@ export class OrderBook {
orderQueue.update(headOrder, response.partial)
response.quantityLeft = 0
} else {
response.quantityLeft = response.quantityLeft - headSize
response.quantityLeft = response.quantityLeft - headOrder.size
const canceledOrder = this.cancel(headOrder.id)
if (canceledOrder !== undefined) response.done.push(canceledOrder)
}
Expand All @@ -514,16 +511,14 @@ export class OrderBook {
size: number,
price: number
): boolean => {
const insufficientSideVolume: boolean = orderSide.volume().lt(size)
if (insufficientSideVolume) {
if (orderSide.volume() < size) {
return false
}

let cumulativeSize = 0
orderSide.priceTree().forEach((_: number, level: OrderQueue) => {
if (price >= level.price() && cumulativeSize < size) {
const volume: number = level.volume().toNumber()
cumulativeSize += volume
cumulativeSize += level.volume()
} else {
return true // break the loop
}
Expand All @@ -536,16 +531,14 @@ export class OrderBook {
size: number,
price: number
): boolean => {
const insufficientSideVolume: boolean = orderSide.volume().lt(size)
if (insufficientSideVolume) {
if (orderSide.volume() < size) {
return false
}

let cumulativeSize = 0
orderSide.priceTree().forEach((_: number, level: OrderQueue) => {
if (price <= level.price() && cumulativeSize < size) {
const volume: number = level.volume().toNumber()
cumulativeSize += volume
cumulativeSize += level.volume()
} else {
return true // break the loop
}
Expand Down
19 changes: 9 additions & 10 deletions src/orderqueue.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
import BigNumber from 'bignumber.js'
import Denque from 'denque'
import { Order } from './order'

export class OrderQueue {
private readonly _price: number
private _volume: BigNumber
private _volume: number
private readonly _orders: Denque<Order>
// { orderID: index } index in denque
private _ordersMap: { [key: string]: number } = {}

constructor (price: number) {
this._price = price
this._volume = new BigNumber(0)
this._volume = 0
this._orders = new Denque<Order>()
}

Expand All @@ -30,7 +29,7 @@ export class OrderQueue {
}

// returns price level of the queue
volume = (): BigNumber => {
volume = (): number => {
return this._volume
}

Expand All @@ -46,15 +45,16 @@ export class OrderQueue {

// adds order to tail of the queue
append = (order: Order): Order => {
this._volume = this._volume.plus(order.size)
this._volume += order.size
this._orders.push(order)
this._ordersMap[order.id] = this._orders.length - 1
return order
}

// sets up new order to list value
update = (oldOrder: Order, newOrder: Order): void => {
this._volume = this._volume.minus(oldOrder.size).plus(newOrder.size)
this._volume -= oldOrder.size
this._volume += newOrder.size
// Remove old order from head
this._orders.shift()
/* eslint-disable @typescript-eslint/no-dynamic-delete */
Expand All @@ -66,7 +66,7 @@ export class OrderQueue {

// removes order from the queue
remove = (order: Order): void => {
this._volume = this._volume.minus(order.size)
this._volume -= order.size
const deletedOrderIndex = this._ordersMap[order.id]
this._orders.removeOne(deletedOrderIndex)
delete this._ordersMap[order.id]
Expand All @@ -79,9 +79,8 @@ export class OrderQueue {
}

updateOrderSize = (order: Order, size: number): void => {
const newSize = new BigNumber(size)
this._volume = this._volume.plus(newSize.minus(order.size)) // update volume
order.size = newSize
this._volume += size - order.size // update volume
order.size = size
order.time = Date.now()
}
}
Loading

0 comments on commit 2c061dc

Please sign in to comment.