From 09c4d817e70ef0db4607fd492b222289d017bb0e Mon Sep 17 00:00:00 2001
From: tjs
Date: Mon, 2 Jan 2023 14:50:09 -0500
Subject: [PATCH] improve slippage calc for spot trades
---
components/trade/Slippage.tsx | 7 ++++---
components/trade/TradeSummary.tsx | 2 +-
hooks/useMarkPrice.tsx | 7 +++++--
utils/tradeForm.ts | 31 ++++++++++++++++++++++++++++++-
4 files changed, 40 insertions(+), 7 deletions(-)
diff --git a/components/trade/Slippage.tsx b/components/trade/Slippage.tsx
index 30656f31..e61748e6 100644
--- a/components/trade/Slippage.tsx
+++ b/components/trade/Slippage.tsx
@@ -4,7 +4,7 @@ import useMarkPrice from 'hooks/useMarkPrice'
import useSelectedMarket from 'hooks/useSelectedMarket'
import { useTranslation } from 'next-i18next'
import { useMemo } from 'react'
-import { notify } from 'utils/notifications'
+// import { notify } from 'utils/notifications'
import { calculateSlippage } from 'utils/tradeForm'
const Slippage = () => {
@@ -25,7 +25,8 @@ const Slippage = () => {
)
}
} catch (e) {
- notify({ type: 'info', title: 'Unable to calculate slippage' })
+ console.error({ type: 'info', title: 'Unable to calculate slippage' })
+ return 100_000
}
return 0
}, [tradeForm, markPrice, selectedMarket])
@@ -44,7 +45,7 @@ const Slippage = () => {
: 'text-th-error'
}`}
>
- {slippage.toFixed(2)}%
+ {slippage === 100_000 ? 'Unavailable' : `${slippage.toFixed(2)}&`}
) : null
diff --git a/components/trade/TradeSummary.tsx b/components/trade/TradeSummary.tsx
index 91cd14b9..fe9d4e4d 100644
--- a/components/trade/TradeSummary.tsx
+++ b/components/trade/TradeSummary.tsx
@@ -69,7 +69,7 @@ const TradeSummary = ({
: simulatedHealthRatio < 0
? 0
: Math.trunc(simulatedHealthRatio)
- }, [group, mangoAccount, selectedMarket, tradeForm.baseSize, tradeForm.side])
+ }, [group, mangoAccount, selectedMarket, tradeForm])
return (
diff --git a/hooks/useMarkPrice.tsx b/hooks/useMarkPrice.tsx
index cf8dd957..1029718c 100644
--- a/hooks/useMarkPrice.tsx
+++ b/hooks/useMarkPrice.tsx
@@ -1,8 +1,9 @@
import mangoStore from '@store/mangoStore'
import { useEffect } from 'react'
+const set = mangoStore.getState().set
+
export default function useMarkPrice() {
- const set = mangoStore((s) => s.set)
const markPrice = mangoStore((s) => s.selectedMarket.markPrice)
const orderbook = mangoStore((s) => s.selectedMarket.orderbook)
const fills = mangoStore((s) => s.selectedMarket.fills)
@@ -28,7 +29,9 @@ export default function useMarkPrice() {
state.selectedMarket.markPrice = newMarkPrice
})
}
- }, [orderbook, trades])
+ }, [orderbook, trades, markPrice])
+
+ console.log('markPrice', markPrice)
return markPrice
}
diff --git a/utils/tradeForm.ts b/utils/tradeForm.ts
index 299b2099..ff9be9d5 100644
--- a/utils/tradeForm.ts
+++ b/utils/tradeForm.ts
@@ -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 = (
orderBook: OrderbookL2,
size: number,
@@ -39,7 +67,7 @@ export const calculateSlippage = (
const referencePrice = bb && ba ? (bb + ba) / 2 : markPrice
if (Number(size)) {
- const estimatedPrice = calculateLimitPriceForMarketOrder(
+ const estimatedPrice = calculateEstPriceForBaseSize(
orderBook,
Number(size),
side
@@ -47,6 +75,7 @@ export const calculateSlippage = (
const slippageAbs =
Number(size) > 0 ? Math.abs(estimatedPrice - referencePrice) : 0
+
const slippageRel = (slippageAbs / referencePrice) * 100
return slippageRel
}