bybit: Add OrderbookLastUpdated field and ensure timestamp usage is correct (#1680)

* bybit: Add time field for orderbook and handle correct timings

* use UpdateID as this is the localised ID for this pair, rm check result.UpdateID == 1 just use snapshot

* general quick fixes across from #1672 which can be used straight away

* fix test

* glorious: nits

* thrasher: nits

* thrasher: nits thanks @thrasher-

---------

Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
This commit is contained in:
Ryan O'Hara-Reid
2024-11-08 15:35:18 +11:00
committed by GitHub
parent d172f3dfe1
commit d4c4bf1bcd
3 changed files with 54 additions and 49 deletions

View File

@@ -363,7 +363,7 @@ func (by *Bybit) wsProcessOrder(assetType asset.Item, resp *WebsocketResponse) e
}
execution := make([]order.Detail, len(result))
for x := range result {
cp, err := currency.NewPairFromString(result[x].Symbol)
cp, err := by.MatchSymbolWithAvailablePairs(result[x].Symbol, assetType, hasPotentialDelimiter(assetType))
if err != nil {
return err
}
@@ -404,7 +404,7 @@ func (by *Bybit) wsProcessExecution(assetType asset.Item, resp *WebsocketRespons
}
executions := make([]fill.Data, len(result))
for x := range result {
cp, err := currency.NewPairFromString(result[x].Symbol)
cp, err := by.MatchSymbolWithAvailablePairs(result[x].Symbol, assetType, hasPotentialDelimiter(assetType))
if err != nil {
return err
}
@@ -455,7 +455,7 @@ func (by *Bybit) wsProcessLeverageTokenTicker(assetType asset.Item, resp *Websoc
if err != nil {
return err
}
cp, err := currency.NewPairFromString(result.Symbol)
cp, err := by.MatchSymbolWithAvailablePairs(result.Symbol, assetType, hasPotentialDelimiter(assetType))
if err != nil {
return err
}
@@ -466,7 +466,7 @@ func (by *Bybit) wsProcessLeverageTokenTicker(assetType asset.Item, resp *Websoc
Pair: cp,
ExchangeName: by.Name,
AssetType: assetType,
LastUpdated: resp.Timestamp.Time(),
LastUpdated: resp.PushTimestamp.Time(),
}
return nil
}
@@ -477,7 +477,7 @@ func (by *Bybit) wsProcessLeverageTokenKline(assetType asset.Item, resp *Websock
if err != nil {
return err
}
cp, err := currency.NewPairFromString(topicSplit[2])
cp, err := by.MatchSymbolWithAvailablePairs(topicSplit[2], assetType, hasPotentialDelimiter(assetType))
if err != nil {
return err
}
@@ -521,7 +521,7 @@ func (by *Bybit) wsProcessKline(assetType asset.Item, resp *WebsocketResponse, t
if err != nil {
return err
}
cp, err := currency.NewPairFromString(topicSplit[2])
cp, err := by.MatchSymbolWithAvailablePairs(topicSplit[2], assetType, hasPotentialDelimiter(assetType))
if err != nil {
return err
}
@@ -556,7 +556,7 @@ func (by *Bybit) wsProcessPublicTicker(assetType asset.Item, resp *WebsocketResp
return err
}
p, err := by.MatchSymbolWithAvailablePairs(tickResp.Symbol, assetType, true)
p, err := by.MatchSymbolWithAvailablePairs(tickResp.Symbol, assetType, hasPotentialDelimiter(assetType))
if err != nil {
return err
}
@@ -582,7 +582,7 @@ func (by *Bybit) wsProcessPublicTicker(assetType asset.Item, resp *WebsocketResp
}
updateTicker(tick, tickResp)
tick.LastUpdated = resp.Timestamp.Time()
tick.LastUpdated = resp.PushTimestamp.Time()
if err = ticker.ProcessTicker(tick); err == nil {
by.Websocket.DataHandler <- tick
@@ -657,7 +657,7 @@ func (by *Bybit) wsProcessPublicTrade(assetType asset.Item, resp *WebsocketRespo
}
tradeDatas := make([]trade.Data, len(result))
for x := range result {
cp, err := currency.NewPairFromString(result[x].Symbol)
cp, err := by.MatchSymbolWithAvailablePairs(result[x].Symbol, assetType, hasPotentialDelimiter(assetType))
if err != nil {
return err
}
@@ -685,7 +685,7 @@ func (by *Bybit) wsProcessOrderbook(assetType asset.Item, resp *WebsocketRespons
if err != nil {
return err
}
cp, err := currency.NewPairFromString(result.Symbol)
cp, err := by.MatchSymbolWithAvailablePairs(result.Symbol, assetType, hasPotentialDelimiter(assetType))
if err != nil {
return err
}
@@ -714,33 +714,27 @@ func (by *Bybit) wsProcessOrderbook(assetType asset.Item, resp *WebsocketRespons
if len(asks) == 0 && len(bids) == 0 {
return nil
}
if resp.Type == "snapshot" || result.UpdateID == 1 {
err = by.Websocket.Orderbook.LoadSnapshot(&orderbook.Base{
Pair: cp,
Exchange: by.Name,
Asset: assetType,
LastUpdated: resp.Timestamp.Time(),
LastUpdateID: result.Sequence,
Asks: asks,
Bids: bids,
if resp.Type == "snapshot" {
return by.Websocket.Orderbook.LoadSnapshot(&orderbook.Base{
Pair: cp,
Exchange: by.Name,
Asset: assetType,
LastUpdated: resp.OrderbookLastUpdated.Time(),
LastUpdateID: result.UpdateID,
UpdatePushedAt: resp.PushTimestamp.Time(),
Asks: asks,
Bids: bids,
})
if err != nil {
return err
}
} else {
err = by.Websocket.Orderbook.Update(&orderbook.Update{
Pair: cp,
Asks: asks,
Bids: bids,
Asset: assetType,
UpdateID: result.Sequence,
UpdateTime: resp.Timestamp.Time(),
})
if err != nil {
return err
}
}
return nil
return by.Websocket.Orderbook.Update(&orderbook.Update{
Pair: cp,
Asks: asks,
Bids: bids,
Asset: assetType,
UpdateID: result.UpdateID,
UpdateTime: resp.OrderbookLastUpdated.Time(),
UpdatePushedAt: resp.PushTimestamp.Time(),
})
}
// channelName converts global channel names to exchange specific names
@@ -778,3 +772,8 @@ const subTplText = `
{{- $.AssetSeparator }}
{{- end }}
`
// hasPotentialDelimiter returns if the asset has a potential delimiter on the pairs being returned.
func hasPotentialDelimiter(a asset.Item) bool {
return a == asset.Options || a == asset.USDCMarginedFutures
}