Skip to content

Commit 38a155d

Browse files
authored
Merge pull request #1561 from c9s/edwin/bitget/test-place-order
FIX: [bitget] support market order on bitget unfilled order conversion
2 parents ca68771 + 9144580 commit 38a155d

File tree

3 files changed

+76
-6
lines changed

3 files changed

+76
-6
lines changed

pkg/exchange/bitget/convert.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,17 @@ func unfilledOrderToGlobalOrder(order v2.UnfilledOrder) (*types.Order, error) {
189189
qty := order.Size
190190
price := order.PriceAvg
191191

192-
// The market order will be executed immediately, so this check is used to handle corner cases.
192+
// 2023/11/05 The market order will be executed immediately, so this check is used to handle corner cases.
193+
// 2024/03/06 After placing a Market Order, we can retrieve it through the unfilledOrder API, so we still need to
194+
// handle the Market Order status.
193195
if orderType == types.OrderTypeMarket {
194-
qty = order.BaseVolume
195-
log.Warnf("!!! The price(%f) and quantity(%f) are not verified for market orders, because we only receive limit orders in the test environment !!!", price.Float64(), qty.Float64())
196+
price = order.PriceAvg
197+
if side == types.SideTypeBuy {
198+
qty, err = processMarketBuyQuantity(order.BaseVolume, order.QuoteVolume, order.PriceAvg, order.Size, order.Status)
199+
if err != nil {
200+
return nil, err
201+
}
202+
}
196203
}
197204

198205
return &types.Order{

pkg/exchange/bitget/convert_test.go

+62-1
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ func Test_unfilledOrderToGlobalOrder(t *testing.T) {
227227
}
228228
)
229229

230-
t.Run("succeeds", func(t *testing.T) {
230+
t.Run("succeeds with limit order", func(t *testing.T) {
231231
order, err := unfilledOrderToGlobalOrder(unfilledOrder)
232232
assert.NoError(err)
233233
assert.Equal(&types.Order{
@@ -251,6 +251,67 @@ func Test_unfilledOrderToGlobalOrder(t *testing.T) {
251251
}, order)
252252
})
253253

254+
t.Run("succeeds with market buy order", func(t *testing.T) {
255+
unfilledOrder2 := unfilledOrder
256+
unfilledOrder2.OrderType = v2.OrderTypeMarket
257+
unfilledOrder2.Side = v2.SideTypeBuy
258+
unfilledOrder2.Size = unfilledOrder2.PriceAvg.Mul(unfilledOrder2.Size)
259+
unfilledOrder2.PriceAvg = fixedpoint.Zero
260+
unfilledOrder2.Status = v2.OrderStatusNew
261+
262+
order, err := unfilledOrderToGlobalOrder(unfilledOrder2)
263+
assert.NoError(err)
264+
assert.Equal(&types.Order{
265+
SubmitOrder: types.SubmitOrder{
266+
ClientOrderID: "74b86af3-6098-479c-acac-bfb074c067f3",
267+
Symbol: "BTCUSDT",
268+
Side: types.SideTypeBuy,
269+
Type: types.OrderTypeMarket,
270+
Quantity: fixedpoint.Zero,
271+
Price: fixedpoint.Zero,
272+
TimeInForce: types.TimeInForceGTC,
273+
},
274+
Exchange: types.ExchangeBitget,
275+
OrderID: uint64(orderId),
276+
UUID: strconv.FormatInt(int64(orderId), 10),
277+
Status: types.OrderStatusNew,
278+
ExecutedQuantity: fixedpoint.Zero,
279+
IsWorking: true,
280+
CreationTime: types.Time(types.NewMillisecondTimestampFromInt(1660704288118).Time()),
281+
UpdateTime: types.Time(types.NewMillisecondTimestampFromInt(1660704288118).Time()),
282+
}, order)
283+
})
284+
285+
t.Run("succeeds with market sell order", func(t *testing.T) {
286+
unfilledOrder2 := unfilledOrder
287+
unfilledOrder2.OrderType = v2.OrderTypeMarket
288+
unfilledOrder2.Side = v2.SideTypeSell
289+
unfilledOrder2.PriceAvg = fixedpoint.Zero
290+
unfilledOrder2.Status = v2.OrderStatusNew
291+
292+
order, err := unfilledOrderToGlobalOrder(unfilledOrder2)
293+
assert.NoError(err)
294+
assert.Equal(&types.Order{
295+
SubmitOrder: types.SubmitOrder{
296+
ClientOrderID: "74b86af3-6098-479c-acac-bfb074c067f3",
297+
Symbol: "BTCUSDT",
298+
Side: types.SideTypeSell,
299+
Type: types.OrderTypeMarket,
300+
Quantity: fixedpoint.NewFromInt(5),
301+
Price: fixedpoint.Zero,
302+
TimeInForce: types.TimeInForceGTC,
303+
},
304+
Exchange: types.ExchangeBitget,
305+
OrderID: uint64(orderId),
306+
UUID: strconv.FormatInt(int64(orderId), 10),
307+
Status: types.OrderStatusNew,
308+
ExecutedQuantity: fixedpoint.Zero,
309+
IsWorking: true,
310+
CreationTime: types.Time(types.NewMillisecondTimestampFromInt(1660704288118).Time()),
311+
UpdateTime: types.Time(types.NewMillisecondTimestampFromInt(1660704288118).Time()),
312+
}, order)
313+
})
314+
254315
t.Run("failed to convert side", func(t *testing.T) {
255316
newOrder := unfilledOrder
256317
newOrder.Side = "xxx"

pkg/exchange/bitget/exchange.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -362,10 +362,12 @@ func (e *Exchange) SubmitOrder(ctx context.Context, order types.SubmitOrder) (cr
362362
debugf("unfilled order response for order#%s: %+v", orderId, ordersResp)
363363

364364
if len(ordersResp) == 1 {
365+
// 2023/11/05 The market order will be executed immediately, so we cannot retrieve it through the NewGetUnfilledOrdersRequest API.
366+
// Try to get the order from the NewGetHistoryOrdersRequest API.
367+
// 2024/03/06 After placing a Market Order, we can retrieve it through the unfilledOrder API, so we still need to
368+
// handle the Market Order status.
365369
return unfilledOrderToGlobalOrder(ordersResp[0])
366370
} else if len(ordersResp) == 0 {
367-
// The market order will be executed immediately, so we cannot retrieve it through the NewGetUnfilledOrdersRequest API.
368-
// Try to get the order from the NewGetHistoryOrdersRequest API.
369371
ordersResp, err := e.v2client.NewGetHistoryOrdersRequest().OrderId(orderId).Do(ctx)
370372
if err != nil {
371373
return nil, fmt.Errorf("failed to query history order by order id: %s, err: %w", orderId, err)

0 commit comments

Comments
 (0)