bbgo_origin/pkg/bbgo/activeorderbook_test.go
2024-03-14 22:41:58 +08:00

155 lines
3.9 KiB
Go

package bbgo
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/c9s/bbgo/pkg/fixedpoint"
. "github.com/c9s/bbgo/pkg/testing/testhelper"
"github.com/c9s/bbgo/pkg/types"
)
func TestActiveOrderBook_pendingOrders(t *testing.T) {
now := time.Now()
t1 := now
t2 := now.Add(time.Millisecond)
ob := NewActiveOrderBook("BTCUSDT")
filled := false
ob.OnFilled(func(o types.Order) {
filled = true
})
quantity := Number("0.01")
orderUpdate1 := types.Order{
OrderID: 99,
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Side: types.SideTypeBuy,
Type: types.OrderTypeLimit,
Quantity: quantity,
Price: Number(19000.0),
AveragePrice: fixedpoint.Zero,
StopPrice: fixedpoint.Zero,
},
ExecutedQuantity: Number(0.0),
Status: types.OrderStatusNew,
CreationTime: types.Time(t1),
UpdateTime: types.Time(t1),
}
orderUpdate2 := types.Order{
OrderID: 99,
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Side: types.SideTypeBuy,
Type: types.OrderTypeLimit,
Quantity: quantity,
Price: Number(19000.0),
AveragePrice: fixedpoint.Zero,
StopPrice: fixedpoint.Zero,
},
ExecutedQuantity: quantity,
Status: types.OrderStatusFilled,
CreationTime: types.Time(t1),
UpdateTime: types.Time(t2),
}
assert.True(t, isNewerOrderUpdate(orderUpdate2, orderUpdate1), "orderUpdate2 should be newer than orderUpdate1")
// if we received filled order first
// should be added to pending orders
ob.Update(orderUpdate2)
assert.Len(t, ob.pendingOrderUpdates.Orders(), 1)
o99, ok := ob.pendingOrderUpdates.Get(99)
if assert.True(t, ok) {
assert.Equal(t, types.OrderStatusFilled, o99.Status)
}
// when adding the older order update to the book,
// it should trigger the filled event once the order is registered to the active order book
ob.Add(orderUpdate1)
assert.True(t, filled, "filled event should be fired")
}
func Test_RestoreParametersOnUpdateHandler(t *testing.T) {
now := time.Now()
t1 := now
t2 := now.Add(time.Millisecond)
ob := NewActiveOrderBook("BTCUSDT")
var updatedOrder types.Order
ob.OnFilled(func(o types.Order) {
updatedOrder = o
})
quantity := Number("0.01")
orderUpdate1 := types.Order{
OrderID: 99,
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Side: types.SideTypeBuy,
Type: types.OrderTypeLimit,
Quantity: quantity,
Price: Number(19000.0),
AveragePrice: fixedpoint.Zero,
StopPrice: fixedpoint.Zero,
Tag: "tag1",
GroupID: uint32(1),
},
ExecutedQuantity: Number(0.0),
Status: types.OrderStatusNew,
CreationTime: types.Time(t1),
UpdateTime: types.Time(t1),
}
orderUpdate2 := types.Order{
OrderID: 99,
SubmitOrder: types.SubmitOrder{
Symbol: "BTCUSDT",
Side: types.SideTypeBuy,
Type: types.OrderTypeLimit,
Quantity: quantity,
Price: Number(19000.0),
AveragePrice: fixedpoint.Zero,
StopPrice: fixedpoint.Zero,
},
ExecutedQuantity: quantity,
Status: types.OrderStatusFilled,
CreationTime: types.Time(t1),
UpdateTime: types.Time(t2),
}
ob.add(orderUpdate1)
ob.orderUpdateHandler(orderUpdate2)
assert.Equal(t, "tag1", updatedOrder.Tag)
assert.Equal(t, uint32(1), updatedOrder.GroupID)
}
func Test_isNewerUpdate(t *testing.T) {
a := types.Order{
Status: types.OrderStatusPartiallyFilled,
ExecutedQuantity: number(0.2),
}
b := types.Order{
Status: types.OrderStatusPartiallyFilled,
ExecutedQuantity: number(0.1),
}
ret := isNewerOrderUpdate(a, b)
assert.True(t, ret)
}
func Test_isNewerUpdateTime(t *testing.T) {
a := types.Order{
UpdateTime: types.NewTimeFromUnix(200, 0),
}
b := types.Order{
UpdateTime: types.NewTimeFromUnix(100, 0),
}
ret := isNewerOrderUpdateTime(a, b)
assert.True(t, ret)
}