From e37512e94fe4558cca72941d9c2314ca4fa885e9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Wed, 18 Dec 2019 10:56:02 +1100 Subject: [PATCH] (BTC Markets) Ticker batching support (#399) * moved to getticekers endpoint * add support for tickerbatching * const and things * moved openOrders to bool * gofmt and clean up test logs * revert canManipulateRealOrders to false --- exchanges/btcmarkets/btcmarkets.go | 12 +++--- exchanges/btcmarkets/btcmarkets_test.go | 25 ++++++++++--- exchanges/btcmarkets/btcmarkets_wrapper.go | 43 +++++++++++----------- 3 files changed, 46 insertions(+), 34 deletions(-) diff --git a/exchanges/btcmarkets/btcmarkets.go b/exchanges/btcmarkets/btcmarkets.go index 637e32ae..60e031d8 100644 --- a/exchanges/btcmarkets/btcmarkets.go +++ b/exchanges/btcmarkets/btcmarkets.go @@ -29,7 +29,7 @@ const ( btcMarketsGetTrades = "/trades?" btcMarketOrderBooks = "/orderbook?" btcMarketsCandles = "/candles?" - btcMarketsTickers = "/tickers?" + btcMarketsTickers = "tickers?" btcMarketsMultipleOrderbooks = "/orderbooks?" btcMarketsGetTime = "/time" btcMarketsWithdrawalFees = "/withdrawal-fees" @@ -227,11 +227,11 @@ func (b *BTCMarkets) GetMarketCandles(marketID, timeWindow, from, to string, bef } // GetTickers gets multiple tickers -func (b *BTCMarkets) GetTickers(marketIDs []string) ([]Ticker, error) { +func (b *BTCMarkets) GetTickers(marketIDs []currency.Pair) ([]Ticker, error) { var tickers []Ticker params := url.Values{} for x := range marketIDs { - params.Add("marketId", marketIDs[x]) + params.Add("marketId", marketIDs[x].String()) } return tickers, b.SendHTTPRequest(btcMarketsUnauthPath+btcMarketsTickers+params.Encode(), &tickers) @@ -375,7 +375,7 @@ func (b *BTCMarkets) NewOrder(marketID string, price, amount float64, orderType, } // GetOrders returns current order information on the exchange -func (b *BTCMarkets) GetOrders(marketID string, before, after, limit int64, status string) ([]OrderData, error) { +func (b *BTCMarkets) GetOrders(marketID string, before, after, limit int64, openOnly bool) ([]OrderData, error) { if (before > 0) && (after >= 0) { return nil, errors.New("BTCMarkets only supports either before or after, not both") } @@ -393,8 +393,8 @@ func (b *BTCMarkets) GetOrders(marketID string, before, after, limit int64, stat if limit > 0 { params.Set("limit", strconv.FormatInt(limit, 10)) } - if status != "" { - params.Set("status", status) + if openOnly { + params.Set("status", "open") } return resp, b.SendAuthenticatedRequest(http.MethodGet, common.EncodeURLValues(btcMarketsOrders, params), nil, &resp) diff --git a/exchanges/btcmarkets/btcmarkets_test.go b/exchanges/btcmarkets/btcmarkets_test.go index f7e669cb..55437a4e 100644 --- a/exchanges/btcmarkets/btcmarkets_test.go +++ b/exchanges/btcmarkets/btcmarkets_test.go @@ -94,7 +94,7 @@ func TestGetMarketCandles(t *testing.T) { func TestGetTickers(t *testing.T) { t.Parallel() - temp := []string{BTCAUD, LTCAUD, ETHAUD} + temp := currency.NewPairsFromStrings([]string{LTCAUD, BTCAUD}) _, err := b.GetTickers(temp) if err != nil { t.Error(err) @@ -194,11 +194,11 @@ func TestGetOrders(t *testing.T) { if !areTestAPIKeysSet() { t.Skip("API keys required but not set, skipping test") } - _, err := b.GetOrders("", -1, -1, 2, "") + _, err := b.GetOrders("", -1, -1, 2, false) if err != nil { t.Error(err) } - _, err = b.GetOrders(LTCAUD, -1, -1, -1, "open") + _, err = b.GetOrders(LTCAUD, -1, -1, -1, true) if err != nil { t.Error(err) } @@ -454,9 +454,10 @@ func TestGetOrderHistory(t *testing.T) { if !areTestAPIKeysSet() { t.Skip("API keys required but not set, skipping test") } - var input order.GetOrdersRequest - input.OrderSide = order.Buy - _, err := b.GetOrderHistory(&input) + + _, err := b.GetOrderHistory(&order.GetOrdersRequest{ + OrderSide: order.Buy, + }) if err != nil { t.Error(err) } @@ -479,3 +480,15 @@ func TestUpdateTicker(t *testing.T) { t.Error(err) } } + +func TestGetActiveOrders(t *testing.T) { + t.Parallel() + if !areTestAPIKeysSet() { + t.Skip("API keys required but not set, skipping test") + } + + _, err := b.GetActiveOrders(&order.GetOrdersRequest{}) + if err != nil { + t.Fatal(err) + } +} diff --git a/exchanges/btcmarkets/btcmarkets_wrapper.go b/exchanges/btcmarkets/btcmarkets_wrapper.go index fcb4e849..5d3ee75b 100644 --- a/exchanges/btcmarkets/btcmarkets_wrapper.go +++ b/exchanges/btcmarkets/btcmarkets_wrapper.go @@ -76,6 +76,7 @@ func (b *BTCMarkets) SetDefaults() { REST: true, Websocket: true, RESTCapabilities: protocol.Features{ + TickerBatching: true, TickerFetching: true, TradeFetching: true, OrderbookFetching: true, @@ -245,24 +246,24 @@ func (b *BTCMarkets) UpdateTradablePairs(forceUpdate bool) error { // UpdateTicker updates and returns the ticker for a currency pair func (b *BTCMarkets) UpdateTicker(p currency.Pair, assetType asset.Item) (*ticker.Price, error) { - tickerPrice := new(ticker.Price) allPairs := b.GetEnabledPairs(assetType) - for x := range allPairs { - tick, err := b.GetTicker(b.FormatExchangeCurrency(allPairs[x], assetType).String()) + tickers, err := b.GetTickers(allPairs.Slice()) + if err != nil { + return nil, err + } + for x := range tickers { + var resp ticker.Price + resp.Pair = currency.NewPairFromString(tickers[x].MarketID) + resp.Last = tickers[x].LastPrice + resp.High = tickers[x].High24h + resp.Low = tickers[x].Low24h + resp.Bid = tickers[x].BestBID + resp.Ask = tickers[x].BestAsk + resp.Volume = tickers[x].Volume + resp.LastUpdated = time.Now() + err = ticker.ProcessTicker(b.Name, &resp, assetType) if err != nil { - return tickerPrice, err - } - tickerPrice.Pair = allPairs[x] - tickerPrice.Last = tick.LastPrice - tickerPrice.High = tick.High24h - tickerPrice.Low = tick.Low24h - tickerPrice.Bid = tick.BestBID - tickerPrice.Ask = tick.BestAsk - tickerPrice.Volume = tick.Volume - tickerPrice.LastUpdated = time.Now() - err = ticker.ProcessTicker(b.Name, tickerPrice, assetType) - if err != nil { - return tickerPrice, err + return nil, err } } return ticker.GetTicker(b.Name, p, assetType) @@ -396,7 +397,7 @@ func (b *BTCMarkets) CancelAllOrders(_ *order.Cancel) (order.CancelAllResponse, var resp order.CancelAllResponse tempMap := make(map[string]string) var orderIDs []string - orders, err := b.GetOrders("", -1, -1, -1, "open") + orders, err := b.GetOrders("", -1, -1, -1, true) if err != nil { return resp, err } @@ -547,10 +548,8 @@ func (b *BTCMarkets) GetActiveOrders(req *order.GetOrdersRequest) ([]order.Detai } var resp []order.Detail - var err error for x := range req.Currencies { - var tempData []OrderData - tempData, err = b.GetOrders(b.FormatExchangeCurrency(req.Currencies[x], asset.Spot).String(), -1, -1, -1, "open") + tempData, err := b.GetOrders(b.FormatExchangeCurrency(req.Currencies[x], asset.Spot).String(), -1, -1, -1, true) if err != nil { return resp, err } @@ -612,7 +611,7 @@ func (b *BTCMarkets) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detai var tempResp order.Detail var tempArray []string if len(req.Currencies) == 0 { - orders, err := b.GetOrders("", -1, -1, -1, "") + orders, err := b.GetOrders("", -1, -1, -1, false) if err != nil { return resp, err } @@ -621,7 +620,7 @@ func (b *BTCMarkets) GetOrderHistory(req *order.GetOrdersRequest) ([]order.Detai } } for y := range req.Currencies { - orders, err := b.GetOrders(b.FormatExchangeCurrency(req.Currencies[y], asset.Spot).String(), -1, -1, -1, "") + orders, err := b.GetOrders(b.FormatExchangeCurrency(req.Currencies[y], asset.Spot).String(), -1, -1, -1, false) if err != nil { return resp, err }