@@ -222,7 +222,7 @@ func (s *Strategy) Validate() error {
222222}
223223
224224func (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+
834852func (s * Strategy ) interactiveOrderHelpMessage (submitOrder * types.SubmitOrder ) string {
835853 quoteCurrency := submitOrder .Market .QuoteCurrency
836854 return fmt .Sprintf (`
0 commit comments