From 606c59ad4d0c458b006778570ad5394bb1000fd3 Mon Sep 17 00:00:00 2001 From: c9s Date: Tue, 20 Oct 2020 15:54:32 +0800 Subject: [PATCH] connecting strategies with session name --- pkg/config/loader.go | 41 +++++++++++++++++++------------ pkg/config/loader_test.go | 2 -- pkg/config/testdata/strategy.yaml | 11 +++++---- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/pkg/config/loader.go b/pkg/config/loader.go index 8e1646a59..2cec77326 100644 --- a/pkg/config/loader.go +++ b/pkg/config/loader.go @@ -12,8 +12,8 @@ import ( ) type Config struct { - ExchangeStrategies []bbgo.SingleExchangeStrategy - CrossExchangeStrategies []bbgo.CrossExchangeStrategy + ExchangeStrategies map[string][]bbgo.SingleExchangeStrategy + CrossExchangeStrategies map[string][]bbgo.CrossExchangeStrategy } type Stash map[string]interface{} @@ -49,32 +49,41 @@ func Load(configFile string) (*Config, error) { return &config, nil } -func loadExchangeStrategies(stash Stash) (strategies []bbgo.SingleExchangeStrategy, err error) { +func loadExchangeStrategies(stash Stash) (strategies map[string][]bbgo.SingleExchangeStrategy, err error) { exchangeStrategiesConf, ok := stash["exchangeStrategies"] if !ok { return nil, errors.New("exchangeStrategies is not defined") } - list, ok := exchangeStrategiesConf.([]interface{}) + sessionToConfigList, ok := exchangeStrategiesConf.(Stash) if !ok { - return nil, errors.New("exchangeStrategies should be a list") + return nil, errors.New("expecting session name at the first level") } - for _, entry := range list { - configStash, ok := entry.(Stash) + strategies = make(map[string][]bbgo.SingleExchangeStrategy) + + for sessionName, configList := range sessionToConfigList { + list, ok := configList.([]interface{}) if !ok { - return nil, errors.Errorf("strategy config should be a map, given: %T %+v", entry, entry) + return nil, errors.New("exchangeStrategies should be a list") } - for id, conf := range configStash { - // look up the real struct type - if st, ok := bbgo.LoadedExchangeStrategies[id]; ok { - val, err := reUnmarshal(conf, st) - if err != nil { - return nil, err - } + for _, entry := range list { + configStash, ok := entry.(Stash) + if !ok { + return nil, errors.Errorf("strategy config should be a map, given: %T %+v", entry, entry) + } - strategies = append(strategies, val.(bbgo.SingleExchangeStrategy)) + for id, conf := range configStash { + // look up the real struct type + if st, ok := bbgo.LoadedExchangeStrategies[id]; ok { + val, err := reUnmarshal(conf, st) + if err != nil { + return nil, err + } + + strategies[sessionName] = append(strategies[sessionName], val.(bbgo.SingleExchangeStrategy)) + } } } } diff --git a/pkg/config/loader_test.go b/pkg/config/loader_test.go index 1bbbf013d..d84acb306 100644 --- a/pkg/config/loader_test.go +++ b/pkg/config/loader_test.go @@ -45,8 +45,6 @@ func TestLoadStrategies(t *testing.T) { assert.NotNil(t, config) assert.Len(t, config.ExchangeStrategies, tt.length) - - t.Logf("%+v", config.ExchangeStrategies[0]) }) } } diff --git a/pkg/config/testdata/strategy.yaml b/pkg/config/testdata/strategy.yaml index 481802a8f..87e169171 100644 --- a/pkg/config/testdata/strategy.yaml +++ b/pkg/config/testdata/strategy.yaml @@ -9,8 +9,9 @@ sessions: keyVar: BINANCE_API_KEY secretVar: BINANCE_API_SECRET exchangeStrategies: -- buyandhold: - symbol: "BTCUSDT" - interval: "1m" - baseQuantity: 0.1 - minDropPercentage: -0.05 + binance: + - buyandhold: + symbol: "BTCUSDT" + interval: "1m" + baseQuantity: 0.1 + minDropPercentage: -0.05