diff --git a/binance.go b/binance.go index 8b6b983..f5e4c8a 100644 --- a/binance.go +++ b/binance.go @@ -43,6 +43,8 @@ type Binance interface { OpenOrders(oor OpenOrdersRequest) ([]*ExecutedOrder, error) // AllOrders returns list of all previous orders. AllOrders(aor AllOrdersRequest) ([]*ExecutedOrder, error) + // RecentTrades returns all recent trades + RecentTrades(hr RecentTradesRequest) ([]*RecentTrades, error) // Account returns account data. Account(ar AccountRequest) (*Account, error) @@ -487,6 +489,27 @@ func (b *binance) WithdrawHistory(hr HistoryRequest) ([]*Withdrawal, error) { return b.Service.WithdrawHistory(hr) } + +type RecentTradesRequest struct { + Symbol string + Limit int +} + +type RecentTrades struct { + ID int64 + Price float64 + Qty float64 + Time time.Time + IsBuyerMaker bool + IsBestMatch bool +} + +// Recent trades list. +func (b *binance) RecentTrades(rt RecentTradesRequest) ([]*RecentTrades, error) { + return b.Service.RecentTrades(rt) +} + + // Stream represents stream information. // // Read web docs to get more information about using streams. diff --git a/service_def.go b/service_def.go index e380f98..c90841e 100644 --- a/service_def.go +++ b/service_def.go @@ -37,6 +37,7 @@ type Service interface { Withdraw(wr WithdrawRequest) (*WithdrawResult, error) DepositHistory(hr HistoryRequest) ([]*Deposit, error) WithdrawHistory(hr HistoryRequest) ([]*Withdrawal, error) + RecentTrades(hr RecentTradesRequest) ([]*RecentTrades, error) StartUserDataStream() (*Stream, error) KeepAliveUserDataStream(s *Stream) error diff --git a/service_market.go b/service_market.go index 510d718..876c160 100644 --- a/service_market.go +++ b/service_market.go @@ -177,6 +177,67 @@ func (as *apiService) AggTrades(atr AggTradesRequest) ([]*AggTrade, error) { return aggTrades, nil } +func (as *apiService) RecentTrades(rtr RecentTradesRequest) ([]*RecentTrades, error) { + params := make(map[string]string) + params["symbol"] = rtr.Symbol + if rtr.Limit != 0 { + params["limit"] = strconv.Itoa(rtr.Limit) + } + + res, err := as.request("GET", "api/v1/trades", params, false, false) + if err != nil { + return nil, err + } + textRes, err := ioutil.ReadAll(res.Body) + if err != nil { + return nil, errors.Wrap(err, "unable to read response from RecentTrades") + } + defer res.Body.Close() + + if res.StatusCode != 200 { + as.handleError(textRes) + } + + var rawRecentTrades []struct { + ID int64 `json:"id"` + Price string `json:"price"` + Qty string `json:"qty"` + Time float64 `json:"time"` + IsBuyerMaker bool `json:"isBuyerMaker"` + IsBestMatch bool `json:"isBestMatch"` + } + + if err := json.Unmarshal(textRes, &rawRecentTrades); err != nil { + return nil, errors.Wrap(err, "rawRecentTrades unmarshal failed") + } + + var recentTrades []*RecentTrades + for _, rrt := range rawRecentTrades { + price, err := floatFromString(rrt.Price) + if err != nil { + return nil, err + } + qty, err := floatFromString(rrt.Qty) + if err != nil { + return nil, err + } + + t, err := timeFromUnixTimestampFloat(rrt.Time) + if err != nil { + return nil, err + } + recentTrades = append(recentTrades, &RecentTrades{ + ID: rrt.ID, + Price: price, + Qty: qty, + Time: t, + IsBuyerMaker: rrt.IsBuyerMaker, + IsBestMatch: rrt.IsBestMatch, + }) + } + return recentTrades, nil +} + func (as *apiService) Klines(kr KlinesRequest) ([]*Kline, error) { params := make(map[string]string) params["symbol"] = kr.Symbol