improve slippage calc for spot trades

This commit is contained in:
tjs 2023-01-02 14:50:09 -05:00
parent fc161c1906
commit 09c4d817e7
4 changed files with 40 additions and 7 deletions

View File

@ -4,7 +4,7 @@ import useMarkPrice from 'hooks/useMarkPrice'
import useSelectedMarket from 'hooks/useSelectedMarket' import useSelectedMarket from 'hooks/useSelectedMarket'
import { useTranslation } from 'next-i18next' import { useTranslation } from 'next-i18next'
import { useMemo } from 'react' import { useMemo } from 'react'
import { notify } from 'utils/notifications' // import { notify } from 'utils/notifications'
import { calculateSlippage } from 'utils/tradeForm' import { calculateSlippage } from 'utils/tradeForm'
const Slippage = () => { const Slippage = () => {
@ -25,7 +25,8 @@ const Slippage = () => {
) )
} }
} catch (e) { } catch (e) {
notify({ type: 'info', title: 'Unable to calculate slippage' }) console.error({ type: 'info', title: 'Unable to calculate slippage' })
return 100_000
} }
return 0 return 0
}, [tradeForm, markPrice, selectedMarket]) }, [tradeForm, markPrice, selectedMarket])
@ -44,7 +45,7 @@ const Slippage = () => {
: 'text-th-error' : 'text-th-error'
}`} }`}
> >
{slippage.toFixed(2)}% {slippage === 100_000 ? 'Unavailable' : `${slippage.toFixed(2)}&`}
</p> </p>
</div> </div>
) : null ) : null

View File

@ -69,7 +69,7 @@ const TradeSummary = ({
: simulatedHealthRatio < 0 : simulatedHealthRatio < 0
? 0 ? 0
: Math.trunc(simulatedHealthRatio) : Math.trunc(simulatedHealthRatio)
}, [group, mangoAccount, selectedMarket, tradeForm.baseSize, tradeForm.side]) }, [group, mangoAccount, selectedMarket, tradeForm])
return ( return (
<div className="space-y-2 px-3 md:px-4"> <div className="space-y-2 px-3 md:px-4">

View File

@ -1,8 +1,9 @@
import mangoStore from '@store/mangoStore' import mangoStore from '@store/mangoStore'
import { useEffect } from 'react' import { useEffect } from 'react'
const set = mangoStore.getState().set
export default function useMarkPrice() { export default function useMarkPrice() {
const set = mangoStore((s) => s.set)
const markPrice = mangoStore((s) => s.selectedMarket.markPrice) const markPrice = mangoStore((s) => s.selectedMarket.markPrice)
const orderbook = mangoStore((s) => s.selectedMarket.orderbook) const orderbook = mangoStore((s) => s.selectedMarket.orderbook)
const fills = mangoStore((s) => s.selectedMarket.fills) const fills = mangoStore((s) => s.selectedMarket.fills)
@ -28,7 +29,9 @@ export default function useMarkPrice() {
state.selectedMarket.markPrice = newMarkPrice state.selectedMarket.markPrice = newMarkPrice
}) })
} }
}, [orderbook, trades]) }, [orderbook, trades, markPrice])
console.log('markPrice', markPrice)
return markPrice return markPrice
} }

View File

@ -28,6 +28,34 @@ export const calculateLimitPriceForMarketOrder = (
} }
} }
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]
}
}
export const calculateSlippage = ( export const calculateSlippage = (
orderBook: OrderbookL2, orderBook: OrderbookL2,
size: number, size: number,
@ -39,7 +67,7 @@ export const calculateSlippage = (
const referencePrice = bb && ba ? (bb + ba) / 2 : markPrice const referencePrice = bb && ba ? (bb + ba) / 2 : markPrice
if (Number(size)) { if (Number(size)) {
const estimatedPrice = calculateLimitPriceForMarketOrder( const estimatedPrice = calculateEstPriceForBaseSize(
orderBook, orderBook,
Number(size), Number(size),
side side
@ -47,6 +75,7 @@ export const calculateSlippage = (
const slippageAbs = const slippageAbs =
Number(size) > 0 ? Math.abs(estimatedPrice - referencePrice) : 0 Number(size) > 0 ? Math.abs(estimatedPrice - referencePrice) : 0
const slippageRel = (slippageAbs / referencePrice) * 100 const slippageRel = (slippageAbs / referencePrice) * 100
return slippageRel return slippageRel
} }