bbgo/pkg/exchange/binance/cancel_replace.go

72 lines
2.0 KiB
Go

package binance
import (
"context"
"fmt"
"git.qtrade.icu/lychiyu/bbgo/pkg/exchange/binance/binanceapi"
"git.qtrade.icu/lychiyu/bbgo/pkg/types"
"github.com/adshao/go-binance/v2"
)
func (e *Exchange) CancelReplace(ctx context.Context, cancelReplaceMode types.CancelReplaceModeType, o types.Order) (*types.Order, error) {
if err := orderLimiter.Wait(ctx); err != nil {
log.WithError(err).Errorf("order rate limiter wait error")
return nil, err
}
if e.IsFutures || e.IsMargin {
// Not supported at the moment
return nil, nil
}
var req = e.client2.NewCancelReplaceSpotOrderRequest()
req.Symbol(o.Symbol)
req.Side(binance.SideType(o.Side))
if o.OrderID > 0 {
req.CancelOrderId(int(o.OrderID))
} else {
return nil, types.NewOrderError(fmt.Errorf("cannot cancel %s order", o.Symbol), o)
}
req.CancelReplaceMode(binanceapi.CancelReplaceModeType(cancelReplaceMode))
if len(o.TimeInForce) > 0 {
// TODO: check the TimeInForce value
req.TimeInForce(string(binance.TimeInForceType(o.TimeInForce)))
} else {
switch o.Type {
case types.OrderTypeLimit, types.OrderTypeStopLimit:
req.TimeInForce(string(binance.TimeInForceTypeGTC))
}
}
if o.Market.Symbol != "" {
req.Quantity(o.Market.FormatQuantity(o.Quantity))
} else {
req.Quantity(o.Quantity.FormatString(8))
}
switch o.Type {
case types.OrderTypeStopLimit, types.OrderTypeLimit, types.OrderTypeLimitMaker:
if o.Market.Symbol != "" {
req.Price(o.Market.FormatPrice(o.Price))
} else {
// TODO: report error
req.Price(o.Price.FormatString(8))
}
}
switch o.Type {
case types.OrderTypeStopLimit, types.OrderTypeStopMarket:
if o.Market.Symbol != "" {
req.StopPrice(o.Market.FormatPrice(o.StopPrice))
} else {
// TODO report error
req.StopPrice(o.StopPrice.FormatString(8))
}
}
req.NewOrderRespType(binanceapi.Full)
resp, err := req.Do(ctx)
if resp != nil && resp.Data != nil && resp.Data.NewOrderResponse != nil {
return toGlobalOrder(resp.Data.NewOrderResponse, e.IsMargin)
}
return nil, err
}