diff --git a/pkg/exchange/bybit/bybitapi/cancel_order_request.go b/pkg/exchange/bybit/bybitapi/cancel_order_request.go index 144a08623..4ff7cb0a5 100644 --- a/pkg/exchange/bybit/bybitapi/cancel_order_request.go +++ b/pkg/exchange/bybit/bybitapi/cancel_order_request.go @@ -21,7 +21,7 @@ type CancelOrderRequest struct { // User customised order ID. Either orderId or orderLinkId is required orderLinkId string `param:"orderLinkId"` - orderId *string `param:"orderLinkId"` + orderId *string `param:"orderId"` // orderFilter default type is Order // tpsl order type are not currently supported orderFilter *string `param:"timeInForce" validValues:"Order"` diff --git a/pkg/exchange/bybit/bybitapi/cancel_order_request_requestgen.go b/pkg/exchange/bybit/bybitapi/cancel_order_request_requestgen.go index 6bda981de..ad168ded9 100644 --- a/pkg/exchange/bybit/bybitapi/cancel_order_request_requestgen.go +++ b/pkg/exchange/bybit/bybitapi/cancel_order_request_requestgen.go @@ -77,12 +77,12 @@ func (p *CancelOrderRequest) GetParameters() (map[string]interface{}, error) { // assign parameter of orderLinkId params["orderLinkId"] = orderLinkId - // check orderId field -> json key orderLinkId + // check orderId field -> json key orderId if p.orderId != nil { orderId := *p.orderId // assign parameter of orderId - params["orderLinkId"] = orderId + params["orderId"] = orderId } else { } // check orderFilter field -> json key timeInForce diff --git a/pkg/exchange/bybit/exchange.go b/pkg/exchange/bybit/exchange.go index a38246936..ba1e123b8 100644 --- a/pkg/exchange/bybit/exchange.go +++ b/pkg/exchange/bybit/exchange.go @@ -302,7 +302,9 @@ func (e *Exchange) SubmitOrder(ctx context.Context, order types.SubmitOrder) (*t if len(order.ClientOrderID) > maxOrderIdLen { return nil, fmt.Errorf("unexpected length of order id, got: %d", len(order.ClientOrderID)) } - req.OrderLinkId(order.ClientOrderID) + if len(order.ClientOrderID) > 0 { + req.OrderLinkId(order.ClientOrderID) + } if err := orderRateLimiter.Wait(ctx); err != nil { return nil, fmt.Errorf("place order rate limiter wait error: %w", err) @@ -312,11 +314,11 @@ func (e *Exchange) SubmitOrder(ctx context.Context, order types.SubmitOrder) (*t return nil, fmt.Errorf("failed to place order, order: %#v, err: %w", order, err) } - if len(res.OrderId) == 0 || res.OrderLinkId != order.ClientOrderID { + if len(res.OrderId) == 0 || (len(order.ClientOrderID) != 0 && res.OrderLinkId != order.ClientOrderID) { return nil, fmt.Errorf("unexpected order id, resp: %#v, order: %#v", res, order) } - ordersResp, err := e.client.NewGetOpenOrderRequest().OrderLinkId(res.OrderLinkId).Do(ctx) + ordersResp, err := e.client.NewGetOpenOrderRequest().OrderId(res.OrderId).Do(ctx) if err != nil { return nil, fmt.Errorf("failed to query order by client order id: %s, err: %w", res.OrderLinkId, err) } @@ -336,11 +338,17 @@ func (e *Exchange) CancelOrders(ctx context.Context, orders ...types.Order) (err for _, order := range orders { req := e.client.NewCancelOrderRequest() + reqId := "" switch { + // use the OrderID first, then the ClientOrderID + case order.OrderID > 0: + req.OrderId(order.UUID) + reqId = order.UUID + case len(order.ClientOrderID) != 0: req.OrderLinkId(order.ClientOrderID) - case len(order.UUID) != 0 && order.OrderID != 0: - req.OrderId(order.UUID) + reqId = order.ClientOrderID + default: errs = multierr.Append( errs, @@ -360,8 +368,10 @@ func (e *Exchange) CancelOrders(ctx context.Context, orders ...types.Order) (err errs = multierr.Append(errs, fmt.Errorf("failed to cancel order id: %s, err: %w", order.ClientOrderID, err)) continue } - if res.OrderId != order.UUID || res.OrderLinkId != order.ClientOrderID { - errs = multierr.Append(errs, fmt.Errorf("unexpected order id, resp: %#v, order: %#v", res, order)) + + // sanity check + if res.OrderId != reqId && res.OrderLinkId != reqId { + errs = multierr.Append(errs, fmt.Errorf("order id mismatch, exp: %s, respOrderId: %s, respOrderLinkId: %s", reqId, res.OrderId, res.OrderLinkId)) continue } }