@@ -29,15 +29,15 @@ import (
29
29
// BinanceWrapper represents the wrapper for the Binance exchange.
30
30
type BinanceWrapper struct {
31
31
api * binance.Client
32
- summaries SummaryCache
33
- candles CandlesCache
32
+ summaries * SummaryCache
33
+ candles * CandlesCache
34
34
websocketOn bool
35
35
}
36
36
37
37
// NewBinanceWrapper creates a generic wrapper of the binance API.
38
38
func NewBinanceWrapper (publicKey string , secretKey string ) ExchangeWrapper {
39
39
client := binance .NewClient (publicKey , secretKey )
40
- return BinanceWrapper {
40
+ return & BinanceWrapper {
41
41
api : client ,
42
42
summaries : NewSummaryCache (),
43
43
candles : NewCandlesCache (),
@@ -46,16 +46,16 @@ func NewBinanceWrapper(publicKey string, secretKey string) ExchangeWrapper {
46
46
}
47
47
48
48
// Name returns the name of the wrapped exchange.
49
- func (wrapper BinanceWrapper ) Name () string {
49
+ func (wrapper * BinanceWrapper ) Name () string {
50
50
return "binance"
51
51
}
52
52
53
- func (wrapper BinanceWrapper ) String () string {
53
+ func (wrapper * BinanceWrapper ) String () string {
54
54
return wrapper .Name ()
55
55
}
56
56
57
57
// GetMarkets Gets all the markets info.
58
- func (wrapper BinanceWrapper ) GetMarkets () ([]* environment.Market , error ) {
58
+ func (wrapper * BinanceWrapper ) GetMarkets () ([]* environment.Market , error ) {
59
59
binanceMarkets , err := wrapper .api .NewListPricesService ().Do (context .Background ())
60
60
if err != nil {
61
61
return nil , err
@@ -81,7 +81,7 @@ func (wrapper BinanceWrapper) GetMarkets() ([]*environment.Market, error) {
81
81
}
82
82
83
83
// GetOrderBook gets the order(ASK + BID) book of a market.
84
- func (wrapper BinanceWrapper ) GetOrderBook (market * environment.Market ) (* environment.OrderBook , error ) {
84
+ func (wrapper * BinanceWrapper ) GetOrderBook (market * environment.Market ) (* environment.OrderBook , error ) {
85
85
binanceOrderBook , err := wrapper .api .NewListOrdersService ().Symbol (MarketNameFor (market , wrapper )).Do (context .Background ())
86
86
if err != nil {
87
87
return nil , err
@@ -118,31 +118,31 @@ func (wrapper BinanceWrapper) GetOrderBook(market *environment.Market) (*environ
118
118
}
119
119
120
120
// BuyLimit performs a limit buy action.
121
- func (wrapper BinanceWrapper ) BuyLimit (market * environment.Market , amount float64 , limit float64 ) (string , error ) {
121
+ func (wrapper * BinanceWrapper ) BuyLimit (market * environment.Market , amount float64 , limit float64 ) (string , error ) {
122
122
orderNumber , err := wrapper .api .NewCreateOrderService ().Type (binance .OrderTypeLimit ).Side (binance .SideTypeBuy ).Symbol (MarketNameFor (market , wrapper )).Price (fmt .Sprint (limit )).Quantity (fmt .Sprint (amount )).Do (context .Background ())
123
123
return fmt .Sprint (orderNumber .ClientOrderID ), err
124
124
}
125
125
126
126
// SellLimit performs a limit sell action.
127
- func (wrapper BinanceWrapper ) SellLimit (market * environment.Market , amount float64 , limit float64 ) (string , error ) {
127
+ func (wrapper * BinanceWrapper ) SellLimit (market * environment.Market , amount float64 , limit float64 ) (string , error ) {
128
128
orderNumber , err := wrapper .api .NewCreateOrderService ().Type (binance .OrderTypeLimit ).Side (binance .SideTypeSell ).Symbol (MarketNameFor (market , wrapper )).Price (fmt .Sprint (limit )).Quantity (fmt .Sprint (amount )).Do (context .Background ())
129
129
return fmt .Sprint (orderNumber .ClientOrderID ), err
130
130
}
131
131
132
132
// BuyMarket performs a market buy action.
133
- func (wrapper BinanceWrapper ) BuyMarket (market * environment.Market , amount float64 ) (string , error ) {
133
+ func (wrapper * BinanceWrapper ) BuyMarket (market * environment.Market , amount float64 ) (string , error ) {
134
134
orderNumber , err := wrapper .api .NewCreateOrderService ().Type (binance .OrderTypeMarket ).Side (binance .SideTypeBuy ).Symbol (MarketNameFor (market , wrapper )).Quantity (fmt .Sprint (amount )).Do (context .Background ())
135
135
return fmt .Sprint (orderNumber .ClientOrderID ), err
136
136
}
137
137
138
138
// SellMarket performs a market sell action.
139
- func (wrapper BinanceWrapper ) SellMarket (market * environment.Market , amount float64 ) (string , error ) {
139
+ func (wrapper * BinanceWrapper ) SellMarket (market * environment.Market , amount float64 ) (string , error ) {
140
140
orderNumber , err := wrapper .api .NewCreateOrderService ().Type (binance .OrderTypeMarket ).Side (binance .SideTypeSell ).Symbol (MarketNameFor (market , wrapper )).Quantity (fmt .Sprint (amount )).Do (context .Background ())
141
141
return fmt .Sprint (orderNumber .ClientOrderID ), err
142
142
}
143
143
144
144
// GetTicker gets the updated ticker for a market.
145
- func (wrapper BinanceWrapper ) GetTicker (market * environment.Market ) (* environment.Ticker , error ) {
145
+ func (wrapper * BinanceWrapper ) GetTicker (market * environment.Market ) (* environment.Ticker , error ) {
146
146
binanceTicker , err := wrapper .api .NewBookTickerService ().Symbol (MarketNameFor (market , wrapper )).Do (context .Background ())
147
147
if err != nil {
148
148
return nil , err
@@ -159,7 +159,7 @@ func (wrapper BinanceWrapper) GetTicker(market *environment.Market) (*environmen
159
159
}
160
160
161
161
// GetMarketSummary gets the current market summary.
162
- func (wrapper BinanceWrapper ) GetMarketSummary (market * environment.Market ) (* environment.MarketSummary , error ) {
162
+ func (wrapper * BinanceWrapper ) GetMarketSummary (market * environment.Market ) (* environment.MarketSummary , error ) {
163
163
if ! wrapper .websocketOn {
164
164
hilo , err := wrapper .api .NewListPriceChangeStatsService ().Do (context .Background ())
165
165
if err != nil {
@@ -204,7 +204,7 @@ func (wrapper BinanceWrapper) GetMarketSummary(market *environment.Market) (*env
204
204
}
205
205
206
206
// GetCandles gets the candle data from the exchange.
207
- func (wrapper BinanceWrapper ) GetCandles (market * environment.Market ) ([]environment.CandleStick , error ) {
207
+ func (wrapper * BinanceWrapper ) GetCandles (market * environment.Market ) ([]environment.CandleStick , error ) {
208
208
if ! wrapper .websocketOn {
209
209
binanceCandles , err := wrapper .api .NewKlinesService ().Symbol (MarketNameFor (market , wrapper )).Do (context .Background ())
210
210
if err != nil {
@@ -241,7 +241,7 @@ func (wrapper BinanceWrapper) GetCandles(market *environment.Market) ([]environm
241
241
}
242
242
243
243
// GetBalance gets the balance of the user of the specified currency.
244
- func (wrapper BinanceWrapper ) GetBalance (symbol string ) (* decimal.Decimal , error ) {
244
+ func (wrapper * BinanceWrapper ) GetBalance (symbol string ) (* decimal.Decimal , error ) {
245
245
binanceAccount , err := wrapper .api .NewGetAccountService ().Do (context .Background ())
246
246
if err != nil {
247
247
return nil , err
@@ -263,7 +263,7 @@ func (wrapper BinanceWrapper) GetBalance(symbol string) (*decimal.Decimal, error
263
263
// CalculateTradingFees calculates the trading fees for an order on a specified market.
264
264
//
265
265
// NOTE: In Binance fees are currently hardcoded.
266
- func (wrapper BinanceWrapper ) CalculateTradingFees (market * environment.Market , amount float64 , limit float64 , orderType TradeType ) float64 {
266
+ func (wrapper * BinanceWrapper ) CalculateTradingFees (market * environment.Market , amount float64 , limit float64 , orderType TradeType ) float64 {
267
267
var feePercentage float64
268
268
if orderType == MakerTrade {
269
269
feePercentage = 0.0010
@@ -277,60 +277,44 @@ func (wrapper BinanceWrapper) CalculateTradingFees(market *environment.Market, a
277
277
}
278
278
279
279
// CalculateWithdrawFees calculates the withdrawal fees on a specified market.
280
- func (wrapper BinanceWrapper ) CalculateWithdrawFees (market * environment.Market , amount float64 ) float64 {
280
+ func (wrapper * BinanceWrapper ) CalculateWithdrawFees (market * environment.Market , amount float64 ) float64 {
281
281
panic ("Not Implemented" )
282
282
}
283
283
284
284
// FeedConnect connects to the feed of the exchange.
285
- func (wrapper BinanceWrapper ) FeedConnect () {
286
- wrapper .websocketOn = true
287
- }
288
-
289
- var unsubscribe = make (map [string ]chan struct {})
290
- var unsubscribed = make (map [string ]chan struct {})
291
-
292
- // SubscribeMarketSummaryFeed subscribes to the Market Summary Feed service.
293
- func (wrapper BinanceWrapper ) SubscribeMarketSummaryFeed (market * environment.Market ) {
294
- if wrapper .websocketOn {
295
- doneC , stopC , err := binance .WsMarketStatServe (MarketNameFor (market , wrapper ), func (event * binance.WsMarketStatEvent ) {
296
- high , _ := decimal .NewFromString (event .HighPrice )
297
- low , _ := decimal .NewFromString (event .LowPrice )
298
- ask , _ := decimal .NewFromString (event .AskPrice )
299
- bid , _ := decimal .NewFromString (event .BidPrice )
300
- last , _ := decimal .NewFromString (event .LastPrice )
301
- volume , _ := decimal .NewFromString (event .BaseVolume )
302
-
303
- wrapper .summaries .Set (market , & environment.MarketSummary {
304
- High : high ,
305
- Low : low ,
306
- Ask : ask ,
307
- Bid : bid ,
308
- Last : last ,
309
- Volume : volume ,
310
- })
311
- }, func (error ) {})
312
-
285
+ func (wrapper * BinanceWrapper ) FeedConnect (markets []* environment.Market ) error {
286
+ for _ , m := range markets {
287
+ err := wrapper .subscribeMarketSummaryFeed (m )
313
288
if err != nil {
314
- panic ( err )
289
+ return err
315
290
}
316
-
317
- unsubscribe [MarketNameFor (market , wrapper )] = stopC
318
- unsubscribed [MarketNameFor (market , wrapper )] = doneC
319
291
}
320
- }
321
-
322
- // UnsubscribeMarketSummaryFeed unsubscribes from the Market Summary Feed service.
323
- func (wrapper BinanceWrapper ) UnsubscribeMarketSummaryFeed (market * environment.Market ) {
324
- if wrapper .websocketOn {
325
- tickerKey := MarketNameFor (market , wrapper )
292
+ wrapper .websocketOn = true
326
293
327
- unsubscribe [tickerKey ] <- struct {}{}
294
+ return nil
295
+ }
328
296
329
- <- unsubscribed [tickerKey ]
297
+ // SubscribeMarketSummaryFeed subscribes to the Market Summary Feed service.
298
+ func (wrapper * BinanceWrapper ) subscribeMarketSummaryFeed (market * environment.Market ) error {
299
+ _ , _ , err := binance .WsMarketStatServe (MarketNameFor (market , wrapper ), func (event * binance.WsMarketStatEvent ) {
300
+ high , _ := decimal .NewFromString (event .HighPrice )
301
+ low , _ := decimal .NewFromString (event .LowPrice )
302
+ ask , _ := decimal .NewFromString (event .AskPrice )
303
+ bid , _ := decimal .NewFromString (event .BidPrice )
304
+ last , _ := decimal .NewFromString (event .LastPrice )
305
+ volume , _ := decimal .NewFromString (event .BaseVolume )
330
306
331
- close (unsubscribe [tickerKey ])
332
- close (unsubscribed [tickerKey ])
333
- delete (unsubscribe , tickerKey )
334
- delete (unsubscribed , tickerKey )
307
+ wrapper .summaries .Set (market , & environment.MarketSummary {
308
+ High : high ,
309
+ Low : low ,
310
+ Ask : ask ,
311
+ Bid : bid ,
312
+ Last : last ,
313
+ Volume : volume ,
314
+ })
315
+ }, func (error ) {})
316
+ if err != nil {
317
+ return err
335
318
}
319
+ return nil
336
320
}
0 commit comments