bbgo_origin/pkg/service/sync.go

79 lines
2.0 KiB
Go

package service
import (
"context"
"errors"
"os"
"strconv"
"time"
"github.com/c9s/bbgo/pkg/cache"
log "github.com/sirupsen/logrus"
"github.com/c9s/bbgo/pkg/types"
)
var ErrNotImplemented = errors.New("not implemented")
var ErrExchangeRewardServiceNotImplemented = errors.New("exchange does not implement ExchangeRewardService interface")
type SyncService struct {
TradeService *TradeService
OrderService *OrderService
RewardService *RewardService
WithdrawService *WithdrawService
DepositService *DepositService
}
func paperTrade() bool {
v, err := strconv.ParseBool(os.Getenv("PAPER_TRADE"))
return err == nil && v
}
// SyncSessionSymbols syncs the trades from the given exchange session
func (s *SyncService) SyncSessionSymbols(ctx context.Context, exchange types.Exchange, startTime time.Time, symbols ...string) error {
markets, err := cache.LoadExchangeMarketsWithCache(ctx, exchange)
if err != nil {
return err
}
for _, symbol := range symbols {
if _, ok := markets[symbol]; ok {
log.Infof("syncing %s %s trades...", exchange.Name(), symbol)
if err := s.TradeService.Sync(ctx, exchange, symbol, startTime); err != nil {
return err
}
log.Infof("syncing %s %s orders...", exchange.Name(), symbol)
if err := s.OrderService.Sync(ctx, exchange, symbol, startTime); err != nil {
return err
}
}
}
if !paperTrade() {
log.Infof("syncing %s deposit records...", exchange.Name())
if err := s.DepositService.Sync(ctx, exchange); err != nil {
if err != ErrNotImplemented {
return err
}
}
log.Infof("syncing %s withdraw records...", exchange.Name())
if err := s.WithdrawService.Sync(ctx, exchange); err != nil {
if err != ErrNotImplemented {
return err
}
}
log.Infof("syncing %s reward records...", exchange.Name())
if err := s.RewardService.Sync(ctx, exchange); err != nil {
if err != ErrExchangeRewardServiceNotImplemented {
log.Infof("%s reward service is not supported", exchange.Name())
return err
}
}
}
return nil
}