improve slippage calc for spot trades
This commit is contained in:
parent
fc161c1906
commit
09c4d817e7
|
@ -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
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue