Skip to content

Commit

Permalink
bugfixes: Backtester credentials, Binance ExecutionLimits, Mock recor…
Browse files Browse the repository at this point in the history
…ding (#1539)

* fix mock recording, binance, backtester

* minor credential streamlining
  • Loading branch information
gloriousCode committed May 15, 2024
1 parent 4cd4fb0 commit 34ef09d
Show file tree
Hide file tree
Showing 9 changed files with 187,757 additions and 34,996 deletions.
12 changes: 6 additions & 6 deletions backtester/engine/setup.go
Original file line number Diff line number Diff line change
Expand Up @@ -843,7 +843,7 @@ func (bt *BackTest) loadData(cfg *config.Config, exch gctexchange.IBotExchange,
cfg.DataSettings.Interval)
}
err = bt.exchangeManager.Add(exch)
if err != nil {
if err != nil && !errors.Is(err, engine.ErrExchangeAlreadyLoaded) {
return nil, err
}
err = bt.LiveDataHandler.AppendDataSource(&liveDataSourceSetup{
Expand Down Expand Up @@ -955,7 +955,8 @@ func setExchangeCredentials(cfg *config.Config, base *gctexchange.Base) error {
cfg.DataSettings.LiveData.ExchangeCredentials[i].Keys.IsEmpty() {
return fmt.Errorf("%v %w, please review your live, real order config", base.GetName(), gctexchange.ErrCredentialsAreEmpty)
}

base.API.AuthenticatedSupport = true
base.API.AuthenticatedWebsocketSupport = true
base.SetCredentials(
cfg.DataSettings.LiveData.ExchangeCredentials[i].Keys.Key,
cfg.DataSettings.LiveData.ExchangeCredentials[i].Keys.Secret,
Expand All @@ -964,10 +965,9 @@ func setExchangeCredentials(cfg *config.Config, base *gctexchange.Base) error {
cfg.DataSettings.LiveData.ExchangeCredentials[i].Keys.PEMKey,
cfg.DataSettings.LiveData.ExchangeCredentials[i].Keys.OneTimePassword,
)
validated := base.AreCredentialsValid(context.TODO())
base.API.AuthenticatedSupport = validated
if !validated {
return fmt.Errorf("%v %w", base.GetName(), errInvalidCredentials)
_, err := base.GetCredentials(context.TODO())
if err != nil {
return err
}
}

Expand Down
5 changes: 2 additions & 3 deletions engine/exchange_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ var (
ErrExchangeFailedToLoad = errors.New("exchange failed to load")
ErrExchangeNameIsEmpty = errors.New("exchange name is empty")

errExchangeIsNil = errors.New("exchange is nil")
errExchangeAlreadyLoaded = errors.New("exchange already loaded")
errExchangeIsNil = errors.New("exchange is nil")
)

// CustomExchangeBuilder interface allows external applications to create
Expand Down Expand Up @@ -55,7 +54,7 @@ func (m *ExchangeManager) Add(exch exchange.IBotExchange) error {
defer m.mtx.Unlock()
_, ok := m.exchanges[strings.ToLower(exch.GetName())]
if ok {
return fmt.Errorf("exchange manager: %s %w", exch.GetName(), errExchangeAlreadyLoaded)
return fmt.Errorf("exchange manager: %s %w", exch.GetName(), ErrExchangeAlreadyLoaded)
}
m.exchanges[strings.ToLower(exch.GetName())] = exch
return nil
Expand Down
4 changes: 2 additions & 2 deletions engine/exchange_manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ func TestExchangeManagerAdd(t *testing.T) {
t.Fatalf("received: '%v' but expected: '%v'", err, nil)
}
err = m.Add(b)
if !errors.Is(err, errExchangeAlreadyLoaded) {
t.Fatalf("received: '%v' but expected: '%v'", err, errExchangeAlreadyLoaded)
if !errors.Is(err, ErrExchangeAlreadyLoaded) {
t.Fatalf("received: '%v' but expected: '%v'", err, ErrExchangeAlreadyLoaded)
}
exchanges, err := m.GetExchanges()
if err != nil {
Expand Down
76 changes: 38 additions & 38 deletions exchanges/binance/binance.go
Original file line number Diff line number Diff line change
Expand Up @@ -1233,46 +1233,46 @@ func (b *Binance) FetchExchangeLimits(ctx context.Context, a asset.Item) ([]orde
return nil, err
}

if !slices.Contains(s.Permissions, aUpper) {
continue
}

l := order.MinMaxLevel{
Pair: cp,
Asset: a,
}

for _, f := range s.Filters {
// TODO: Unhandled filters:
// maxPosition, trailingDelta, percentPriceBySide, maxNumAlgoOrders
switch f.FilterType {
case priceFilter:
l.MinPrice = f.MinPrice
l.MaxPrice = f.MaxPrice
l.PriceStepIncrementSize = f.TickSize
case percentPriceFilter:
l.MultiplierUp = f.MultiplierUp
l.MultiplierDown = f.MultiplierDown
l.AveragePriceMinutes = f.AvgPriceMinutes
case lotSizeFilter:
l.MaximumBaseAmount = f.MaxQty
l.MinimumBaseAmount = f.MinQty
l.AmountStepIncrementSize = f.StepSize
case notionalFilter:
l.MinNotional = f.MinNotional
case icebergPartsFilter:
l.MaxIcebergParts = f.Limit
case marketLotSizeFilter:
l.MarketMinQty = f.MinQty
l.MarketMaxQty = f.MaxQty
l.MarketStepIncrementSize = f.StepSize
case maxNumOrdersFilter:
l.MaxTotalOrders = f.MaxNumOrders
l.MaxAlgoOrders = f.MaxNumAlgoOrders
for i := range s.PermissionSets {
if !slices.Contains(s.PermissionSets[i], aUpper) {
continue
}
l := order.MinMaxLevel{
Pair: cp,
Asset: a,
}
for _, f := range s.Filters {
// TODO: Unhandled filters:
// maxPosition, trailingDelta, percentPriceBySide, maxNumAlgoOrders
switch f.FilterType {
case priceFilter:
l.MinPrice = f.MinPrice
l.MaxPrice = f.MaxPrice
l.PriceStepIncrementSize = f.TickSize
case percentPriceFilter:
l.MultiplierUp = f.MultiplierUp
l.MultiplierDown = f.MultiplierDown
l.AveragePriceMinutes = f.AvgPriceMinutes
case lotSizeFilter:
l.MaximumBaseAmount = f.MaxQty
l.MinimumBaseAmount = f.MinQty
l.AmountStepIncrementSize = f.StepSize
case notionalFilter:
l.MinNotional = f.MinNotional
case icebergPartsFilter:
l.MaxIcebergParts = f.Limit
case marketLotSizeFilter:
l.MarketMinQty = f.MinQty
l.MarketMaxQty = f.MaxQty
l.MarketStepIncrementSize = f.StepSize
case maxNumOrdersFilter:
l.MaxTotalOrders = f.MaxNumOrders
l.MaxAlgoOrders = f.MaxNumAlgoOrders
}
}
limits = append(limits, l)
break
}

limits = append(limits, l)
}
return limits, nil
}
Expand Down
4 changes: 2 additions & 2 deletions exchanges/binance/binance_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1085,8 +1085,8 @@ func TestGetExchangeInfo(t *testing.T) {
info, err := b.GetExchangeInfo(context.Background())
require.NoError(t, err, "GetExchangeInfo must not error")
if mockTests {
exp := time.Date(2022, 2, 25, 3, 50, 40, int(601*time.Millisecond), time.UTC)
assert.True(t, info.ServerTime.Equal(exp), "ServerTime should be correct")
exp := time.Date(2024, 5, 10, 6, 8, 1, int(707*time.Millisecond), time.UTC)
assert.True(t, info.ServerTime.Equal(exp), "expected %v received %v", exp.UTC(), info.ServerTime.UTC())
} else {
assert.WithinRange(t, info.ServerTime, time.Now().Add(-24*time.Hour), time.Now().Add(24*time.Hour), "ServerTime should be within a day of now")
}
Expand Down
1 change: 1 addition & 0 deletions exchanges/binance/binance_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ type ExchangeInfo struct {
IsMarginTradingAllowed bool `json:"isMarginTradingAllowed"`
Filters []*filterData `json:"filters"`
Permissions []string `json:"permissions"`
PermissionSets [][]string `json:"permissionSets"`
} `json:"symbols"`
}

Expand Down
Loading

0 comments on commit 34ef09d

Please sign in to comment.