Skip to content

Commit 9d4a5b5

Browse files
committed
support futures ticker
1 parent 00018b4 commit 9d4a5b5

File tree

4 files changed

+75
-8
lines changed

4 files changed

+75
-8
lines changed

src/binance-proxy/handler/handler.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ import (
1010
log "github.com/sirupsen/logrus"
1111
)
1212

13-
func NewHandler(ctx context.Context, class service.Class, enableFakeKline bool) func(w http.ResponseWriter, r *http.Request) {
13+
func NewHandler(
14+
ctx context.Context, class service.Class,
15+
enableFakeKline, startTickerWithKline, startOrderbookWithKline bool,
16+
) func(w http.ResponseWriter, r *http.Request) {
1417
handler := &Handler{
15-
srv: service.NewService(ctx, class),
18+
srv: service.NewService(ctx, class, startTickerWithKline, startOrderbookWithKline),
1619
class: class,
1720
enableFakeKline: enableFakeKline,
1821
}
@@ -38,7 +41,7 @@ func (s *Handler) Router(w http.ResponseWriter, r *http.Request) {
3841
case "/api/v3/depth", "/fapi/v1/depth":
3942
s.depth(w, r)
4043

41-
case "/api/v3/ticker/24hr":
44+
case "/api/v3/ticker/24hr", "/fapi/v1/ticker/24hr":
4245
s.ticker(w, r)
4346

4447
case "/api/v3/exchangeInfo", "/fapi/v1/exchangeInfo":

src/binance-proxy/main.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import (
1717

1818
func startProxy(ctx context.Context, address string, class service.Class) {
1919
mux := http.NewServeMux()
20-
mux.HandleFunc("/", handler.NewHandler(ctx, class, flagEnableFakeKline))
20+
mux.HandleFunc("/", handler.NewHandler(ctx, class, flagEnableFakeKline, flagStartTickerWithKline, flagStartOrderbookWithKline))
2121

2222
log.Infof("Start %s proxy !Address: %s", class, address)
2323
if err := http.ListenAndServe(address, mux); err != nil {
@@ -41,11 +41,15 @@ var flagSpotAddress string
4141
var flagFuturesAddress string
4242
var flagDebug bool
4343
var flagEnableFakeKline bool
44+
var flagStartTickerWithKline bool
45+
var flagStartOrderbookWithKline bool
4446

4547
func main() {
4648
flag.StringVar(&flagSpotAddress, "s", ":8090", "spot bind address.")
4749
flag.StringVar(&flagFuturesAddress, "f", ":8091", "futures bind address.")
4850
flag.BoolVar(&flagEnableFakeKline, "fakekline", false, "enable fake kline.")
51+
flag.BoolVar(&flagStartTickerWithKline, "at", false, "auto monitor ticker with kline request.")
52+
flag.BoolVar(&flagStartOrderbookWithKline, "ao", false, "auto monitor orderbook with kline request.")
4953
flag.BoolVar(&flagDebug, "v", false, "print debug log.")
5054
flag.Parse()
5155

src/binance-proxy/service/service.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,28 @@ type Service struct {
1212
ctx context.Context
1313
cancel context.CancelFunc
1414

15+
startTickerWithKline bool
16+
startOrderbookWithKline bool
17+
1518
class Class
1619
exchangeInfoSrv *ExchangeInfoSrv
1720
klinesSrv sync.Map // map[symbolInterval]*Klines
1821
depthSrv sync.Map // map[symbolInterval]*Depth
1922
tickerSrv sync.Map // map[symbolInterval]*Ticker
2023

24+
klineIntervalMap sync.Map // map[string]string
25+
2126
lastGetKlines sync.Map // map[symbolInterval]time.Time
2227
lastGetDepth sync.Map // map[symbolInterval]time.Time
2328
lastGetTicker sync.Map // map[symbolInterval]time.Time
2429
}
2530

26-
func NewService(ctx context.Context, class Class) *Service {
27-
s := &Service{class: class}
31+
func NewService(ctx context.Context, class Class, startTickerWithKline, startOrderbookWithKline bool) *Service {
32+
s := &Service{
33+
class: class,
34+
startTickerWithKline: startTickerWithKline,
35+
startOrderbookWithKline: startOrderbookWithKline,
36+
}
2837
s.ctx, s.cancel = context.WithCancel(ctx)
2938
s.exchangeInfoSrv = NewExchangeInfoSrv(s.ctx, NewSymbolInterval(s.class, "", ""))
3039
s.exchangeInfoSrv.Start()
@@ -131,6 +140,7 @@ func (s *Service) Klines(symbol, interval string) []*Kline {
131140
srv.(*KlinesSrv).Start()
132141
}
133142
}
143+
134144
s.lastGetKlines.Store(*si, time.Now())
135145

136146
return srv.(*KlinesSrv).GetKlines()

src/binance-proxy/service/ticker.go

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
log "github.com/sirupsen/logrus"
99

1010
spot "github.com/adshao/go-binance/v2"
11+
futures "github.com/adshao/go-binance/v2/futures"
1112
)
1213

1314
type TickerSrv struct {
@@ -105,11 +106,19 @@ func (s *TickerSrv) Stop() {
105106
}
106107

107108
func (s *TickerSrv) connectTickerBook() (doneC, stopC chan struct{}, err error) {
108-
return spot.WsBookTickerServe(s.si.Symbol, s.wsHandlerBookTicker, s.errHandler)
109+
if s.si.Class == SPOT {
110+
return spot.WsBookTickerServe(s.si.Symbol, s.wsHandlerBookTicker, s.errHandler)
111+
} else {
112+
return futures.WsBookTickerServe(s.si.Symbol, s.wsHandlerBookTickerFutures, s.errHandler)
113+
}
109114
}
110115

111116
func (s *TickerSrv) connectTicker24hr() (doneC, stopC chan struct{}, err error) {
112-
return spot.WsMarketStatServe(s.si.Symbol, s.wsHandlerTicker24hr, s.errHandler)
117+
if s.si.Class == SPOT {
118+
return spot.WsMarketStatServe(s.si.Symbol, s.wsHandlerTicker24hr, s.errHandler)
119+
} else {
120+
return futures.WsMarketTickerServe(s.si.Symbol, s.wsHandlerTicker24hrFutures, s.errHandler)
121+
}
113122
}
114123

115124
func (s *TickerSrv) GetTicker() *Ticker24hr {
@@ -191,6 +200,47 @@ func (s *TickerSrv) wsHandlerTicker24hr(event *spot.WsMarketStatEvent) {
191200
}
192201
}
193202

203+
func (s *TickerSrv) wsHandlerBookTickerFutures(event *futures.WsBookTickerEvent) {
204+
s.rw.Lock()
205+
defer s.rw.Unlock()
206+
207+
s.bookTicker = &BookTicker{
208+
Symbol: event.Symbol,
209+
BidPrice: event.BestBidPrice,
210+
BidQuantity: event.BestBidQty,
211+
AskPrice: event.BestAskPrice,
212+
AskQuantity: event.BestAskQty,
213+
}
214+
}
215+
216+
func (s *TickerSrv) wsHandlerTicker24hrFutures(event *futures.WsMarketTickerEvent) {
217+
s.rw.Lock()
218+
defer s.rw.Unlock()
219+
220+
if s.ticker24hr == nil {
221+
defer s.initDone()
222+
}
223+
224+
s.ticker24hr = &Ticker24hr{
225+
Symbol: event.Symbol,
226+
PriceChange: event.PriceChange,
227+
PriceChangePercent: event.PriceChangePercent,
228+
WeightedAvgPrice: event.WeightedAvgPrice,
229+
LastPrice: event.ClosePrice,
230+
LastQty: event.CloseQty,
231+
OpenPrice: event.OpenPrice,
232+
HighPrice: event.HighPrice,
233+
LowPrice: event.LowPrice,
234+
Volume: event.BaseVolume,
235+
QuoteVolume: event.QuoteVolume,
236+
OpenTime: event.OpenTime,
237+
CloseTime: event.CloseTime,
238+
FirstID: event.FirstID,
239+
LastID: event.LastID,
240+
Count: event.TradeCount,
241+
}
242+
}
243+
194244
func (s *TickerSrv) errHandler(err error) {
195245
log.Errorf("%s.Ticker websocket throw error!Error:%s", s.si, err)
196246
}

0 commit comments

Comments
 (0)