Skip to content

Commit 6f0c4fd

Browse files
authored
Merge pull request #994 from zenixls2/feature/binance_aggTrade
feature: add aggTrade for binance
2 parents 79c93e9 + 9213caf commit 6f0c4fd

File tree

7 files changed

+105
-0
lines changed

7 files changed

+105
-0
lines changed

pkg/exchange/binance/convert.go

+6
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,8 @@ func convertSubscription(s types.Subscription) string {
295295
// binance uses lower case symbol name,
296296
// for kline, it's "<symbol>@kline_<interval>"
297297
// for depth, it's "<symbol>@depth OR <symbol>@depth@100ms"
298+
// for trade, it's "<symbol>@trade"
299+
// for aggregated trade, it's "<symbol>@aggTrade"
298300
switch s.Channel {
299301
case types.KLineChannel:
300302
return fmt.Sprintf("%s@%s_%s", strings.ToLower(s.Symbol), s.Channel, s.Options.String())
@@ -326,6 +328,10 @@ func convertSubscription(s types.Subscription) string {
326328
return n
327329
case types.BookTickerChannel:
328330
return fmt.Sprintf("%s@bookTicker", strings.ToLower(s.Symbol))
331+
case types.MarketTradeChannel:
332+
return fmt.Sprintf("%s@trade", strings.ToLower(s.Symbol))
333+
case types.AggTradeChannel:
334+
return fmt.Sprintf("%s@aggTrade", strings.ToLower(s.Symbol))
329335
}
330336

331337
return fmt.Sprintf("%s@%s", strings.ToLower(s.Symbol), s.Channel)

pkg/exchange/binance/parse.go

+62
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,11 @@ func parseWebSocketEvent(message []byte) (interface{}, error) {
350350
err = json.Unmarshal([]byte(message), &event)
351351
return &event, err
352352

353+
case "aggTrade":
354+
var event AggTradeEvent
355+
err = json.Unmarshal([]byte(message), &event)
356+
return &event, err
357+
353358
default:
354359
id := val.GetInt("id")
355360
if id > 0 {
@@ -542,6 +547,63 @@ func (e *MarketTradeEvent) Trade() types.Trade {
542547
}
543548
}
544549

550+
type AggTradeEvent struct {
551+
EventBase
552+
Symbol string `json:"s"`
553+
Quantity fixedpoint.Value `json:"q"`
554+
Price fixedpoint.Value `json:"p"`
555+
FirstTradeId int64 `json:"f"`
556+
LastTradeId int64 `json:"l"`
557+
OrderTradeTime int64 `json:"T"`
558+
IsMaker bool `json:"m"`
559+
Dummy bool `json:"M"`
560+
}
561+
562+
/*
563+
aggregate trade
564+
{
565+
"e": "aggTrade", // Event type
566+
"E": 123456789, // Event time
567+
"s": "BNBBTC", // Symbol
568+
"a": 12345, // Aggregate trade ID
569+
"p": "0.001", // Price
570+
"q": "100", // Quantity
571+
"f": 100, // First trade ID
572+
"l": 105, // Last trade ID
573+
"T": 123456785, // Trade time
574+
"m": true, // Is the buyer the market maker?
575+
"M": true // Ignore
576+
}
577+
*/
578+
579+
func (e *AggTradeEvent) Trade() types.Trade {
580+
tt := time.Unix(0, e.OrderTradeTime*int64(time.Millisecond))
581+
var side types.SideType
582+
var isBuyer bool
583+
if e.IsMaker {
584+
side = types.SideTypeSell
585+
isBuyer = false
586+
} else {
587+
side = types.SideTypeBuy
588+
isBuyer = true
589+
}
590+
return types.Trade{
591+
ID: uint64(e.LastTradeId),
592+
Exchange: types.ExchangeBinance,
593+
Symbol: e.Symbol,
594+
OrderID: 0,
595+
Side: side,
596+
Price: e.Price,
597+
Quantity: e.Quantity,
598+
QuoteQuantity: e.Quantity,
599+
IsBuyer: isBuyer,
600+
IsMaker: e.IsMaker,
601+
Time: types.Time(tt),
602+
Fee: fixedpoint.Zero,
603+
FeeCurrency: "",
604+
}
605+
}
606+
545607
type KLine struct {
546608
StartTime int64 `json:"t"`
547609
EndTime int64 `json:"T"`

pkg/exchange/binance/stream.go

+9
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ type Stream struct {
4848

4949
markPriceUpdateEventCallbacks []func(e *MarkPriceUpdateEvent)
5050
marketTradeEventCallbacks []func(e *MarketTradeEvent)
51+
aggTradeEventCallbacks []func(e *AggTradeEvent)
5152

5253
continuousKLineEventCallbacks []func(e *ContinuousKLineEvent)
5354
continuousKLineClosedEventCallbacks []func(e *ContinuousKLineEvent)
@@ -120,6 +121,7 @@ func NewStream(ex *Exchange, client *binance.Client, futuresClient *futures.Clie
120121
stream.OnExecutionReportEvent(stream.handleExecutionReportEvent)
121122
stream.OnContinuousKLineEvent(stream.handleContinuousKLineEvent)
122123
stream.OnMarketTradeEvent(stream.handleMarketTradeEvent)
124+
stream.OnAggTradeEvent(stream.handleAggTradeEvent)
123125

124126
// Event type ACCOUNT_UPDATE from user data stream updates Balance and FuturesPosition.
125127
stream.OnAccountUpdateEvent(stream.handleAccountUpdateEvent)
@@ -218,6 +220,10 @@ func (s *Stream) handleMarketTradeEvent(e *MarketTradeEvent) {
218220
s.EmitMarketTrade(e.Trade())
219221
}
220222

223+
func (s *Stream) handleAggTradeEvent(e *AggTradeEvent) {
224+
s.EmitAggTrade(e.Trade())
225+
}
226+
221227
func (s *Stream) handleKLineEvent(e *KLineEvent) {
222228
kline := e.KLine.KLine()
223229
if e.KLine.Closed {
@@ -342,6 +348,9 @@ func (s *Stream) dispatchEvent(e interface{}) {
342348
case *MarketTradeEvent:
343349
s.EmitMarketTradeEvent(e)
344350

351+
case *AggTradeEvent:
352+
s.EmitAggTradeEvent(e)
353+
345354
case *KLineEvent:
346355
s.EmitKLineEvent(e)
347356

pkg/exchange/binance/stream_callbacks.go

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/types/channel.go

+1
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ var BookChannel = Channel("book")
66
var KLineChannel = Channel("kline")
77
var BookTickerChannel = Channel("bookticker")
88
var MarketTradeChannel = Channel("trade")
9+
var AggTradeChannel = Channel("aggTrade")

pkg/types/standardstream_callbacks.go

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/types/stream.go

+3
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ type StandardStream struct {
100100

101101
marketTradeCallbacks []func(trade Trade)
102102

103+
aggTradeCallbacks []func(trade Trade)
104+
103105
// Futures
104106
FuturesPositionUpdateCallbacks []func(futuresPositions FuturesPositionMap)
105107

@@ -121,6 +123,7 @@ type StandardStreamEmitter interface {
121123
EmitBookTickerUpdate(BookTicker)
122124
EmitBookSnapshot(SliceOrderBook)
123125
EmitMarketTrade(Trade)
126+
EmitAggTrade(Trade)
124127
EmitFuturesPositionUpdate(FuturesPositionMap)
125128
EmitFuturesPositionSnapshot(FuturesPositionMap)
126129
}

0 commit comments

Comments
 (0)