mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-25 16:25:16 +00:00
FIX: retry to get open orders only for 5 times and do not sync orders updated in 3 min
This commit is contained in:
parent
be4c69c365
commit
671772a767
|
@ -47,6 +47,15 @@ func GeneralBackoff(ctx context.Context, op backoff2.Operation) (err error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GeneralBackoffLite(ctx context.Context, op backoff2.Operation) (err error) {
|
||||||
|
err = backoff2.Retry(op, backoff2.WithContext(
|
||||||
|
backoff2.WithMaxRetries(
|
||||||
|
backoff2.NewExponentialBackOff(),
|
||||||
|
5),
|
||||||
|
ctx))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func QueryOpenOrdersUntilSuccessful(ctx context.Context, ex types.Exchange, symbol string) (openOrders []types.Order, err error) {
|
func QueryOpenOrdersUntilSuccessful(ctx context.Context, ex types.Exchange, symbol string) (openOrders []types.Order, err error) {
|
||||||
var op = func() (err2 error) {
|
var op = func() (err2 error) {
|
||||||
openOrders, err2 = ex.QueryOpenOrders(ctx, symbol)
|
openOrders, err2 = ex.QueryOpenOrders(ctx, symbol)
|
||||||
|
@ -57,6 +66,16 @@ func QueryOpenOrdersUntilSuccessful(ctx context.Context, ex types.Exchange, symb
|
||||||
return openOrders, err
|
return openOrders, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func QueryOpenOrdersUntilSuccessfulLite(ctx context.Context, ex types.Exchange, symbol string) (openOrders []types.Order, err error) {
|
||||||
|
var op = func() (err2 error) {
|
||||||
|
openOrders, err2 = ex.QueryOpenOrders(ctx, symbol)
|
||||||
|
return err2
|
||||||
|
}
|
||||||
|
|
||||||
|
err = GeneralBackoffLite(ctx, op)
|
||||||
|
return openOrders, err
|
||||||
|
}
|
||||||
|
|
||||||
func QueryOrderUntilSuccessful(ctx context.Context, query types.ExchangeOrderQueryService, opts types.OrderQuery) (order *types.Order, err error) {
|
func QueryOrderUntilSuccessful(ctx context.Context, query types.ExchangeOrderQueryService, opts types.OrderQuery) (order *types.Order, err error) {
|
||||||
var op = func() (err2 error) {
|
var op = func() (err2 error) {
|
||||||
order, err2 = query.QueryOrder(ctx, opts)
|
order, err2 = query.QueryOrder(ctx, opts)
|
||||||
|
|
|
@ -89,9 +89,10 @@ func (s *Strategy) recoverActiveOrdersPeriodically(ctx context.Context) {
|
||||||
func syncActiveOrders(ctx context.Context, opts SyncActiveOrdersOpts) error {
|
func syncActiveOrders(ctx context.Context, opts SyncActiveOrdersOpts) error {
|
||||||
opts.logger.Infof("[ActiveOrderRecover] syncActiveOrders")
|
opts.logger.Infof("[ActiveOrderRecover] syncActiveOrders")
|
||||||
|
|
||||||
notAddNonExistingOpenOrdersAfter := time.Now().Add(-5 * time.Minute)
|
// do not sync orders which is updated in 3 min, because we may receive from websocket and handle it twice
|
||||||
|
doNotSyncAfter := time.Now().Add(-3 * time.Minute)
|
||||||
|
|
||||||
openOrders, err := retry.QueryOpenOrdersUntilSuccessful(ctx, opts.exchange, opts.activeOrderBook.Symbol)
|
openOrders, err := retry.QueryOpenOrdersUntilSuccessfulLite(ctx, opts.exchange, opts.activeOrderBook.Symbol)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
opts.logger.WithError(err).Error("[ActiveOrderRecover] failed to query open orders, skip this time")
|
opts.logger.WithError(err).Error("[ActiveOrderRecover] failed to query open orders, skip this time")
|
||||||
return errors.Wrapf(err, "[ActiveOrderRecover] failed to query open orders, skip this time")
|
return errors.Wrapf(err, "[ActiveOrderRecover] failed to query open orders, skip this time")
|
||||||
|
@ -116,6 +117,10 @@ func syncActiveOrders(ctx context.Context, opts SyncActiveOrdersOpts) error {
|
||||||
delete(openOrdersMap, activeOrder.OrderID)
|
delete(openOrdersMap, activeOrder.OrderID)
|
||||||
} else {
|
} else {
|
||||||
opts.logger.Infof("found active order #%d is not in the open orders, updating...", activeOrder.OrderID)
|
opts.logger.Infof("found active order #%d is not in the open orders, updating...", activeOrder.OrderID)
|
||||||
|
if activeOrder.UpdateTime.After(doNotSyncAfter) {
|
||||||
|
opts.logger.Infof("active order #%d is updated in 3 min, skip updating...", activeOrder.OrderID)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// sleep 100ms to avoid DDOS
|
// sleep 100ms to avoid DDOS
|
||||||
time.Sleep(100 * time.Millisecond)
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
@ -130,8 +135,10 @@ func syncActiveOrders(ctx context.Context, opts SyncActiveOrdersOpts) error {
|
||||||
|
|
||||||
// update open orders not in active orders
|
// update open orders not in active orders
|
||||||
for _, openOrder := range openOrdersMap {
|
for _, openOrder := range openOrdersMap {
|
||||||
// we don't add open orders into active orderbook if updated in 5 min
|
opts.logger.Infof("found open order #%d is not in active orderbook, updating...", openOrder.OrderID)
|
||||||
if openOrder.UpdateTime.After(notAddNonExistingOpenOrdersAfter) {
|
// we don't add open orders into active orderbook if updated in 3 min, because we may receive message from websocket and add it twice.
|
||||||
|
if openOrder.UpdateTime.After(doNotSyncAfter) {
|
||||||
|
opts.logger.Infof("open order #%d is updated in 3 min, skip updating...", openOrder.OrderID)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,7 +54,7 @@ func (s *Strategy) recover(ctx context.Context) error {
|
||||||
activeOrderBook := s.orderExecutor.ActiveMakerOrders()
|
activeOrderBook := s.orderExecutor.ActiveMakerOrders()
|
||||||
activeOrders := activeOrderBook.Orders()
|
activeOrders := activeOrderBook.Orders()
|
||||||
|
|
||||||
openOrders, err := retry.QueryOpenOrdersUntilSuccessful(ctx, s.session.Exchange, s.Symbol)
|
openOrders, err := retry.QueryOpenOrdersUntilSuccessfulLite(ctx, s.session.Exchange, s.Symbol)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user