diff --git a/pkg/exchange/coinbase/api/v1/get_order_trades_request.go b/pkg/exchange/coinbase/api/v1/get_order_trades_request.go index 34d5ff55c..fbe6cc253 100644 --- a/pkg/exchange/coinbase/api/v1/get_order_trades_request.go +++ b/pkg/exchange/coinbase/api/v1/get_order_trades_request.go @@ -25,11 +25,12 @@ type Trade struct { type TradeSnapshot []Trade -//go:generate requestgen -method GET -url "/orders/fills" -type GetOrderTradesRequest -responseType .TradeSnapshot +//go:generate requestgen -method GET -url "/fills" -type GetOrderTradesRequest -responseType .TradeSnapshot type GetOrderTradesRequest struct { client requestgen.AuthenticatedAPIClient - orderID string `param:"order_id,required"` + orderID string `param:"order_id"` + productID string `param:"product_id"` // one of order_id or product_id is required limit int `param:"limit"` before *int `param:"before"` // pagination id, which is the trade_id (exclusive) after *int `param:"after"` // pagination id, which is the trade_id (exclusive) diff --git a/pkg/exchange/coinbase/api/v1/get_order_trades_request_requestgen.go b/pkg/exchange/coinbase/api/v1/get_order_trades_request_requestgen.go index 370a10cbc..d01a44b9c 100644 --- a/pkg/exchange/coinbase/api/v1/get_order_trades_request_requestgen.go +++ b/pkg/exchange/coinbase/api/v1/get_order_trades_request_requestgen.go @@ -1,4 +1,4 @@ -// Code generated by "requestgen -method GET -url /orders/fills -type GetOrderTradesRequest -responseType .TradeSnapshot"; DO NOT EDIT. +// Code generated by "requestgen -method GET -url /fills -type GetOrderTradesRequest -responseType .TradeSnapshot"; DO NOT EDIT. package coinbase @@ -16,6 +16,11 @@ func (g *GetOrderTradesRequest) OrderID(orderID string) *GetOrderTradesRequest { return g } +func (g *GetOrderTradesRequest) ProductID(productID string) *GetOrderTradesRequest { + g.productID = productID + return g +} + func (g *GetOrderTradesRequest) Limit(limit int) *GetOrderTradesRequest { g.limit = limit return g @@ -64,14 +69,13 @@ func (g *GetOrderTradesRequest) GetParameters() (map[string]interface{}, error) // check orderID field -> json key order_id orderID := g.orderID - // TEMPLATE check-required - if len(orderID) == 0 { - return nil, fmt.Errorf("order_id is required, empty string given") - } - // END TEMPLATE check-required - // assign parameter of orderID params["order_id"] = orderID + // check productID field -> json key product_id + productID := g.productID + + // assign parameter of productID + params["product_id"] = productID // check limit field -> json key limit limit := g.limit @@ -213,7 +217,7 @@ func (g *GetOrderTradesRequest) GetSlugsMap() (map[string]string, error) { // GetPath returns the request path of the API func (g *GetOrderTradesRequest) GetPath() string { - return "/orders/fills" + return "/fills" } // Do generates the request object and send the request object to the API endpoint diff --git a/pkg/exchange/coinbase/convert.go b/pkg/exchange/coinbase/convert.go index f9074b3f9..3ee3ccb9e 100644 --- a/pkg/exchange/coinbase/convert.go +++ b/pkg/exchange/coinbase/convert.go @@ -17,7 +17,7 @@ func toGlobalOrder(cbOrder *api.Order) types.Order { UUID: cbOrder.ID, OrderID: FNV64a(cbOrder.ID), OriginalStatus: string(cbOrder.Status), - CreationTime: types.Time(cbOrder.CreatedAt), + CreationTime: cbOrder.CreatedAt, } } diff --git a/pkg/exchange/coinbase/exchage.go b/pkg/exchange/coinbase/exchage.go index 542ad7806..c852b020b 100644 --- a/pkg/exchange/coinbase/exchage.go +++ b/pkg/exchange/coinbase/exchage.go @@ -355,7 +355,7 @@ func (e *Exchange) QueryOrder(ctx context.Context, q types.OrderQuery) (*types.O } func (e *Exchange) QueryOrderTrades(ctx context.Context, q types.OrderQuery) ([]types.Trade, error) { - cbTrades, err := e.queryOrderTradesByPagination(ctx, q.OrderID) + cbTrades, err := e.queryOrderTradesByPagination(ctx, q) if err != nil { return nil, errors.Wrapf(err, "failed to get order trades: %v", q.OrderID) } @@ -366,8 +366,15 @@ func (e *Exchange) QueryOrderTrades(ctx context.Context, q types.OrderQuery) ([] return trades, nil } -func (e *Exchange) queryOrderTradesByPagination(ctx context.Context, orderID string) (api.TradeSnapshot, error) { - req := e.client.NewGetOrderTradesRequest().OrderID(orderID).Limit(PaginationLimit) +func (e *Exchange) queryOrderTradesByPagination(ctx context.Context, q types.OrderQuery) (api.TradeSnapshot, error) { + paginationLimit := 100 + req := e.client.NewGetOrderTradesRequest().Limit(paginationLimit) + if len(q.OrderID) > 0 { + req.OrderID(q.OrderID) + } + if len(q.Symbol) > 0 { + req.ProductID(toLocalSymbol(q.Symbol)) + } cbTrades, err := req.Do(ctx) if err != nil { return nil, err diff --git a/pkg/exchange/coinbase/exchange_test.go b/pkg/exchange/coinbase/exchange_test.go index 383a3511c..28fca6ed4 100644 --- a/pkg/exchange/coinbase/exchange_test.go +++ b/pkg/exchange/coinbase/exchange_test.go @@ -21,7 +21,7 @@ func Test_new(t *testing.T) { _ = ex.PlatformFeeCurrency() } -func Test_SubmitOrder(t *testing.T) { +func Test_OrdersAPI(t *testing.T) { ex := getExchangeOrSkip(t) ctx := context.Background() @@ -37,7 +37,40 @@ func Test_SubmitOrder(t *testing.T) { }) assert.Error(t, err) assert.Empty(t, order) - // TODO: test with real symbol + // should succeed + order, err = ex.SubmitOrder( + ctx, + types.SubmitOrder{ + Symbol: "ETHUSD", + Side: types.SideTypeBuy, + Type: types.OrderTypeLimit, + Price: fixedpoint.MustNewFromString("0.01"), + Quantity: fixedpoint.MustNewFromString("100"), // min funds is $1 + }) + assert.NoError(t, err) + assert.NotEmpty(t, order) + + // test query open orders + order, err = ex.QueryOrder(ctx, types.OrderQuery{Symbol: "ETHUSD", OrderID: order.UUID, ClientOrderID: order.UUID}) + assert.NoError(t, err) + + orders, err := ex.QueryOpenOrders(ctx, "ETHUSD") + assert.NoError(t, err) + found := false + for _, o := range orders { + if o.UUID == order.UUID { + found = true + break + } + } + assert.True(t, found) + + // test cancel order + err = ex.CancelOrders(ctx, types.Order{ + Exchange: types.ExchangeCoinBase, + UUID: order.UUID, + }) + assert.NoError(t, err) } func Test_QueryAccount(t *testing.T) { @@ -47,6 +80,13 @@ func Test_QueryAccount(t *testing.T) { assert.NoError(t, err) } +func Test_QueryAccountBalances(t *testing.T) { + ex := getExchangeOrSkip(t) + ctx := context.Background() + _, err := ex.QueryAccountBalances(ctx) + assert.NoError(t, err) +} + func Test_QueryOpenOrders(t *testing.T) { ex := getExchangeOrSkip(t) ctx := context.Background() @@ -94,6 +134,15 @@ func Test_QueryKLines(t *testing.T) { assert.NotNil(t, klines) } +func Test_QueryOrderTrades(t *testing.T) { + ex := getExchangeOrSkip(t) + ctx := context.Background() + + trades, err := ex.QueryOrderTrades(ctx, types.OrderQuery{Symbol: "ETHUSD"}) + assert.NoError(t, err) + assert.NotNil(t, trades) +} + func getExchangeOrSkip(t *testing.T) *Exchange { if b, _ := strconv.ParseBool(os.Getenv("CI")); b { t.Skip("skip test for CI")