Added klines, liquidations, tickers and trades to be recorded. Bundled the stats as cli argument.

This commit is contained in:
Kalzu Rekku
2026-07-22 15:35:33 +03:00
parent 270922fb78
commit f6765fdf07
15 changed files with 2719 additions and 495 deletions
+207 -1
View File
@@ -35,7 +35,7 @@ type FeatureBucket struct {
VWAP float64
}
// Top-level websocket message.
// Top-level websocket message (used for topic extraction and trade parsing).
type BybitWSMessage struct {
Topic string `json:"topic"`
Type string `json:"type"`
@@ -62,3 +62,209 @@ type BybitTradeRaw struct {
Seq int64 `json:"seq"`
}
// --- MessageHandler interface for multi-stream support ---
// MessageHandler is implemented by each stream handler (trades, ticker, klines, etc.)
type MessageHandler interface {
// Topics returns the list of Bybit WebSocket topics this handler subscribes to.
Topics() []string
// HandleMessage processes a raw WebSocket message routed by topic.
HandleMessage(data []byte)
// Close gracefully shuts down the handler, flushing any pending data.
Close()
}
// --- Ticker types ---
// BybitTickerMessage is the WebSocket response for the tickers stream.
type BybitTickerMessage struct {
Topic string `json:"topic"`
Type string `json:"type"` // "snapshot" or "delta"
TS int64 `json:"ts"`
CS int64 `json:"cs"`
Data BybitTickerRaw `json:"data"`
}
// BybitTickerRaw holds the fields from a Bybit ticker push (linear/inverse).
type BybitTickerRaw struct {
Symbol string `json:"symbol"`
LastPrice string `json:"lastPrice"`
Bid1Price string `json:"bid1Price"`
Bid1Size string `json:"bid1Size"`
Ask1Price string `json:"ask1Price"`
Ask1Size string `json:"ask1Size"`
HighPrice24h string `json:"highPrice24h"`
LowPrice24h string `json:"lowPrice24h"`
Volume24h string `json:"volume24h"`
Turnover24h string `json:"turnover24h"`
MarkPrice string `json:"markPrice"`
IndexPrice string `json:"indexPrice"`
OpenInterest string `json:"openInterest"`
FundingRate string `json:"fundingRate"`
NextFundingTime string `json:"nextFundingTime"`
Price24hPcnt string `json:"price24hPcnt"`
}
// TickerSnapshot is a parsed ticker snapshot row for hot DB storage.
type TickerSnapshot struct {
Timestamp int64
LastPrice float64
Bid1Price float64
Bid1Size float64
Ask1Price float64
Ask1Size float64
MarkPrice float64
IndexPrice float64
OpenInterest float64
FundingRate float64
Volume24h float64
Turnover24h float64
}
// TickerFeature holds derived features computed from ticker snapshots.
type TickerFeature struct {
Timestamp int64
Spread float64
SpreadBps float64
MidPrice float64
OIChange float64
FundingRate float64
MarkIndexBasis float64
BidAskImbalance float64
}
// --- Kline types ---
// BybitKlineMessage is the WebSocket response for the kline stream.
type BybitKlineMessage struct {
Topic string `json:"topic"`
Type string `json:"type"`
TS int64 `json:"ts"`
Data []BybitKlineRaw `json:"data"`
}
// BybitKlineRaw holds the fields from a single kline (candle) push.
type BybitKlineRaw struct {
Start int64 `json:"start"`
End int64 `json:"end"`
Interval string `json:"interval"`
Open string `json:"open"`
Close string `json:"close"`
High string `json:"high"`
Low string `json:"low"`
Volume string `json:"volume"`
Turnover string `json:"turnover"`
Confirm bool `json:"confirm"`
Timestamp int64 `json:"timestamp"`
}
// Kline is a parsed kline row for hot DB storage.
type Kline struct {
StartTime int64
EndTime int64
Interval string
Open float64
High float64
Low float64
Close float64
Volume float64
Turnover float64
Confirmed bool
}
// KlineFeature holds derived features computed from kline data.
type KlineFeature struct {
Timestamp int64
Interval string
BodyRatio float64
UpperWick float64
LowerWick float64
LogReturn float64
Volume float64
Turnover float64
}
// --- Orderbook types ---
// BybitOrderbookMessage is the WebSocket response for the orderbook stream.
type BybitOrderbookMessage struct {
Topic string `json:"topic"`
Type string `json:"type"` // "snapshot" or "delta"
TS int64 `json:"ts"`
Data BybitOrderbookData `json:"data"`
}
// BybitOrderbookData holds the bids/asks arrays from an orderbook push.
type BybitOrderbookData struct {
S string `json:"s"` // Symbol
B [][]string `json:"b"` // Bids: [[price, size], ...]
A [][]string `json:"a"` // Asks: [[price, size], ...]
U int64 `json:"u"` // Update ID
Seq int64 `json:"seq"`
}
// OrderbookLevel represents a single price level in the order book.
type OrderbookLevel struct {
Price float64
Size float64
}
// OrderbookFeature holds derived features computed from orderbook snapshots.
type OrderbookFeature struct {
Timestamp int64
Spread float64
MidPrice float64
BidDepth5 float64
AskDepth5 float64
BidDepth20 float64
AskDepth20 float64
DepthImbalance5 float64
DepthImbalance20 float64
WeightedMid float64
VWAP10 float64
}
// --- Liquidation types ---
// BybitLiquidationMessage is the WebSocket response for the allLiquidation stream.
type BybitLiquidationMessage struct {
Topic string `json:"topic"`
Type string `json:"type"`
TS int64 `json:"ts"`
Data BybitLiquidationData `json:"data"`
}
// BybitLiquidationData holds the fields from a single liquidation event.
type BybitLiquidationData struct {
T int64 `json:"T"` // Timestamp ms
S string `json:"s"` // Symbol
SD string `json:"S"` // Side: "Buy" (long liq) or "Sell" (short liq)
V string `json:"v"` // Quantity
P string `json:"p"` // Bankruptcy price
}
// Liquidation is a parsed liquidation event for hot DB storage.
type Liquidation struct {
Timestamp int64
Side string
Price float64
Quantity float64
Value float64 // price * quantity
}
// LiquidationFeature holds aggregated liquidation features for a 5-second bucket.
type LiquidationFeature struct {
Timestamp int64
CountTotal int
CountLong int
CountShort int
VolumeTotal float64
VolumeLong float64
VolumeShort float64
ValueTotal float64
ValueLong float64
ValueShort float64
AvgPrice float64
NetValue float64
}