diff --git a/risk/engine.go b/risk/engine.go index d4b0aeee2f..bda118ce31 100644 --- a/risk/engine.go +++ b/risk/engine.go @@ -22,6 +22,7 @@ var ( //go:generate go run github.com/golang/mock/mockgen -destination mocks/orderbook_mock.go -package mocks code.vegaprotocol.io/vega/risk Orderbook type Orderbook interface { GetCloseoutPrice(volume uint64, side types.Side) (uint64, error) + GetIndicativePrice() uint64 } // AuctionState represents the current auction state of the market, previously we got this information from the matching engine, but really... that's not its job diff --git a/risk/margins_calculation.go b/risk/margins_calculation.go index bd0de94400..e982e9f8f3 100644 --- a/risk/margins_calculation.go +++ b/risk/margins_calculation.go @@ -77,10 +77,18 @@ func (e *Engine) calculateMargins(m events.Margin, markPrice int64, rf types.Ris slippagePerUnit int64 ) if slippageVolume > 0 { - exitPrice, err := e.ob.GetCloseoutPrice(uint64(slippageVolume), types.Side_SIDE_BUY) - if err != nil && e.log.GetLevel() == logging.DebugLevel { - e.log.Debug("got non critical error from GetCloseoutPrice for Buy side", - logging.Error(err)) + var ( + exitPrice uint64 + err error + ) + if auction { + exitPrice = e.ob.GetIndicativePrice() + } else { + exitPrice, err = e.ob.GetCloseoutPrice(uint64(slippageVolume), types.Side_SIDE_BUY) + if err != nil && e.log.GetLevel() == logging.DebugLevel { + e.log.Debug("got non critical error from GetCloseoutPrice for Buy side", + logging.Error(err)) + } } slippagePerUnit = markPrice - int64(exitPrice) } @@ -101,10 +109,18 @@ func (e *Engine) calculateMargins(m events.Margin, markPrice int64, rf types.Ris ) // slippageVolume would be negative we abs it in the next phase if slippageVolume < 0 { - exitPrice, err := e.ob.GetCloseoutPrice(uint64(-slippageVolume), types.Side_SIDE_SELL) - if err != nil && e.log.GetLevel() == logging.DebugLevel { - e.log.Debug("got non critical error from GetCloseoutPrice for Sell side", - logging.Error(err)) + var ( + exitPrice uint64 + err error + ) + if auction { + exitPrice = e.ob.GetIndicativePrice() + } else { + exitPrice, err = e.ob.GetCloseoutPrice(uint64(-slippageVolume), types.Side_SIDE_SELL) + if err != nil && e.log.GetLevel() == logging.DebugLevel { + e.log.Debug("got non critical error from GetCloseoutPrice for Sell side", + logging.Error(err)) + } } slippagePerUnit = -1 * (markPrice - int64(exitPrice)) } diff --git a/risk/mocks/orderbook_mock.go b/risk/mocks/orderbook_mock.go index 5adb09c870..c4311bc4a7 100644 --- a/risk/mocks/orderbook_mock.go +++ b/risk/mocks/orderbook_mock.go @@ -47,3 +47,17 @@ func (mr *MockOrderbookMockRecorder) GetCloseoutPrice(arg0, arg1 interface{}) *g mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetCloseoutPrice", reflect.TypeOf((*MockOrderbook)(nil).GetCloseoutPrice), arg0, arg1) } + +// GetIndicativePrice mocks base method +func (m *MockOrderbook) GetIndicativePrice() uint64 { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetIndicativePrice") + ret0, _ := ret[0].(uint64) + return ret0 +} + +// GetIndicativePrice indicates an expected call of GetIndicativePrice +func (mr *MockOrderbookMockRecorder) GetIndicativePrice() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetIndicativePrice", reflect.TypeOf((*MockOrderbook)(nil).GetIndicativePrice)) +}