exchanges/order, GateIO: Update USDT margined futures pathway for cancel all orders (#2021)

* order/gateio: update USDT margined futures pathway for cancel all orders and drop count field

* gateio: add and expand tests for CancelAllOrders and getExchangeSide

* Add test for load

* linter: fix

* Update exchanges/kraken/kraken_wrapper.go

Co-authored-by: Scott <gloriousCode@users.noreply.github.com>

* glorious: nits

* Update exchanges/order/orders.go

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* gk: nits

* glorious: nits

* reverted change for options

* Update exchanges/gateio/gateio_wrapper_test.go

Co-authored-by: Scott <gloriousCode@users.noreply.github.com>

* Update exchanges/gateio/gateio_wrapper.go

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* Update exchanges/deribit/deribit_wrapper.go

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* Update exchanges/gateio/gateio_wrapper_test.go

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* Update exchanges/gateio/gateio_wrapper_test.go

Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>

* Add consts for cancel side references

* Update exchanges/gateio/gateio_wrapper.go

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>

* Update exchanges/gateio/gateio_wrapper.go

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>

* Update exchanges/gateio/gateio_websocket_request_futures.go

Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>

* thrasher-: nits

---------

Co-authored-by: Ryan O'Hara-Reid <ryan.oharareid@thrasher.io>
Co-authored-by: Scott <gloriousCode@users.noreply.github.com>
Co-authored-by: Gareth Kirwan <gbjkirwan@gmail.com>
Co-authored-by: Adrian Gallagher <adrian.gallagher@thrasher.io>
This commit is contained in:
Ryan O'Hara-Reid
2025-10-02 15:50:51 +10:00
committed by GitHub
parent e11765bc36
commit dcf98ec700
13 changed files with 204 additions and 156 deletions

View File

@@ -1124,65 +1124,73 @@ func (e *Exchange) CancelBatchOrders(ctx context.Context, o []order.Cancel) (*or
// CancelAllOrders cancels all orders associated with a currency pair
func (e *Exchange) CancelAllOrders(ctx context.Context, o *order.Cancel) (order.CancelAllResponse, error) {
err := o.Validate()
if err != nil {
return order.CancelAllResponse{}, err
var resp order.CancelAllResponse
if err := o.Validate(); err != nil {
return resp, err
}
var cancelAllOrdersResponse order.CancelAllResponse
cancelAllOrdersResponse.Status = map[string]string{}
fmtPair, err := e.FormatExchangeCurrency(o.Pair, o.AssetType)
if err != nil {
return resp, err
}
var side string
switch {
case o.Side.IsLong():
side = order.Bid.Lower()
case o.Side.IsShort():
side = order.Ask.Lower()
case o.Side == order.UnknownSide, o.Side == order.AnySide:
default:
return resp, fmt.Errorf("%w: %q", order.ErrSideIsInvalid, o.Side)
}
switch o.AssetType {
case asset.Spot, asset.Margin, asset.CrossMargin:
if o.Pair.IsEmpty() {
return order.CancelAllResponse{}, currency.ErrCurrencyPairEmpty
}
var cancel []SpotPriceTriggeredOrder
cancel, err = e.CancelMultipleSpotOpenOrders(ctx, o.Pair, o.AssetType)
cancel, err := e.CancelMultipleSpotOpenOrders(ctx, fmtPair, o.AssetType)
if err != nil {
return cancelAllOrdersResponse, err
return resp, err
}
for x := range cancel {
cancelAllOrdersResponse.Status[strconv.FormatInt(cancel[x].AutoOrderID, 10)] = cancel[x].Status
resp.Add(strconv.FormatInt(cancel[x].AutoOrderID, 10), cancel[x].Status)
}
case asset.CoinMarginedFutures, asset.USDTMarginedFutures, asset.DeliveryFutures:
if o.Pair.IsEmpty() {
return cancelAllOrdersResponse, currency.ErrCurrencyPairEmpty
}
settle, err := getSettlementCurrency(o.Pair, o.AssetType)
settle, err := getSettlementCurrency(fmtPair, o.AssetType)
if err != nil {
return cancelAllOrdersResponse, err
return resp, err
}
var cancel []Order
if o.AssetType == asset.DeliveryFutures {
cancel, err = e.CancelMultipleDeliveryOrders(ctx, o.Pair, o.Side.Lower(), settle)
cancel, err = e.CancelMultipleDeliveryOrders(ctx, fmtPair, side, settle)
} else {
cancel, err = e.CancelMultipleFuturesOpenOrders(ctx, o.Pair, o.Side.Lower(), settle)
cancel, err = e.CancelMultipleFuturesOpenOrders(ctx, fmtPair, side, settle)
}
if err != nil {
return cancelAllOrdersResponse, err
return resp, err
}
for f := range cancel {
cancelAllOrdersResponse.Status[strconv.FormatInt(cancel[f].ID, 10)] = cancel[f].Status
resp.Add(strconv.FormatInt(cancel[f].ID, 10), cancel[f].FinishAs)
}
case asset.Options:
var underlying currency.Pair
if !o.Pair.IsEmpty() {
underlying, err = e.GetUnderlyingFromCurrencyPair(o.Pair)
if err != nil {
return cancelAllOrdersResponse, err
return resp, err
}
}
cancel, err := e.CancelMultipleOptionOpenOrders(ctx, o.Pair, underlying.String(), o.Side.Lower())
cancel, err := e.CancelMultipleOptionOpenOrders(ctx, fmtPair, underlying.String(), side)
if err != nil {
return cancelAllOrdersResponse, err
return resp, err
}
for x := range cancel {
cancelAllOrdersResponse.Status[strconv.FormatInt(cancel[x].OptionOrderID, 10)] = cancel[x].Status
resp.Add(strconv.FormatInt(cancel[x].OptionOrderID, 10), cancel[x].FinishAs)
}
default:
return cancelAllOrdersResponse, fmt.Errorf("%w asset type: %v", asset.ErrNotSupported, o.AssetType)
return resp, fmt.Errorf("%w asset type: %v", asset.ErrNotSupported, o.AssetType)
}
return cancelAllOrdersResponse, nil
return resp, nil
}
// GetOrderInfo returns order information based on order ID
@@ -2573,13 +2581,14 @@ func (e *Exchange) deriveFuturesWebsocketOrderResponses(responses []*WebsocketFu
}
func (e *Exchange) getSpotOrderRequest(s *order.Submit) (*CreateOrderRequest, error) {
var side string
switch {
case s.Side.IsLong():
s.Side = order.Buy
side = order.Buy.Lower()
case s.Side.IsShort():
s.Side = order.Sell
side = order.Sell.Lower()
default:
return nil, order.ErrSideIsInvalid
return nil, fmt.Errorf("%w: %q", order.ErrSideIsInvalid, s.Side)
}
tif, err := toExchangeTIF(s.TimeInForce, s.Price)
@@ -2588,7 +2597,7 @@ func (e *Exchange) getSpotOrderRequest(s *order.Submit) (*CreateOrderRequest, er
}
return &CreateOrderRequest{
Side: s.Side.Lower(),
Side: side,
Type: s.Type.Lower(),
Account: e.assetTypeToString(s.AssetType),
Amount: types.Number(s.GetTradeAmount(e.GetTradingRequirements())),