Skip to content

Commit

Permalink
Merge pull request #9926 from vegaprotocol/9881-rm-liq-monitoring
Browse files Browse the repository at this point in the history
9881 rm liq monitoring
  • Loading branch information
EVODelavega authored Nov 3, 2023
2 parents f4e925f + 0ea86a9 commit f50e3c5
Show file tree
Hide file tree
Showing 54 changed files with 571 additions and 2,191 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

### 🗑️ Deprecation

- [](https://github.com/vegaprotocol/vega/issues/xxxx) -
- [9881](https://github.com/vegaprotocol/vega/issues/9881) - Liquidity monitoring auctions to be removed.

### 🛠 Improvements

Expand Down
5 changes: 2 additions & 3 deletions core/execution/common/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ import (
"code.vegaprotocol.io/vega/core/datasource/spec"
"code.vegaprotocol.io/vega/core/events"
"code.vegaprotocol.io/vega/core/liquidity/v2"
lmon "code.vegaprotocol.io/vega/core/monitor/liquidity"
"code.vegaprotocol.io/vega/core/monitor/price"
"code.vegaprotocol.io/vega/core/risk"
"code.vegaprotocol.io/vega/core/types"
Expand Down Expand Up @@ -93,13 +92,11 @@ type IDGenerator interface {
//nolint:interfacebloat
type AuctionState interface {
price.AuctionState
lmon.AuctionState
// are we in auction, and what auction are we in?
ExtendAuctionSuspension(delta types.AuctionDuration)
InAuction() bool
IsOpeningAuction() bool
IsPriceAuction() bool
IsLiquidityAuction() bool
IsFBA() bool
IsMonitorAuction() bool
ExceededMaxOpening(time.Time) bool
Expand All @@ -124,6 +121,8 @@ type AuctionState interface {
GetState() *types.AuctionState
Changed() bool
UpdateMaxDuration(ctx context.Context, d time.Duration)
StartGovernanceSuspensionAuction(t time.Time)
EndGovernanceSuspensionAuction()
}

type EpochEngine interface {
Expand Down
52 changes: 0 additions & 52 deletions core/execution/common/mocks/mocks.go

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

41 changes: 23 additions & 18 deletions core/execution/future/auction.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,8 @@ import (

func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.IDGenerator) {
if !m.as.InAuction() {
// new block, check liquidity, start auction if needed
m.checkLiquidity(ctx, nil, true)
if m.as.AuctionStart() {
m.enterAuction(ctx)
}
// new block, check bond balance, top up if needed
m.checkBondBalance(ctx)
return
}

Expand Down Expand Up @@ -86,17 +83,15 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I
}

// first check liquidity - before we mark auction as ready to leave
m.checkLiquidity(ctx, trades, true)
if !m.as.CanLeave() {
if checkExceeded && m.as.ExceededMaxOpening(now) {
// cancel the market, exceeded opening auction
m.log.Debug("Market was cancelled because it failed to leave opening auction in time", logging.MarketID(m.GetID()))
m.terminateMarket(ctx, types.MarketStateCancelled, nil)
return
}
if e := m.as.AuctionExtended(ctx, now); e != nil {
m.broker.Send(e)
}
m.checkBondBalance(ctx)
if checkExceeded && m.as.ExceededMaxOpening(now) {
// cancel the market, exceeded opening auction
m.log.Debug("Market was cancelled because it failed to leave opening auction in time", logging.MarketID(m.GetID()))
m.terminateMarket(ctx, types.MarketStateCancelled, nil)
return
}
if e := m.as.AuctionExtended(ctx, now); e != nil {
m.broker.Send(e)
return
}
// opening auction requirements satisfied at this point, other requirements still need to be checked downstream though
Expand Down Expand Up @@ -132,17 +127,27 @@ func (m *Market) checkAuction(ctx context.Context, now time.Time, idgen common.I
)
return
}
// NOTE: This is a fix for the snapshot restores in case we're restoring a liquidity auction
// from a snapshot (or protocol upgrade) with state form before the liquidity monitoring was still
// in place. This can be removed once we've deployed the version without liquidity monitoring.
// Liquidity auctions are no longer a thing, we know we're not in opening auction here
// if we're not in price auction, we should just let the liquidity auction expire
if m.as.Trigger() == types.AuctionTriggerLiquidityTargetNotMet || m.as.Trigger() == types.AuctionTriggerUnableToDeployLPOrders {
if end := m.as.ExpiresAt(); end == nil || !end.Before(now) {
m.as.SetReadyToLeave()
}
}
// price and liquidity auctions
isPrice := m.as.IsPriceAuction() || m.as.IsPriceExtension()
if !isPrice {
m.checkLiquidity(ctx, trades, true)
m.checkBondBalance(ctx)
}
if isPrice || m.as.CanLeave() {
m.pMonitor.CheckPrice(ctx, m.as, trades, true)
}
end := m.as.CanLeave()
if isPrice && end {
m.checkLiquidity(ctx, trades, true)
m.checkBondBalance(ctx)
}
if evt := m.as.AuctionExtended(ctx, m.timeService.GetTimeNow()); evt != nil {
m.broker.Send(evt)
Expand Down
16 changes: 0 additions & 16 deletions core/execution/future/event_generation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@ func TestEvents_EnteringAuctionCancelsGFNOrders(t *testing.T) {
ctx := context.Background()
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)
tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
Expand Down Expand Up @@ -240,8 +239,6 @@ func TestEvents_CloseOutParty(t *testing.T) {
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)

tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
auxOrder1 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "AuxOrderBuy", types.SideBuy, auxParty, 1, 1)
Expand Down Expand Up @@ -320,8 +317,6 @@ func TestEvents_CloseOutPartyWithPeggedOrder(t *testing.T) {
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)

tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
auxOrder1 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "AuxOrderBuy", types.SideBuy, auxParty, 1, 1)
Expand Down Expand Up @@ -444,7 +439,6 @@ func TestEvents_EnteringAuctionParksAllPegs(t *testing.T) {
ctx := context.Background()
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)
tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
Expand Down Expand Up @@ -511,8 +505,6 @@ func TestEvents_SelfTrading(t *testing.T) {
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)

tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
auxOrder1 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "AuxOrderBuy", types.SideBuy, auxParty, 1, 1)
Expand Down Expand Up @@ -611,8 +603,6 @@ func TestEvents_MovingPegsAround(t *testing.T) {
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)

tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
auxOrder1 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "AuxOrderBuy", types.SideBuy, auxParty, 1, 1)
Expand Down Expand Up @@ -679,8 +669,6 @@ func TestEvents_MovingPegsAround2(t *testing.T) {
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)

tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
auxOrder1 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "AuxOrderBuy", types.SideBuy, auxParty, 1, 1)
Expand Down Expand Up @@ -737,8 +725,6 @@ func TestEvents_AmendOrderToSelfTrade(t *testing.T) {
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)

tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
auxOrder1 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "AuxOrderBuy", types.SideBuy, auxParty, 1, 1)
Expand Down Expand Up @@ -794,8 +780,6 @@ func TestEvents_AmendOrderToIncreaseSizeAndPartiallyFill(t *testing.T) {
mdb := subscribers.NewMarketDepthBuilder(ctx, nil, true)
tm := startMarketInAuction(t, ctx, &now)

tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))

