Skip to content

Commit a2edfd4

Browse files
committed
✨ feat(xalign): retry placing order on another session when failed
1 parent 7b33e01 commit a2edfd4

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

pkg/strategy/xalign/strategy.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ func (s *Strategy) Validate() error {
222222
}
223223

224224
func (s *Strategy) selectSessionForCurrency(
225-
ctx context.Context, sessions map[string]*bbgo.ExchangeSession, currency string, changeQuantity fixedpoint.Value,
225+
ctx context.Context, sessions map[string]*bbgo.ExchangeSession, excludeSession, currency string, changeQuantity fixedpoint.Value,
226226
) (*bbgo.ExchangeSession, *types.SubmitOrder) {
227227
var taker = s.UseTakerOrder
228228
var side = s.selectAdjustmentOrderSide(changeQuantity)
@@ -234,6 +234,9 @@ func (s *Strategy) selectSessionForCurrency(
234234
}
235235

236236
for _, sessionName := range s.PreferredSessions {
237+
if sessionName == excludeSession {
238+
continue
239+
}
237240
session, ok := sessions[sessionName]
238241
if !ok {
239242
log.Errorf("session %s not found, please check the preferredSessions settings", sessionName)
@@ -745,7 +748,8 @@ func (s *Strategy) align(ctx context.Context, sessions bbgo.ExchangeSessionMap)
745748
)
746749
}
747750

748-
selectedSession, submitOrder := s.selectSessionForCurrency(ctx, sessions, currency, q)
751+
selectedSession, submitOrder := s.selectSessionForCurrency(ctx, sessions, "", currency, q)
752+
onSubmittedOrderCallback := s.asyncOrderCallbackWithRetry(ctx, sessions, currency, q)
749753
if selectedSession != nil && submitOrder != nil {
750754
if market, hasMarket := selectedSession.Market(submitOrder.Symbol); hasMarket && submitOrder.Price.Sign() > 0 {
751755
if market.IsDustQuantity(q.Abs(), submitOrder.Price) {
@@ -770,7 +774,7 @@ func (s *Strategy) align(ctx context.Context, sessions bbgo.ExchangeSessionMap)
770774
// 2. interactive order is not enabled
771775
if isInstantAmount || !s.isInteractiveOrderEnabled {
772776
createdOrder, err := selectedSession.Exchange.SubmitOrder(ctx, *submitOrder)
773-
s.onSubmittedOrderCallback(selectedSession, submitOrder, createdOrder, err)
777+
onSubmittedOrderCallback(selectedSession, submitOrder, createdOrder, err)
774778
// continue to the next currency
775779
continue
776780
}
@@ -807,10 +811,10 @@ func (s *Strategy) align(ctx context.Context, sessions bbgo.ExchangeSessionMap)
807811
s.slackEvtID,
808812
)
809813
itOrder.SetHelpMessage(s.interactiveOrderHelpMessage(submitOrder))
810-
itOrder.AsyncSubmit(ctx, selectedSession, s.onSubmittedOrderCallback)
814+
itOrder.AsyncSubmit(ctx, selectedSession, onSubmittedOrderCallback)
811815
} else {
812816
createdOrder, err := selectedSession.Exchange.SubmitOrder(ctx, *submitOrder)
813-
s.onSubmittedOrderCallback(selectedSession, submitOrder, createdOrder, err)
817+
onSubmittedOrderCallback(selectedSession, submitOrder, createdOrder, err)
814818
}
815819
}
816820
}
@@ -831,6 +835,20 @@ func (s *Strategy) onSubmittedOrderCallback(session *bbgo.ExchangeSession, submi
831835
}
832836
}
833837

838+
func (s *Strategy) asyncOrderCallbackWithRetry(ctx context.Context, sessions bbgo.ExchangeSessionMap, currency string, changeQuantity fixedpoint.Value) OnSubmittedOrderCallback {
839+
return func(session *bbgo.ExchangeSession, submitOrder *types.SubmitOrder, createdOrder *types.Order, err error) {
840+
if err != nil {
841+
// select another session and retry once
842+
log.WithError(err).Infof("select new session to retry for %s: %s %s", session.Name, changeQuantity, currency)
843+
session, submitOrder = s.selectSessionForCurrency(ctx, sessions, session.Name, currency, changeQuantity)
844+
if session != nil && submitOrder != nil {
845+
createdOrder, err = session.Exchange.SubmitOrder(ctx, *submitOrder)
846+
}
847+
}
848+
s.onSubmittedOrderCallback(session, submitOrder, createdOrder, err)
849+
}
850+
}
851+
834852
func (s *Strategy) interactiveOrderHelpMessage(submitOrder *types.SubmitOrder) string {
835853
quoteCurrency := submitOrder.Market.QuoteCurrency
836854
return fmt.Sprintf(`

pkg/strategy/xalign/strategy_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ func TestStrategy(t *testing.T) {
154154
sessions := map[string]*bbgo.ExchangeSession{}
155155
sessions["max"] = session
156156

157-
_, submitOrder := s.selectSessionForCurrency(ctx, sessions, "TWD", Number(70_000))
157+
_, submitOrder := s.selectSessionForCurrency(ctx, sessions, "", "TWD", Number(70_000))
158158
assert.NotNil(t, submitOrder)
159159
assert.Equal(t, types.SideTypeSell, submitOrder.Side)
160160
assert.Equal(t, Number(32).String(), submitOrder.Price.String())
@@ -181,7 +181,7 @@ func TestStrategy(t *testing.T) {
181181
sessions := map[string]*bbgo.ExchangeSession{}
182182
sessions["max"] = session
183183

184-
_, submitOrder := s.selectSessionForCurrency(ctx, sessions, "TWD", Number(-10_000))
184+
_, submitOrder := s.selectSessionForCurrency(ctx, sessions, "", "TWD", Number(-10_000))
185185
assert.NotNil(t, submitOrder)
186186
assert.Equal(t, types.SideTypeBuy, submitOrder.Side)
187187
assert.Equal(t, Number(33).String(), submitOrder.Price.String())
@@ -218,7 +218,7 @@ func TestStrategy(t *testing.T) {
218218
sessions := map[string]*bbgo.ExchangeSession{}
219219
sessions["max"] = session
220220

221-
_, submitOrder := s.selectSessionForCurrency(ctx, sessions, "BTC", Number(0.045))
221+
_, submitOrder := s.selectSessionForCurrency(ctx, sessions, "", "BTC", Number(0.045))
222222
assert.NotNil(t, submitOrder)
223223
assert.Equal(t, types.SideTypeBuy, submitOrder.Side)
224224
assert.Equal(t, "36000", submitOrder.Price.String())

0 commit comments

Comments
 (0)