mango-v4-ui/utils/tradeForm.ts

86 lines
1.9 KiB
TypeScript
Raw Normal View History

import { OrderbookL2 } from 'types'
2022-09-25 19:02:58 -07:00
export const calculateLimitPriceForMarketOrder = (
orderBook: OrderbookL2,
2022-09-25 19:02:58 -07:00
size: number,
2022-11-17 14:08:45 -08:00
side: 'buy' | 'sell'
2022-09-25 19:02:58 -07:00
): number => {
const orders = side === 'buy' ? orderBook.asks : orderBook.bids
let acc = 0
let selectedOrder
2022-11-19 17:40:06 -08:00
const orderSize = size
2022-09-25 19:02:58 -07:00
for (const order of orders) {
acc += order[1]
if (acc >= orderSize) {
2022-09-25 19:02:58 -07:00
selectedOrder = order
break
}
}
if (!selectedOrder) {
2023-01-19 12:31:45 -08:00
throw new Error(
'Unable to place market order for this order size. Please retry.'
)
2022-09-25 19:02:58 -07:00
}
if (side === 'buy') {
return selectedOrder[0] * 1.05
} else {
return selectedOrder[0] * 0.95
}
}
2022-11-25 02:10:23 -08:00
2023-01-02 11:50:09 -08:00
export const calculateEstPriceForBaseSize = (
orderBook: OrderbookL2,
size: number,
side: 'buy' | 'sell'
): number => {
const orders = side === 'buy' ? orderBook.asks : orderBook.bids
let acc = 0
let selectedOrder
const orderSize = size
for (const order of orders) {
acc += order[1]
if (acc >= orderSize) {
selectedOrder = order
break
}
}
if (!selectedOrder) {
throw new Error('Unable to calculate market order. Please retry.')
}
if (side === 'buy') {
return selectedOrder[0]
} else {
return selectedOrder[0]
}
}
2022-11-25 02:10:23 -08:00
export const calculateSlippage = (
orderBook: OrderbookL2,
2022-11-25 02:10:23 -08:00
size: number,
side: 'buy' | 'sell',
markPrice: number
): number => {
const bb = orderBook?.bids?.length > 0 && Number(orderBook.bids[0][0])
const ba = orderBook?.asks?.length > 0 && Number(orderBook.asks[0][0])
const referencePrice = bb && ba ? (bb + ba) / 2 : markPrice
2022-12-14 10:48:13 -08:00
if (Number(size)) {
2023-01-02 11:50:09 -08:00
const estimatedPrice = calculateEstPriceForBaseSize(
orderBook,
Number(size),
side
)
2022-11-25 02:10:23 -08:00
2022-12-14 10:48:13 -08:00
const slippageAbs =
Number(size) > 0 ? Math.abs(estimatedPrice - referencePrice) : 0
2023-01-02 11:50:09 -08:00
2022-12-14 10:48:13 -08:00
const slippageRel = (slippageAbs / referencePrice) * 100
return slippageRel
}
return 0
2022-11-25 02:10:23 -08:00
}