auxParty := "aux"
addAccount(t, tm, auxParty)
auxOrder1 := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "AuxOrderBuy", types.SideBuy, auxParty, 1, 1)
Expand Down
5 changes: 0 additions & 5 deletions core/execution/future/margin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,6 @@ func TestMargins(t *testing.T) {
addAccount(t, tm, auxParty2)
addAccountWithAmount(tm, "lpprov", 100000)

// Assure liquidity auction won't be triggered
tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(context.Background(), num.DecimalFromFloat(0))
// set auction durations to 1 second
tm.market.OnMarketAuctionMinimumDurationUpdate(context.Background(), time.Second)
alwaysOnBid := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "alwaysOnBid", types.SideBuy, auxParty, 1, 1)
Expand Down Expand Up @@ -189,8 +187,6 @@ func TestPartialFillMargins(t *testing.T) {
addAccountWithAmount(tm, "lpprov", 100000000)
tm.broker.EXPECT().Send(gomock.Any()).AnyTimes()

// Assure liquidity auction won't be triggered
tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(context.Background(), num.DecimalFromFloat(0))
// ensure auction durations are 1 second
tm.market.OnMarketAuctionMinimumDurationUpdate(context.Background(), time.Second)
alwaysOnBid := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "alwaysOnBid", types.SideBuy, auxParty, 1, 1)
Expand Down Expand Up @@ -321,7 +317,6 @@ func TestPartialFillMargins(t *testing.T) {
// tm.broker.EXPECT().Send(gomock.Any()).AnyTimes()

// // Assure liquidity auction won't be triggered
// tm.market.OnMarketLiquidityTargetStakeTriggeringRatio(ctx, num.DecimalFromFloat(0))
// // ensure auction durations are 1 second
// tm.market.OnMarketAuctionMinimumDurationUpdate(ctx, time.Second)
// alwaysOnBid := getMarketOrder(tm, now, types.OrderTypeLimit, types.OrderTimeInForceGTC, "alwaysOnBid", types.SideBuy, auxParty, 1, 500)
Expand Down
40 changes: 2 additions & 38 deletions core/execution/future/market.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ import (
"code.vegaprotocol.io/vega/core/matching"
"code.vegaprotocol.io/vega/core/metrics"
"code.vegaprotocol.io/vega/core/monitor"
lmon "code.vegaprotocol.io/vega/core/monitor/liquidity"
"code.vegaprotocol.io/vega/core/monitor/price"
"code.vegaprotocol.io/vega/core/positions"
"code.vegaprotocol.io/vega/core/products"
Expand All @@ -53,14 +52,6 @@ import (
"golang.org/x/exp/maps"
)

// LiquidityMonitor.
type LiquidityMonitor interface {
CheckLiquidity(as lmon.AuctionState, t time.Time, currentStake *num.Uint, trades []*types.Trade, rf types.RiskFactor, markPrice *num.Uint, bestStaticBidVolume, bestStaticAskVolume uint64, persistent bool) bool
SetMinDuration(d time.Duration)
UpdateTargetStakeTriggerRatio(ctx context.Context, ratio num.Decimal)
UpdateParameters(*types.LiquidityMonitoringParameters)
}

// TargetStakeCalculator interface.
type TargetStakeCalculator interface {
types.StateProvider
Expand Down Expand Up @@ -112,7 +103,6 @@ type Market struct {
parties map[string]struct{}

pMonitor common.PriceMonitor
lMonitor LiquidityMonitor

linearSlippageFactor num.Decimal
quadraticSlippageFactor num.Decimal
Expand Down Expand Up @@ -252,8 +242,6 @@ func NewMarket(
return nil, fmt.Errorf("unable to instantiate price monitoring engine: %w", err)
}

lMonitor := lmon.NewMonitor(tsCalc, mkt.LiquidityMonitoringParameters)

now := timeService.GetTimeNow()

liquidityEngine := liquidity.NewSnapshotEngine(
Expand Down Expand Up @@ -305,7 +293,6 @@ func NewMarket(
parties: map[string]struct{}{},
as: auctionState,
pMonitor: pMonitor,
lMonitor: lMonitor,
tsCalc: tsCalc,
peggedOrders: common.NewPeggedOrders(log, timeService),
expiringOrders: common.NewExpiringOrders(),
Expand Down Expand Up @@ -573,7 +560,6 @@ func (m *Market) Update(ctx context.Context, config *types.Market, oracleEngine
m.pMonitor.UpdateSettings(m.tradableInstrument.RiskModel, m.mkt.PriceMonitoringSettings)
m.linearSlippageFactor = m.mkt.LinearSlippageFactor
m.quadraticSlippageFactor = m.mkt.QuadraticSlippageFactor
m.lMonitor.UpdateParameters(m.mkt.LiquidityMonitoringParameters)
m.liquidity.UpdateMarketConfig(m.tradableInstrument.RiskModel, m.pMonitor)

// we should not need to rebind a replacement oracle here, the m.tradableInstrument.UpdateInstrument
Expand Down Expand Up @@ -1314,7 +1300,7 @@ func (m *Market) enterAuction(ctx context.Context) {
// Send an event bus update
m.broker.Send(event)

if m.as.InAuction() && (m.as.IsLiquidityAuction() || m.as.IsPriceAuction()) {
if m.as.InAuction() && m.as.IsPriceAuction() {
m.mkt.State = types.MarketStateSuspended
m.mkt.TradingMode = types.MarketTradingModeMonitoringAuction
m.broker.Send(events.NewMarketUpdatedEvent(ctx, *m.mkt))
Expand Down Expand Up @@ -1417,7 +1403,7 @@ func (m *Market) leaveAuction(ctx context.Context, now time.Time) {

m.checkForReferenceMoves(ctx, updatedOrders, true)

m.checkLiquidity(ctx, nil, true)
m.checkBondBalance(ctx)
m.commandLiquidityAuction(ctx)

if !m.as.InAuction() {
Expand Down Expand Up @@ -3852,28 +3838,6 @@ func (m *Market) getSuppliedStake() *num.Uint {
return m.liquidityEngine.CalculateSuppliedStake()
}

//nolint:unparam
func (m *Market) checkLiquidity(ctx context.Context, trades []*types.Trade, persistentOrder bool) bool {
// before we check liquidity, ensure we've moved all funds that can go towards
// provided stake to the bond accounts so we don't trigger liquidity auction for no reason
m.checkBondBalance(ctx)
var vBid, vAsk uint64
// if we're not in auction, or we are checking liquidity when leaving opening auction, or we have best bid/ask volume
if !m.as.InAuction() || m.matching.BidAndAskPresentAfterAuction() {
_, vBid, _ = m.getBestStaticBidPriceAndVolume()
_, vAsk, _ = m.getBestStaticAskPriceAndVolume()
}

return m.lMonitor.CheckLiquidity(
m.as, m.timeService.GetTimeNow(),
m.getSuppliedStake(),
trades,
*m.risk.GetRiskFactors(),
m.getReferencePrice(),
vBid, vAsk,
persistentOrder)
}

// command liquidity auction checks if liquidity auction should be entered and if it can end.
func (m *Market) commandLiquidityAuction(ctx context.Context) {
// start the liquidity monitoring auction if required
Expand Down
Loading

0 comments on commit f50e3c5

Please sign in to comment.