From 86360a7595855f58c464df01106aae0a786cbb05 Mon Sep 17 00:00:00 2001 From: c9s Date: Tue, 22 Oct 2024 11:56:38 +0800 Subject: [PATCH] bbgo: fix order update compare method --- pkg/bbgo/activeorderbook.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pkg/bbgo/activeorderbook.go b/pkg/bbgo/activeorderbook.go index d9988d9a0..5240a9f7c 100644 --- a/pkg/bbgo/activeorderbook.go +++ b/pkg/bbgo/activeorderbook.go @@ -336,7 +336,7 @@ func (b *ActiveOrderBook) Update(order types.Order) { // if we can't detect which is newer, isNewerOrderUpdate returns false // if you pass two same objects to isNewerOrderUpdate, it returns false if !isNewerOrderUpdate(order, previousOrder) { - log.Infof("[ActiveOrderBook] order #%d updateTime %s is out of date, skip it", order.OrderID, order.UpdateTime) + log.Infof("[ActiveOrderBook] order #%d (update time %s) is out of date, skip it", order.OrderID, order.UpdateTime) b.mu.Unlock() return } @@ -393,26 +393,33 @@ func (b *ActiveOrderBook) Add(orders ...types.Order) { } } +// isNewerOrderUpdate checks if the order a is newer than the order b. func isNewerOrderUpdate(a, b types.Order) bool { // compare state first switch a.Status { case types.OrderStatusCanceled, types.OrderStatusRejected: // canceled is a final state switch b.Status { - case types.OrderStatusNew, types.OrderStatusPartiallyFilled: + + case types.OrderStatusCanceled, types.OrderStatusRejected, types.OrderStatusNew, types.OrderStatusPartiallyFilled: return true } case types.OrderStatusPartiallyFilled: switch b.Status { + case types.OrderStatusNew: return true + case types.OrderStatusPartiallyFilled: // unknown for equal if a.ExecutedQuantity.Compare(b.ExecutedQuantity) > 0 { return true } + if a.UpdateTime.After(b.UpdateTime.Time()) { + return true + } } case types.OrderStatusFilled: